aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore6
-rw-r--r--ChangeLog117
-rw-r--r--Makefile.am11
-rw-r--r--changes/6153_circuittime_accessor4
-rw-r--r--changes/bug27672
-rw-r--r--changes/bug43412
-rw-r--r--changes/bug50408
-rw-r--r--changes/bug56094
-rw-r--r--changes/bug89294
-rw-r--r--changes/bug91083
-rw-r--r--changes/bug92072
-rw-r--r--changes/bug92544
-rw-r--r--changes/bug92586
-rw-r--r--changes/bug92674
-rw-r--r--changes/bug92884
-rw-r--r--changes/bug92954
-rw-r--r--changes/bug93096
-rw-r--r--changes/bug93374
-rw-r--r--changes/bug93545
-rw-r--r--changes/bug93664
-rw-r--r--changes/bug94007
-rw-r--r--changes/bug95434
-rw-r--r--changes/bug954611
-rw-r--r--changes/bug95645
-rw-r--r--changes/bug9645a5
-rw-r--r--changes/bug9671_0235
-rw-r--r--changes/doc-heartbeat-loglevel3
-rw-r--r--changes/fancy_testing27
-rw-r--r--changes/feature95747
-rw-r--r--changes/geoip-august20133
-rw-r--r--changes/ticket51293
-rw-r--r--changes/ticket55264
-rw-r--r--changes/ticket91083
-rw-r--r--changes/ticket96584
-rw-r--r--changes/ticket_92146
-rw-r--r--changes/v3_intro_len8
-rw-r--r--configure.ac16
-rwxr-xr-xcontrib/cov-blame48
-rwxr-xr-xcontrib/cov-diff17
-rwxr-xr-xcontrib/coverage46
-rw-r--r--doc/HACKING33
-rw-r--r--doc/tor.1.txt46
-rw-r--r--src/common/compat.c189
-rw-r--r--src/common/compat.h21
-rw-r--r--src/common/crypto.c10
-rw-r--r--src/common/crypto.h9
-rw-r--r--src/common/crypto_curve25519.c2
-rw-r--r--src/common/crypto_curve25519.h5
-rw-r--r--src/common/crypto_format.c1
-rw-r--r--src/common/include.am35
-rw-r--r--src/common/log.c4
-rw-r--r--src/common/sandbox.c18
-rw-r--r--src/common/testsupport.h80
-rw-r--r--src/common/torlog.h6
-rw-r--r--src/common/tortls.c3
-rw-r--r--src/common/util.c64
-rw-r--r--src/common/util.h39
-rw-r--r--src/config/geoip9207
-rw-r--r--src/config/geoip-manual25
-rw-r--r--src/ext/eventdns.c9
-rw-r--r--src/or/addressmap.c2
-rw-r--r--src/or/addressmap.h6
-rw-r--r--src/or/buffers.c61
-rw-r--r--src/or/buffers.h12
-rw-r--r--src/or/channel.c14
-rw-r--r--src/or/channel.h3
-rw-r--r--src/or/channeltls.c46
-rw-r--r--src/or/circuitbuild.c37
-rw-r--r--src/or/circuitlist.c113
-rw-r--r--src/or/circuitlist.h11
-rw-r--r--src/or/circuitmux.c13
-rw-r--r--src/or/circuitmux.h9
-rw-r--r--src/or/circuitstats.c120
-rw-r--r--src/or/circuitstats.h63
-rw-r--r--src/or/circuituse.c75
-rw-r--r--src/or/command.c3
-rw-r--r--src/or/config.c273
-rw-r--r--src/or/config.h22
-rw-r--r--src/or/confparse.c16
-rw-r--r--src/or/confparse.h2
-rw-r--r--src/or/connection.c91
-rw-r--r--src/or/connection.h10
-rw-r--r--src/or/connection_edge.c4
-rw-r--r--src/or/connection_edge.h6
-rw-r--r--src/or/connection_or.c99
-rw-r--r--src/or/connection_or.h3
-rw-r--r--src/or/control.c159
-rw-r--r--src/or/control.h70
-rw-r--r--src/or/cpuworker.c5
-rw-r--r--src/or/directory.c19
-rw-r--r--src/or/directory.h5
-rw-r--r--src/or/dirserv.c18
-rw-r--r--src/or/dirserv.h23
-rw-r--r--src/or/dirvote.c4
-rw-r--r--src/or/dirvote.h6
-rw-r--r--src/or/dns.c8
-rw-r--r--src/or/entrynodes.c19
-rw-r--r--src/or/ext_orport.c648
-rw-r--r--src/or/ext_orport.h42
-rw-r--r--src/or/geoip.c174
-rw-r--r--src/or/geoip.h12
-rw-r--r--src/or/hibernate.c9
-rw-r--r--src/or/hibernate.h3
-rw-r--r--src/or/include.am32
-rw-r--r--src/or/main.c54
-rw-r--r--src/or/main.h15
-rw-r--r--src/or/microdesc.c9
-rw-r--r--src/or/networkstatus.c5
-rw-r--r--src/or/ntmain.c1
-rw-r--r--src/or/onion.c237
-rw-r--r--src/or/onion.h4
-rw-r--r--src/or/onion_fast.c2
-rw-r--r--src/or/or.h108
-rw-r--r--src/or/relay.c46
-rw-r--r--src/or/relay.h8
-rw-r--r--src/or/rendclient.c2
-rw-r--r--src/or/rendservice.c16
-rw-r--r--src/or/rendservice.h2
-rw-r--r--src/or/rephist.c43
-rw-r--r--src/or/rephist.h8
-rw-r--r--src/or/replaycache.c27
-rw-r--r--src/or/replaycache.h10
-rw-r--r--src/or/router.c2
-rw-r--r--src/or/router.h4
-rw-r--r--src/or/routerlist.c4
-rw-r--r--src/or/routerlist.h9
-rw-r--r--src/or/statefile.c12
-rw-r--r--src/or/statefile.h6
-rw-r--r--src/or/status.c33
-rw-r--r--src/or/transports.c169
-rw-r--r--src/or/transports.h22
-rw-r--r--src/test/bench.c1
-rw-r--r--src/test/include.am23
-rw-r--r--src/test/test.c859
-rw-r--r--src/test/test_buffers.c342
-rw-r--r--src/test/test_cell_queue.c146
-rw-r--r--src/test/test_circuitlist.c168
-rw-r--r--src/test/test_circuitmux.c84
-rw-r--r--src/test/test_config.c112
-rw-r--r--src/test/test_containers.c53
-rw-r--r--src/test/test_crypto.c3
-rw-r--r--src/test/test_dir.c73
-rw-r--r--src/test/test_extorport.c604
-rw-r--r--src/test/test_options.c170
-rw-r--r--src/test/test_pt.c313
-rw-r--r--src/test/test_replay.c192
-rw-r--r--src/test/test_socks.c393
-rw-r--r--src/test/test_util.c170
-rw-r--r--src/tools/tor-checkkey.c2
-rw-r--r--src/tools/tor-gencert.c2
150 files changed, 10939 insertions, 6241 deletions
diff --git a/.gitignore b/.gitignore
index e48918d32..201d04da6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -128,10 +128,13 @@
/src/common/Makefile.in
/src/common/common_sha1.i
/src/common/libor.a
+/src/common/libor-testing.a
/src/common/libor.lib
/src/common/libor-crypto.a
+/src/common/libor-crypto-testing.a
/src/common/libor-crypto.lib
/src/common/libor-event.a
+/src/common/libor-event-testing.a
/src/common/libor-event.lib
/src/common/libcurve25519_donna.a
/src/common/libcurve25519_donna.lib
@@ -149,7 +152,10 @@
/src/or/or_sha1.i
/src/or/tor
/src/or/tor.exe
+/src/or/tor-cov
+/src/or/tor-cov.exe
/src/or/libtor.a
+/src/or/libtor-testing.a
/src/or/libtor.lib
# /src/test
diff --git a/ChangeLog b/ChangeLog
index 157872829..bc58205cf 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,110 @@
+Changes in version 0.2.4.17-rc - 2013-09-05
+ Tor 0.2.4.17-rc is the third release candidate for the Tor 0.2.4.x
+ series. It adds an emergency step to help us tolerate the massive
+ influx of users: 0.2.4 clients using the new (faster and safer) "NTor"
+ circuit-level handshakes now effectively jump the queue compared to
+ the 0.2.3 clients using "TAP" handshakes. This release also fixes a
+ big bug hindering bridge reachability tests.
+
+ o Major features:
+ - Relays now process the new "NTor" circuit-level handshake requests
+ with higher priority than the old "TAP" circuit-level handshake
+ requests. We still process some TAP requests to not totally starve
+ 0.2.3 clients when NTor becomes popular. A new consensus parameter
+ "NumNTorsPerTAP" lets us tune the balance later if we need to.
+ Implements ticket 9574.
+
+ o Major bugfixes:
+ - If the circuit build timeout logic is disabled (via the consensus,
+ or because we are an authority), then don't build testing circuits.
+ Fixes bug 9657; bugfix on 0.2.2.14-alpha.
+ - Bridges now send AUTH_CHALLENGE cells during their v3 handshakes;
+ previously they did not, which prevented them from receiving
+ successful connections from relays for self-test or bandwidth
+ testing. Also, when a relay is extending a circuit to a bridge,
+ it needs to send a NETINFO cell, even when the bridge hasn't sent
+ an AUTH_CHALLENGE cell. Fixes bug 9546; bugfix on 0.2.3.6-alpha.
+ - If the time to download the next old-style networkstatus is in
+ the future, do not decline to consider whether to download the
+ next microdescriptor networkstatus. Fixes bug 9564; bugfix on
+ 0.2.3.14-alpha.
+
+ o Minor bugfixes:
+ - Avoid double-closing the listener socket in our socketpair()
+ replacement (used on Windows) in the case where the addresses on
+ our opened sockets don't match what we expected. Fixes bug 9400;
+ bugfix on 0.0.2pre7. Found by Coverity.
+
+ o Minor fixes (config options):
+ - Avoid overflows when the user sets MaxCircuitDirtiness to a
+ ridiculously high value, by imposing a (ridiculously high) 30-day
+ maximum on MaxCircuitDirtiness.
+ - Fix the documentation of HeartbeatPeriod to say that the heartbeat
+ message is logged at notice, not at info.
+ - Warn and fail if a server is configured not to advertise any
+ ORPorts at all. (We need *something* to put in our descriptor,
+ or we just won't work.)
+
+ o Minor features:
+ - Track how many "TAP" and "NTor" circuit handshake requests we get,
+ and how many we complete, and log it every hour to help relay
+ operators follow trends in network load. Addresses ticket 9658.
+ - Update to the August 7 2013 Maxmind GeoLite Country database.
+
+
+Changes in version 0.2.4.16-rc - 2013-08-10
+ Tor 0.2.4.16-rc is the second release candidate for the Tor 0.2.4.x
+ series. It fixes several crash bugs in the 0.2.4 branch.
+
+ o Major bugfixes:
+ - Fix a bug in the voting algorithm that could yield incorrect results
+ when a non-naming authority declared too many flags. Fixes bug 9200;
+ bugfix on 0.2.0.3-alpha.
+ - Fix an uninitialized read that could in some cases lead to a remote
+ crash while parsing INTRODUCE2 cells. Bugfix on 0.2.4.1-alpha.
+ Anybody running a hidden service on the experimental 0.2.4.x
+ branch should upgrade. (This is, so far as we know, unrelated to
+ the recent news.)
+ - Avoid an assertion failure when processing DNS replies without the
+ answer types we expected. Fixes bug 9337; bugfix on 0.2.4.7-alpha.
+ - Avoid a crash when using --hash-password. Fixes bug 9295; bugfix on
+ 0.2.4.15-rc. Found by stem integration tests.
+
+ o Minor bugfixes:
+ - Fix an invalid memory read that occured when a pluggable
+ transport proxy failed its configuration protocol.
+ Fixes bug 9288; bugfix on 0.2.4.1-alpha.
+ - When evaluating whether to use a connection that we haven't
+ decided is canonical using a recent link protocol version,
+ decide that it's canonical only if it used address _does_
+ match the desired address. Fixes bug 9309; bugfix on
+ 0.2.4.4-alpha. Reported by skruffy.
+ - Make the default behavior of NumDirectoryGuards be to track
+ NumEntryGuards. Now a user who changes only NumEntryGuards will get
+ the behavior she expects. Fixes bug 9354; bugfix on 0.2.4.8-alpha.
+ - Fix a spurious compilation warning with some older versions of
+ GCC on FreeBSD. Fixes bug 9254; bugfix on 0.2.4.14-alpha.
+
+ o Minor features:
+ - Update to the July 3 2013 Maxmind GeoLite Country database.
+
+
+Changes in version 0.2.4.15-rc - 2013-07-01
+ Tor 0.2.4.15-rc is the first release candidate for the Tor 0.2.4.x
+ series. It fixes a few smaller bugs, but generally appears stable.
+ Please test it and let us know whether it is!
+
+ o Major bugfixes:
+ - When receiving a new configuration file via the control port's
+ LOADCONF command, do not treat the defaults file as absent.
+ Fixes bug 9122; bugfix on 0.2.3.9-alpha.
+
+ o Minor features:
+ - Issue a warning when running with the bufferevents backend enabled.
+ It's still not stable, and people should know that they're likely
+ to hit unexpected problems. Closes ticket 9147.
+
+
Changes in version 0.2.4.14-alpha - 2013-06-18
Tor 0.2.4.14-alpha fixes a pair of client guard enumeration problems
present in 0.2.4.13-alpha.
@@ -80,11 +187,11 @@ Changes in version 0.2.4.13-alpha - 2013-06-14
- Relays now treat a changed IPv6 ORPort as sufficient reason to
publish an updated descriptor. Fixes bug 6026; bugfix on
0.2.4.1-alpha.
- - When launching a resolve request on behalf of an AF_UNIX control
- socket, omit the address field of the new entry connection, used in
- subsequent controller events, rather than letting tor_dup_addr()
- set it to "<unknown address type>". Fixes bug 8639; bugfix on
- 0.2.4.12-alpha.
+ - When launching a resolve request on behalf of an AF_UNIX control
+ socket, omit the address field of the new entry connection, used in
+ subsequent controller events, rather than letting tor_dup_addr()
+ set it to "<unknown address type>". Fixes bug 8639; bugfix on
+ 0.2.4.12-alpha.
o Minor bugfixes (log messages):
- Fix a scaling issue in the path bias accounting code that
diff --git a/Makefile.am b/Makefile.am
index a736638e4..0361d87ce 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -32,6 +32,12 @@ EXTRA_DIST+= \
README \
ReleaseNotes
+if COVERAGE_ENABLED
+TEST_CFLAGS=-fno-inline -fprofile-arcs -ftest-coverage
+else
+TEST_CFLAGS=
+endif
+
#install-data-local:
# $(INSTALL) -m 755 -d $(LOCALSTATEDIR)/lib/tor
@@ -65,6 +71,9 @@ test: all
test-network: all
./src/test/test-network.sh
+reset-gcov:
+ rm -f src/*/*.gcda
+
# Avoid strlcpy.c, strlcat.c, aes.c, OpenBSD_malloc_Linux.c, sha256.c,
# eventdns.[hc], tinytest*.[ch]
check-spaces:
@@ -89,3 +98,5 @@ version:
(cd "$(top_srcdir)" && git rev-parse --short=16 HEAD); \
fi
+mostlyclean-local:
+ rm -f src/*/*.gc{da,no}
diff --git a/changes/6153_circuittime_accessor b/changes/6153_circuittime_accessor
new file mode 100644
index 000000000..16f1f557d
--- /dev/null
+++ b/changes/6153_circuittime_accessor
@@ -0,0 +1,4 @@
+ o Code simplification and refactoring:
+
+ - Add a set of accessor functions for the circuit timeout data
+ structure. Fixes ticket 6153; patch from "piet".
diff --git a/changes/bug2767 b/changes/bug2767
new file mode 100644
index 000000000..974ce6326
--- /dev/null
+++ b/changes/bug2767
@@ -0,0 +1,2 @@
+ o Minor bugfixes:
+ - No longer accepting malformed http headers when parsing urls from headers, replies with Bad Request(400). Fixes #2767. \ No newline at end of file
diff --git a/changes/bug4341 b/changes/bug4341
new file mode 100644
index 000000000..8853a86a0
--- /dev/null
+++ b/changes/bug4341
@@ -0,0 +1,2 @@
+o Minor bugfix:
+ - Config now handles fingerprints which are missing their initial '$'
diff --git a/changes/bug5040 b/changes/bug5040
new file mode 100644
index 000000000..720665b4d
--- /dev/null
+++ b/changes/bug5040
@@ -0,0 +1,8 @@
+ o Minor features:
+ - Bridges now track GeoIP information and the number of their
+ users even when pluggable transports are in use. These
+ statistics are reported in their extra-info descriptors like
+ normal bridges do. Resolves ticket 4773.
+ - Bridges now track the usage of their pluggable transports and
+ report statistics in their extra-info descriptors. Resolves
+ ticket 5040.
diff --git a/changes/bug5609 b/changes/bug5609
new file mode 100644
index 000000000..1057e30b0
--- /dev/null
+++ b/changes/bug5609
@@ -0,0 +1,4 @@
+ o Minor features:
+ - Implement the TRANSPORT_LAUNCHED control port event that
+ notifies controllers about new launched pluggable
+ transports. Resolves ticket 5609.
diff --git a/changes/bug8929 b/changes/bug8929
new file mode 100644
index 000000000..2a1898b8a
--- /dev/null
+++ b/changes/bug8929
@@ -0,0 +1,4 @@
+ o Minor features:
+ - Add a new torrc option "ServerTransportOptions" that allows
+ bridge operators to pass configuration parameters to their
+ pluggable transports. Resolves ticket 8929.
diff --git a/changes/bug9108 b/changes/bug9108
new file mode 100644
index 000000000..9d2d3d8b6
--- /dev/null
+++ b/changes/bug9108
@@ -0,0 +1,3 @@
+ o Code simplifications and refactoring:
+ - Make global_circuitlist data structure in circuitlist.c
+ a doubly-linked list. Bug #9108.
diff --git a/changes/bug9207 b/changes/bug9207
new file mode 100644
index 000000000..66f8e344e
--- /dev/null
+++ b/changes/bug9207
@@ -0,0 +1,2 @@
+ o Minor Bugfixes:
+ - Updated configuration advice for installing openssl on Debian. Fixes #9207.
diff --git a/changes/bug9254 b/changes/bug9254
new file mode 100644
index 000000000..5179bdc52
--- /dev/null
+++ b/changes/bug9254
@@ -0,0 +1,4 @@
+ o Minor bugfixes:
+ - Fix a spurious compilation warning with some older versions of
+ GCC on FreeBSD. Fixes bug 9254; bugfix on 0.2.4.14-alpha.
+
diff --git a/changes/bug9258 b/changes/bug9258
new file mode 100644
index 000000000..5165b3a67
--- /dev/null
+++ b/changes/bug9258
@@ -0,0 +1,6 @@
+ o Minor bugfixes:
+ - Reject relative control socket paths and emit a warning.
+ Previously single-component control socket paths would be rejected,
+ but Tor would not log why it could not validate the config.
+ Now we reject all relative control socket paths and print a warning.
+ Fixes bug 9047; bugfix on 0.2.2.6-alpha.
diff --git a/changes/bug9267 b/changes/bug9267
new file mode 100644
index 000000000..95a621148
--- /dev/null
+++ b/changes/bug9267
@@ -0,0 +1,4 @@
+ o Minor bugfixes:
+ - Added optional parameter to contrib/coverage script to specify directory
+ to put gcov files in, and added reset-gcov target to top-level makefile.
+ Fixes bug #9267.
diff --git a/changes/bug9288 b/changes/bug9288
new file mode 100644
index 000000000..59bf414ea
--- /dev/null
+++ b/changes/bug9288
@@ -0,0 +1,4 @@
+ o Minor bugfixes:
+ - Fix an invalid memory read that occured when a pluggable
+ transport proxy failed its configuration protocol.
+ Fixes bug 9288.
diff --git a/changes/bug9295 b/changes/bug9295
new file mode 100644
index 000000000..2c113616c
--- /dev/null
+++ b/changes/bug9295
@@ -0,0 +1,4 @@
+ o Major bugfixes:
+ - Avoid a crash when using --hash-password. Fixes bug 9295; bugfix on
+ 0.2.4.15-rc. Found by stem integration tests.
+
diff --git a/changes/bug9309 b/changes/bug9309
new file mode 100644
index 000000000..38c462bc0
--- /dev/null
+++ b/changes/bug9309
@@ -0,0 +1,6 @@
+ o Minor bugfixes:
+ - When evaluating whether to use a connection that we haven't
+ decided is canonical using a recent link protocol version,
+ decide that it's canonical only if it used address _does_
+ match the desired address. Fixes bug 9309; bugfix on
+ 0.2.4.4-alpha. Reported by skruffy.
diff --git a/changes/bug9337 b/changes/bug9337
new file mode 100644
index 000000000..ce99bc818
--- /dev/null
+++ b/changes/bug9337
@@ -0,0 +1,4 @@
+ o Major bugfixes (DNS):
+ - Avoid an assertion failure when processing DNS replies without the
+ answer types we expected. Fixes bug 9337; bugfix on 0.2.4.7-alpha.
+
diff --git a/changes/bug9354 b/changes/bug9354
new file mode 100644
index 000000000..68fc81a59
--- /dev/null
+++ b/changes/bug9354
@@ -0,0 +1,5 @@
+ o Minor bugfixes:
+ - Make the default behavior of NumDirectoryGuards be to track
+ NumEntryGuards. Now a user who changes only NumEntryGuards will get
+ the behavior she expects. Fixes bug 9354; bugfix on 0.2.4.8-alpha.
+
diff --git a/changes/bug9366 b/changes/bug9366
new file mode 100644
index 000000000..acc919e77
--- /dev/null
+++ b/changes/bug9366
@@ -0,0 +1,4 @@
+ o Minor features (usability):
+ - Warn and fail if a server is configured not to advertise any
+ ORPorts at all. (We need *something* to put in our descriptor, or
+ we just won't work.)
diff --git a/changes/bug9400 b/changes/bug9400
new file mode 100644
index 000000000..974224068
--- /dev/null
+++ b/changes/bug9400
@@ -0,0 +1,7 @@
+ o Minor bugfixes:
+
+ - Avoid double-closing the listener socket in our socketpair replacement
+ (used on Windows) in the case where the addresses on our opened
+ sockets don't match what we expected. Fixes bug 9400; bugfix on
+ every released Tor version. Found by Coverity.
+
diff --git a/changes/bug9543 b/changes/bug9543
new file mode 100644
index 000000000..753947f6f
--- /dev/null
+++ b/changes/bug9543
@@ -0,0 +1,4 @@
+ o Minor bugfixes:
+ - Avoid overflows when the user sets MaxCircuitDirtiness to a
+ ridiculously high value, by imposing a (ridiculously high) 30-day
+ maximum on MaxCircuitDirtiness.
diff --git a/changes/bug9546 b/changes/bug9546
new file mode 100644
index 000000000..2145e35d8
--- /dev/null
+++ b/changes/bug9546
@@ -0,0 +1,11 @@
+ o Major bugfixes:
+
+ - When a relay is extending a circuit to a bridge, it needs to send a
+ NETINFO cell, even when the bridge hasn't sent an AUTH_CHALLENGE
+ cell. Fixes bug 9546; bugfix on 0.2.3.6-alpha.
+
+ - Bridges send AUTH_CHALLENGE cells during their handshakes; previously
+ they did not, which prevented relays from successfully connecting
+ to a bridge for self-test or bandwidth testing. Fixes bug 9546;
+ bugfix on 0.2.3.6-alpha.
+
diff --git a/changes/bug9564 b/changes/bug9564
new file mode 100644
index 000000000..0df00e369
--- /dev/null
+++ b/changes/bug9564
@@ -0,0 +1,5 @@
+ o Minor bugfixes:
+ - If the time to download the next old-style networkstatus is in
+ the future, do not decline to consider whether to download the
+ next microdescriptor networkstatus. Fixes bug 9564. Bugfix on
+ 0.2.3.14-alpha.
diff --git a/changes/bug9645a b/changes/bug9645a
new file mode 100644
index 000000000..2daba65a0
--- /dev/null
+++ b/changes/bug9645a
@@ -0,0 +1,5 @@
+ o Minor bugfixes:
+ - If we are unable to save a microdescriptor to the journal, do not
+ drop it from memory and then reattempt downloading it. Fixes bug
+ 9645; bugfix on 0.2.2.6-alpha.
+
diff --git a/changes/bug9671_023 b/changes/bug9671_023
new file mode 100644
index 000000000..035ca5cde
--- /dev/null
+++ b/changes/bug9671_023
@@ -0,0 +1,5 @@
+ o Major bugfixes:
+ - If the circuit build timeout logic is disabled (via the consensus,
+ or because we are an authority), then don't build testing circuits.
+ Fixes bug 9657; bugfix on 0.2.2.14-alpha.
+
diff --git a/changes/doc-heartbeat-loglevel b/changes/doc-heartbeat-loglevel
new file mode 100644
index 000000000..91f40ad26
--- /dev/null
+++ b/changes/doc-heartbeat-loglevel
@@ -0,0 +1,3 @@
+ o Minor documentation fixes:
+ - Fix the documentation of HeartbeatPeriod to say that the heartbeat
+ message is logged at notice, not at info.
diff --git a/changes/fancy_testing b/changes/fancy_testing
new file mode 100644
index 000000000..fa5b5703c
--- /dev/null
+++ b/changes/fancy_testing
@@ -0,0 +1,27 @@
+ o Build features:
+
+ - Tor now builds each source file in two modes: a mode that avoids
+ exposing identifiers needlessly, and another mode that exposes
+ more identifiers for testing. This lets the compiler do better at
+ optimizing the production code, while enabling us to take more
+ radical measures to let the unit tests test things.
+
+ - The production builds no longer include functions used only
+ in the unit tests; all functions exposed from a module for
+ unit-testing only are now static in production builds.
+
+ - Add an --enable-coverage configuration option to make the unit
+ tests (and a new src/or/tor-cov target) to build with gcov test
+ coverage support.
+
+ o Testing:
+
+ - We now have rudimentary function mocking support that our unit
+ tests can use to test functions in isolation. Function mocking
+ lets the tests temporarily replace a function's dependencies with
+ stub functions, so that the tests can check the function without
+ invoking the other functions it calls.
+
+ - Add more unit tests for the <circid,channel>->circuit map, and
+ the destroy-cell-tracking code to fix bug 7912.
+
diff --git a/changes/feature9574 b/changes/feature9574
new file mode 100644
index 000000000..723606e39
--- /dev/null
+++ b/changes/feature9574
@@ -0,0 +1,7 @@
+ o Major features:
+ - Relays now process the new "NTor" circuit-level handshake requests
+ with higher priority than the old "TAP" circuit-level handshake
+ requests. We still process some TAP requests to not totally starve
+ 0.2.3 clients when NTor becomes popular. A new consensus parameter
+ "NumNTorsPerTAP" lets us tune the balance later if we need to.
+ Implements ticket 9574.
diff --git a/changes/geoip-august2013 b/changes/geoip-august2013
new file mode 100644
index 000000000..bd15177a0
--- /dev/null
+++ b/changes/geoip-august2013
@@ -0,0 +1,3 @@
+ o Minor features:
+ - Update to the August 7 2013 Maxmind GeoLite Country database.
+
diff --git a/changes/ticket5129 b/changes/ticket5129
new file mode 100644
index 000000000..c05ca68a3
--- /dev/null
+++ b/changes/ticket5129
@@ -0,0 +1,3 @@
+ o Minor features:
+ - Use the SOCK_NONBLOCK socket type, if supported, to open nonblocking
+ sockets in a single system call. Implements ticket #5129.
diff --git a/changes/ticket5526 b/changes/ticket5526
new file mode 100644
index 000000000..35911d4b0
--- /dev/null
+++ b/changes/ticket5526
@@ -0,0 +1,4 @@
+ o Minor features:
+ - Log current accounting state (bytes sent and received + remaining
+ time for the current accounting period) in the server's
+ heartbeat message. Implements ticket 5526; patch from Peter Retzlaff.
diff --git a/changes/ticket9108 b/changes/ticket9108
new file mode 100644
index 000000000..3d3038cc2
--- /dev/null
+++ b/changes/ticket9108
@@ -0,0 +1,3 @@
+ o Code simplification and refactoring:
+ - Use a doubly-linked list to implement the global circuit list.
+ Fix for ticket 9108. Patch from Marek Majkowski.
diff --git a/changes/ticket9658 b/changes/ticket9658
new file mode 100644
index 000000000..a8db2efba
--- /dev/null
+++ b/changes/ticket9658
@@ -0,0 +1,4 @@
+ o Minor features:
+ - Track how many "TAP" and "NTor" circuit handshake requests we get,
+ and how many we complete, and log it every hour to help relay
+ operators follow trends in network load. Addresses ticket 9658.
diff --git a/changes/ticket_9214 b/changes/ticket_9214
new file mode 100644
index 000000000..f1e43caeb
--- /dev/null
+++ b/changes/ticket_9214
@@ -0,0 +1,6 @@
+ o Minor features:
+ - Accept bandwidth and space limits in bits as well as bytes.
+ (Anywhere in the configuration file that you can say "2 Kilobytes",
+ you can now say "16 kilobits", and so on.) Resolves ticket 9214.
+ Patch by CharlieB.
+
diff --git a/changes/v3_intro_len b/changes/v3_intro_len
new file mode 100644
index 000000000..fbe39bce3
--- /dev/null
+++ b/changes/v3_intro_len
@@ -0,0 +1,8 @@
+ o Major bugfixes:
+
+ - Fix an uninitialized read that could (in some cases) lead to a remote
+ crash while parsing INTRODUCE 1 cells. (This is, so far as we know,
+ unrelated to the recent news.) Fixes bug XXX; bugfix on
+ 0.2.4.1-alpha. Anybody running a hidden service on the experimental
+ 0.2.4.x branch should upgrade.
+
diff --git a/configure.ac b/configure.ac
index 8992c84e0..7259d8812 100644
--- a/configure.ac
+++ b/configure.ac
@@ -39,6 +39,13 @@ AC_ARG_ENABLE(static-tor,
AS_HELP_STRING(--enable-static-tor, Create an entirely static Tor binary. Requires --with-openssl-dir and --with-libevent-dir and --with-zlib-dir))
AC_ARG_ENABLE(curve25519,
AS_HELP_STRING(--disable-curve25519, Build Tor with no curve25519 elliptic-curve crypto support))
+AC_ARG_ENABLE(unittests,
+ AS_HELP_STRING(--disable-unittests, [Don't build unit tests for Tor. Risky!]))
+AC_ARG_ENABLE(coverage,
+ AS_HELP_STRING(--enable-coverage, [Enable coverage support in the unit-test build]))
+
+AM_CONDITIONAL(UNITTESTS_ENABLED, test x$enable_unittests != xno)
+AM_CONDITIONAL(COVERAGE_ENABLED, test x$enable_coverage = xyes)
if test "$enable_static_tor" = "yes"; then
enable_static_libevent="yes";
@@ -498,7 +505,7 @@ dnl ------------------------------------------------------
dnl Where do you live, openssl? And how do we call you?
tor_openssl_pkg_redhat="openssl"
-tor_openssl_pkg_debian="libssl"
+tor_openssl_pkg_debian="libssl-dev"
tor_openssl_devpkg_redhat="openssl-devel"
tor_openssl_devpkg_debian="libssl-dev"
@@ -1465,7 +1472,12 @@ if test x$enable_gcc_warnings = xyes || test x$enable_gcc_warnings_advisory = xy
# CFLAGS="$CFLAGS -Winline"
fi
-
+if test "$enable_coverage" = yes && test "$have_clang" = "no"; then
+ case "$host_os" in
+ darwin*)
+ AC_MSG_WARN([Tried to enable coverage on OSX without using the clang compiler. This might not work! If coverage fails, use CC=clang when configuring with --enable-profiling.])
+ esac
+fi
CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent $TOR_CPPFLAGS_openssl $TOR_CPPFLAGS_zlib"
diff --git a/contrib/cov-blame b/contrib/cov-blame
new file mode 100755
index 000000000..601f21195
--- /dev/null
+++ b/contrib/cov-blame
@@ -0,0 +1,48 @@
+#!/usr/bin/python
+
+import os
+import re
+import subprocess
+import sys
+
+def handle_file(source_fname, cov_fname):
+
+ lines_blm = subprocess.Popen(["git", "blame", source_fname], stdout=subprocess.PIPE).stdout.readlines()
+ lines_cov = open(cov_fname).readlines()
+
+ # XXXX expensive!
+ while re.match(r'\s*-:\s*0:', lines_cov[0]):
+ del lines_cov[0]
+
+ if len(lines_blm) != len(lines_cov):
+ print >>sys.stderr, "MISMATCH IN NUMBER OF LINES in",source_fname
+
+ for b,c in zip(lines_blm, lines_cov):
+ m = re.match(r'\s*([^\s:]+):', c)
+ if not m:
+ print >>sys.stderr, "CONFUSING LINE %r"% c
+ cov = 'X'
+ elif m.group(1) == '-':
+ cov = '-'
+ elif m.group(1)[0] == '#':
+ cov = '#'
+ elif m.group(1)[0].isdigit():
+ cov = '1'
+ else:
+ print >>sys.stderr, "CONFUSING LINE %r"% c
+ cov = 'X'
+
+ print cov, b,
+
+COV_DIR = sys.argv[1]
+SOURCES = sys.argv[2:]
+
+for fn in SOURCES:
+ _, base = os.path.split(fn)
+ cfn = os.path.join(COV_DIR, base)
+ cfn += ".gcov"
+ if os.path.exists(cfn):
+ handle_file(fn, cfn)
+ else:
+ print >>sys.stderr, "NO FILE EXISTS CALLED ",cfn
+
diff --git a/contrib/cov-diff b/contrib/cov-diff
new file mode 100755
index 000000000..33a54802b
--- /dev/null
+++ b/contrib/cov-diff
@@ -0,0 +1,17 @@
+#!/bin/sh
+# Copyright 2013 The Tor Project, Inc.
+# See LICENSE for licensing information.
+
+# cov-diff -- compare two directories full of gcov files.
+
+DIRA="$1"
+DIRB="$2"
+
+for A in $DIRA/*; do
+ B=$DIRB/`basename $A`
+ perl -pe 's/^\s*\d+:/ 1:/; s/^([^:]+:)[\d\s]+:/$1/;' "$A" > "$A.tmp"
+ perl -pe 's/^\s*\d+:/ 1:/; s/^([^:]+:)[\d\s]+:/$1/;' "$B" > "$B.tmp"
+ diff -u "$A.tmp" "$B.tmp"
+ rm "$A.tmp" "$B.tmp"
+done
+
diff --git a/contrib/coverage b/contrib/coverage
new file mode 100755
index 000000000..f4ae47582
--- /dev/null
+++ b/contrib/coverage
@@ -0,0 +1,46 @@
+#!/bin/sh
+# Copyright 2013 The Tor Project, Inc.
+# See LICENSE for licensing information.
+
+# coverage -- run gcov on the appropriate set of object files to extract
+# coverage information.
+
+dst=$1
+
+for fn in src/or/*.c src/common/*.c; do
+ BN=`basename $fn`
+ DN=`dirname $fn`
+ F=`echo $BN | sed -e 's/\.c$//;'`
+ GC="${BN}.gcov"
+ # Figure out the object file names
+ ONS=`echo ${DN}/src_*-${F}.o`
+ ONS_WILDCARD_LITERAL="${DN}/src_*-${F}.o"
+ # If the wildcard didn't expand, no files
+ if [ "$ONS" != "${ONS_WILDCARD_LITERAL}" ]
+ then
+ for on in $ONS; do
+ # We should have a gcno file
+ GCNO=`echo $on | sed -e 's/\.o$/\.gcno/;'`
+ if [ -e $GCNO ]
+ then
+ # No need to test for gcda, since gcov assumes no execution
+ # if it's absent
+ rm -f $GC
+ gcov -o $on $fn
+ if [ -e $GC ]
+ then
+ if [ -n $dst ]
+ then
+ mv $GC $dst/$GC
+ fi
+ else
+ echo "gcov -o $on $fn didn't make a .gcov file"
+ fi
+ else
+ echo "Couldn't find gcno file for $on"
+ fi
+ done
+ else
+ echo "No object file found matching source file $fn"
+ fi
+done
diff --git a/doc/HACKING b/doc/HACKING
index b7cd8952d..9f9e6447b 100644
--- a/doc/HACKING
+++ b/doc/HACKING
@@ -118,25 +118,22 @@ Running gcov for unit test coverage
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-----
- make clean
- make CFLAGS='-g -fprofile-arcs -ftest-coverage'
- ./src/test/test
- gcov -o src/common src/common/*.[ch]
- gcov -o src/or src/or/*.[ch]
- cd ../or; gcov *.[ch]
+ ./configure --enable-coverage
+ make
+ ./src/test/test
+ mkdir coverage-output
+ ./contrib/coverage coverage-output
-----
-Then, look at the .gcov files. '-' before a line means that the
-compiler generated no code for that line. '######' means that the
-line was never reached. Lines with numbers were called that number
-of times.
+(On OSX, you'll need to start with "--enable-coverage CC=clang".)
+
+Then, look at the .gcov files in coverage-output. '-' before a line means
+that the compiler generated no code for that line. '######' means that the
+line was never reached. Lines with numbers were called that number of times.
If that doesn't work:
* Try configuring Tor with --disable-gcc-hardening
- * On recent OSX versions, you might need to add CC=clang to your
- build line, as in:
- make CFLAGS='-g -fprofile-arcs -ftest-coverage' CC=clang
- Their llvm-gcc doesn't work so great for me.
+ * You might need to run 'make clean' after you run './configure'.
Profiling Tor with oprofile
~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -493,12 +490,8 @@ in their approved versions list.
8) scp the tarball and its sig to the website in the dist/ directory
(i.e. /srv/www-master.torproject.org/htdocs/dist/ on vescum). Edit
-include/versions.wmi to note the new version. From your website checkout,
-run ./publish to build and publish the website.
-
-Try not to delay too much between scp'ing the tarball and running
-./publish -- the website has multiple A records and your scp only sent
-it to one of them.
+"include/versions.wmi" and "Makefile" to note the new version. From your
+website checkout, run ./publish to build and publish the website.
9) Email Erinn and weasel (cc'ing tor-assistants) that a new tarball
is up. This step should probably change to mailing more packagers.
diff --git a/doc/tor.1.txt b/doc/tor.1.txt
index a05ab33fc..737e7b4f8 100644
--- a/doc/tor.1.txt
+++ b/doc/tor.1.txt
@@ -124,42 +124,42 @@ option name with a forward slash.
GENERAL OPTIONS
---------------
-**BandwidthRate** __N__ **bytes**|**KBytes**|**MBytes**|**GBytes**::
+**BandwidthRate** __N__ **bytes**|**KBytes**|**MBytes**|**GBytes**|**KBits**|**MBits**|**GBits**::
A token bucket limits the average incoming bandwidth usage on this node to
the specified number of bytes per second, and the average outgoing
bandwidth usage to that same value. If you want to run a relay in the
public network, this needs to be _at the very least_ 30 KBytes (that is,
30720 bytes). (Default: 1 GByte)
-**BandwidthBurst** __N__ **bytes**|**KBytes**|**MBytes**|**GBytes**::
+**BandwidthBurst** __N__ **bytes**|**KBytes**|**MBytes**|**GBytes**|**KBits**|**MBits**|**GBits**::
Limit the maximum token bucket size (also known as the burst) to the given
number of bytes in each direction. (Default: 1 GByte)
-**MaxAdvertisedBandwidth** __N__ **bytes**|**KBytes**|**MBytes**|**GBytes**::
+**MaxAdvertisedBandwidth** __N__ **bytes**|**KBytes**|**MBytes**|**GBytes**|**KBits**|**MBits**|**GBits**::
If set, we will not advertise more than this amount of bandwidth for our
BandwidthRate. Server operators who want to reduce the number of clients
who ask to build circuits through them (since this is proportional to
advertised bandwidth rate) can thus reduce the CPU demands on their server
without impacting network performance.
-**RelayBandwidthRate** __N__ **bytes**|**KBytes**|**MBytes**|**GBytes**::
+**RelayBandwidthRate** __N__ **bytes**|**KBytes**|**MBytes**|**GBytes**|**KBits**|**MBits**|**GBits**::
If not 0, a separate token bucket limits the average incoming bandwidth
usage for \_relayed traffic_ on this node to the specified number of bytes
per second, and the average outgoing bandwidth usage to that same value.
Relayed traffic currently is calculated to include answers to directory
requests, but that may change in future versions. (Default: 0)
-**RelayBandwidthBurst** __N__ **bytes**|**KBytes**|**MBytes**|**GBytes**::
+**RelayBandwidthBurst** __N__ **bytes**|**KBytes**|**MBytes**|**GBytes**|**KBits**|**MBits**|**GBits**::
If not 0, limit the maximum token bucket size (also known as the burst) for
\_relayed traffic_ to the given number of bytes in each direction.
(Default: 0)
-**PerConnBWRate** __N__ **bytes**|**KBytes**|**MBytes**|**GBytes**::
+**PerConnBWRate** __N__ **bytes**|**KBytes**|**MBytes**|**GBytes**|**KBits**|**MBits**|**GBits**::
If set, do separate rate limiting for each connection from a non-relay.
You should never need to change this value, since a network-wide value is
published in the consensus and your relay will use that value. (Default: 0)
-**PerConnBWBurst** __N__ **bytes**|**KBytes**|**MBytes**|**GBytes**::
+**PerConnBWBurst** __N__ **bytes**|**KBytes**|**MBytes**|**GBytes**|**KBits**|**MBits**|**GBits**::
If set, do separate rate limiting for each connection from a non-relay.
You should never need to change this value, since a network-wide value is
published in the consensus and your relay will use that value. (Default: 0)
@@ -186,6 +186,20 @@ GENERAL OPTIONS
listening address of any pluggable transport proxy that tries to
launch __transport__.
+**ServerTransportOptions** __transport__ __k=v__ __k=v__ ...::
+ When this option is set, Tor will pass the __k=v__ parameters to
+ any pluggable transport proxy that tries to launch __transport__. +
+ (Example: ServerTransportOptions obfs45 shared-secret=bridgepasswd cache=/var/lib/tor/cache)
+
+**ExtORPort** \['address':]__port__|**auto**
+ Open this port to listen for Extended ORPort connections from your
+ pluggable transports.
+
+**ExtORPortCookieAuthFile** __Path__::
+ If set, this option overrides the default location and file name
+ for the Extended ORPort's cookie file -- the cookie file is needed
+ for pluggable transports to communicate through the Extended ORPort.
+
**ConnLimit** __NUM__::
The minimum number of file descriptors that must be available to the Tor
process before it will start. Tor will ask the OS for as many file
@@ -1048,7 +1062,8 @@ The following options are useful only for clients (that is, if
fraction of your paths. (Default: 1)
**UseEntryGuardsAsDirectoryGuards** **0**|**1**::
- If this option is set to 1, we try to use our entry guards as directory
+ If this option is set to 1, and UseEntryGuards is also set to 1,
+ we try to use our entry guards as directory
guards, and failing that, pick more nodes to act as our directory guards.
This helps prevent an adversary from enumerating clients. It's only
available for clients (non-relay, non-bridge) that aren't configured to
@@ -1061,7 +1076,8 @@ The following options are useful only for clients (that is, if
**NumDirectoryGuards** __NUM__::
If UseEntryGuardsAsDirectoryGuards is enabled, we try to make sure we
- have at least NUM routers to use as directory guards. (Default: 3)
+ have at least NUM routers to use as directory guards. If this option
+ is set to 0, use the value from NumEntryGuards. (Default: 0)
**GuardLifetime** __N__ **days**|**weeks**|**months**::
If nonzero, and UseEntryGuards is set, minimum time to keep a guard before
@@ -1533,11 +1549,11 @@ is non-zero):
**HeartbeatPeriod** __N__ **minutes**|**hours**|**days**|**weeks**::
Log a heartbeat message every **HeartbeatPeriod** seconds. This is
- a log level __info__ message, designed to let you know your Tor
+ a log level __notice__ message, designed to let you know your Tor
server is still alive and doing useful things. Settings this
to 0 will disable the heartbeat. (Default: 6 hours)
-**AccountingMax** __N__ **bytes**|**KBytes**|**MBytes**|**GBytes**|**TBytes**::
+**AccountingMax** __N__ **bytes**|**KBytes**|**MBytes**|**GBytes**|**KBits**|**MBits**|**GBits**|**TBytes**::
Never send more than the specified number of bytes in a given accounting
period, or receive more than that number in the period. For example, with
AccountingMax set to 1 GByte, a server could send 900 MBytes and
@@ -1674,7 +1690,7 @@ is non-zero):
If it hits this threshold, it will begin killing circuits until it
has recovered at least 10% of this memory. Do not set this option too
low, or your relay may be unreliable under load. This option only
- effects circuit queues, so the actual process size will be larger than
+ affects circuit queues, so the actual process size will be larger than
this. (Default: 8GB)
DIRECTORY SERVER OPTIONS
@@ -1869,12 +1885,12 @@ DIRECTORY AUTHORITY SERVER OPTIONS
Authoritative directories only. Like AuthDirMaxServersPerAddr, but applies
to addresses shared with directory authorities. (Default: 5)
-**AuthDirFastGuarantee** __N__ **bytes**|**KBytes**|**MBytes**|**GBytes**::
+**AuthDirFastGuarantee** __N__ **bytes**|**KBytes**|**MBytes**|**GBytes**|**KBits**|**MBits**|**GBits**::
Authoritative directories only. If non-zero, always vote the
Fast flag for any relay advertising this amount of capacity or
more. (Default: 100 KBytes)
-**AuthDirGuardBWGuarantee** __N__ **bytes**|**KBytes**|**MBytes**|**GBytes**::
+**AuthDirGuardBWGuarantee** __N__ **bytes**|**KBytes**|**MBytes**|**GBytes**|**KBits**|**MBits**|**GBits**::
Authoritative directories only. If non-zero, this advertised capacity
or more is always sufficient to satisfy the bandwidth requirement
for the Guard flag. (Default: 250 KBytes)
@@ -2060,7 +2076,7 @@ The following options are used for running a testing Tor network.
time. Changing this requires that **TestingTorNetwork** is set. (Default:
10 minutes)
-**TestingMinFastFlagThreshold** __N__ **bytes**|**KBytes**|**MBytes**|**GBytes**::
+**TestingMinFastFlagThreshold** __N__ **bytes**|**KBytes**|**MBytes**|**GBytes**|**KBits**|**MBits**|**GBits**::
Minimum value for the Fast flag. Overrides the ordinary minimum taken
from the consensus when TestingTorNetwork is set. (Default: 0.)
diff --git a/src/common/compat.c b/src/common/compat.c
index adabf6edd..8e2619f84 100644
--- a/src/common/compat.c
+++ b/src/common/compat.c
@@ -23,6 +23,7 @@
* we can also take out the configure check. */
#define _GNU_SOURCE
+#define COMPAT_PRIVATE
#include "compat.h"
#ifdef _WIN32
@@ -950,24 +951,40 @@ socket_accounting_unlock(void)
}
/** As close(), but guaranteed to work for sockets across platforms (including
- * Windows, where close()ing a socket doesn't work. Returns 0 on success, -1
- * on failure. */
+ * Windows, where close()ing a socket doesn't work. Returns 0 on success and
+ * the socket error code on failure. */
int
-tor_close_socket(tor_socket_t s)
+tor_close_socket_simple(tor_socket_t s)
{
int r = 0;
/* On Windows, you have to call close() on fds returned by open(),
- * and closesocket() on fds returned by socket(). On Unix, everything
- * gets close()'d. We abstract this difference by always using
- * tor_close_socket to close sockets, and always using close() on
- * files.
- */
-#if defined(_WIN32)
- r = closesocket(s);
-#else
- r = close(s);
-#endif
+ * and closesocket() on fds returned by socket(). On Unix, everything
+ * gets close()'d. We abstract this difference by always using
+ * tor_close_socket to close sockets, and always using close() on
+ * files.
+ */
+ #if defined(_WIN32)
+ r = closesocket(s);
+ #else
+ r = close(s);
+ #endif
+
+ if (r != 0) {
+ int err = tor_socket_errno(-1);
+ log_info(LD_NET, "Close returned an error: %s", tor_socket_strerror(err));
+ return err;
+ }
+
+ return r;
+}
+
+/** As tor_close_socket_simple(), but keeps track of the number
+ * of open sockets. Returns 0 on success, -1 on failure. */
+int
+tor_close_socket(tor_socket_t s)
+{
+ int r = tor_close_socket_simple(s);
socket_accounting_lock();
#ifdef DEBUG_SOCKET_COUNTING
@@ -982,13 +999,11 @@ tor_close_socket(tor_socket_t s)
if (r == 0) {
--n_sockets_open;
} else {
- int err = tor_socket_errno(-1);
- log_info(LD_NET, "Close returned an error: %s", tor_socket_strerror(err));
#ifdef _WIN32
- if (err != WSAENOTSOCK)
+ if (r != WSAENOTSOCK)
--n_sockets_open;
#else
- if (err != EBADF)
+ if (r != EBADF)
--n_sockets_open;
#endif
r = -1;
@@ -1034,33 +1049,61 @@ mark_socket_open(tor_socket_t s)
tor_socket_t
tor_open_socket(int domain, int type, int protocol)
{
+ return tor_open_socket_with_extensions(domain, type, protocol, 1, 0);
+}
+
+/** As socket(), but creates a nonblocking socket and
+ * counts the number of open sockets. */
+tor_socket_t
+tor_open_socket_nonblocking(int domain, int type, int protocol)
+{
+ return tor_open_socket_with_extensions(domain, type, protocol, 1, 1);
+}
+
+/** As socket(), but counts the number of open sockets and handles
+ * socket creation with either of SOCK_CLOEXEC and SOCK_NONBLOCK specified.
+ * <b>cloexec</b> and <b>nonblock</b> should be either 0 or 1 to indicate
+ * if the corresponding extension should be used.*/
+tor_socket_t
+tor_open_socket_with_extensions(int domain, int type, int protocol,
+ int cloexec, int nonblock)
+{
tor_socket_t s;
-#ifdef SOCK_CLOEXEC
- s = socket(domain, type|SOCK_CLOEXEC, protocol);
+#if defined(SOCK_CLOEXEC) && defined(SOCK_NONBLOCK)
+ int ext_flags = (cloexec ? SOCK_CLOEXEC : 0) |
+ (nonblock ? SOCK_NONBLOCK : 0);
+ s = socket(domain, type|ext_flags, protocol);
if (SOCKET_OK(s))
goto socket_ok;
/* If we got an error, see if it is EINVAL. EINVAL might indicate that,
- * even though we were built on a system with SOCK_CLOEXEC support, we
- * are running on one without. */
+ * even though we were built on a system with SOCK_CLOEXEC and SOCK_NONBLOCK
+ * support, we are running on one without. */
if (errno != EINVAL)
return s;
-#endif /* SOCK_CLOEXEC */
+#endif /* SOCK_CLOEXEC && SOCK_NONBLOCK */
s = socket(domain, type, protocol);
if (! SOCKET_OK(s))
return s;
#if defined(FD_CLOEXEC)
- if (fcntl(s, F_SETFD, FD_CLOEXEC) == -1) {
- log_warn(LD_FS,"Couldn't set FD_CLOEXEC: %s", strerror(errno));
-#if defined(_WIN32)
- closesocket(s);
+ if (cloexec) {
+ if (fcntl(s, F_SETFD, FD_CLOEXEC) == -1) {
+ log_warn(LD_FS,"Couldn't set FD_CLOEXEC: %s", strerror(errno));
+ tor_close_socket_simple(s);
+ return TOR_INVALID_SOCKET;
+ }
+ }
#else
- close(s);
+ (void)cloexec;
#endif
- return -1;
+
+ if (nonblock) {
+ if (set_socket_nonblocking(s) == -1) {
+ tor_close_socket_simple(s);
+ return TOR_INVALID_SOCKET;
+ }
}
-#endif
goto socket_ok; /* So that socket_ok will not be unused. */
@@ -1072,19 +1115,41 @@ tor_open_socket(int domain, int type, int protocol)
return s;
}
-/** As socket(), but counts the number of open sockets. */
+/** As accept(), but counts the number of open sockets. */
tor_socket_t
tor_accept_socket(tor_socket_t sockfd, struct sockaddr *addr, socklen_t *len)
{
+ return tor_accept_socket_with_extensions(sockfd, addr, len, 1, 0);
+}
+
+/** As accept(), but returns a nonblocking socket and
+ * counts the number of open sockets. */
+tor_socket_t
+tor_accept_socket_nonblocking(tor_socket_t sockfd, struct sockaddr *addr,
+ socklen_t *len)
+{
+ return tor_accept_socket_with_extensions(sockfd, addr, len, 1, 1);
+}
+
+/** As accept(), but counts the number of open sockets and handles
+ * socket creation with either of SOCK_CLOEXEC and SOCK_NONBLOCK specified.
+ * <b>cloexec</b> and <b>nonblock</b> should be either 0 or 1 to indicate
+ * if the corresponding extension should be used.*/
+tor_socket_t
+tor_accept_socket_with_extensions(tor_socket_t sockfd, struct sockaddr *addr,
+ socklen_t *len, int cloexec, int nonblock)
+{
tor_socket_t s;
-#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
- s = accept4(sockfd, addr, len, SOCK_CLOEXEC);
+#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC) && defined(SOCK_NONBLOCK)
+ int ext_flags = (cloexec ? SOCK_CLOEXEC : 0) |
+ (nonblock ? SOCK_NONBLOCK : 0);
+ s = accept4(sockfd, addr, len, ext_flags);
if (SOCKET_OK(s))
goto socket_ok;
/* If we got an error, see if it is ENOSYS. ENOSYS indicates that,
* even though we were built on a system with accept4 support, we
* are running on one without. Also, check for EINVAL, which indicates that
- * we are missing SOCK_CLOEXEC support. */
+ * we are missing SOCK_CLOEXEC/SOCK_NONBLOCK support. */
if (errno != EINVAL && errno != ENOSYS)
return s;
#endif
@@ -1094,13 +1159,24 @@ tor_accept_socket(tor_socket_t sockfd, struct sockaddr *addr, socklen_t *len)
return s;
#if defined(FD_CLOEXEC)
- if (fcntl(s, F_SETFD, FD_CLOEXEC) == -1) {
- log_warn(LD_NET, "Couldn't set FD_CLOEXEC: %s", strerror(errno));
- close(s);
- return TOR_INVALID_SOCKET;
+ if (cloexec) {
+ if (fcntl(s, F_SETFD, FD_CLOEXEC) == -1) {
+ log_warn(LD_NET, "Couldn't set FD_CLOEXEC: %s", strerror(errno));
+ tor_close_socket_simple(s);
+ return TOR_INVALID_SOCKET;
+ }
}
+#else
+ (void)cloexec;
#endif
+ if (nonblock) {
+ if (set_socket_nonblocking(s) == -1) {
+ tor_close_socket_simple(s);
+ return TOR_INVALID_SOCKET;
+ }
+ }
+
goto socket_ok; /* So that socket_ok will not be unused. */
socket_ok:
@@ -1222,17 +1298,29 @@ tor_socketpair(int family, int type, int protocol, tor_socket_t fd[2])
return 0;
#else
+ return tor_ersatz_socketpair(family, type, protocol, fd);
+#endif
+}
+
+#ifdef NEED_ERSATZ_SOCKETPAIR
+/**
+ * Helper used to implement socketpair on systems that lack it, by
+ * making a direct connection to localhost.
+ */
+STATIC int
+tor_ersatz_socketpair(int family, int type, int protocol, tor_socket_t fd[2])
+{
/* This socketpair does not work when localhost is down. So
* it's really not the same thing at all. But it's close enough
* for now, and really, when localhost is down sometimes, we
* have other problems too.
*/
- tor_socket_t listener = -1;
- tor_socket_t connector = -1;
- tor_socket_t acceptor = -1;
+ tor_socket_t listener = TOR_INVALID_SOCKET;
+ tor_socket_t connector = TOR_INVALID_SOCKET;
+ tor_socket_t acceptor = TOR_INVALID_SOCKET;
struct sockaddr_in listen_addr;
struct sockaddr_in connect_addr;
- int size;
+ socklen_t size;
int saved_errno = -1;
if (protocol
@@ -1283,7 +1371,6 @@ tor_socketpair(int family, int type, int protocol, tor_socket_t fd[2])
goto tidy_up_and_fail;
if (size != sizeof(listen_addr))
goto abort_tidy_up_and_fail;
- tor_close_socket(listener);
/* Now check we are talking to ourself by matching port and host on the
two sockets. */
if (getsockname(connector, (struct sockaddr *) &connect_addr, &size) == -1)
@@ -1294,6 +1381,7 @@ tor_socketpair(int family, int type, int protocol, tor_socket_t fd[2])
|| listen_addr.sin_port != connect_addr.sin_port) {
goto abort_tidy_up_and_fail;
}
+ tor_close_socket(listener);
fd[0] = connector;
fd[1] = acceptor;
@@ -1308,15 +1396,15 @@ tor_socketpair(int family, int type, int protocol, tor_socket_t fd[2])
tidy_up_and_fail:
if (saved_errno < 0)
saved_errno = errno;
- if (listener != -1)
+ if (SOCKET_OK(listener))
tor_close_socket(listener);
- if (connector != -1)
+ if (SOCKET_OK(connector))
tor_close_socket(connector);
- if (acceptor != -1)
+ if (SOCKET_OK(acceptor))
tor_close_socket(acceptor);
return -saved_errno;
-#endif
}
+#endif
/** Number of extra file descriptors to keep in reserve beyond those that we
* tell Tor it's allowed to use. */
@@ -1748,6 +1836,15 @@ get_user_homedir(const char *username)
* actually examine the filesystem; does a purely syntactic modification.
*
* The parent of the root director is considered to be iteself.
+ *
+ * Path separators are the forward slash (/) everywhere and additionally
+ * the backslash (\) on Win32.
+ *
+ * Cuts off any number of trailing path separators but otherwise ignores
+ * them for purposes of finding the parent directory.
+ *
+ * Returns 0 if a parent directory was successfully found, -1 otherwise (fname
+ * did not have any path separators or only had them at the end).
* */
int
get_parent_directory(char *fname)
diff --git a/src/common/compat.h b/src/common/compat.h
index 258fc9902..8e700a9a1 100644
--- a/src/common/compat.h
+++ b/src/common/compat.h
@@ -8,6 +8,7 @@
#include "orconfig.h"
#include "torint.h"
+#include "testsupport.h"
#ifdef _WIN32
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0501
@@ -450,10 +451,22 @@ typedef int socklen_t;
#define TOR_INVALID_SOCKET (-1)
#endif
+int tor_close_socket_simple(tor_socket_t s);
int tor_close_socket(tor_socket_t s);
+tor_socket_t tor_open_socket_with_extensions(
+ int domain, int type, int protocol,
+ int cloexec, int nonblock);
tor_socket_t tor_open_socket(int domain, int type, int protocol);
+tor_socket_t tor_open_socket_nonblocking(int domain, int type, int protocol);
tor_socket_t tor_accept_socket(tor_socket_t sockfd, struct sockaddr *addr,
socklen_t *len);
+tor_socket_t tor_accept_socket_nonblocking(tor_socket_t sockfd,
+ struct sockaddr *addr,
+ socklen_t *len);
+tor_socket_t tor_accept_socket_with_extensions(tor_socket_t sockfd,
+ struct sockaddr *addr,
+ socklen_t *len,
+ int cloexec, int nonblock);
int get_n_open_sockets(void);
#define tor_socket_send(s, buf, len, flags) send(s, buf, len, flags)
@@ -726,5 +739,13 @@ char *format_win32_error(DWORD err);
#endif
+#ifdef COMPAT_PRIVATE
+#if !defined(HAVE_SOCKETPAIR) || defined(_WIN32) || defined(TOR_UNIT_TESTS)
+#define NEED_ERSATZ_SOCKETPAIR
+STATIC int tor_ersatz_socketpair(int family, int type, int protocol,
+ tor_socket_t fd[2]);
+#endif
+#endif
+
#endif
diff --git a/src/common/crypto.c b/src/common/crypto.c
index 71d516683..684949964 100644
--- a/src/common/crypto.c
+++ b/src/common/crypto.c
@@ -1233,8 +1233,8 @@ crypto_pk_get_all_digests(crypto_pk_t *pk, digests_t *digests_out)
/** Copy <b>in</b> to the <b>outlen</b>-byte buffer <b>out</b>, adding spaces
* every four spaces. */
-/* static */ void
-add_spaces_to_fp(char *out, size_t outlen, const char *in)
+void
+crypto_add_spaces_to_fp(char *out, size_t outlen, const char *in)
{
int n = 0;
char *end = out+outlen;
@@ -1271,7 +1271,7 @@ crypto_pk_get_fingerprint(crypto_pk_t *pk, char *fp_out, int add_space)
}
base16_encode(hexdigest,sizeof(hexdigest),digest,DIGEST_LEN);
if (add_space) {
- add_spaces_to_fp(fp_out, FINGERPRINT_LEN+1, hexdigest);
+ crypto_add_spaces_to_fp(fp_out, FINGERPRINT_LEN+1, hexdigest);
} else {
strncpy(fp_out, hexdigest, HEX_DIGEST_LEN+1);
}
@@ -2405,8 +2405,8 @@ crypto_seed_rng(int startup)
/** Write <b>n</b> bytes of strong random data to <b>to</b>. Return 0 on
* success, -1 on failure.
*/
-int
-crypto_rand(char *to, size_t n)
+MOCK_IMPL(int,
+crypto_rand, (char *to, size_t n))
{
int r;
tor_assert(n < INT_MAX);
diff --git a/src/common/crypto.h b/src/common/crypto.h
index 2886306a6..2750ed810 100644
--- a/src/common/crypto.h
+++ b/src/common/crypto.h
@@ -15,6 +15,7 @@
#include <stdio.h>
#include "torint.h"
+#include "testsupport.h"
/*
Macro to create an arbitrary OpenSSL version number as used by
@@ -247,7 +248,7 @@ int crypto_expand_key_material_rfc5869_sha256(
/* random numbers */
int crypto_seed_rng(int startup);
-int crypto_rand(char *to, size_t n);
+MOCK_DECL(int,crypto_rand,(char *to, size_t n));
int crypto_strongest_rand(uint8_t *out, size_t out_len);
int crypto_rand_int(unsigned int max);
uint64_t crypto_rand_uint64(uint64_t max);
@@ -283,7 +284,6 @@ void secret_to_key(char *key_out, size_t key_out_len, const char *secret,
/** OpenSSL-based utility functions. */
void memwipe(void *mem, uint8_t byte, size_t sz);
-#ifdef CRYPTO_PRIVATE
/* Prototypes for private functions only used by tortls.c, crypto.c, and the
* unit tests. */
struct rsa_st;
@@ -294,9 +294,8 @@ crypto_pk_t *crypto_new_pk_from_rsa_(struct rsa_st *rsa);
struct evp_pkey_st *crypto_pk_get_evp_pkey_(crypto_pk_t *env,
int private);
struct dh_st *crypto_dh_get_dh_(crypto_dh_t *dh);
-/* Prototypes for private functions only used by crypto.c and test.c*/
-void add_spaces_to_fp(char *out, size_t outlen, const char *in);
-#endif
+
+void crypto_add_spaces_to_fp(char *out, size_t outlen, const char *in);
#endif
diff --git a/src/common/crypto_curve25519.c b/src/common/crypto_curve25519.c
index 88c723f37..9e83440e1 100644
--- a/src/common/crypto_curve25519.c
+++ b/src/common/crypto_curve25519.c
@@ -29,7 +29,7 @@ int curve25519_donna(uint8_t *mypublic,
#endif
#endif
-int
+STATIC int
curve25519_impl(uint8_t *output, const uint8_t *secret,
const uint8_t *basepoint)
{
diff --git a/src/common/crypto_curve25519.h b/src/common/crypto_curve25519.h
index 652f1883c..f9d533ba2 100644
--- a/src/common/crypto_curve25519.h
+++ b/src/common/crypto_curve25519.h
@@ -4,6 +4,7 @@
#ifndef TOR_CRYPTO_CURVE25519_H
#define TOR_CRYPTO_CURVE25519_H
+#include "testsupport.h"
#include "torint.h"
/** Length of a curve25519 public key when encoded. */
@@ -52,8 +53,8 @@ int curve25519_keypair_read_from_file(curve25519_keypair_t *keypair_out,
const char *fname);
#ifdef CRYPTO_CURVE25519_PRIVATE
-int curve25519_impl(uint8_t *output, const uint8_t *secret,
- const uint8_t *basepoint);
+STATIC int curve25519_impl(uint8_t *output, const uint8_t *secret,
+ const uint8_t *basepoint);
#endif
#endif
diff --git a/src/common/crypto_format.c b/src/common/crypto_format.c
index 93932f839..be669c8d2 100644
--- a/src/common/crypto_format.c
+++ b/src/common/crypto_format.c
@@ -3,7 +3,6 @@
/* Formatting and parsing code for crypto-related data structures. */
-#define CRYPTO_CURVE25519_PRIVATE
#include "orconfig.h"
#ifdef HAVE_SYS_STAT_H
#include <sys/stat.h>
diff --git a/src/common/include.am b/src/common/include.am
index e700bd5ca..032befd20 100644
--- a/src/common/include.am
+++ b/src/common/include.am
@@ -1,5 +1,15 @@
-noinst_LIBRARIES+= src/common/libor.a src/common/libor-crypto.a src/common/libor-event.a
+noinst_LIBRARIES += \
+ src/common/libor.a \
+ src/common/libor-crypto.a \
+ src/common/libor-event.a
+
+if UNITTESTS_ENABLED
+noinst_LIBRARIES += \
+ src/common/libor-testing.a \
+ src/common/libor-crypto-testing.a \
+ src/common/libor-event-testing.a
+endif
EXTRA_DIST+= \
src/common/common_sha1.i \
@@ -38,7 +48,7 @@ if CURVE25519_ENABLED
libcrypto_extra_source=src/common/crypto_curve25519.c
endif
-src_common_libor_a_SOURCES = \
+LIBOR_A_SOURCES = \
src/common/address.c \
src/common/compat.c \
src/common/container.c \
@@ -52,7 +62,7 @@ src_common_libor_a_SOURCES = \
src/common/sandbox.c \
$(libor_extra_source)
-src_common_libor_crypto_a_SOURCES = \
+LIBOR_CRYPTO_A_SOURCES = \
src/common/aes.c \
src/common/crypto.c \
src/common/crypto_format.c \
@@ -60,7 +70,23 @@ src_common_libor_crypto_a_SOURCES = \
src/common/tortls.c \
$(libcrypto_extra_source)
-src_common_libor_event_a_SOURCES = src/common/compat_libevent.c
+LIBOR_EVENT_A_SOURCES = src/common/compat_libevent.c
+
+src_common_libor_a_SOURCES = $(LIBOR_A_SOURCES)
+src_common_libor_crypto_a_SOURCES = $(LIBOR_CRYPTO_A_SOURCES)
+src_common_libor_event_a_SOURCES = $(LIBOR_EVENT_A_SOURCES)
+
+src_common_libor_testing_a_SOURCES = $(LIBOR_A_SOURCES)
+src_common_libor_crypto_testing_a_SOURCES = $(LIBOR_CRYPTO_A_SOURCES)
+src_common_libor_event_testing_a_SOURCES = $(LIBOR_EVENT_A_SOURCES)
+
+src_common_libor_testing_a_CPPFLAGS = -DTOR_UNIT_TESTS $(AM_CPPFLAGS)
+src_common_libor_crypto_testing_a_CPPFLAGS = -DTOR_UNIT_TESTS $(AM_CPPFLAGS)
+src_common_libor_event_testing_a_CPPFLAGS = -DTOR_UNIT_TESTS $(AM_CPPFLAGS)
+src_common_libor_testing_a_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS)
+src_common_libor_crypto_testing_a_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS)
+src_common_libor_event_testing_a_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS)
+
COMMONHEADERS = \
src/common/address.h \
@@ -76,6 +102,7 @@ COMMONHEADERS = \
src/common/mempool.h \
src/common/procmon.h \
src/common/sandbox.h \
+ src/common/testsupport.h \
src/common/torgzip.h \
src/common/torint.h \
src/common/torlog.h \
diff --git a/src/common/log.c b/src/common/log.c
index 6f95e518c..303fba93a 100644
--- a/src/common/log.c
+++ b/src/common/log.c
@@ -36,6 +36,10 @@
#include "torlog.h"
#include "container.h"
+/** Given a severity, yields an index into log_severity_list_t.masks to use
+ * for that severity. */
+#define SEVERITY_MASK_IDX(sev) ((sev) - LOG_ERR)
+
/** @{ */
/** The string we stick at the end of a log message when it is too long,
* and its length. */
diff --git a/src/common/sandbox.c b/src/common/sandbox.c
index b9ec99efa..33ffd3356 100644
--- a/src/common/sandbox.c
+++ b/src/common/sandbox.c
@@ -9,11 +9,15 @@
* \brief Code to enable sandboxing.
**/
+#include "orconfig.h"
+
+#ifndef _LARGEFILE64_SOURCE
/**
* Temporarily required for O_LARGEFILE flag. Needs to be removed
* with the libevent fix.
*/
#define _LARGEFILE64_SOURCE
+#endif
/** Malloc mprotect limit in bytes. */
#define MALLOC_MP_LIM 1048576
@@ -24,7 +28,6 @@
#include "sandbox.h"
#include "torlog.h"
-#include "orconfig.h"
#include "torint.h"
#include "util.h"
#include "tor_queue.h"
@@ -1319,7 +1322,7 @@ static void
sigsys_debugging(int nr, siginfo_t *info, void *void_context)
{
ucontext_t *ctx = (ucontext_t *) (void_context);
- char message[64];
+ char message[256];
int rv = 0, syscall, length, err;
(void) nr;
@@ -1331,11 +1334,12 @@ sigsys_debugging(int nr, siginfo_t *info, void *void_context)
syscall = ctx->uc_mcontext.gregs[REG_SYSCALL];
- /* XXXX Avoid use of snprintf; it isn't on the list of Stuff You're Allowed
- * To Do In A Signal Handler. */
- length = snprintf(message, sizeof(message),
- "\n\n(Sandbox) bad syscall (%d) was caught.\n",
- syscall);
+ strlcpy(message, "\n\n(Sandbox) Caught a bad syscall attempt (syscall 0x",
+ sizeof(message));
+ (void) format_hex_number_sigsafe(syscall, message+strlen(message),
+ sizeof(message)-strlen(message));
+ strlcat(message, ")\n", sizeof(message));
+ length = strlen(message);
err = 0;
if (sigsys_debugging_fd >= 0) {
diff --git a/src/common/testsupport.h b/src/common/testsupport.h
new file mode 100644
index 000000000..4a4f50b69
--- /dev/null
+++ b/src/common/testsupport.h
@@ -0,0 +1,80 @@
+/* Copyright (c) 2013, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#ifndef TOR_TESTSUPPORT_H
+#define TOR_TESTSUPPORT_H
+
+#ifdef TOR_UNIT_TESTS
+#define STATIC
+#else
+#define STATIC static
+#endif
+
+/** Quick and dirty macros to implement test mocking.
+ *
+ * To use them, suppose that you have a function you'd like to mock
+ * with the signature "void writebuf(size_t n, char *buf)". You can then
+ * declare the function as:
+ *
+ * MOCK_DECL(void, writebuf, (size_t n, char *buf));
+ *
+ * and implement it as:
+ *
+ * MOCK_IMPL(void
+ * writebuf,(size_t n, char *buf)
+ * {
+ * ...
+ * }
+ *
+ * For the non-testing build, this will expand simply into:
+ *
+ * void writebuf(size_t n, char *buf);
+ * void
+ * writebuf(size_t n, char *buf)
+ * {
+ * ...
+ * }
+ *
+ * But for the testing case, it will expand into:
+ *
+ * void writebuf__real(size_t n, char *buf);
+ * extern void (*writebuf)(size_t n, char *buf);
+ *
+ * void (*writebuf)(size_t n, char *buf) = writebuf__real;
+ * void
+ * writebuf__real(size_t n, char *buf)
+ * {
+ * ...
+ * }
+ *
+ * This is not a great mocking system! It is deliberately "the simplest
+ * thing that could work", and pays for its simplicity in its lack of
+ * features, and in its uglification of the Tor code. Replacing it with
+ * something clever would be a fine thing.
+ *
+ * @{ */
+#ifdef TOR_UNIT_TESTS
+#define MOCK_DECL(rv, funcname, arglist) \
+ rv funcname ##__real arglist; \
+ extern rv(*funcname) arglist
+#define MOCK_IMPL(rv, funcname, arglist) \
+ rv(*funcname) arglist = funcname ##__real; \
+ rv funcname ##__real arglist
+#define MOCK(func, replacement) \
+ do { \
+ (func) = (replacement); \
+ } while (0)
+#define UNMOCK(func) \
+ do { \
+ func = func ##__real; \
+ } while (0)
+#else
+#define MOCK_DECL(rv, funcname, arglist) \
+ rv funcname arglist
+#define MOCK_IMPL(rv, funcname, arglist) \
+ rv funcname arglist
+#endif
+/** @} */
+
+#endif
+
diff --git a/src/common/torlog.h b/src/common/torlog.h
index 9b2ff2c9f..ecd7e121e 100644
--- a/src/common/torlog.h
+++ b/src/common/torlog.h
@@ -114,12 +114,6 @@ typedef struct log_severity_list_t {
log_domain_mask_t masks[LOG_DEBUG-LOG_ERR+1];
} log_severity_list_t;
-#ifdef LOG_PRIVATE
-/** Given a severity, yields an index into log_severity_list_t.masks to use
- * for that severity. */
-#define SEVERITY_MASK_IDX(sev) ((sev) - LOG_ERR)
-#endif
-
/** Callback type used for add_callback_log. */
typedef void (*log_callback)(int severity, uint32_t domain, const char *msg);
diff --git a/src/common/tortls.c b/src/common/tortls.c
index 6bd557b8c..df706b001 100644
--- a/src/common/tortls.c
+++ b/src/common/tortls.c
@@ -48,9 +48,6 @@
#include "compat_libevent.h"
#endif
-#define CRYPTO_PRIVATE /* to import prototypes from crypto.h */
-#define TORTLS_PRIVATE
-
#include "crypto.h"
#include "tortls.h"
#include "util.h"
diff --git a/src/common/util.c b/src/common/util.c
index 8408a36f3..02c51a451 100644
--- a/src/common/util.c
+++ b/src/common/util.c
@@ -1224,17 +1224,14 @@ escaped(const char *s)
return escaped_val_;
}
-/** Escape every ";" or "\" character of <b>string</b>. Use
- * <b>escape_char</b> as the character to use for escaping.
- * The returned string is allocated on the heap and it's the
- * responsibility of the caller to free it. */
+/** Return a newly allocated string equal to <b>string</b>, except that every
+ * character in <b>chars_to_escape</b> is preceded by a backslash. */
char *
-tor_escape_str_for_socks_arg(const char *string)
+tor_escape_str_for_pt_args(const char *string, const char *chars_to_escape)
{
char *new_string = NULL;
char *new_cp = NULL;
size_t length, new_length;
- static const char *chars_to_escape = ";\\";
tor_assert(string);
@@ -2220,9 +2217,9 @@ write_bytes_to_file_impl(const char *fname, const char *str, size_t len,
/** As write_str_to_file, but does not assume a NUL-terminated
* string. Instead, we write <b>len</b> bytes, starting at <b>str</b>. */
-int
-write_bytes_to_file(const char *fname, const char *str, size_t len,
- int bin)
+MOCK_IMPL(int,
+write_bytes_to_file,(const char *fname, const char *str, size_t len,
+ int bin))
{
return write_bytes_to_file_impl(fname, str, len,
OPEN_FLAGS_REPLACE|(bin?O_BINARY:O_TEXT));
@@ -3384,13 +3381,13 @@ tor_join_win_cmdline(const char *argv[])
}
/**
- * Helper function to output hex numbers, called by
- * format_helper_exit_status(). This writes the hexadecimal digits of x into
- * buf, up to max_len digits, and returns the actual number of digits written.
- * If there is insufficient space, it will write nothing and return 0.
+ * Helper function to output hex numbers from within a signal handler.
+ *
+ * Writes the nul-terminated hexadecimal digits of <b>x</b> into a buffer
+ * <b>buf</b> of size <b>buf_len</b>, and return the actual number of digits
+ * written, not counting the terminal NUL.
*
- * This function DOES NOT add a terminating NUL character to its output: be
- * careful!
+ * If there is insufficient space, write nothing and return 0.
*
* This accepts an unsigned int because format_helper_exit_status() needs to
* call it with a signed int and an unsigned char, and since the C standard
@@ -3405,15 +3402,14 @@ tor_join_win_cmdline(const char *argv[])
* arbitrary C functions.
*/
int
-format_hex_number_for_helper_exit_status(unsigned int x, char *buf,
- int max_len)
+format_hex_number_sigsafe(unsigned int x, char *buf, int buf_len)
{
int len;
unsigned int tmp;
char *cur;
/* Sanity check */
- if (!buf || max_len <= 0)
+ if (!buf || buf_len <= 1)
return 0;
/* How many chars do we need for x? */
@@ -3429,7 +3425,7 @@ format_hex_number_for_helper_exit_status(unsigned int x, char *buf,
}
/* Bail if we would go past the end of the buffer */
- if (len > max_len)
+ if (len+1 > buf_len)
return 0;
/* Point to last one */
@@ -3441,10 +3437,13 @@ format_hex_number_for_helper_exit_status(unsigned int x, char *buf,
x >>= 4;
} while (x != 0 && cur >= buf);
+ buf[len] = '\0';
+
/* Return len */
return len;
}
+#ifndef _WIN32
/** Format <b>child_state</b> and <b>saved_errno</b> as a hex string placed in
* <b>hex_errno</b>. Called between fork and _exit, so must be signal-handler
* safe.
@@ -3460,7 +3459,7 @@ format_hex_number_for_helper_exit_status(unsigned int x, char *buf,
* On success return the number of characters added to hex_errno, not counting
* the terminating NUL; return -1 on error.
*/
-int
+STATIC int
format_helper_exit_status(unsigned char child_state, int saved_errno,
char *hex_errno)
{
@@ -3491,8 +3490,8 @@ format_helper_exit_status(unsigned char child_state, int saved_errno,
cur = hex_errno;
/* Emit child_state */
- written = format_hex_number_for_helper_exit_status(child_state,
- cur, left);
+ written = format_hex_number_sigsafe(child_state, cur, left);
+
if (written <= 0)
goto err;
@@ -3521,8 +3520,7 @@ format_helper_exit_status(unsigned char child_state, int saved_errno,
}
/* Emit unsigned_errno */
- written = format_hex_number_for_helper_exit_status(unsigned_errno,
- cur, left);
+ written = format_hex_number_sigsafe(unsigned_errno, cur, left);
if (written <= 0)
goto err;
@@ -3553,6 +3551,7 @@ format_helper_exit_status(unsigned char child_state, int saved_errno,
done:
return res;
}
+#endif
/* Maximum number of file descriptors, if we cannot get it via sysconf() */
#define DEFAULT_MAX_FD 256
@@ -3969,9 +3968,9 @@ tor_spawn_background(const char *const filename, const char **argv,
* <b>process_handle</b>.
* If <b>also_terminate_process</b> is true, also terminate the
* process of the process handle. */
-void
-tor_process_handle_destroy(process_handle_t *process_handle,
- int also_terminate_process)
+MOCK_IMPL(void,
+tor_process_handle_destroy,(process_handle_t *process_handle,
+ int also_terminate_process))
{
if (!process_handle)
return;
@@ -4480,9 +4479,9 @@ stream_status_to_string(enum stream_status stream_status)
/** Return a smartlist containing lines outputted from
* <b>handle</b>. Return NULL on error, and set
* <b>stream_status_out</b> appropriately. */
-smartlist_t *
-tor_get_lines_from_handle(HANDLE *handle,
- enum stream_status *stream_status_out)
+MOCK_IMPL(smartlist_t *,
+tor_get_lines_from_handle, (HANDLE *handle,
+ enum stream_status *stream_status_out))
{
int pos;
char stdout_buf[600] = {0};
@@ -4570,8 +4569,9 @@ log_from_handle(HANDLE *pipe, int severity)
/** Return a smartlist containing lines outputted from
* <b>handle</b>. Return NULL on error, and set
* <b>stream_status_out</b> appropriately. */
-smartlist_t *
-tor_get_lines_from_handle(FILE *handle, enum stream_status *stream_status_out)
+MOCK_IMPL(smartlist_t *,
+tor_get_lines_from_handle, (FILE *handle,
+ enum stream_status *stream_status_out))
{
enum stream_status stream_status;
char stdout_buf[400];
diff --git a/src/common/util.h b/src/common/util.h
index fc4ca291b..fdd8c135a 100644
--- a/src/common/util.h
+++ b/src/common/util.h
@@ -15,6 +15,7 @@
#include "torint.h"
#include "compat.h"
#include "di_ops.h"
+#include "testsupport.h"
#include <stdio.h>
#include <stdlib.h>
#ifdef _WIN32
@@ -230,7 +231,8 @@ int tor_digest256_is_zero(const char *digest);
char *esc_for_log(const char *string) ATTR_MALLOC;
const char *escaped(const char *string);
-char *tor_escape_str_for_socks_arg(const char *string);
+char *tor_escape_str_for_pt_args(const char *string,
+ const char *chars_to_escape);
struct smartlist_t;
int tor_vsscanf(const char *buf, const char *pattern, va_list ap) \
@@ -353,8 +355,9 @@ FILE *fdopen_file(open_file_t *file_data);
int finish_writing_to_file(open_file_t *file_data);
int abort_writing_to_file(open_file_t *file_data);
int write_str_to_file(const char *fname, const char *str, int bin);
-int write_bytes_to_file(const char *fname, const char *str, size_t len,
- int bin);
+MOCK_DECL(int,
+write_bytes_to_file,(const char *fname, const char *str, size_t len,
+ int bin));
/** An ad-hoc type to hold a string of characters and a count; used by
* write_chunks_to_file. */
typedef struct sized_chunk_t {
@@ -490,18 +493,21 @@ FILE *tor_process_get_stdout_pipe(process_handle_t *process_handle);
#endif
#ifdef _WIN32
-struct smartlist_t *
-tor_get_lines_from_handle(HANDLE *handle,
- enum stream_status *stream_status);
+MOCK_DECL(struct smartlist_t *,
+tor_get_lines_from_handle,(HANDLE *handle,
+ enum stream_status *stream_status));
#else
-struct smartlist_t *
-tor_get_lines_from_handle(FILE *handle,
- enum stream_status *stream_status);
+MOCK_DECL(struct smartlist_t *,
+tor_get_lines_from_handle,(FILE *handle,
+ enum stream_status *stream_status));
#endif
-int tor_terminate_process(process_handle_t *process_handle);
-void tor_process_handle_destroy(process_handle_t *process_handle,
- int also_terminate_process);
+int
+tor_terminate_process(process_handle_t *process_handle);
+
+MOCK_DECL(void,
+tor_process_handle_destroy,(process_handle_t *process_handle,
+ int also_terminate_process));
/* ===== Insecure rng */
typedef struct tor_weak_rng_t {
@@ -517,12 +523,13 @@ int32_t tor_weak_random_range(tor_weak_rng_t *rng, int32_t top);
* <b>n</b> */
#define tor_weak_random_one_in_n(rng, n) (0==tor_weak_random_range((rng),(n)))
+int format_hex_number_sigsafe(unsigned int x, char *buf, int max_len);
+
#ifdef UTIL_PRIVATE
/* Prototypes for private functions only used by util.c (and unit tests) */
-int format_hex_number_for_helper_exit_status(unsigned int x, char *buf,
- int max_len);
-int format_helper_exit_status(unsigned char child_state,
+#ifndef _WIN32
+STATIC int format_helper_exit_status(unsigned char child_state,
int saved_errno, char *hex_errno);
/* Space for hex values of child state, a slash, saved_errno (with
@@ -531,6 +538,8 @@ int format_helper_exit_status(unsigned char child_state,
1 + sizeof(int) * 2 + 1)
#endif
+#endif
+
const char *libor_get_digests(void);
#define ARRAY_LENGTH(x) (sizeof(x)) / sizeof(x[0])
diff --git a/src/config/geoip b/src/config/geoip
index 2b2fbf192..f7a5c084a 100644
--- a/src/config/geoip
+++ b/src/config/geoip
@@ -1,4 +1,4 @@
-# Last updated based on July 3 2013 Maxmind GeoLite Country
+# Last updated based on August 7 2013 Maxmind GeoLite Country
# Visit the following URL for details on the conversion:
# https://gitweb.torproject.org/tor.git/blob/HEAD:/src/config/README.geoip
16777216,16777471,AU
@@ -183,9 +183,7 @@
49807360,50331647,SE
50331648,57083940,US
57083941,57083941,BE
-57083942,68305407,US
-68305408,68305919,MX
-68305920,68965375,US
+57083942,68965375,US
68965376,68965631,CA
68965632,69156927,US
69156928,69156935,US
@@ -299,7 +297,8 @@
85360640,85362687,IL
85362688,85364735,GB
85364736,85366783,DE
-85366784,85367295,CZ
+85366784,85367039,CZ
+85367040,85367295,RU
85367296,85367551,SK
85367552,85367807,CZ
85367808,85368831,UA
@@ -552,9 +551,7 @@
87676928,87678975,RU
87678976,87679103,NL
87679104,87679231,ES
-87679232,87680063,NL
-87680064,87680511,ES
-87680512,87681023,NL
+87679232,87681023,NL
87681024,87683071,RU
87683072,87685119,SE
87685120,87687167,NL
@@ -636,8 +633,7 @@
90456064,90472447,RU
90472448,90476543,DE
90476544,90478591,FR
-90478592,90479103,GB
-90479104,90480639,VG
+90478592,90480639,VG
90480640,90482687,YE
90482688,90484735,SA
90484736,90488831,NO
@@ -668,7 +664,11 @@
90705920,90707967,CZ
90707968,90710015,IT
90710016,90718207,UA
-90718208,90720255,EU
+90718208,90718719,DE
+90718720,90719231,FR
+90719232,90719487,AT
+90719488,90719999,EU
+90720000,90720255,GB
90720256,90722303,IQ
90722304,90724351,FI
90724352,90726399,CH
@@ -729,15 +729,15 @@
92725248,92733439,SY
92733440,92734735,FR
92734736,92734739,DE
-92734740,92736511,FR
-92736512,92737023,GB
-92737024,92738719,FR
+92734740,92738719,FR
92738720,92738727,GB
92738728,92747711,FR
92747712,92747775,GB
92747776,92749067,FR
92749068,92749071,GB
-92749072,92786827,FR
+92749072,92757311,FR
+92757312,92757375,ES
+92757376,92786827,FR
92786828,92786831,IT
92786832,92798975,FR
92798976,93323263,RU
@@ -781,8 +781,8 @@
93681664,93683711,UA
93683712,93685759,AT
93685760,93687807,BE
-93687808,93691391,RU
-93691392,93691903,GB
+93687808,93691647,RU
+93691648,93691903,GB
93691904,93693951,PL
93693952,93695999,IE
93696000,93700095,FR
@@ -791,10 +791,7 @@
93704192,93708287,UA
93708288,93712383,DE
93712384,93714431,HU
-93714432,93714943,NL
-93714944,93715455,GB
-93715456,93715967,CA
-93715968,93716479,NL
+93714432,93716479,NL
93716480,93749247,GB
93749248,93753343,IT
93753344,93765631,GB
@@ -910,8 +907,7 @@
95367168,95369215,IT
95369216,95371263,GB
95371264,95374591,IT
-95374592,95374847,EU
-95374848,95375359,LY
+95374592,95375359,EU
95375360,95377407,NL
95377408,95387647,RU
95387648,95420415,DE
@@ -971,7 +967,7 @@
96897024,96899071,GB
96899072,96903167,AT
96903168,96911359,IR
-96911360,96919551,NL
+96911360,96919551,FR
96919552,96923647,IT
96923648,96925695,JO
96925696,96960511,GB
@@ -1044,7 +1040,6 @@
100329472,100331519,RU
100331520,100335615,TR
100335616,100401151,KZ
-100401152,100532223,DE
100532224,100564991,RO
100564992,100568063,SE
100568064,100568319,FR
@@ -1077,9 +1072,7 @@
135432192,135434239,CA
135434240,135441407,US
135441408,135441663,CA
-135441664,135603711,US
-135603712,135604223,CA
-135604224,135607039,US
+135441664,135607039,US
135607040,135607295,CA
135607296,135776255,US
135776256,135776511,GU
@@ -1088,21 +1081,19 @@
135794688,136237055,US
136237056,136239103,CA
136239104,136415487,US
-136415488,136415743,CA
+136415488,136415665,CA
+136415666,136415666,FR
+136415667,136415743,CA
136415744,136699903,US
136699904,136703999,A2
136704000,152305663,US
152305664,152338431,GB
152338432,167772159,US
-184549376,202706431,US
-202706432,202706943,PR
-202706944,202935551,US
+184549376,202935551,US
202935552,202935807,PR
202935808,203658751,US
203658752,203658815,VI
-203658816,204046335,US
-204046336,204046847,PR
-204046848,204047391,US
+203658816,204047391,US
204047392,204047423,VI
204047424,204047487,US
204047488,204047503,VI
@@ -1387,7 +1378,11 @@
387055616,387121151,PR
387121152,387825663,US
387825664,387833855,CA
-387833856,394264575,US
+387833856,391110655,US
+391110656,391110911,IL
+391110912,391111167,GB
+391111168,393215999,US
+398458880,400556031,US
402653184,405012479,US
405012480,405143551,CA
405143552,405180415,US
@@ -1604,7 +1599,6 @@
459540480,459541503,JP
459541504,459542527,IN
459542528,459544575,HK
-459544576,459545599,AU
459545600,459547647,JP
459548672,459550719,TH
459550720,459554815,JP
@@ -1818,20 +1812,20 @@
520494080,520494591,IT
520494592,520494847,CH
520494848,520495103,DK
-520495104,520495615,DE
-520495616,520495871,IT
+520495104,520495871,IT
520495872,520496383,DE
-520496384,520497151,IT
+520496384,520496895,IT
+520496896,520497151,ES
520497152,520497407,FR
520497408,520497663,IT
520497664,520498175,FR
520498176,520498431,CH
520498432,520498687,SE
-520498688,520499711,FR
-520499712,520500223,DE
+520498688,520499199,FR
+520499200,520500223,IT
520500224,520500479,LU
-520500480,520501247,DE
-520501248,520501759,IT
+520500480,520500735,DE
+520500736,520501759,IT
520501760,520503295,GB
520503296,520505343,PL
520505344,520507391,GB
@@ -1921,11 +1915,11 @@
521555968,521558015,NL
521558016,521560063,CY
521560064,521562111,PL
-521562112,521562911,DE
-521562912,521564159,GB
+521562112,521564159,GB
521564160,521565183,GR
521565184,521565439,GB
-521565440,521566207,GR
+521565440,521565695,US
+521565696,521566207,GR
521566208,521568255,LU
521568256,521601023,PT
521601024,521666559,RU
@@ -2078,10 +2072,7 @@
523010048,523014143,IL
523014144,523018239,ES
523018240,523022335,IT
-523022336,523024895,RU
-523024896,523025407,BZ
-523025408,523025919,RU
-523025920,523026431,NL
+523022336,523026431,RU
523026432,523030527,TR
523030528,523034623,FR
523034624,523038719,SE
@@ -2202,22 +2193,23 @@
529596416,529661951,TR
529661952,529727487,GE
529727488,529793023,HR
-529793024,529827839,RU
+529793024,529825791,RU
+529825792,529826815,CZ
+529826816,529827839,RU
529827840,529828863,CZ
529828864,529835007,RU
529835008,529836031,KG
-529836032,529836543,UA
-529836544,529837055,IL
+529836032,529837055,CZ
529837056,529839103,RU
-529839104,529839615,UA
-529839616,529840127,CY
+529839104,529840127,CZ
529840128,529841151,RU
529841152,529842175,UA
529842176,529843199,IN
-529843200,529844735,RU
-529844736,529845247,UA
+529843200,529844223,RU
+529844224,529845247,CZ
529845248,529846271,UZ
-529846272,529848319,RU
+529846272,529847295,CZ
+529847296,529848319,RU
529848320,529848575,NL
529848576,529849087,CZ
529849088,529849343,NL
@@ -2266,9 +2258,7 @@
531263488,531265535,RU
531265536,531267583,GB
531267584,531275775,UA
-531275776,531276799,US
-531276800,531277311,GB
-531277312,531277823,US
+531275776,531277823,US
531277824,531279871,RU
531279872,531281919,CZ
531281920,531283967,RU
@@ -2284,13 +2274,9 @@
531351552,531355647,NL
531355648,531357695,IR
531357696,531361791,HU
-531361792,531365887,CH
-531365888,531366399,DE
-531366400,531367935,CH
+531361792,531367935,CH
531367936,531369983,DE
-531369984,531371007,CH
-531371008,531371519,US
-531371520,531372031,JP
+531369984,531372031,CH
531372032,531372287,DE
531372288,531372543,CH
531372544,531372799,DE
@@ -2367,11 +2353,7 @@
532152320,532168703,DE
532168704,532185087,NL
532185088,532201471,IR
-532201472,532211711,RU
-532211712,532212223,LU
-532212224,532214783,RU
-532214784,532215295,AE
-532215296,532221951,RU
+532201472,532221951,RU
532221952,532223999,IT
532224000,532226047,NO
532226048,532234239,GB
@@ -2401,8 +2383,7 @@
532344576,532348671,GB
532348672,532348927,NL
532348928,532365311,PL
-532365312,532365823,AU
-532365824,532366335,DE
+532365312,532366335,DE
532366336,532367359,GB
532367360,532373503,DE
532373504,532375551,RU
@@ -2446,7 +2427,8 @@
532791296,532793343,LT
532793344,532795391,SE
532795392,532797439,CH
-532797440,532799487,IE
+532797440,532799231,IE
+532799232,532799487,GB
532799488,532801535,ES
532801536,532803583,DK
532803584,532805631,FR
@@ -2562,14 +2544,16 @@
534378496,534380543,FR
534380544,534511615,AE
534511616,534512639,BZ
-534512640,534513151,DE
+534512640,534512895,NL
+534512896,534513151,DE
534513152,534513215,BS
534513216,534513279,VG
-534513280,534513407,NL
-534513408,534513663,DE
+534513280,534513663,NL
534513664,534514687,US
534514688,534519039,DE
-534519040,534519327,NL
+534519040,534519263,NL
+534519264,534519295,IT
+534519296,534519327,NL
534519328,534519359,PK
534519360,534519391,PE
534519392,534519423,PK
@@ -2577,8 +2561,7 @@
534519456,534519487,BR
534519488,534519519,MX
534519520,534519551,CN
-534519552,534519807,GB
-534519808,534521855,US
+534519552,534521855,US
534521856,534523903,DE
534523904,534527999,LT
534528000,534544383,DE
@@ -2635,9 +2618,7 @@
539656192,539660287,IN
539660288,539671103,US
539671104,539671135,JP
-539671136,540711935,US
-540711936,540712447,NL
-540712448,540737535,US
+539671136,540737535,US
540737536,540737757,BZ
540737758,540737758,BR
540737759,540803071,BZ
@@ -2828,14 +2809,13 @@
621330432,621346815,PL
621346816,621355007,RU
621355008,621357055,UA
-621357056,621359615,RU
-621359616,621360127,UA
-621360128,621381631,RU
+621357056,621381631,RU
621381632,621383679,FR
621383680,621387775,RU
621387776,621389823,NL
621389824,621391871,SK
-621391872,621393919,CY
+621391872,621392127,IT
+621392128,621393919,CY
621393920,621395967,DE
621395968,621398015,CZ
621398016,621400063,TR
@@ -2879,8 +2859,8 @@
621983744,621985791,RS
621985792,621987839,US
621987840,621989887,DK
-621989888,621993471,SE
-621993472,621993983,DK
+621989888,621992959,SE
+621992960,621993983,DK
621993984,621998079,SI
621998080,622000127,ES
622000128,622004223,RU
@@ -2914,7 +2894,7 @@
622483456,622485503,GB
622485504,622487551,MK
622487552,622489599,GB
-622489600,622493695,US
+622489600,622493695,IL
622493696,622497791,MD
622497792,622499839,IL
622499840,622501887,SE
@@ -2987,9 +2967,7 @@
623673344,623689727,NO
623689728,623706111,RU
623706112,623771647,BY
-623771648,623774207,GB
-623774208,623774719,NL
-623774720,623775743,GB
+623771648,623775743,GB
623775744,623777791,IE
623777792,623779839,GB
623779840,623783935,IL
@@ -3001,17 +2979,14 @@
623796224,623798271,GB
623798272,623800319,GE
623800320,623801855,LU
-623801856,623802367,NL
-623802368,623803391,SE
+623801856,623803391,SE
623803392,623804415,NL
623804416,623806463,RU
623806464,623808511,NL
623808512,623810559,RU
623810560,623812607,ES
623812608,623820799,SE
-623820800,623821823,NL
-623821824,623822335,US
-623822336,623822847,NL
+623820800,623822847,NL
623822848,623824895,GB
623824896,623826943,CZ
623826944,623837183,UA
@@ -3188,10 +3163,7 @@
625842176,625844223,PL
625844224,625846271,IT
625846272,625848319,RS
-625848320,625851391,GB
-625851392,625851903,NL
-625851904,625852415,SE
-625852416,625854463,GB
+625848320,625854463,GB
625854464,625856511,DE
625856512,625860607,IT
625860608,625868799,CZ
@@ -3224,9 +3196,7 @@
628015104,628017151,GB
628017152,628019199,CH
628019200,628021247,UZ
-628021248,628021504,GB
-628021505,628022015,IE
-628022016,628023295,GB
+628021248,628023295,GB
628023296,628029439,RU
628029440,628031487,GB
628031488,628097023,HU
@@ -3236,8 +3206,7 @@
628236288,628244479,DE
628244480,628246527,FR
628246528,628248575,MT
-628248576,628249599,NL
-628249600,628250623,FI
+628248576,628250623,FI
628250624,628252671,NL
628252672,628259071,DE
628259072,628260863,SC
@@ -3318,7 +3287,9 @@
629669888,629735423,FI
629735424,629800959,IR
629800960,629866495,DE
-629866496,629879807,RU
+629866496,629869149,RU
+629869150,629869405,NL
+629869406,629879807,RU
629879808,629880063,DE
629880064,629880831,RU
629880832,629881855,EE
@@ -3405,9 +3376,7 @@
630806528,630808575,ES
630808576,630810175,NL
630810176,630816767,CH
-630816768,630828543,RO
-630828544,630829055,FR
-630829056,630833151,RO
+630816768,630833151,RO
630833152,630849535,NL
630849536,630980607,TR
630980608,631001087,RO
@@ -3631,9 +3600,7 @@
635723776,635725823,ES
635725824,635727871,US
635727872,635729919,RU
-635729920,635732479,DE
-635732480,635732991,US
-635732992,635748351,DE
+635729920,635748351,DE
635748352,635764735,IE
635764736,635830271,UA
635830272,635842559,DE
@@ -3641,8 +3608,7 @@
635846656,635854847,ES
635854848,635856895,NL
635856896,635858943,TR
-635858944,635860479,RU
-635860480,635860991,NL
+635858944,635860991,RU
635860992,635863039,BE
635863040,635895807,RU
635895808,635961343,KW
@@ -3705,8 +3671,7 @@
637186048,637206527,SE
637206528,637239295,NL
637239296,637272063,RO
-637272064,637272575,RU
-637272576,637276159,DE
+637272064,637276159,DE
637276160,637278207,RU
637278208,637288447,GB
637288448,637296639,AM
@@ -3715,9 +3680,7 @@
637300736,637302783,NO
637302784,637304831,NL
637304832,637313023,CH
-637313024,637313535,EU
-637313536,637314047,NL
-637314048,637315071,EU
+637313024,637315071,EU
637315072,637317119,NL
637317120,637319167,ES
637319168,637321215,AT
@@ -3725,9 +3688,27 @@
637323264,637325311,FR
637325312,637327359,NO
637327360,637329407,IR
-637329408,637332991,AT
-637332992,637333247,BR
-637333248,637337599,AT
+637329408,637330175,AT
+637330176,637330431,DE
+637330432,637330943,JP
+637330944,637331199,GB
+637331200,637331455,IE
+637331456,637331711,GB
+637331712,637331967,AT
+637331968,637332223,DE
+637332224,637332991,AT
+637332992,637333503,BR
+637333504,637333759,AU
+637333760,637334271,AT
+637334272,637334527,TW
+637334528,637334783,KR
+637334784,637335039,AE
+637335040,637335295,SK
+637335296,637335551,BG
+637335552,637336831,AT
+637336832,637337087,IT
+637337088,637337343,RU
+637337344,637337599,AT
637337600,637403135,NO
637403136,637534207,IR
637534208,641736703,US
@@ -3986,9 +3967,7 @@
692658176,692666367,ZA
692666368,692674559,TZ
692674560,692682751,ML
-692682752,692690431,NG
-692690432,692690687,GH
-692690688,692690943,NG
+692682752,692690943,NG
692690944,692707327,TZ
692707328,692715519,NG
692715520,692719615,BJ
@@ -4327,6 +4306,8 @@
700434432,700436479,LS
700436480,700437503,NG
700437504,700438527,MU
+700438528,700439551,BW
+700439552,700440575,GN
700440576,700442623,KE
700442624,700444671,ZW
700444672,700446719,GH
@@ -4335,24 +4316,13 @@
700448768,700579839,ZA
700579840,700587007,A2
700587008,700587263,ZM
-700587264,700588031,A2
-700588032,700588286,KM
-700588287,700588287,A2
+700587264,700588287,A2
700588288,700588543,KM
-700588544,700588798,IO
-700588799,700590847,A2
-700590848,700591103,CM
-700591104,700592383,A2
-700592384,700592639,KE
-700592640,700593151,A2
+700588544,700593151,A2
700593152,700594175,NG
700594176,700595967,A2
700595968,700596223,CD
-700596224,700604927,A2
-700604928,700605183,NG
-700605184,700632831,A2
-700632832,700633087,SA
-700633088,700645375,A2
+700596224,700645375,A2
700645376,700710911,ZA
700710912,700776447,EG
700776448,700841983,RW
@@ -4415,18 +4385,15 @@
701423616,701431807,NG
701431808,701439999,CI
701440000,701448191,MG
-701448192,701461247,KE
-701461248,701461503,CD
-701461504,701462783,KE
-701462784,701463295,CG
-701463296,701463394,KE
+701448192,701462783,KE
+701462784,701463039,CG
+701463040,701463394,KE
701463395,701463395,NG
701463396,701463528,KE
701463529,701463529,NG
701463530,701463807,KE
701463808,701464063,CG
-701464064,701464319,KE
-701464320,701464575,CG
+701464064,701464575,KE
701464576,701472767,MU
701472768,701480959,TG
701480960,701489151,CI
@@ -4725,7 +4692,8 @@
772276224,772284415,NL
772284416,772284927,RU
772284928,772285183,UA
-772285184,772296703,RU
+772285184,772285439,UZ
+772285440,772296703,RU
772296704,772300799,UA
772300800,772341759,RU
772341760,772407295,NO
@@ -4882,9 +4850,7 @@
773120000,773124095,GB
773124096,773128191,CH
773128192,773132287,DE
-773132288,773134335,IT
-773134336,773134847,CH
-773134848,773136383,IT
+773132288,773136383,IT
773136384,773140479,DK
773140480,773144575,CY
773144576,773148671,RU
@@ -4913,7 +4879,15 @@
773197824,773201919,CH
773201920,773206015,DE
773206016,773210111,RU
-773210112,773214207,US
+773210112,773210623,US
+773210624,773211135,ES
+773211136,773211391,FR
+773211392,773211647,US
+773211648,773211903,NL
+773211904,773212159,US
+773212160,773212671,NL
+773212672,773213183,GB
+773213184,773214207,US
773214208,773218303,FR
773218304,773222399,IS
773222400,773226495,SE
@@ -5089,9 +5063,7 @@
773963776,773971967,ME
773971968,773980159,UA
773980160,773988351,GB
-773988352,773999615,ES
-773999616,774000127,NL
-774000128,774000771,ES
+773988352,774000771,ES
774000772,774000772,NL
774000773,774001663,ES
774001664,774002687,NL
@@ -5319,7 +5291,8 @@
774162337,774162346,AZ
774162347,774162366,US
774162367,774162375,VA
-774162376,774162386,MX
+774162376,774162376,MX
+774162377,774162386,GB
774162387,774162396,ZW
774162397,774162406,SZ
774162407,774162416,SD
@@ -5570,14 +5543,20 @@
778304512,778305535,AL
778305536,778371071,IR
778371072,778436607,RU
-778436608,778498047,RO
+778436608,778476031,RO
+778476032,778476287,MD
+778476288,778498047,RO
778498048,778500095,NL
778500096,778502143,RO
778502144,778567679,GR
778567680,778633215,TR
-778633216,778666879,FR
+778633216,778666479,FR
+778666480,778666495,DE
+778666496,778666879,FR
778666880,778666943,GB
-778666944,778670975,FR
+778666944,778668863,FR
+778668864,778668895,DE
+778668896,778670975,FR
778670976,778670976,DE
778670977,778679212,FR
778679213,778679214,FI
@@ -5589,9 +5568,7 @@
778691712,778691727,GB
778691728,778698751,FR
778698752,778764287,TR
-778764288,778767871,HU
-778767872,778768383,RO
-778768384,778829823,HU
+778764288,778829823,HU
778829824,778895359,RO
778895360,778960895,LV
778960896,779026431,DE
@@ -5700,8 +5677,8 @@
782385152,782401535,SE
782401536,782417919,FR
782417920,782434303,AM
-782434304,782450175,SI
-782450176,782450687,BA
+782434304,782450431,SI
+782450432,782450687,BA
782450688,782467071,DE
782467072,782483455,RU
782483456,782499839,FI
@@ -5720,9 +5697,7 @@
782667520,782667775,LU
782667776,782671103,SC
782671104,782671359,SC
-782671360,782672639,SC
-782672640,782672895,RO
-782672896,782675455,SC
+782671360,782675455,SC
782675456,782676991,DE
782676992,782678015,SC
782678016,782678527,RU
@@ -5849,8 +5824,7 @@
783775744,783777791,AL
783777792,783779839,RU
783779840,783781887,DK
-783781888,783782399,US
-783782400,783783935,NL
+783781888,783783935,NL
783783936,783785983,DE
783785984,783788031,RU
783788032,783790079,NO
@@ -5923,9 +5897,7 @@
786595840,786597887,FR
786597888,786599935,EE
786599936,786601983,ES
-786601984,786603007,SE
-786603008,786603519,NL
-786603520,786604031,SE
+786601984,786604031,SE
786604032,786606079,RU
786606080,786608127,GB
786608128,786610175,IT
@@ -6049,9 +6021,7 @@
786933760,786935807,RU
786935808,786937855,DE
786937856,786939903,GB
-786939904,786940415,FI
-786940416,786941439,SE
-786941440,786941951,FI
+786939904,786941951,FI
786941952,786943999,CH
786944000,786946047,RU
786946048,786948095,FR
@@ -6117,7 +6087,9 @@
787192064,787192319,FR
787192320,787192575,DE
787192576,787192831,SE
-787192832,787193855,EU
+787192832,787193087,EU
+787193088,787193343,FI
+787193344,787193855,EU
787193856,787195903,RU
787195904,787197951,GB
787197952,787199999,FR
@@ -6218,21 +6190,7 @@
787906560,787939327,GR
787939328,787972095,GB
787972096,788004863,UA
-788004864,788005375,GB
-788005376,788006399,BE
-788006400,788006911,IT
-788006912,788007423,FR
-788007424,788007935,DE
-788007936,788008447,US
-788008448,788008959,SG
-788008960,788009471,IN
-788009472,788009983,ES
-788009984,788010495,HK
-788010496,788011007,AU
-788011008,788011519,CN
-788011520,788012031,AR
-788012032,788012543,CA
-788012544,788013055,RU
+788004864,788013055,GB
788013056,788021247,IR
788021248,788029439,SI
788029440,788045823,GB
@@ -6261,10 +6219,7 @@
788234240,788242431,SA
788242432,788250623,IR
788250624,788258815,KG
-788258816,788260351,DE
-788260352,788260863,NL
-788260864,788266495,DE
-788266496,788267007,IN
+788258816,788267007,DE
788267008,788271103,SE
788271104,788275199,DE
788275200,788279295,AL
@@ -6275,8 +6230,7 @@
788299776,788303871,DE
788303872,788307967,IT
788307968,788312063,RU
-788312064,788315135,FR
-788315136,788316159,LU
+788312064,788316159,FR
788316160,788320255,NL
788320256,788324351,UA
788324352,788328447,CZ
@@ -6470,7 +6424,7 @@
835715072,835977215,CN
835977216,836042751,JP
836042752,836046847,HK
-836046848,836050943,AU
+836046848,836050943,SG
836050944,836059135,IN
836059136,836075519,VN
836075520,836501503,TW
@@ -6505,20 +6459,21 @@
838467584,838729727,JP
838729728,838795263,KR
838795264,838860799,AU
-838860800,839062271,US
+838860800,839027967,US
+839027968,839030015,IN
+839030016,839062271,US
839062272,839064063,CA
839064064,839069183,US
839069184,839071231,CA
839071232,839072255,US
839072256,839074303,CA
-839074304,839101695,US
-839101696,839102207,CA
-839102208,839352319,US
+839074304,839352319,US
839352320,839353343,NL
839353344,839360511,US
-839360512,839366911,NL
+839360512,839364607,NL
+839364608,839366911,US
839366912,839367167,CZ
-839367168,839368703,NL
+839367168,839368703,US
839368704,839385087,CZ
839385088,840161595,US
840161596,840161596,US
@@ -6568,7 +6523,9 @@
897238056,905969663,DE
905969664,920125439,US
920125440,920256511,IE
-920256512,920911871,US
+920256512,920518655,US
+920518656,920649727,CN
+920649728,920911871,US
920911872,921042943,IE
921042944,921174015,US
921174016,921255935,BR
@@ -6965,9 +6922,7 @@
1024365056,1024365311,AP
1024365312,1024365727,JP
1024365728,1024365759,SG
-1024365760,1024370687,JP
-1024370688,1024371199,PH
-1024371200,1024375551,JP
+1024365760,1024375551,JP
1024375552,1024375807,AU
1024375808,1024376831,JP
1024376832,1024393215,PH
@@ -7163,7 +7118,9 @@
1041714944,1041715199,FR
1041715200,1041715567,GB
1041715568,1041715583,FR
-1041715584,1041716223,GB
+1041715584,1041716039,GB
+1041716040,1041716047,FR
+1041716048,1041716223,GB
1041716224,1041716479,FR
1041716480,1041718527,GB
1041718528,1041718783,FR
@@ -7187,9 +7144,7 @@
1041724928,1041725439,FR
1041725440,1041725695,GB
1041725696,1041725951,FR
-1041725952,1041727487,GB
-1041727488,1041727999,FR
-1041728000,1041728767,GB
+1041725952,1041728767,GB
1041728768,1041729023,FR
1041729024,1041729559,GB
1041729560,1041729560,FR
@@ -7217,9 +7172,7 @@
1041745664,1041745919,FR
1041745920,1041748991,GB
1041748992,1041749247,EU
-1041749248,1041749659,GB
-1041749660,1041749663,FR
-1041749664,1041749759,GB
+1041749248,1041749759,GB
1041749760,1041750015,FR
1041750016,1041750527,GB
1041750528,1041751039,FR
@@ -7245,9 +7198,7 @@
1042120704,1042153471,PL
1042153472,1042284543,GB
1042284544,1042292735,CH
-1042292736,1042294783,NL
-1042294784,1042295295,GE
-1042295296,1042295551,NL
+1042292736,1042295551,NL
1042295552,1042296575,GE
1042296576,1042300927,NL
1042300928,1042309119,RU
@@ -7261,11 +7212,15 @@
1042808832,1042817023,DE
1042817024,1042825215,IE
1042825216,1042833407,CZ
-1042833408,1042841599,GB
+1042833408,1042834025,GB
+1042834026,1042834026,PT
+1042834027,1042840673,GB
+1042840674,1042840674,PT
+1042840675,1042841599,GB
1042841600,1042874367,AT
1042874368,1042877183,NL
-1042877184,1042877951,DE
-1042877952,1042879487,NL
+1042877184,1042877439,DE
+1042877440,1042879487,NL
1042879488,1042879743,US
1042879744,1042879999,NL
1042880000,1042880255,GB
@@ -7300,9 +7255,7 @@
1043476384,1043476399,DE
1043476400,1043476431,GB
1043476432,1043476447,DE
-1043476448,1043476991,GB
-1043476992,1043477503,DE
-1043477504,1043483406,GB
+1043476448,1043483406,GB
1043483407,1043483407,CH
1043483408,1043488767,GB
1043488768,1043496959,DE
@@ -7320,9 +7273,7 @@
1043892736,1043892991,CD
1043892992,1043897343,A2
1043897344,1043897855,KE
-1043897856,1043912703,A2
-1043912704,1043913215,ZM
-1043913216,1043919359,A2
+1043897856,1043919359,A2
1043919360,1043919871,SD
1043919872,1043921919,A2
1043921920,1043922943,IL
@@ -7341,26 +7292,11 @@
1044201472,1044217855,FI
1044217856,1044226047,DK
1044226048,1044234239,OM
-1044250624,1044251135,BE
-1044251136,1044251647,EU
-1044251648,1044252159,BE
-1044252160,1044253695,EU
-1044253696,1044254207,BE
-1044254208,1044256767,EU
-1044256768,1044257279,BE
-1044257280,1044257791,EU
-1044257792,1044258303,BE
-1044258304,1044260351,EU
+1044250624,1044260351,EU
1044260352,1044261119,BE
-1044261120,1044265983,EU
-1044265984,1044266495,BE
-1044266496,1044267519,EU
-1044267520,1044268031,BE
-1044268032,1044269055,EU
-1044269056,1044269567,BE
-1044269568,1044270079,EU
-1044270080,1044271615,BE
-1044271616,1044283391,EU
+1044261120,1044270079,EU
+1044270080,1044271103,BE
+1044271104,1044283391,EU
1044283392,1044316159,FR
1044316160,1044332543,NO
1044332544,1044348927,RU
@@ -7372,33 +7308,22 @@
1044414464,1044447231,GB
1044447232,1044453233,SE
1044453234,1044453234,NO
-1044453235,1044454911,SE
-1044454912,1044455423,NO
+1044453235,1044455167,SE
+1044455168,1044455423,NO
1044455424,1044463615,EE
1044463616,1044479999,SE
1044480000,1044488191,CH
1044488192,1044496383,SK
1044496384,1044512767,EE
1044512768,1044578303,DK
-1044578304,1044586495,GB
-1044586496,1044587007,DE
-1044587008,1044589055,GB
-1044589056,1044589567,DE
-1044589568,1044632575,GB
-1044632576,1044633087,DE
-1044633088,1044635647,GB
-1044635648,1044636159,US
-1044636160,1044636671,GB
+1044578304,1044636671,GB
1044636672,1044637695,DE
1044637696,1044638273,GB
1044638274,1044638274,GB
1044638275,1044638463,GB
1044638464,1044638719,DE
-1044638720,1044639743,GB
-1044639744,1044640255,DE
-1044640256,1044640767,GB
-1044640768,1044641791,DE
-1044641792,1044642815,US
+1044638720,1044640767,GB
+1044640768,1044642815,DE
1044642816,1044643839,GB
1044643840,1044652031,DE
1044652032,1044660223,LY
@@ -7412,7 +7337,9 @@
1044668416,1044676607,BA
1044676608,1044684799,RU
1044684800,1044692991,HU
-1044692992,1044698623,AT
+1044692992,1044698111,AT
+1044698112,1044698367,DE
+1044698368,1044698623,AT
1044698624,1044699135,DE
1044699136,1044701183,AT
1044701184,1044709375,EG
@@ -7431,9 +7358,7 @@
1044905984,1044908031,GB
1044908032,1044909055,US
1044909056,1044916735,GB
-1044916736,1044919295,DE
-1044919296,1044919807,GB
-1044919808,1044920319,DE
+1044916736,1044920319,DE
1044920320,1044921343,GB
1044921344,1044922367,US
1044922368,1044930559,DE
@@ -7455,9 +7380,7 @@
1044936548,1044936548,BE
1044936549,1044936703,GB
1044936704,1044936959,BE
-1044936960,1044937031,GB
-1044937032,1044937039,BE
-1044937040,1044937727,GB
+1044936960,1044937727,GB
1044937728,1044937983,BE
1044937984,1044946943,GB
1044946944,1044955135,UA
@@ -7470,8 +7393,7 @@
1045020672,1045037055,NO
1045037056,1045118975,GR
1045118976,1045119231,US
-1045119232,1045119743,AL
-1045119744,1045135359,GR
+1045119232,1045135359,GR
1045135360,1045168127,DE
1045168128,1045233663,RU
1045233664,1045241855,GB
@@ -7482,8 +7404,8 @@
1045282816,1045299199,HU
1045299200,1045302271,GB
1045302272,1045303295,EU
-1045303296,1045305855,DE
-1045305856,1045307391,EU
+1045303296,1045305343,DE
+1045305344,1045307391,EU
1045307392,1045315583,RU
1045315584,1045319679,DE
1045319680,1045323775,RU
@@ -7493,11 +7415,7 @@
1045446656,1045447423,SK
1045447424,1045447679,HU
1045447680,1045454847,SK
-1045454848,1045460991,DE
-1045460992,1045461503,FR
-1045461504,1045461631,DE
-1045461632,1045461695,FR
-1045461696,1045463039,DE
+1045454848,1045463039,DE
1045463040,1045471231,FI
1045471232,1045479423,UA
1045479424,1045487615,SE
@@ -7536,23 +7454,17 @@
1046150610,1046151167,IL
1046151168,1046216703,DE
1046216704,1046282239,NO
-1046282240,1046288895,DE
-1046288896,1046290431,AG
+1046282240,1046289407,DE
+1046289408,1046290431,AG
1046290432,1046298623,PL
1046298624,1046315007,AT
-1046315008,1046315519,FR
-1046315520,1046316031,IT
-1046316032,1046316543,FR
-1046316544,1046317055,DK
-1046317056,1046317567,ES
-1046317568,1046318591,GB
-1046318592,1046323199,NL
+1046315008,1046316031,FR
+1046316032,1046319103,GB
+1046319104,1046320127,NL
+1046320128,1046321151,GB
+1046321152,1046323199,NL
1046323200,1046331391,ES
-1046331392,1046336511,EU
-1046336512,1046337023,DE
-1046337024,1046337535,EU
-1046337536,1046338047,DE
-1046338048,1046347775,EU
+1046331392,1046347775,EU
1046347776,1046391295,IT
1046391296,1046391807,US
1046391808,1046413311,IT
@@ -7563,30 +7475,34 @@
1046481408,1046482943,GB
1046482944,1046483199,DE
1046483200,1046485503,GB
-1046485504,1046486271,DE
-1046486272,1046486527,GB
-1046486528,1046487551,DE
+1046485504,1046485759,DE
+1046485760,1046486015,GB
+1046486016,1046486271,DE
+1046486272,1046487039,GB
+1046487040,1046487295,DE
+1046487296,1046487551,GB
1046487552,1046487807,US
-1046487808,1046491135,DE
-1046491136,1046492159,GB
+1046487808,1046488063,GB
+1046488064,1046488575,DE
+1046488576,1046492159,GB
1046492160,1046492415,DE
1046492416,1046492671,GB
1046492672,1046492927,DE
1046492928,1046494719,GB
1046494720,1046495231,DE
-1046495232,1046497807,GB
+1046495232,1046495719,GB
+1046495720,1046495727,DE
+1046495728,1046497807,GB
1046497808,1046497815,DE
-1046497816,1046499327,GB
-1046499328,1046502399,DE
+1046497816,1046502143,GB
+1046502144,1046502399,DE
1046502400,1046502911,GB
1046502912,1046503423,DE
1046503424,1046504447,GB
1046504448,1046508543,DE
1046508544,1046511615,GB
1046511616,1046515711,DE
-1046515712,1046517759,GB
-1046517760,1046518271,DE
-1046518272,1046518783,GB
+1046515712,1046518783,GB
1046518784,1046519039,DE
1046519040,1046519247,GB
1046519248,1046519255,DE
@@ -7594,10 +7510,12 @@
1046524160,1046524415,DE
1046524416,1046525351,GB
1046525352,1046525359,DE
-1046525360,1046526719,GB
+1046525360,1046525439,GB
+1046525440,1046525695,DE
+1046525696,1046526719,GB
1046526720,1046526975,DE
-1046526976,1046530047,GB
-1046530048,1046531327,DE
+1046526976,1046530559,GB
+1046530560,1046531327,DE
1046531328,1046538751,GB
1046538752,1046539263,DE
1046539264,1046540031,GB
@@ -7608,9 +7526,7 @@
1046541312,1046541567,DE
1046541568,1046541823,GB
1046541824,1046542079,DE
-1046542080,1046542335,GB
-1046542336,1046542847,DE
-1046542848,1046544383,GB
+1046542080,1046544383,GB
1046544384,1046560767,IT
1046560768,1046585343,ES
1046585344,1046609919,NO
@@ -7629,22 +7545,9 @@
1046839296,1046847487,BA
1046847488,1046855679,ES
1046855680,1046872063,NO
-1046872064,1046872575,BE
-1046872576,1046874111,EU
-1046874112,1046878207,BE
-1046878208,1046881279,EU
-1046881280,1046881791,BE
-1046881792,1046882303,EU
-1046882304,1046884351,BE
-1046884352,1046885375,EU
-1046885376,1046887423,BE
-1046887424,1046888447,EU
-1046888448,1046894591,GB
-1046894592,1046896639,EU
-1046896640,1046897663,GB
-1046897664,1046898175,BE
-1046898176,1046899199,EU
-1046899200,1046904831,BE
+1046872064,1046874111,EU
+1046874112,1046877183,BE
+1046877184,1046904831,EU
1046904832,1046906879,SK
1046906880,1046908927,IR
1046908928,1046910975,SE
@@ -7751,9 +7654,7 @@
1048576000,1048584191,DE
1048584192,1048592383,IL
1048592384,1048600575,IT
-1048600576,1048601599,UA
-1048601600,1048602111,RU
-1048602112,1048608767,UA
+1048600576,1048608767,UA
1048608768,1048616959,GB
1048616960,1048617215,A2
1048617216,1048618751,KE
@@ -7774,9 +7675,13 @@
1048847872,1048848127,NL
1048848128,1048850687,DE
1048850688,1048850943,NL
-1048850944,1048853503,DE
+1048850944,1048851199,DE
+1048851200,1048851455,NL
+1048851456,1048853503,DE
1048853504,1048853759,NL
-1048853760,1048859767,DE
+1048853760,1048856895,DE
+1048856896,1048856903,NL
+1048856904,1048859767,DE
1048859768,1048859775,NL
1048859776,1048859863,DE
1048859864,1048859871,NL
@@ -7788,15 +7693,29 @@
1048861904,1048861911,NL
1048861912,1048861951,DE
1048861952,1048862207,NL
-1048862208,1048868863,DE
+1048862208,1048862360,DE
+1048862361,1048862361,NL
+1048862362,1048863712,DE
+1048863713,1048863713,NL
+1048863714,1048868863,DE
1048868864,1048869119,NL
1048869120,1048870183,DE
1048870184,1048870191,NL
-1048870192,1048879175,DE
+1048870192,1048871408,DE
+1048871409,1048871409,NL
+1048871410,1048879175,DE
1048879176,1048879183,NL
-1048879184,1048888319,DE
+1048879184,1048882362,DE
+1048882363,1048882363,NL
+1048882364,1048885464,DE
+1048885465,1048885465,NL
+1048885466,1048886216,DE
+1048886217,1048886217,NL
+1048886218,1048888319,DE
1048888320,1048888575,NL
-1048888576,1048889855,DE
+1048888576,1048889087,DE
+1048889088,1048889343,NL
+1048889344,1048889855,DE
1048889856,1048890111,NL
1048890112,1048890367,DE
1048890368,1048890623,NL
@@ -7808,60 +7727,52 @@
1048891896,1048891903,NL
1048891904,1048893183,DE
1048893184,1048893439,NL
-1048893440,1048894519,DE
-1048894520,1048894527,NL
-1048894528,1048896015,DE
+1048893440,1048896015,DE
1048896016,1048896023,NL
1048896024,1048898303,DE
1048898304,1048898559,NL
1048898560,1048898815,DE
1048898816,1048899071,NL
-1048899072,1048901631,DE
+1048899072,1048900351,DE
+1048900352,1048900607,NL
+1048900608,1048901631,DE
1048901632,1048901887,NL
-1048901888,1048902967,DE
+1048901888,1048902293,DE
+1048902294,1048902294,NL
+1048902295,1048902856,DE
+1048902857,1048902857,NL
+1048902858,1048902967,DE
1048902968,1048902975,NL
-1048902976,1048903167,DE
-1048903168,1048903679,NL
+1048902976,1048903679,DE
1048903680,1048911871,GB
1048911872,1048920063,IT
1048920064,1048936447,NL
1048936448,1048944639,PL
1048944640,1048952831,RU
1048952832,1048969215,NL
-1048969216,1048974335,EU
-1048974336,1048974847,DE
-1048974848,1048979455,EU
-1048979456,1048980479,DE
-1048980480,1048982015,EU
-1048982016,1048982527,DE
-1048982528,1048982783,EU
+1048969216,1048979455,EU
+1048979456,1048979711,DE
+1048979712,1048980223,EU
+1048980224,1048980479,DE
+1048980480,1048982783,EU
1048982784,1048982887,FR
1048982888,1048982943,DE
1048982944,1048983039,FR
1048983040,1048985087,EU
1048985088,1048985343,DE
-1048985344,1049003519,EU
-1049003520,1049004031,DE
-1049004032,1049004543,EU
-1049004544,1049006079,DE
-1049006080,1049007615,EU
-1049007616,1049009151,DE
-1049009152,1049009663,EU
-1049009664,1049011711,DE
-1049011712,1049012991,EU
-1049012992,1049014015,DE
-1049014016,1049014783,EU
-1049014784,1049018367,DE
+1048985344,1049008127,EU
+1049008128,1049009151,DE
+1049009152,1049016319,EU
+1049016320,1049018367,DE
1049018368,1049018623,EU
-1049018624,1049022975,DE
-1049022976,1049023487,EU
-1049023488,1049024511,DE
-1049024512,1049026815,EU
-1049026816,1049029887,DE
-1049029888,1049030143,EU
-1049030144,1049031679,DE
+1049018624,1049022463,DE
+1049022464,1049026815,EU
+1049026816,1049029375,DE
+1049029376,1049030655,EU
+1049030656,1049031679,DE
1049031680,1049032191,EU
-1049032192,1049034751,DE
+1049032192,1049032703,DE
+1049032704,1049034751,EU
1049034752,1049067519,EG
1049067520,1049100287,DK
1049100288,1049231359,GB
@@ -7887,11 +7798,9 @@
1049699072,1049699327,A2
1049699328,1049699583,NL
1049699584,1049699839,BW
-1049699840,1049706495,NL
-1049706496,1049707007,GB
-1049707008,1049708031,NL
-1049708032,1049709055,GB
-1049709056,1049709823,NL
+1049699840,1049708543,NL
+1049708544,1049708799,GB
+1049708800,1049709823,NL
1049709824,1049710079,A2
1049710080,1049710335,NL
1049710336,1049710591,A2
@@ -7956,7 +7865,9 @@
1051033600,1051049983,FI
1051049984,1051066367,HU
1051066368,1051115519,NL
-1051115520,1051123711,BE
+1051115520,1051117055,BE
+1051117056,1051117567,NL
+1051117568,1051123711,BE
1051123712,1051131903,NL
1051131904,1051197439,CH
1051197440,1051213823,CZ
@@ -7997,21 +7908,17 @@
1051803648,1051820031,CZ
1051820032,1051852799,NL
1051852800,1051918335,AT
-1051918336,1051919359,PL
-1051919360,1051920383,AT
-1051920384,1051920895,PL
-1051920896,1051983871,AT
+1051918336,1051918591,PL
+1051918592,1051983871,AT
1051983872,1051990015,EU
1051990016,1051991039,DE
-1051991040,1052000767,EU
-1052000768,1052002559,DE
+1051991040,1052001279,EU
+1052001280,1052002559,DE
1052002560,1052003327,EU
1052003328,1052003583,DE
1052003584,1052011263,EU
1052011264,1052012287,DE
-1052012288,1052012543,EU
-1052012544,1052013055,DE
-1052013056,1052014205,EU
+1052012288,1052014205,EU
1052014206,1052014206,DE
1052014207,1052017535,EU
1052017536,1052017663,DE
@@ -8065,177 +7972,57 @@
1052178432,1052180479,DK
1052180480,1052213247,RU
1052213248,1052246015,FI
-1052246016,1052246527,DE
-1052246528,1052247551,EU
-1052247552,1052248063,DE
-1052248064,1052248575,EU
-1052248576,1052249087,DE
-1052249088,1052251647,EU
-1052251648,1052252159,DE
-1052252160,1052253183,EU
-1052253184,1052253695,DE
-1052253696,1052254207,EU
-1052254208,1052254719,NL
-1052254720,1052256255,EU
-1052256256,1052257279,NL
-1052257280,1052258815,EU
-1052258816,1052260351,FR
-1052260352,1052262911,EU
-1052262912,1052263423,DK
-1052263424,1052263935,DE
-1052263936,1052266495,EU
-1052266496,1052267007,BE
-1052267008,1052267519,EU
-1052267520,1052268031,BE
-1052268032,1052269055,EU
-1052269056,1052269567,ZA
-1052269568,1052270079,EU
-1052270080,1052270591,ZA
-1052270592,1052273151,EU
-1052273152,1052274175,FR
-1052274176,1052274687,ZA
-1052274688,1052275199,EU
-1052275200,1052275711,AT
-1052275712,1052277247,EU
-1052277248,1052277759,IT
-1052277760,1052279295,EU
-1052279296,1052283391,GB
-1052283392,1052284927,EU
+1052246016,1052259327,EU
+1052259328,1052260351,FR
+1052260352,1052279807,EU
+1052279808,1052282879,GB
+1052282880,1052284927,EU
1052284928,1052286975,GB
-1052286976,1052287487,CH
-1052287488,1052287999,SE
-1052288000,1052289535,EU
-1052289536,1052290047,GB
-1052290048,1052292607,EU
-1052292608,1052298751,GB
-1052298752,1052300287,EU
-1052300288,1052300799,GB
-1052300800,1052301823,EU
-1052301824,1052302335,GB
-1052302336,1052303359,EU
+1052286976,1052293119,EU
+1052293120,1052298239,GB
+1052298240,1052303359,EU
1052303360,1052305407,DE
-1052305408,1052305919,EU
-1052305920,1052307455,DE
-1052307456,1052307967,EU
-1052307968,1052308991,CH
-1052308992,1052309503,EU
+1052305408,1052306431,EU
+1052306432,1052307455,DE
+1052307456,1052309503,EU
1052309504,1052310527,CH
-1052310528,1052311039,EU
-1052311040,1052311551,GB
-1052311552,1052313087,EU
-1052313088,1052314623,DE
-1052314624,1052318207,EU
-1052318208,1052318719,DE
-1052318720,1052319231,EU
-1052319232,1052319743,DE
-1052319744,1052320255,EU
-1052320256,1052321791,GB
-1052321792,1052324351,EU
-1052324352,1052324863,GB
-1052324864,1052325887,EU
+1052310528,1052313599,EU
+1052313600,1052314623,DE
+1052314624,1052325887,EU
1052325888,1052327935,GB
1052327936,1052328959,EU
1052328960,1052329983,CH
-1052329984,1052330495,EU
-1052330496,1052331007,CH
-1052331008,1052338175,EU
-1052338176,1052339711,FR
-1052339712,1052342527,EU
-1052342528,1052343039,CH
-1052343040,1052343807,EU
-1052343808,1052344319,CH
-1052344320,1052345855,EU
-1052345856,1052346879,NL
-1052346880,1052347391,EU
+1052329984,1052338175,EU
+1052338176,1052339199,FR
+1052339200,1052347391,EU
1052347392,1052348415,CH
-1052348416,1052349439,EU
-1052349440,1052352511,GB
+1052348416,1052350463,EU
+1052350464,1052352511,GB
1052352512,1052354559,EU
1052354560,1052356607,GB
-1052356608,1052364799,EU
-1052364800,1052365311,BE
-1052365312,1052366847,EU
+1052356608,1052366847,EU
1052366848,1052367871,BE
-1052367872,1052368383,DK
-1052368384,1052370943,EU
-1052370944,1052371455,GB
-1052371456,1052374015,EU
+1052367872,1052374015,EU
1052374016,1052375039,CH
-1052375040,1052378111,EU
-1052378112,1052378623,DE
-1052378624,1052383231,EU
-1052383232,1052383743,GB
-1052383744,1052384767,EU
-1052384768,1052385279,GB
-1052385280,1052385791,EU
-1052385792,1052386303,GB
-1052386304,1052387327,EU
+1052375040,1052387327,EU
1052387328,1052388351,GB
-1052388352,1052390911,EU
-1052390912,1052391423,GB
-1052391424,1052391935,EU
-1052391936,1052392447,GB
-1052392448,1052392959,EU
-1052392960,1052393471,GB
-1052393472,1052394495,EU
-1052394496,1052395007,CH
-1052395008,1052397567,EU
-1052397568,1052398079,IT
-1052398080,1052399359,EU
-1052399360,1052399871,IT
-1052399872,1052405759,EU
-1052405760,1052407295,AT
-1052407296,1052408831,EU
-1052408832,1052409855,GB
-1052409856,1052411391,EU
-1052411392,1052411903,NL
-1052411904,1052412927,EU
-1052412928,1052413439,NL
-1052413440,1052415487,EU
-1052415488,1052415999,BE
-1052416000,1052418047,EU
-1052418048,1052418559,BE
-1052418560,1052419071,EU
-1052419072,1052419583,BE
-1052419584,1052420095,EU
-1052420096,1052420607,GB
-1052420608,1052421119,EU
+1052388352,1052405759,EU
+1052405760,1052406783,AT
+1052406784,1052421119,EU
1052421120,1052422143,GB
1052422144,1052425215,EU
1052425216,1052426239,ZA
-1052426240,1052426751,EU
-1052426752,1052427263,NL
-1052427264,1052427775,CH
-1052427776,1052430591,EU
-1052430592,1052432639,BE
-1052432640,1052441599,EU
-1052441600,1052442111,GB
-1052442112,1052455935,EU
-1052455936,1052456447,NL
-1052456448,1052456959,CH
-1052456960,1052462079,EU
-1052462080,1052462591,FR
-1052462592,1052463615,EU
-1052463616,1052464127,GB
-1052464128,1052477951,EU
-1052477952,1052478463,FR
-1052478464,1052481535,EU
-1052481536,1052483583,NL
-1052483584,1052487679,EU
+1052426240,1052431103,EU
+1052431104,1052432127,BE
+1052432128,1052481535,EU
+1052481536,1052482559,NL
+1052482560,1052487679,EU
1052487680,1052488703,CH
1052488704,1052489727,GB
-1052489728,1052490239,EU
-1052490240,1052490751,SE
-1052490752,1052502015,EU
-1052502016,1052502527,IE
-1052502528,1052505087,EU
-1052505088,1052505599,GB
-1052505600,1052508159,EU
+1052489728,1052508159,EU
1052508160,1052653823,GB
1052653824,1052654079,EU
-1052654080,1052661759,GB
-1052661760,1052662271,SE
-1052662272,1052667903,GB
+1052654080,1052667903,GB
1052667904,1052668063,US
1052668064,1052668079,GB
1052668080,1052668159,US
@@ -8274,45 +8061,29 @@
1053163520,1053294591,DK
1053294592,1053295615,EU
1053295616,1053296639,AT
-1053296640,1053298175,EU
-1053298176,1053298687,CH
-1053298688,1053299711,EU
+1053296640,1053299711,EU
1053299712,1053299967,GB
1053299968,1053300223,EU
1053300224,1053300735,GB
-1053300736,1053305343,EU
-1053305344,1053305855,GR
-1053305856,1053307903,EU
+1053300736,1053307903,EU
1053307904,1053308415,GB
1053308416,1053308671,EU
1053308672,1053308927,GB
-1053308928,1053309439,EU
-1053309440,1053309951,ZA
-1053309952,1053313279,EU
+1053308928,1053313279,EU
1053313280,1053313535,GB
1053313536,1053316607,EU
1053316608,1053316863,GB
-1053316864,1053318143,EU
-1053318144,1053318655,GB
-1053318656,1053319679,EU
-1053319680,1053320191,DE
-1053320192,1053321215,EU
-1053321216,1053321727,DE
-1053321728,1053327615,EU
+1053316864,1053327615,EU
1053327616,1053327871,ZA
1053327872,1053329407,EU
1053329408,1053329663,ES
-1053329664,1053332479,EU
-1053332480,1053334015,BE
+1053329664,1053332991,EU
+1053332992,1053334015,BE
1053334016,1053335551,EU
1053335552,1053336575,ZA
-1053336576,1053338111,EU
-1053338112,1053338623,FI
-1053338624,1053340927,EU
+1053336576,1053340927,EU
1053340928,1053341183,GB
-1053341184,1053347839,EU
-1053347840,1053348351,NL
-1053348352,1053349375,EU
+1053341184,1053349375,EU
1053349376,1053349631,NL
1053349632,1053353983,EU
1053353984,1053354239,IL
@@ -8344,42 +8115,141 @@
1053687808,1053753343,DE
1053753344,1053818879,NL
1053818880,1053819391,DE
-1053819392,1053820415,EU
-1053820416,1053820927,DE
+1053819392,1053819423,EU
+1053819424,1053819439,DE
+1053819440,1053819519,EU
+1053819520,1053819563,DE
+1053819564,1053819583,EU
+1053819584,1053819647,DE
+1053819648,1053820159,EU
+1053820160,1053820927,DE
1053820928,1053821439,EU
1053821440,1053821447,GB
1053821448,1053821567,EU
1053821568,1053821695,GB
-1053821696,1053825023,EU
-1053825024,1053826047,ES
-1053826048,1053829887,EU
+1053821696,1053823999,EU
+1053824000,1053824007,DE
+1053824008,1053824015,EU
+1053824016,1053824023,DE
+1053824024,1053824063,EU
+1053824064,1053824095,DE
+1053824096,1053824127,EU
+1053824128,1053824255,NL
+1053824256,1053825023,EU
+1053825024,1053825791,ES
+1053825792,1053825919,GB
+1053825920,1053826047,ES
+1053826048,1053826815,EU
+1053826816,1053827327,DE
+1053827328,1053827583,BE
+1053827584,1053829887,EU
1053829888,1053830143,DE
-1053830144,1053835263,EU
+1053830144,1053831167,EU
+1053831168,1053831423,DE
+1053831424,1053834943,EU
+1053834944,1053834975,DE
+1053834976,1053835263,EU
1053835264,1053835775,DE
-1053835776,1053837823,EU
+1053835776,1053837311,EU
+1053837312,1053837439,FK
+1053837440,1053837455,GB
+1053837456,1053837567,EU
+1053837568,1053837823,GB
1053837824,1053838335,FK
-1053838336,1053844991,EU
+1053838336,1053838591,DE
+1053838592,1053840399,EU
+1053840400,1053840415,DE
+1053840416,1053840447,EU
+1053840448,1053840511,DE
+1053840512,1053843199,EU
+1053843200,1053843231,DK
+1053843232,1053843455,GB
+1053843456,1053843711,EU
+1053843712,1053843967,DE
+1053843968,1053844223,GB
+1053844224,1053844479,DE
+1053844480,1053844991,EU
1053844992,1053845503,DE
-1053845504,1053846015,EU
+1053845504,1053845727,EU
+1053845728,1053845735,DE
+1053845736,1053846015,EU
1053846016,1053846527,DE
-1053846528,1053847039,EU
-1053847040,1053847551,DE
+1053846528,1053846783,EU
+1053846784,1053847551,DE
1053847552,1053849599,GB
-1053849600,1053855743,EU
+1053849600,1053850367,DE
+1053850368,1053851135,EU
+1053851136,1053851647,DE
+1053851648,1053851903,EU
+1053851904,1053851919,FR
+1053851920,1053852031,EU
+1053852032,1053852047,IT
+1053852048,1053852111,EU
+1053852112,1053852127,GB
+1053852128,1053852159,DE
+1053852160,1053855743,EU
1053855744,1053859839,GB
-1053859840,1053863935,EU
-1053863936,1053864447,DE
-1053864448,1053876223,EU
+1053859840,1053860863,DE
+1053860864,1053862655,EU
+1053862656,1053862783,DE
+1053862784,1053862847,EU
+1053862848,1053862879,DE
+1053862880,1053863423,EU
+1053863424,1053864959,DE
+1053864960,1053865215,EU
+1053865216,1053865727,DE
+1053865728,1053865759,US
+1053865760,1053865983,EU
+1053865984,1053866239,DE
+1053866240,1053866495,ES
+1053866496,1053866823,DE
+1053866824,1053866831,EU
+1053866832,1053866847,DE
+1053866848,1053867519,EU
+1053867520,1053867775,DE
+1053867776,1053867975,EU
+1053867976,1053867983,DE
+1053867984,1053867991,EU
+1053867992,1053867999,DE
+1053868000,1053868007,EU
+1053868008,1053868015,DE
+1053868016,1053868031,EU
+1053868032,1053868447,ES
+1053868448,1053868455,GB
+1053868456,1053868479,EU
+1053868480,1053868543,FR
+1053868544,1053868799,EU
+1053868800,1053869567,DE
+1053869568,1053870079,EU
+1053870080,1053870335,DE
+1053870336,1053870591,GB
+1053870592,1053870847,EU
+1053870848,1053871359,DE
+1053871360,1053871615,EU
+1053871616,1053871871,DE
+1053871872,1053872383,EU
+1053872384,1053872447,DE
+1053872448,1053872511,EU
+1053872512,1053872639,FR
+1053872640,1053872895,EU
+1053872896,1053873663,DE
+1053873664,1053876223,EU
1053876224,1053876479,DE
1053876480,1053876735,GB
-1053876736,1053877759,EU
-1053877760,1053878271,DE
+1053876736,1053876991,DE
+1053876992,1053877247,EU
+1053877248,1053878271,DE
1053878272,1053878783,GB
-1053878784,1053879295,EU
-1053879296,1053881855,DE
-1053881856,1053882367,EU
+1053878784,1053879047,DE
+1053879048,1053879055,EU
+1053879056,1053879071,DE
+1053879072,1053879167,GB
+1053879168,1053879295,EU
+1053879296,1053882111,DE
+1053882112,1053882367,EU
1053882368,1053882879,DE
-1053882880,1053884415,EU
+1053882880,1053883391,GB
+1053883392,1053884415,DE
1053884416,1053892607,BH
1053892608,1053900799,DE
1053900800,1053917183,NO
@@ -8407,11 +8277,7 @@
1054186241,1054186495,GB
1054186496,1054187264,DE
1054187265,1054187519,GB
-1054187520,1054192895,BG
-1054192896,1054193151,RO
-1054193152,1054194687,BG
-1054194688,1054195455,RO
-1054195456,1054195711,BG
+1054187520,1054195711,BG
1054195712,1054212095,BE
1054212096,1054277631,DE
1054277632,1054343167,KW
@@ -8442,9 +8308,49 @@
1054646272,1054654463,SE
1054654464,1054662655,MK
1054662656,1054670847,FI
-1054670848,1054672127,EU
+1054670848,1054671103,GB
+1054671104,1054671167,EU
+1054671168,1054671231,IE
+1054671232,1054671371,EU
+1054671372,1054671375,IE
+1054671376,1054671415,EU
+1054671416,1054671423,IE
+1054671424,1054671431,EU
+1054671432,1054671439,IE
+1054671440,1054672127,EU
1054672128,1054672383,DE
-1054672384,1054679039,EU
+1054672384,1054672447,IE
+1054672448,1054672719,EU
+1054672720,1054672727,IE
+1054672728,1054672743,EU
+1054672744,1054672767,IE
+1054672768,1054672775,EU
+1054672776,1054672783,IE
+1054672784,1054672791,EU
+1054672792,1054672807,IE
+1054672808,1054673663,EU
+1054673664,1054673727,IE
+1054673728,1054673855,EU
+1054673856,1054673919,IE
+1054673920,1054673951,EU
+1054673952,1054674047,IE
+1054674048,1054674079,EU
+1054674080,1054674111,IE
+1054674112,1054674455,EU
+1054674456,1054674471,IE
+1054674472,1054674479,EU
+1054674480,1054674495,IE
+1054674496,1054674503,EU
+1054674504,1054674511,IE
+1054674512,1054674519,EU
+1054674520,1054674527,GB
+1054674528,1054674687,EU
+1054674688,1054675199,IE
+1054675200,1054675455,EU
+1054675456,1054675711,IE
+1054675712,1054675967,EU
+1054675968,1054676223,US
+1054676224,1054679039,EU
1054679040,1054687231,UA
1054687232,1054703615,MD
1054703616,1054711807,BG
@@ -8457,9 +8363,7 @@
1054974208,1055129599,DE
1055129600,1055186943,CY
1055186944,1055195135,GR
-1055195136,1055232511,EU
-1055232512,1055233023,NL
-1055233024,1055326207,EU
+1055195136,1055326207,EU
1055326208,1055334399,RU
1055334400,1055342591,IE
1055342592,1055358975,RO
@@ -8516,23 +8420,13 @@
1056875008,1056964607,GB
1056964608,1061558271,US
1061558272,1061559295,PK
-1061559296,1061853695,US
-1061853696,1061854207,GB
-1061854208,1061939711,US
-1061939712,1061940223,JM
-1061940224,1062069247,US
+1061559296,1062069247,US
1062069248,1062070271,PR
-1062070272,1062429695,US
-1062429696,1062430207,PR
-1062430208,1062473727,US
+1062070272,1062473727,US
1062473728,1062473759,IN
1062473760,1062530047,US
1062530048,1062531071,EC
-1062531072,1062545919,US
-1062545920,1062546431,BM
-1062546432,1062871551,US
-1062871552,1062872063,PR
-1062872064,1063390207,US
+1062531072,1063390207,US
1063390208,1063390463,PR
1063390464,1063567359,US
1063567360,1063575551,A2
@@ -8544,11 +8438,7 @@
1063749376,1063751679,A2
1063751680,1063895039,US
1063895040,1063899135,KR
-1063899136,1064124927,US
-1064124928,1064125439,EC
-1064125440,1064127487,US
-1064127488,1064127999,EC
-1064128000,1064170751,US
+1063899136,1064170751,US
1064170752,1064172031,A2
1064172032,1065530879,US
1065530880,1065533439,TC
@@ -8575,39 +8465,25 @@
1066352640,1066354943,JM
1066354944,1066355199,BB
1066355200,1066369023,JM
-1066369024,1067238143,US
-1067238144,1067238399,JP
-1067238400,1067532287,US
-1067532288,1067532799,HN
+1066369024,1067532543,US
+1067532544,1067532799,HN
1067532800,1067575295,US
1067575296,1067577343,HN
-1067577344,1067693055,US
-1067693056,1067693567,CO
-1067693568,1067700735,US
-1067700736,1067701247,CW
-1067701248,1067726847,US
-1067726848,1067727359,EC
-1067727360,1067740159,US
+1067577344,1067740159,US
1067740160,1067741183,HN
-1067741184,1068017663,US
-1068017664,1068018175,YE
-1068018176,1068123135,US
-1068123136,1068123647,BB
-1068123648,1068175871,US
-1068175872,1068176383,YE
-1068176384,1068199935,US
+1067741184,1068123391,US
+1068123392,1068123647,BB
+1068123648,1068199935,US
1068199936,1068204031,CA
1068204032,1068346367,US
-1068346368,1068346879,YE
-1068346880,1068419071,US
+1068346368,1068346623,YE
+1068346624,1068419071,US
1068419072,1068421119,CO
1068421120,1068422143,US
1068422144,1068422399,CA
1068422400,1068473343,US
1068473344,1068474367,BB
-1068474368,1068481023,US
-1068481024,1068481535,PR
-1068481536,1069622866,US
+1068474368,1069622866,US
1069622867,1069622867,MX
1069622868,1070652215,US
1070652216,1070652216,US
@@ -8651,9 +8527,7 @@
1071251712,1071252479,HK
1071252480,1071254783,US
1071254784,1071255039,GB
-1071255040,1071255295,US
-1071255296,1071255551,DE
-1071255552,1071256319,US
+1071255040,1071256319,US
1071256320,1071256575,HK
1071256576,1071258879,US
1071258880,1071259135,HK
@@ -8773,9 +8647,7 @@
1071579648,1072922623,US
1072922624,1072923391,CA
1072923392,1072923647,US
-1072923648,1072924159,CA
-1072924160,1072924671,HT
-1072924672,1072926719,CA
+1072923648,1072926719,CA
1072926720,1072926975,PH
1072926976,1072932863,CA
1072932864,1072933119,US
@@ -8787,29 +8659,24 @@
1072936448,1072936703,PH
1072936704,1072939263,CA
1072939264,1072939311,US
-1072939312,1072939519,CA
-1072939520,1072940031,US
-1072940032,1072942079,CA
+1072939312,1072942079,CA
1072942080,1072942111,US
1072942112,1072942591,CA
1072942592,1072943103,US
1072943104,1072955391,CA
1072955392,1073022975,US
-1073022976,1073025535,HN
-1073025536,1073027071,US
+1073022976,1073025023,HN
+1073025024,1073027071,US
1073027072,1073028095,NI
-1073028096,1073028607,US
-1073028608,1073029119,GD
+1073028096,1073029119,US
1073029120,1073031167,PR
1073031168,1073033215,US
1073033216,1073035263,CW
1073035264,1073036032,GD
-1073036033,1073037823,US
-1073037824,1073038335,GD
-1073038336,1073039359,US
+1073036033,1073039359,US
1073039360,1073041407,GT
-1073041408,1073043455,CO
-1073043456,1073045503,US
+1073041408,1073042431,CO
+1073042432,1073045503,US
1073045504,1073047551,CO
1073047552,1073049599,US
1073049600,1073053695,BS
@@ -8822,9 +8689,7 @@
1073381888,1074020351,US
1074020352,1074028543,CA
1074028544,1074118655,US
-1074118656,1074126847,CA
-1074126848,1074127359,US
-1074127360,1074135039,CA
+1074118656,1074135039,CA
1074135040,1074184191,US
1074184192,1074188287,CA
1074188288,1074229247,US
@@ -8890,9 +8755,7 @@
1075970048,1075972095,CA
1075972096,1075976959,US
1075976960,1075977215,CA
-1075977216,1075985919,US
-1075985920,1075986431,CA
-1075986432,1075987711,US
+1075977216,1075987711,US
1075987712,1075988223,CA
1075988224,1075988319,US
1075988320,1075988351,CA
@@ -8903,8 +8766,8 @@
1075995008,1075995103,US
1075995104,1075995135,CA
1075995136,1075998207,US
-1075998208,1075999231,CA
-1075999232,1076000767,US
+1075998208,1075998719,CA
+1075998720,1076000767,US
1076000768,1076002047,CA
1076002048,1076007423,US
1076007424,1076007935,CA
@@ -8916,18 +8779,14 @@
1076035520,1076035583,IN
1076035584,1076174847,US
1076174848,1076178943,BM
-1076178944,1076184255,US
-1076184256,1076184287,BE
-1076184288,1076196641,US
+1076178944,1076196641,US
1076196642,1076196671,BE
1076196672,1076233177,US
1076233178,1076233178,TC
1076233179,1076338687,US
1076338688,1076346879,CA
1076346880,1076387839,US
-1076387840,1076393727,CA
-1076393728,1076394239,US
-1076394240,1076396031,CA
+1076387840,1076396031,CA
1076396032,1076404223,US
1076404224,1076408319,A2
1076408320,1076412415,CA
@@ -8946,7 +8805,9 @@
1077002240,1077055487,US
1077055488,1077059583,CA
1077059584,1077383167,US
-1077383168,1077384191,US
+1077383168,1077383368,US
+1077383369,1077383880,US
+1077383881,1077384191,US
1077384192,1077444607,US
1077444608,1077452799,CA
1077452800,1077460991,JP
@@ -8960,7 +8821,9 @@
1077641216,1077657599,CA
1077657600,1077840383,US
1077840384,1077840639,US
-1077840640,1077977087,US
+1077840640,1077968383,US
+1077968384,1077968639,US
+1077968640,1077977087,US
1077977088,1077985279,CA
1077985280,1077993471,US
1077993472,1078001663,CA
@@ -8975,7 +8838,9 @@
1078280192,1078280447,CA
1078280448,1078280575,US
1078280576,1078280583,CA
-1078280584,1078281511,US
+1078280584,1078281300,US
+1078281301,1078281301,CA
+1078281302,1078281511,US
1078281512,1078281519,CA
1078281520,1078281599,US
1078281600,1078281663,CA
@@ -8999,28 +8864,25 @@
1078306560,1078306815,GB
1078306816,1078312260,US
1078312261,1078312261,GB
-1078312262,1078349311,US
-1078349312,1078349823,PH
-1078349824,1078433316,US
+1078312262,1078433316,US
1078433317,1078433317,US
1078433318,1078455551,US
1078455552,1078455807,NL
1078455808,1078456319,US
1078456320,1078460415,CA
-1078460416,1078504959,US
-1078504960,1078505471,CA
-1078505472,1078517759,US
+1078460416,1078517759,US
1078517760,1078525951,CA
1078525952,1078722559,US
1078722560,1078734847,AR
1078734848,1078736895,CO
-1078736896,1078737407,US
-1078737408,1078737919,CO
+1078736896,1078737919,US
1078737920,1078738943,EC
-1078738944,1078739455,VE
+1078738944,1078739199,US
+1078739200,1078739455,VE
1078739456,1078739967,US
1078739968,1078743039,PE
-1078743040,1078746111,CO
+1078743040,1078744063,US
+1078744064,1078746111,CO
1078746112,1078747135,PE
1078747136,1078749183,CL
1078749184,1078751231,PE
@@ -9044,13 +8906,11 @@
1079328768,1079377919,US
1079377920,1079380927,CA
1079380928,1079380991,US
-1079380992,1079384575,CA
-1079384576,1079385087,ZW
+1079380992,1079384831,CA
+1079384832,1079385087,ZW
1079385088,1079391231,CA
1079391232,1079391487,US
-1079391488,1079391743,CA
-1079391744,1079392255,HT
-1079392256,1079394175,CA
+1079391488,1079394175,CA
1079394176,1079394191,US
1079394192,1079394303,CA
1079394304,1079395327,EC
@@ -9070,20 +8930,13 @@
1079405440,1079405567,US
1079405568,1079407103,CA
1079407104,1079407359,US
-1079407360,1079407615,CA
-1079407616,1079408127,US
-1079408128,1079413311,CA
+1079407360,1079413311,CA
1079413312,1079413343,US
1079413344,1079415295,CA
1079415296,1079415807,US
-1079415808,1079427583,CA
-1079427584,1079428095,PW
-1079428096,1079431679,CA
-1079431680,1079432191,ZM
-1079432192,1079433215,CA
+1079415808,1079433215,CA
1079433216,1079435263,CR
-1079435264,1079435775,CO
-1079435776,1079437311,CA
+1079435264,1079437311,CA
1079437312,1079439359,US
1079439360,1079443455,CA
1079443456,1079459839,US
@@ -9141,29 +8994,19 @@
1081047581,1081047581,US
1081047582,1081212927,US
1081212928,1081278463,CA
-1081278464,1081369599,US
-1081369600,1081370111,CO
-1081370112,1081378495,US
+1081278464,1081378495,US
1081378496,1081378559,VE
1081378560,1081391103,US
1081391104,1081393151,PA
-1081393152,1081394175,US
-1081394176,1081394687,CL
-1081394688,1081395199,US
+1081393152,1081395199,US
1081395200,1081397247,CL
-1081397248,1081397759,US
-1081397760,1081398783,CL
-1081398784,1081399295,US
+1081397248,1081399295,US
1081399296,1081401343,CL
-1081401344,1081401855,US
-1081401856,1081402367,AR
-1081402368,1081410559,US
+1081401344,1081410559,US
1081410560,1081411583,PR
1081411584,1081413629,US
1081413630,1081413630,PR
-1081413631,1081419775,US
-1081419776,1081420287,PR
-1081420288,1081421311,US
+1081413631,1081421311,US
1081421312,1081421567,MF
1081421568,1081443327,US
1081443328,1081444351,CL
@@ -9238,9 +9081,7 @@
1085997056,1086013439,CA
1086013440,1086042111,US
1086042112,1086046207,CA
-1086046208,1086421503,US
-1086421504,1086422015,MP
-1086422016,1086922751,US
+1086046208,1086922751,US
1086922752,1086930943,CA
1086930944,1086955519,US
1086955520,1086971903,CA
@@ -9394,13 +9235,7 @@
1089306624,1089339391,PR
1089339392,1089469807,US
1089469808,1089469823,CA
-1089469824,1089881599,US
-1089881600,1089882111,GB
-1089882112,1089882623,US
-1089882624,1089883135,GB
-1089883136,1089887231,US
-1089887232,1089887743,GB
-1089887744,1089961983,US
+1089469824,1089961983,US
1089961984,1089970175,CA
1089970176,1089974271,PR
1089974272,1090146303,US
@@ -9430,9 +9265,7 @@
1093021696,1093025791,US
1093025792,1093033983,CA
1093033984,1093058559,US
-1093058560,1093063167,PR
-1093063168,1093063679,DO
-1093063680,1093066751,PR
+1093058560,1093066751,PR
1093066752,1093074943,US
1093074944,1093091327,CA
1093091328,1093108223,US
@@ -9451,13 +9284,11 @@
1093115904,1093116159,CA
1093116160,1093120511,US
1093120512,1093120767,CA
-1093120768,1093121023,US
-1093121024,1093121791,CA
+1093120768,1093121535,US
+1093121536,1093121791,CA
1093121792,1093122175,US
1093122176,1093122303,CA
-1093122304,1093125119,US
-1093125120,1093125631,CA
-1093125632,1093126655,US
+1093122304,1093126655,US
1093126656,1093126911,CA
1093126912,1093128703,US
1093128704,1093128959,CA
@@ -9477,23 +9308,21 @@
1093320192,1093320447,PR
1093320448,1093697535,US
1093697536,1093699071,BB
-1093699072,1093699583,GD
-1093699584,1093699839,BB
-1093699840,1093700095,GD
-1093700096,1093700351,BB
-1093700352,1093700607,GD
+1093699072,1093700607,GD
1093700608,1093701631,VC
1093701632,1093708287,BB
1093708288,1093709311,LC
1093709312,1093716479,BB
-1093716480,1093716735,GD
-1093716736,1093719807,BB
+1093716480,1093717504,GD
+1093717505,1093719807,BB
1093719808,1093720319,LC
1093720320,1093721343,VG
1093721344,1093724415,BB
1093724416,1093725183,VC
1093725184,1093730303,BB
-1093730304,1093747839,US
+1093730304,1093733887,US
+1093733888,1093734143,US
+1093734144,1093747839,US
1093747840,1093747903,US
1093747904,1093966216,US
1093966217,1093966217,NL
@@ -9511,13 +9340,9 @@
1095314944,1095314944,US
1095314945,1095450623,US
1095450624,1095467007,BS
-1095467008,1095627775,US
-1095627776,1095628287,CA
-1095628288,1096278015,US
+1095467008,1096278015,US
1096278016,1096286207,CA
-1096286208,1096351231,US
-1096351232,1096351743,A2
-1096351744,1096518655,US
+1096286208,1096518655,US
1096518656,1096518911,A2
1096518912,1096519167,US
1096519168,1096519423,CD
@@ -9530,9 +9355,7 @@
1096884224,1096888319,CA
1096888320,1096925183,US
1096925184,1096941567,CA
-1096941568,1097067519,US
-1097067520,1097068031,GB
-1097068032,1097727999,US
+1096941568,1097727999,US
1097728000,1097736191,CA
1097736192,1097768959,US
1097768960,1097785343,CA
@@ -9546,11 +9369,7 @@
1097947136,1097949183,VI
1097949184,1097951231,US
1097951232,1097953279,VI
-1097953280,1101182975,US
-1101182976,1101183487,YE
-1101183488,1101190655,US
-1101190656,1101191167,EC
-1101191168,1101304831,US
+1097953280,1101304831,US
1101304832,1101305855,HN
1101305856,1101352959,US
1101352960,1101355007,HN
@@ -9564,25 +9383,13 @@
1101484032,1101488127,CO
1101488128,1101521407,US
1101521408,1101521919,AS
-1101521920,1101542399,US
-1101542400,1101542911,CO
-1101542912,1101574655,US
-1101574656,1101575167,EC
-1101575168,1101650431,US
-1101650432,1101650943,HN
-1101650944,1101676543,US
+1101521920,1101676543,US
1101676544,1101678591,EC
-1101678592,1101750783,US
-1101750784,1101751295,BM
-1101751296,1101792255,US
-1101792256,1101792767,A2
-1101792768,1101797375,US
+1101678592,1101797375,US
1101797376,1101798399,BB
1101798400,1101803519,US
1101803520,1101804543,HN
-1101804544,1101869055,US
-1101869056,1101869567,GH
-1101869568,1101871103,US
+1101804544,1101871103,US
1101871104,1101873151,BO
1101873152,1101983231,US
1101983232,1101983743,CW
@@ -9602,15 +9409,9 @@
1103548416,1103550463,BS
1103550464,1103603711,US
1103603712,1103605759,EC
-1103605760,1103623167,US
-1103623168,1103623679,CO
-1103623680,1103996927,US
-1103996928,1103997439,EC
-1103997440,1104166911,US
+1103605760,1104166911,US
1104166912,1104168959,CO
-1104168960,1104265215,US
-1104265216,1104265727,PH
-1104265728,1104629247,US
+1104168960,1104629247,US
1104629248,1104629759,GH
1104629760,1104753151,US
1104753152,1104753407,SX
@@ -9620,12 +9421,7 @@
1104916992,1104917247,AS
1104917248,1106469887,US
1106469888,1106470911,BS
-1106470912,1106475007,US
-1106475008,1106475519,CO
-1106475520,1106758655,US
-1106758656,1106759167,EC
-1106759168,1106759679,CO
-1106759680,1106767871,US
+1106470912,1106767871,US
1106767872,1106769919,CO
1106769920,1107239935,US
1107239936,1107240191,CN
@@ -9643,21 +9439,17 @@
1107820544,1107853311,ZA
1107853312,1107895039,US
1107895040,1107895807,GB
-1107895808,1107898367,US
-1107898368,1107899903,GB
-1107899904,1107906559,US
-1107906560,1107907071,GB
-1107907072,1107907839,US
+1107895808,1107899391,US
+1107899392,1107899903,GB
+1107899904,1107907839,US
1107907840,1107908095,GB
1107908096,1107909375,US
1107909376,1107909631,GB
1107909632,1107927039,US
1107927040,1107927551,GB
-1107927552,1107935743,US
-1107935744,1107936767,GB
-1107936768,1107946495,US
-1107946496,1107947007,GB
-1107947008,1107948543,US
+1107927552,1107935999,US
+1107936000,1107936255,GB
+1107936256,1107948543,US
1107948544,1107948799,GB
1107948800,1108025343,US
1108025344,1108029439,CA
@@ -9750,13 +9542,8 @@
1113591808,1113595903,CA
1113595904,1113596159,US
1113596160,1113596415,CL
-1113596416,1113596927,GT
-1113596928,1113597951,US
-1113597952,1113598463,PA
-1113598464,1113599487,US
-1113599488,1113599999,VE
-1113600000,1113600511,US
-1113600512,1113603071,VE
+1113596416,1113601023,US
+1113601024,1113603071,VE
1113603072,1113603327,CL
1113603328,1113657343,US
1113657344,1113661439,CA
@@ -9776,9 +9563,7 @@
1113764498,1113764498,US
1113764499,1113769531,US
1113769532,1113769787,US
-1113769788,1113854975,US
-1113854976,1113855487,CA
-1113855488,1113983999,US
+1113769788,1113983999,US
1113984000,1113984255,NL
1113984256,1113997311,US
1113997312,1114005503,CA
@@ -9790,10 +9575,7 @@
1114505216,1114513407,CA
1114513408,1114515455,SA
1114515456,1114517503,US
-1114517504,1114524159,CA
-1114524160,1114524671,ZA
-1114524672,1114533375,CA
-1114533376,1114533887,ZA
+1114517504,1114533887,CA
1114533888,1114537983,AO
1114537984,1114550271,CA
1114550272,1114579831,US
@@ -9875,26 +9657,21 @@
1118572304,1118572319,US
1118572320,1118572351,US
1118572352,1118572543,US
-1118572544,1118790655,US
-1118790656,1118790911,IL
-1118790912,1118961663,US
+1118572544,1118961663,US
1118961664,1118962943,A2
1118962944,1118963199,AS
-1118963200,1118964991,A2
-1118964992,1118965247,CW
+1118963200,1118965247,A2
1118965248,1118965503,AS
1118965504,1118966015,A2
1118966016,1118966271,BR
-1118966272,1118970879,A2
-1118970880,1118971391,SR
-1118971392,1118989311,A2
-1118989312,1118989823,KE
-1118989824,1118993151,A2
+1118966272,1118993151,A2
1118993152,1118993407,GY
1118993408,1118994431,A2
1118994432,1119109119,US
1119109120,1119111167,CA
-1119113216,1119211519,US
+1119113216,1119174407,US
+1119174408,1119174415,MX
+1119174416,1119211519,US
1119211520,1119215615,CA
1119215616,1119289343,US
1119289344,1119354879,CA
@@ -9907,9 +9684,7 @@
1119469568,1119477759,CA
1119477760,1119502335,US
1119502336,1119510527,CA
-1119510528,1119558143,US
-1119558144,1119558655,PR
-1119558656,1119571967,US
+1119510528,1119571967,US
1119571968,1119576063,CA
1119576064,1119580159,US
1119580160,1119584255,CA
@@ -9920,17 +9695,13 @@
1120153600,1120272383,US
1120272384,1120277247,CA
1120277248,1120277503,US
-1120277504,1120281599,CA
-1120281600,1120282111,US
-1120282112,1120283647,CA
+1120277504,1120283647,CA
1120283648,1120284671,EC
1120284672,1120286719,CA
1120286720,1120288767,US
1120288768,1120307199,CA
1120307200,1120307967,EC
-1120307968,1120310271,CA
-1120310272,1120310783,PH
-1120310784,1120321535,CA
+1120307968,1120321535,CA
1120321536,1120346111,US
1120346112,1120350207,CA
1120350208,1120372991,US
@@ -9992,9 +9763,7 @@
1121042432,1121230847,US
1121230848,1121239039,CA
1121239040,1121247231,US
-1121247232,1121250303,CA
-1121250304,1121250815,BZ
-1121250816,1121255423,CA
+1121247232,1121255423,CA
1121255424,1121714998,US
1121714999,1121714999,KW
1121715000,1121878015,US
@@ -10040,9 +9809,9 @@
1123653632,1123654655,KY
1123654656,1123655679,JM
1123655680,1123663871,US
-1123663872,1123665407,SV
-1123665408,1123665919,US
-1123665920,1123667967,SV
+1123663872,1123664895,SV
+1123664896,1123666943,US
+1123666944,1123667967,SV
1123667968,1123670015,PR
1123670016,1123671039,US
1123671040,1123672063,PY
@@ -10052,9 +9821,7 @@
1123848192,1123852287,CA
1123852288,1123950591,US
1123950592,1123958783,CA
-1123958784,1125064703,US
-1125064704,1125065215,GB
-1125065216,1125076115,US
+1123958784,1125076115,US
1125076116,1125076116,US
1125076117,1125076167,US
1125076168,1125076168,US
@@ -10241,8 +10008,8 @@
1138950144,1139146751,US
1139146752,1139154943,GT
1139154944,1139167231,JM
-1139167232,1139168255,US
-1139168256,1139168767,PR
+1139167232,1139168511,US
+1139168512,1139168767,PR
1139168768,1139169279,US
1139169280,1139170303,PR
1139170304,1139171071,US
@@ -10271,7 +10038,13 @@
1145249792,1145257983,CA
1145257984,1145259247,US
1145259248,1145259251,AE
-1145259252,1145307135,US
+1145259252,1145286655,US
+1145286656,1145287167,SG
+1145287168,1145287679,US
+1145287680,1145287935,SG
+1145287936,1145288191,US
+1145288192,1145288447,SG
+1145288448,1145307135,US
1145307136,1145311231,CA
1145311232,1145333879,US
1145333880,1145333887,CN
@@ -10327,9 +10100,7 @@
1152581632,1152614399,CA
1152614400,1152778239,US
1152778240,1152843775,CA
-1152843776,1154488319,US
-1154488320,1154488831,A2
-1154488832,1156071423,US
+1152843776,1156071423,US
1156071424,1156079615,CA
1156079616,1156263935,US
1156263936,1156265983,CA
@@ -10355,70 +10126,7 @@
1158340608,1158344703,CA
1158344704,1158348799,US
1158348800,1158381567,CA
-1158381568,1158481417,US
-1158481418,1158481426,CA
-1158481427,1158481427,US
-1158481428,1158481436,CA
-1158481437,1158481597,US
-1158481598,1158481606,CA
-1158481607,1158481737,US
-1158481738,1158481745,CA
-1158481746,1158488529,US
-1158488530,1158488542,IL
-1158488543,1158488833,US
-1158488834,1158488846,IL
-1158488847,1158493441,US
-1158493442,1158493566,CA
-1158493567,1158496497,US
-1158496498,1158496506,TC
-1158496507,1158496530,US
-1158496531,1158496539,WS
-1158496540,1158496779,US
-1158496780,1158496788,FJ
-1158496789,1158496797,BE
-1158496798,1158496806,US
-1158496807,1158496815,PE
-1158496816,1158497616,US
-1158497617,1158497625,CH
-1158497626,1158497652,US
-1158497653,1158497661,CA
-1158497662,1158497670,GE
-1158497671,1158497770,US
-1158497771,1158497779,CA
-1158497780,1158497825,US
-1158497826,1158497834,GE
-1158497835,1158497865,WS
-1158497866,1158498032,US
-1158498033,1158498041,HK
-1158498042,1158498282,US
-1158498283,1158498291,MX
-1158498292,1158498457,US
-1158498458,1158498466,GR
-1158498467,1158498778,US
-1158498779,1158498787,IT
-1158498788,1158499171,US
-1158499172,1158499179,VI
-1158499180,1158499315,US
-1158499316,1158499326,CA
-1158499327,1158499382,US
-1158499383,1158499391,AS
-1158499392,1158499400,NL
-1158499401,1158499409,FR
-1158499410,1158499584,US
-1158499585,1158499838,CA
-1158499839,1158501120,US
-1158501121,1158501374,PR
-1158501375,1158504775,US
-1158504776,1158504784,CA
-1158504785,1158504836,US
-1158504837,1158504845,JM
-1158504846,1158504863,US
-1158504864,1158504872,GR
-1158504873,1158504941,US
-1158504942,1158504950,CA
-1158504951,1158504951,US
-1158504952,1158504959,KE
-1158504960,1158505653,US
+1158381568,1158505653,US
1158505654,1158505727,AU
1158505728,1158506793,US
1158506794,1158506809,IN
@@ -10442,9 +10150,7 @@
1158526369,1158526377,CH
1158526378,1158526930,US
1158526931,1158526963,AS
-1158526964,1158538864,US
-1158538865,1158538872,WS
-1158538873,1158714111,US
+1158526964,1158714111,US
1158714112,1158714367,US
1158714368,1158724607,US
1158724608,1158724863,NL
@@ -10482,9 +10188,7 @@
1159517696,1159517951,CA
1159517952,1159518191,US
1159518192,1159518199,CA
-1159518200,1159520255,US
-1159520256,1159520767,CA
-1159520768,1159525375,US
+1159518200,1159525375,US
1159525376,1159525759,CA
1159525760,1159672319,US
1159672320,1159672831,US
@@ -10500,9 +10204,7 @@
1160364032,1160368127,CA
1160368128,1160392703,US
1160392704,1160396799,CA
-1160396800,1160409599,US
-1160409600,1160410111,CO
-1160410112,1160410287,US
+1160396800,1160410287,US
1160410288,1160410303,DO
1160410304,1160425471,US
1160425472,1160429567,CA
@@ -10512,8 +10214,7 @@
1160504320,1160507391,A2
1160507392,1160563199,US
1160563200,1160563455,GU
-1160563456,1160563711,MP
-1160563712,1160609791,US
+1160563456,1160609791,US
1160609792,1160610815,MX
1160610816,1160660417,US
1160660418,1160660418,US
@@ -10572,7 +10273,9 @@
1161586688,1161586943,PA
1161586944,1161617407,US
1161617408,1161625599,CA
-1161625600,1161627819,US
+1161625600,1161627703,US
+1161627704,1161627711,DE
+1161627712,1161627819,US
1161627820,1161627823,CA
1161627824,1161634079,US
1161634080,1161634087,AF
@@ -10621,12 +10324,12 @@
1162464000,1162465279,BB
1162465280,1162465535,GD
1162465536,1162470911,BB
-1162470912,1162471167,GD
-1162471168,1162472703,BB
+1162470912,1162471423,GD
+1162471424,1162472703,BB
1162472704,1162472959,VC
1162472960,1162473471,BB
-1162473472,1162474495,GD
-1162474496,1162477567,BB
+1162473472,1162474751,GD
+1162474752,1162477567,BB
1162477568,1162715135,US
1162715136,1162723327,CA
1162723328,1162807295,US
@@ -10641,12 +10344,11 @@
1162831872,1162833919,PR
1162833920,1162835967,GT
1162835968,1162836223,BS
-1162836224,1162836735,CW
-1162836736,1162836991,US
+1162836224,1162836991,US
1162836992,1162838015,BS
-1162838016,1162840063,PR
-1162840064,1162853375,US
-1162853376,1162854399,PR
+1162838016,1162853375,US
+1162853376,1162853631,PR
+1162853632,1162854399,US
1162854400,1162858495,JM
1162858496,1162862591,HN
1162862592,1162870783,US
@@ -10658,7 +10360,8 @@
1162877184,1162877951,LC
1162877952,1162879999,BB
1162880000,1162882559,DM
-1162882560,1162885375,BB
+1162882560,1162883583,GD
+1162883584,1162885375,BB
1162885376,1162885631,VC
1162885632,1162887167,BB
1162887168,1163395071,US
@@ -10706,8 +10409,8 @@
1163562496,1163564031,US
1163564032,1163564543,CA
1163564544,1163564799,US
-1163564800,1163565055,CA
-1163565056,1163567103,US
+1163564800,1163565311,CA
+1163565312,1163567103,US
1163567104,1163568127,CA
1163568128,1163571199,US
1163571200,1163571967,CA
@@ -10726,8 +10429,8 @@
1163583488,1163588351,US
1163588352,1163588607,CA
1163588608,1163589119,US
-1163589120,1163589631,CA
-1163589632,1167851519,US
+1163589120,1163589375,CA
+1163589376,1167851519,US
1167851520,1168113663,CA
1168113664,1168138239,US
1168138240,1168146431,JM
@@ -10742,8 +10445,8 @@
1168394496,1168420863,US
1168420864,1168424959,CA
1168424960,1168454655,US
-1168454656,1168455167,US
-1168455168,1168474111,US
+1168454656,1168455679,US
+1168455680,1168474111,US
1168474112,1168506879,CA
1168508928,1168510975,US
1168510976,1168515071,CA
@@ -10763,8 +10466,8 @@
1168916480,1168932863,CA
1168932864,1168936959,US
1168936960,1168949247,CA
-1168949248,1168950271,US
-1168950272,1168951295,CA
+1168949248,1168950783,US
+1168950784,1168951295,CA
1168951296,1168952575,US
1168952576,1168952831,CA
1168952832,1168955903,US
@@ -10775,9 +10478,7 @@
1168957952,1168958207,CA
1168958208,1168958527,US
1168958528,1168958559,IN
-1168958560,1168961023,US
-1168961024,1168961535,CA
-1168961536,1168961887,US
+1168958560,1168961887,US
1168961888,1168961919,CA
1168961920,1168963583,US
1168963584,1168965119,CA
@@ -10789,9 +10490,7 @@
1170190336,1170190847,GB
1170190848,1170375167,US
1170375168,1170375679,US
-1170375680,1170467839,US
-1170467840,1170468351,DO
-1170468352,1170472959,US
+1170375680,1170472959,US
1170472960,1170481151,CA
1170481152,1170489343,US
1170489344,1170497535,CA
@@ -10805,9 +10504,7 @@
1176622592,1176623103,CA
1176623104,1176626119,US
1176626120,1176626135,CA
-1176626136,1176630271,US
-1176630272,1176630783,CA
-1176630784,1176631039,US
+1176626136,1176631039,US
1176631040,1176631295,CA
1176631296,1176702975,US
1176702976,1176707071,CA
@@ -10945,11 +10642,12 @@
1209338514,1209338514,US
1209338515,1209358591,US
1209358592,1209358847,DE
-1209358848,1209434111,US
+1209358848,1209359103,GB
+1209359104,1209434111,US
1209434112,1209436671,BB
1209436672,1209437183,VC
-1209437184,1209441023,BB
-1209441024,1209441279,GD
+1209437184,1209440767,BB
+1209440768,1209441279,GD
1209441280,1209442303,BB
1209442304,1209647103,US
1209647104,1209663487,CA
@@ -10974,9 +10672,7 @@
1210925056,1210941439,CA
1210941440,1211032223,US
1211032224,1211032255,VE
-1211032256,1211033087,US
-1211033088,1211033599,CO
-1211033600,1211236351,US
+1211032256,1211236351,US
1211236352,1211269119,PR
1211269120,1211303679,US
1211303680,1211303935,CA
@@ -10989,11 +10685,10 @@
1211316736,1211318271,US
1211318272,1211321343,BB
1211321344,1211322367,VC
-1211322368,1211323135,BB
-1211323136,1211323391,GD
-1211323392,1211323647,BB
-1211323648,1211323903,GD
-1211323904,1211324159,BB
+1211322368,1211322623,BB
+1211322624,1211322879,GD
+1211322880,1211323135,BB
+1211323136,1211324159,GD
1211324160,1211324927,VC
1211324928,1211333375,BB
1211333376,1211333631,VC
@@ -11021,11 +10716,7 @@
1219272704,1219276799,CA
1219276800,1220701665,US
1220701666,1220701666,US
-1220701667,1224296447,US
-1224296448,1224296959,CA
-1224296960,1224311807,US
-1224311808,1224312319,CA
-1224312320,1224470527,US
+1220701667,1224470527,US
1224470528,1224471567,NL
1224471568,1224471568,RU
1224471569,1224473599,NL
@@ -11085,9 +10776,7 @@
1247027200,1247034367,A2
1247034368,1247034623,US
1247034624,1247035391,A2
-1247035392,1247073791,US
-1247073792,1247074303,A2
-1247074304,1247123455,US
+1247035392,1247123455,US
1247123456,1247123711,GB
1247123712,1247123967,US
1247123968,1247124223,LU
@@ -11153,9 +10842,7 @@
1249139712,1249140735,MF
1249140736,1249163263,US
1249163264,1249165311,CA
-1249165312,1249165823,US
-1249165824,1249166335,CA
-1249166336,1249171455,US
+1249165312,1249171455,US
1249171456,1249173503,CA
1249173504,1249191935,US
1249191936,1249193983,CA
@@ -11320,9 +11007,7 @@
1255002112,1255006207,CA
1255006208,1255047167,US
1255047168,1255055359,CA
-1255055360,1255210495,US
-1255210496,1255211007,DE
-1255211008,1255245311,US
+1255055360,1255245311,US
1255245312,1255245567,BR
1255245568,1255276543,US
1255276544,1255342079,CA
@@ -11334,9 +11019,7 @@
1255571456,1255579647,CA
1255579648,1255669759,US
1255669760,1255735295,CA
-1255735296,1255768063,US
-1255768064,1255768575,CA
-1255768576,1255907071,US
+1255735296,1255907071,US
1255907072,1255907327,PR
1255907328,1255972863,US
1255972864,1255981055,CA
@@ -11473,11 +11156,7 @@
1294893056,1294925823,RS
1294925824,1294958591,DE
1294958592,1294991359,UA
-1294991360,1295009023,CZ
-1295009024,1295009407,SK
-1295009408,1295047679,CZ
-1295047680,1295048191,SK
-1295048192,1295056895,CZ
+1294991360,1295056895,CZ
1295056896,1295122431,GR
1295122432,1295253503,RU
1295253504,1295319039,UA
@@ -11497,14 +11176,13 @@
1296236672,1296236799,US
1296236800,1296237439,FR
1296237440,1296237567,IT
-1296237568,1296238079,FR
-1296238080,1296238591,DE
+1296237568,1296238591,FR
1296238592,1296239103,NL
1296239104,1296239231,FR
1296239232,1296239359,NL
1296239360,1296239615,DE
-1296239616,1296240639,FR
-1296240640,1296241151,BE
+1296239616,1296240895,FR
+1296240896,1296241151,BE
1296241152,1296241407,FR
1296241408,1296242175,NL
1296242176,1296242303,FR
@@ -11527,12 +11205,9 @@
1296251776,1296251903,DE
1296251904,1296252871,FR
1296252872,1296252879,DE
-1296252880,1296256511,FR
-1296256512,1296256840,DE
+1296252880,1296256840,FR
1296256841,1296256848,US
-1296256849,1296257023,DE
-1296257024,1296257535,US
-1296257536,1296258303,FR
+1296256849,1296258303,FR
1296258304,1296259071,NL
1296259072,1296259839,FR
1296259840,1296260351,NL
@@ -11544,9 +11219,7 @@
1296263944,1296263959,US
1296263960,1296266239,FR
1296266240,1296266751,US
-1296266752,1296268287,FR
-1296268288,1296268799,US
-1296268800,1296269055,FR
+1296266752,1296269055,FR
1296269056,1296269311,US
1296269312,1296302079,BY
1296302080,1296334847,GB
@@ -11556,8 +11229,8 @@
1296433152,1296465919,BG
1296465920,1296470015,LT
1296470016,1296473087,NO
-1296473088,1296474623,LT
-1296474624,1296476159,US
+1296473088,1296475135,LT
+1296475136,1296476159,US
1296476160,1296479743,LT
1296479744,1296482303,NO
1296482304,1296498687,LT
@@ -11645,9 +11318,7 @@
1296735488,1296735743,DE
1296735744,1296736255,FR
1296736256,1296738303,NO
-1296738304,1296738815,CH
-1296738816,1296739327,FI
-1296739328,1296740351,CH
+1296738304,1296740351,CH
1296740352,1296744447,RU
1296744448,1296746495,GB
1296746496,1296748543,SI
@@ -11710,7 +11381,6 @@
1297215488,1297217535,NL
1297217536,1297219583,RO
1297219584,1297285119,RU
-1297285120,1297350655,GR
1297350656,1297416191,FR
1297416192,1297481727,BG
1297481728,1297514495,GB
@@ -11786,13 +11456,9 @@
1297981440,1297989631,RO
1297989632,1297997823,CZ
1297997824,1298006015,IT
-1298006016,1298014207,RU
-1298014208,1298014719,LT
-1298014720,1298017279,RU
+1298006016,1298017279,RU
1298017280,1298018303,BY
-1298018304,1298019327,RU
-1298019328,1298019839,LT
-1298019840,1298020351,RU
+1298018304,1298020351,RU
1298020352,1298022399,BY
1298022400,1298030591,IT
1298030592,1298038783,RU
@@ -11860,14 +11526,11 @@
1299010048,1299010815,BE
1299010816,1299011071,RU
1299011072,1299011327,BE
-1299011328,1299012095,NL
-1299012096,1299012607,BE
-1299012608,1299013631,NL
+1299011328,1299013631,NL
1299013632,1299015679,BE
1299015680,1299016703,NL
1299016704,1299016959,BE
-1299016960,1299017215,NL
-1299017216,1299017727,RU
+1299016960,1299017727,NL
1299017728,1299019775,BE
1299019776,1299020031,NL
1299020032,1299021823,BE
@@ -11911,9 +11574,7 @@
1306267523,1306267527,NG
1306267528,1306271743,KE
1306271744,1306279935,RU
-1306279936,1306286079,IT
-1306286080,1306286591,CH
-1306286592,1306288127,IT
+1306279936,1306288127,IT
1306288128,1306296319,AT
1306296320,1306312703,RU
1306312704,1306320895,UZ
@@ -11960,10 +11621,12 @@
1307172864,1307181055,DK
1307181056,1307189247,RU
1307189248,1307191295,DE
-1307191296,1307191807,CZ
-1307191808,1307192063,US
+1307191296,1307191551,CZ
+1307191552,1307192063,US
1307192064,1307192319,GB
-1307192320,1307193343,CZ
+1307192320,1307192575,US
+1307192576,1307192831,DE
+1307192832,1307193343,CZ
1307193344,1307195391,NO
1307195392,1307197439,CH
1307197440,1307205631,HU
@@ -11996,20 +11659,14 @@
1307410432,1307418623,CZ
1307418624,1307426815,IR
1307426816,1307435007,CH
-1307435008,1307435519,DE
-1307435520,1307436001,US
-1307436002,1307436031,DE
-1307436032,1307436513,US
-1307436514,1307437055,DE
+1307435008,1307437055,DE
1307437056,1307441151,CZ
1307441152,1307443199,DE
1307443200,1307451391,IT
1307451392,1307459583,SE
1307459584,1307467775,BG
1307467776,1307484159,RU
-1307484160,1307491327,GB
-1307491328,1307491839,IE
-1307491840,1307492351,GB
+1307484160,1307492351,GB
1307492352,1307500543,BA
1307500544,1307508735,RU
1307508736,1307516927,BA
@@ -12038,8 +11695,8 @@
1307635712,1307637247,EE
1307637248,1307637759,LV
1307637760,1307638271,EE
-1307638272,1307639295,LT
-1307639296,1307639551,EE
+1307638272,1307638783,LT
+1307638784,1307639551,EE
1307639552,1307639807,LT
1307639808,1307643903,IT
1307643904,1307652095,RU
@@ -12072,9 +11729,8 @@
1307742208,1307746303,HU
1307746304,1307750399,UA
1307750400,1307754495,IT
-1307754496,1307755519,US
-1307755520,1307756543,GB
-1307756544,1307757311,FR
+1307754496,1307756799,GB
+1307756800,1307757311,FR
1307757312,1307758591,GB
1307758592,1307762687,SM
1307762688,1307766783,PL
@@ -12134,8 +11790,7 @@
1307967488,1307971583,IT
1307971584,1307979775,GB
1307979776,1307981823,ZW
-1307981824,1307982335,ZA
-1307982336,1307983871,GB
+1307981824,1307983871,GB
1307983872,1307984383,NG
1307984384,1307987967,LB
1307987968,1307992063,FR
@@ -12158,7 +11813,6 @@
1308049408,1308053503,DK
1308053504,1308055551,DE
1308055552,1308057599,AL
-1308057600,1308061695,GR
1308061696,1308069887,RU
1308069888,1308073983,NO
1308073984,1308078079,RU
@@ -12204,11 +11858,8 @@
1310240768,1310242815,RU
1310242816,1310244863,HU
1310244864,1310246911,EE
-1310246912,1310247935,FR
-1310247936,1310248447,CH
-1310248448,1310248959,FR
-1310248960,1310250495,IM
-1310250496,1310251007,MT
+1310246912,1310248959,FR
+1310248960,1310251007,IM
1310251008,1310255103,RU
1310255104,1310257151,CZ
1310257152,1310259199,FR
@@ -12308,8 +11959,7 @@
1311291392,1311293439,RU
1311293440,1311295487,NL
1311295488,1311297535,IT
-1311297536,1311299071,EU
-1311299072,1311299583,AT
+1311297536,1311299583,EU
1311299584,1311301631,RU
1311301632,1311303679,TR
1311303680,1311307775,GB
@@ -12485,21 +12135,17 @@
1317634048,1317638399,IE
1317638400,1317638655,GB
1317638656,1317640447,IE
-1317640448,1317643263,GB
-1317643264,1317643775,IE
-1317643776,1317644799,GB
+1317640448,1317644799,GB
1317644800,1317645311,IE
1317645312,1317645823,GB
1317645824,1317646335,IE
1317646336,1317647103,GB
1317647104,1317647359,IE
1317647360,1317647615,GB
-1317647616,1317648383,IE
-1317648384,1317650431,GB
+1317647616,1317647871,IE
+1317647872,1317650431,GB
1317650432,1317666815,PT
-1317666816,1317671935,GB
-1317671936,1317672447,GA
-1317672448,1317683199,GB
+1317666816,1317683199,GB
1317683200,1317699583,DE
1317699584,1317715967,RU
1317715968,1317732351,SA
@@ -12517,11 +12163,7 @@
1317928960,1317945343,BG
1317945344,1317978111,AT
1317978112,1317994495,RU
-1317994496,1317995007,NL
-1317995008,1317996031,DE
-1317996032,1317997055,NL
-1317997056,1317998079,DE
-1317998080,1318010879,NL
+1317994496,1318010879,NL
1318010880,1318027263,DK
1318027264,1318043647,IE
1318043648,1318584319,GB
@@ -12588,8 +12230,8 @@
1318928384,1318936575,LT
1318936576,1318944767,DK
1318944768,1318958079,CZ
-1318958080,1318960639,PL
-1318960640,1318961151,CZ
+1318958080,1318960127,PL
+1318960128,1318961151,CZ
1318961152,1318969343,GB
1318969344,1318977535,RU
1318977536,1318985727,LT
@@ -12737,9 +12379,7 @@
1334084632,1334091775,DE
1334091776,1334099967,LT
1334099968,1334108159,IR
-1334108160,1334115327,BE
-1334115328,1334115839,RU
-1334115840,1334116351,BE
+1334108160,1334116351,BE
1334116352,1334124543,AX
1334124544,1334125567,DE
1334125568,1334126591,ES
@@ -12759,7 +12399,8 @@
1334206464,1334214655,FI
1334214656,1334222847,JO
1334222848,1334231039,BG
-1334231040,1334239231,EE
+1334231040,1334233087,EE
+1334233088,1334239231,RU
1334239232,1334247423,IS
1334247424,1334255615,NO
1334255616,1334263807,IT
@@ -12819,11 +12460,7 @@
1334645223,1334645223,US
1334645224,1334645226,DE
1334645227,1334645227,US
-1334645228,1334645247,DE
-1334645248,1334645759,IQ
-1334645760,1334646271,DE
-1334646272,1334646783,IQ
-1334646784,1334647039,DE
+1334645228,1334647039,DE
1334647040,1334647807,IQ
1334647808,1334648831,DE
1334648832,1334652927,GB
@@ -12859,9 +12496,7 @@
1334710272,1334714367,RU
1334714368,1334718463,DE
1334718464,1334722559,KZ
-1334722560,1334725631,NL
-1334725632,1334726143,SE
-1334726144,1334726655,LU
+1334722560,1334726655,NL
1334726656,1334729983,RU
1334729984,1334730111,KZ
1334730112,1334730495,RU
@@ -12908,9 +12543,7 @@
1336551424,1336553471,GB
1336553472,1336555519,SA
1336555520,1336557567,BE
-1336557568,1336558591,ES
-1336558592,1336559103,US
-1336559104,1336559615,ES
+1336557568,1336559615,ES
1336559616,1336561663,GB
1336561664,1336563711,NO
1336563712,1336567807,NL
@@ -12948,7 +12581,8 @@
1336627200,1336629247,NO
1336629248,1336631295,DE
1336631296,1336633343,IS
-1336633344,1336635391,ES
+1336633344,1336634879,ES
+1336634880,1336635391,PT
1336635392,1336637439,RU
1336637440,1336639487,UA
1336639488,1336643583,HU
@@ -13121,14 +12755,12 @@
1346555904,1346559999,IT
1346560000,1346564095,LI
1346564096,1346568191,EE
-1346568192,1346571775,SE
-1346571776,1346572287,SE
+1346568192,1346572287,SE
1346572288,1346576383,DE
1346576384,1346580479,DK
1346580480,1346584575,RU
1346584576,1346588159,US
-1346588160,1346588671,KR
-1346588672,1346588927,EU
+1346588160,1346588927,EU
1346588928,1346589439,US
1346589440,1346589695,DE
1346589696,1346592767,US
@@ -13136,9 +12768,7 @@
1346596864,1346600959,IT
1346605056,1346609151,CH
1346609152,1346617343,FR
-1346617344,1346620415,SE
-1346620416,1346620927,DK
-1346620928,1346621439,SE
+1346617344,1346621439,SE
1346621440,1346625535,RU
1346625536,1346629631,DE
1346629632,1346637823,RU
@@ -13147,7 +12777,6 @@
1346654208,1346658303,GB
1346658304,1346666495,SE
1346666496,1346670591,ES
-1346670592,1346674687,IT
1346674688,1346678783,DE
1346678784,1346686975,IT
1346686976,1346691071,GB
@@ -13246,15 +12875,9 @@
1347129344,1347133439,FR
1347133440,1347141631,EG
1347141632,1347145727,CH
-1347145728,1347146239,IN
-1347146240,1347147263,CA
-1347147264,1347147775,GB
-1347147776,1347148287,DE
-1347148288,1347149823,CA
+1347145728,1347149823,CA
1347149824,1347151423,HU
-1347151424,1347151615,AT
-1347151616,1347153151,HU
-1347153152,1347158015,AT
+1347151424,1347158015,AT
1347158016,1347162111,CH
1347162112,1347166207,IT
1347166208,1347174399,GR
@@ -13584,8 +13207,8 @@
1347579904,1347588095,GB
1347588096,1347592191,CZ
1347592192,1347600383,RU
-1347600384,1347601919,CZ
-1347601920,1347602431,UA
+1347600384,1347601407,CZ
+1347601408,1347602431,UA
1347602432,1347608575,DE
1347608576,1347612671,FR
1347612672,1347616767,GB
@@ -13598,18 +13221,14 @@
1347649536,1347653631,GE
1347653632,1347657727,GB
1347657728,1347661823,IT
-1347661824,1347664895,DE
-1347664896,1347665407,NL
-1347665408,1347665919,DE
+1347661824,1347665919,DE
1347665920,1347670015,RU
1347670016,1347674111,SE
1347674112,1347682303,RU
1347682304,1347682559,DE
1347682560,1347682815,A2
1347682816,1347686399,DE
-1347686400,1347688959,EU
-1347688960,1347689343,BE
-1347689344,1347690495,EU
+1347686400,1347690495,EU
1347690496,1347694591,SE
1347694592,1347706879,GB
1347706880,1347710975,IT
@@ -13645,23 +13264,21 @@
1347837952,1347846143,RO
1347846144,1347850239,NO
1347850240,1347854335,IT
-1347854336,1347854599,EU
+1347854336,1347854591,DE
+1347854592,1347854599,EU
1347854600,1347854607,DE
1347854608,1347854655,EU
1347854656,1347854719,DE
1347854720,1347855615,EU
1347855616,1347856127,DE
-1347856128,1347856895,EU
-1347856896,1347858431,DE
+1347856128,1347857407,EU
+1347857408,1347858431,DE
1347858432,1347858687,EU
1347858688,1347858943,DE
-1347858944,1347859967,EU
-1347859968,1347860479,DE
-1347860480,1347862089,EU
+1347858944,1347862089,EU
1347862090,1347862090,DE
-1347862091,1347862335,EU
-1347862336,1347862399,DE
-1347862400,1347862527,EU
+1347862091,1347862271,EU
+1347862272,1347862527,DE
1347862528,1347866623,CH
1347866624,1347870719,NO
1347870720,1347874815,AM
@@ -13681,6 +13298,7 @@
1347932160,1347936255,SK
1347936256,1347940351,FR
1347940352,1347944447,BA
+1347945472,1347946495,NG
1347947520,1347948543,DZ
1347948544,1347952639,DE
1347952640,1347956735,BE
@@ -13724,8 +13342,8 @@
1348116480,1348120575,JO
1348120576,1348124671,RU
1348124672,1348128767,GB
-1348128768,1348129279,BE
-1348129280,1348132351,SI
+1348128768,1348129791,BE
+1348129792,1348132351,SI
1348132352,1348132863,BE
1348132864,1348136959,UA
1348136960,1348141055,RU
@@ -13763,9 +13381,7 @@
1348255744,1348263935,RU
1348263936,1348268031,UA
1348268032,1348272127,CZ
-1348272128,1348275199,IE
-1348275200,1348275711,GB
-1348275712,1348280319,IE
+1348272128,1348280319,IE
1348280320,1348284415,AT
1348284416,1348288511,RU
1348288512,1348292607,IT
@@ -13792,9 +13408,7 @@
1348362240,1348366335,MC
1348366336,1348368227,IT
1348368228,1348368228,A2
-1348368229,1348368895,IT
-1348368896,1348369151,A2
-1348369152,1348370431,IT
+1348368229,1348370431,IT
1348370432,1348374527,CZ
1348374528,1348378623,CH
1348378624,1348382719,BY
@@ -13809,11 +13423,7 @@
1348419584,1348427775,HU
1348427776,1348435967,CZ
1348435968,1348440063,FI
-1348440064,1348442111,NL
-1348442112,1348442623,DE
-1348442624,1348443135,NL
-1348443136,1348443647,DE
-1348443648,1348448255,NL
+1348440064,1348448255,NL
1348448256,1348456447,GB
1348456448,1348460543,BH
1348460544,1348464639,SI
@@ -13919,18 +13529,16 @@
1353298688,1353299455,SE
1353299456,1353300079,GB
1353300080,1353300095,SE
-1353300096,1353306111,GB
-1353306112,1353306623,ES
-1353306624,1353308159,GB
+1353300096,1353308159,GB
1353308160,1353309183,FR
-1353309184,1353312255,GB
-1353312256,1353312767,CH
+1353309184,1353312447,GB
+1353312448,1353312479,CH
+1353312480,1353312767,GB
1353312768,1353313023,IT
1353313024,1353313535,GB
1353313536,1353313791,IE
-1353313792,1353314303,GB
-1353314304,1353314815,CH
-1353314816,1353316351,ES
+1353313792,1353315327,GB
+1353315328,1353316351,ES
1353316352,1353318399,GB
1353318400,1353383935,SE
1353383936,1353449471,DE
@@ -13985,45 +13593,30 @@
1357119488,1357185023,DE
1357185024,1357250559,GB
1357250560,1357316095,IL
-1357316096,1357316607,EU
-1357316608,1357317119,LU
+1357316096,1357317119,EU
1357317120,1357317375,GB
1357317376,1357317631,A2
-1357317632,1357318143,LY
+1357317632,1357318143,EU
1357318144,1357320191,QA
-1357320192,1357320703,FR
-1357320704,1357321983,EU
+1357320192,1357321983,EU
1357321984,1357322239,GB
1357322240,1357322495,EU
1357322496,1357322751,DE
-1357322752,1357323263,BH
-1357323264,1357323519,EU
+1357322752,1357323519,EU
1357323520,1357323775,GB
1357323776,1357324287,EU
1357324288,1357325311,GB
1357325312,1357327359,EU
1357327360,1357328383,DE
-1357328384,1357330943,EU
-1357330944,1357331455,ES
-1357331456,1357338111,EU
-1357338112,1357338623,FR
-1357338624,1357340671,EU
+1357328384,1357340671,EU
1357340672,1357341695,GB
1357341696,1357342975,EU
1357342976,1357343231,GB
1357343232,1357343487,EU
1357343488,1357343503,GB
-1357343504,1357349887,EU
-1357349888,1357350399,ES
-1357350400,1357350911,QA
-1357350912,1357351167,EU
+1357343504,1357351167,EU
1357351168,1357351423,PL
-1357351424,1357351935,EU
-1357351936,1357352447,GB
-1357352448,1357357055,EU
-1357357056,1357357567,ES
-1357357568,1357358079,DE
-1357358080,1357359871,EU
+1357351424,1357359871,EU
1357359872,1357360015,GB
1357360016,1357360031,IT
1357360032,1357360271,GB
@@ -14033,25 +13626,17 @@
1357361152,1357363199,GB
1357363200,1357364223,QA
1357364224,1357365247,ES
-1357365248,1357365759,DZ
-1357365760,1357366015,EU
+1357365248,1357366015,EU
1357366016,1357366271,KM
1357366272,1357366783,EU
1357366784,1357366959,GB
1357366960,1357366967,BE
1357366968,1357367039,GB
-1357367040,1357368319,EU
-1357368320,1357368831,GN
-1357368832,1357369343,ES
-1357369344,1357370367,EU
-1357370368,1357370879,GB
-1357370880,1357371391,EU
+1357367040,1357371391,EU
1357371392,1357371647,GB
1357371648,1357372159,EU
-1357372160,1357372927,GB
-1357372928,1357378047,EU
-1357378048,1357378559,FR
-1357378560,1357381631,EU
+1357372160,1357372415,GB
+1357372416,1357381631,EU
1357381632,1357414399,NO
1357414400,1357447167,LV
1357447168,1357479935,IE
@@ -14083,9 +13668,7 @@
1357883648,1357883903,SE
1357883904,1357886105,EU
1357886106,1357886361,SE
-1357886362,1357887487,EU
-1357887488,1357887999,FR
-1357888000,1357889023,EU
+1357886362,1357889023,EU
1357889024,1357889279,GB
1357889280,1357891071,EU
1357891072,1357891327,NL
@@ -14099,8 +13682,7 @@
1357898752,1357898879,DE
1357898880,1357899647,EU
1357899648,1357899775,GB
-1357899776,1357900287,DE
-1357900288,1357902365,EU
+1357899776,1357902365,EU
1357902366,1357902366,NO
1357902367,1357902847,EU
1357902848,1357903359,GB
@@ -14252,8 +13834,7 @@
1358381056,1358385151,IT
1358385152,1358389247,GB
1358389248,1358397439,RU
-1358397440,1358397951,A2
-1358397952,1358398463,TZ
+1358397440,1358398463,A2
1358398464,1358399487,GB
1358399488,1358401279,A2
1358401280,1358401535,KE
@@ -14334,9 +13915,7 @@
1358669824,1358670079,PT
1358670080,1358671359,GB
1358671360,1358671615,PT
-1358671616,1358672895,GB
-1358672896,1358673407,PT
-1358673408,1358675967,GB
+1358671616,1358675967,GB
1358675968,1358677247,SE
1358677248,1358677759,DK
1358677760,1358679039,SE
@@ -14362,14 +13941,11 @@
1358770176,1358774271,BG
1358774272,1358778367,ES
1358778368,1358782463,CH
-1358782464,1358786559,GB
-1358786560,1358787071,NL
-1358787072,1358787327,GB
+1358782464,1358787327,GB
1358787328,1358787583,IE
1358787584,1358790655,GB
1358790656,1358798847,IR
-1358798848,1358799359,DE
-1358799360,1358802943,HR
+1358798848,1358802943,HR
1358802944,1358807039,HU
1358807040,1358811135,ES
1358811136,1358815231,DE
@@ -14511,12 +14087,9 @@
1360113664,1360117759,HU
1360117760,1360121855,FI
1360121856,1360125951,DE
-1360125952,1360126975,SI
-1360126976,1360127487,HR
-1360127488,1360127999,RS
-1360128000,1360128511,MK
-1360128512,1360129023,SI
-1360129024,1360130047,BA
+1360125952,1360129023,SI
+1360129024,1360129279,BA
+1360129280,1360130047,SI
1360130048,1360134143,IE
1360134144,1360138239,NL
1360138240,1360142335,CH
@@ -14531,8 +14104,7 @@
1360191488,1360195583,FO
1360195584,1360199679,NL
1360199680,1360203775,CZ
-1360203776,1360207359,FR
-1360207360,1360207871,US
+1360203776,1360207871,FR
1360207872,1360210943,CZ
1360210944,1360211199,EU
1360211200,1360211967,CZ
@@ -14670,8 +14242,8 @@
1360822272,1360826367,AT
1360826368,1360830463,GB
1360830464,1360838655,RU
-1360838656,1360839167,CH
-1360839168,1360842751,FR
+1360838656,1360838911,CH
+1360838912,1360842751,FR
1360842752,1360846847,RU
1360846848,1360850943,DE
1360855040,1360859135,NL
@@ -14714,27 +14286,21 @@
1361042432,1361043455,PL
1361043456,1361051647,IR
1361051648,1362100223,ES
-1362100224,1362396415,FR
-1362396416,1362396735,US
-1362396736,1362398463,FR
+1362100224,1362398463,FR
1362398464,1362398719,DE
-1362398720,1362403583,FR
-1362403584,1362404095,DZ
-1362404096,1362404607,FR
+1362398720,1362404607,FR
1362404608,1362405887,DZ
1362405888,1362406143,FR
1362406144,1362407167,SV
1362407168,1362411519,FR
1362411520,1362413273,MQ
-1362413274,1362414335,FR
-1362414336,1362414847,US
+1362413274,1362414847,FR
1362414848,1362415103,GB
1362415104,1362415359,FR
1362415360,1362415615,DE
1362415616,1362417663,GP
1362417664,1362419711,SG
-1362419712,1362423295,FR
-1362423296,1362423807,VE
+1362419712,1362423807,FR
1362423808,1362425855,SG
1362425856,1362426495,US
1362426496,1362426879,FR
@@ -14761,23 +14327,15 @@
1364525312,1364525567,A2
1364525568,1364526591,NL
1364526592,1364528639,GB
-1364528640,1364528895,NL
-1364528896,1364529407,GB
-1364529408,1364529663,NL
-1364529664,1364530175,GB
-1364530176,1364577791,NL
-1364577792,1364578303,GB
-1364578304,1364579839,NL
+1364528640,1364579839,NL
1364579840,1364580095,US
1364580096,1364581375,NL
1364581376,1364582399,LY
1364582400,1364583423,US
1364583424,1364585727,NL
1364585728,1364585983,CA
-1364585984,1364586240,LB
-1364586241,1364586495,NL
-1364586496,1364586752,LB
-1364586753,1364588977,NL
+1364585984,1364586239,LB
+1364586240,1364588977,NL
1364588978,1364588978,US
1364588979,1364589567,NL
1364589568,1364589823,A2
@@ -14948,8 +14506,8 @@
1369657344,1369659391,RU
1369659392,1369661439,UA
1369661440,1369665535,RU
-1369665536,1369677823,UA
-1369677824,1369686015,RU
+1369665536,1369677824,UA
+1369677825,1369686015,RU
1369686016,1369690111,PL
1369690112,1369694207,UA
1369694208,1369702399,RU
@@ -14994,10 +14552,10 @@
1370488832,1370619903,RU
1370619904,1370750975,GB
1370750976,1370767359,RO
-1370767360,1370771455,MD
-1370771456,1370772479,RO
-1370772480,1370772991,MD
-1370772992,1370882047,RO
+1370767360,1370768895,MD
+1370768896,1370769407,RO
+1370769408,1370771455,MD
+1370771456,1370882047,RO
1370882048,1371013119,HU
1371013120,1371078655,ES
1371078656,1371144191,FR
@@ -15020,9 +14578,7 @@
1371996672,1371996927,GA
1371996928,1371997183,A2
1371997184,1371997439,KE
-1371997440,1371997695,A2
-1371997696,1371998207,NG
-1371998208,1371998463,A2
+1371997440,1371998463,A2
1371998464,1371998719,NG
1371998720,1372000255,A2
1372000256,1372004351,UG
@@ -15032,16 +14588,15 @@
1372012544,1372013567,ZM
1372013568,1372020735,A2
1372020736,1372022783,ZM
-1372022784,1372025855,A2
-1372025856,1372026367,IL
+1372022784,1372026367,A2
1372026368,1372026879,KE
1372026880,1372027903,IL
1372027904,1372043519,A2
1372043520,1372043775,NG
1372043776,1372045567,A2
1372045568,1372045823,ZM
-1372045824,1372060159,A2
-1372060160,1372061695,IL
+1372045824,1372060671,A2
+1372060672,1372061695,IL
1372061696,1372069887,RU
1372069888,1372073983,FR
1372073984,1372078079,CZ
@@ -15077,30 +14632,22 @@
1372585984,1372618751,IT
1372618752,1372651519,GB
1372651520,1372684287,FI
-1372684288,1372684799,EU
-1372684800,1372685311,DE
-1372685312,1372688383,EU
+1372684288,1372688383,EU
1372688384,1372689407,DE
1372689408,1372689663,EU
1372689664,1372689919,DE
1372689920,1372690431,EU
1372690432,1372691455,DE
1372691456,1372692223,EU
-1372692224,1372692991,DE
-1372692992,1372693503,EU
-1372693504,1372694015,DE
-1372694016,1372695999,EU
+1372692224,1372692479,DE
+1372692480,1372695999,EU
1372696000,1372696007,DK
-1372696008,1372696831,EU
-1372696832,1372697215,DE
-1372697216,1372699135,EU
+1372696008,1372699135,EU
1372699136,1372699391,DE
-1372699392,1372701183,EU
-1372701184,1372701695,DE
-1372701696,1372704767,EU
+1372699392,1372704767,EU
1372704768,1372713983,DE
-1372713984,1372714495,EU
-1372714496,1372717055,DE
+1372713984,1372715007,EU
+1372715008,1372717055,DE
1372717056,1372749823,PL
1372749824,1372782591,DE
1372782592,1372815359,RU
@@ -15108,9 +14655,7 @@
1372848128,1373110271,TR
1373110272,1373175807,SE
1373175808,1373241343,AT
-1373241344,1373271295,IL
-1373271296,1373271551,PS
-1373271552,1373306879,IL
+1373241344,1373306879,IL
1373306880,1373372415,PL
1373372416,1373437951,FR
1373437952,1373503487,CH
@@ -15215,23 +14760,17 @@
1382039552,1382055935,DE
1382055936,1382072319,FR
1382072320,1382088703,RU
-1382088704,1382097919,FR
-1382097920,1382098431,IT
-1382098432,1382105087,FR
+1382088704,1382105087,FR
1382105088,1382137855,DE
1382137856,1382154239,RU
1382154240,1382170623,FR
-1382170624,1382183423,DE
-1382183424,1382183935,LI
-1382183936,1382187007,DE
+1382170624,1382187007,DE
1382187008,1382203391,ES
1382203392,1382205439,GB
1382205440,1382211583,EU
1382211584,1382211839,FR
1382211840,1382213631,EU
-1382213632,1382215679,GB
-1382215680,1382216191,NL
-1382216192,1382219775,GB
+1382213632,1382219775,GB
1382219776,1382222847,SE
1382222848,1382223103,FI
1382223104,1382252543,SE
@@ -15316,8 +14855,7 @@
1383325696,1383333887,GB
1383333888,1383350271,RU
1383350272,1383358463,NO
-1383358464,1383367167,DE
-1383367168,1383367679,KW
+1383358464,1383367679,DE
1383367680,1383368703,GB
1383368704,1383368957,DE
1383368958,1383368958,US
@@ -15347,7 +14885,13 @@
1383469056,1383471103,UA
1383471104,1383473151,SE
1383473152,1383481343,DE
-1383481344,1383497727,GB
+1383481344,1383481599,GB
+1383481600,1383481615,US
+1383481616,1383481663,GB
+1383481664,1383481695,US
+1383481696,1383482623,GB
+1383482624,1383482879,NL
+1383482880,1383497727,GB
1383497728,1383505919,RU
1383505920,1383514111,SA
1383514112,1383522303,FI
@@ -15391,29 +14935,7 @@
1384759296,1384775679,SY
1384775680,1384792063,RU
1384792064,1384808447,FR
-1384808448,1384809471,EU
-1384809472,1384809983,US
-1384809984,1384810495,EU
-1384810496,1384811007,US
-1384811008,1384811519,GB
-1384811520,1384813567,EU
-1384813568,1384814079,ES
-1384814080,1384814591,GB
-1384814592,1384815103,BE
-1384815104,1384815615,FR
-1384815616,1384816127,BE
-1384816128,1384816639,EU
-1384816640,1384817151,DK
-1384817152,1384819199,EU
-1384819200,1384819711,GB
-1384819712,1384820223,CH
-1384820224,1384820735,BE
-1384820736,1384821759,EU
-1384821760,1384822271,DK
-1384822272,1384822783,ES
-1384822784,1384823295,BE
-1384823296,1384823807,CH
-1384823808,1384824831,EU
+1384808448,1384824831,EU
1384824832,1384841215,GB
1384841216,1384857599,PL
1384857600,1384873983,NL
@@ -15448,8 +14970,8 @@
1385259008,1385267199,IT
1385267200,1385275391,SE
1385275392,1385283583,IT
-1385283584,1385285631,DE
-1385285632,1385287679,GB
+1385283584,1385286143,DE
+1385286144,1385287679,GB
1385287680,1385291775,EU
1385291776,1385299967,TR
1385299968,1385308159,BG
@@ -15496,8 +15018,7 @@
1385567203,1385567203,FR
1385567204,1385567231,EU
1385567232,1385568255,IE
-1385568256,1385569791,EU
-1385569792,1385570303,FR
+1385568256,1385570303,EU
1385570304,1385578495,HU
1385578496,1385580543,TR
1385580544,1385580799,DK
@@ -15527,15 +15048,7 @@
1386348544,1386414079,RU
1386414080,1386479615,GB
1386479616,1386545151,NO
-1386545152,1386549759,DE
-1386549760,1386550271,ES
-1386550272,1386586111,DE
-1386586112,1386586623,GB
-1386586624,1386587135,FR
-1386587136,1386587647,IT
-1386587648,1386590207,DE
-1386590208,1386590719,GB
-1386590720,1386602495,DE
+1386545152,1386602495,DE
1386602496,1386610687,US
1386610688,1386676223,IL
1386676224,1386741759,SA
@@ -15564,8 +15077,8 @@
1388389168,1388390143,NG
1388390144,1388390167,IT
1388390168,1388394495,NG
-1388394496,1388396031,IT
-1388396032,1388396543,NG
+1388394496,1388395519,IT
+1388395520,1388396543,NG
1388396544,1388404735,LV
1388404736,1388412927,UA
1388412928,1388421119,RU
@@ -15591,8 +15104,7 @@
1388570843,1388576767,CH
1388576768,1388580863,NL
1388580864,1388584959,FR
-1388584960,1388585983,GB
-1388585984,1388587519,EU
+1388584960,1388587519,EU
1388587520,1388588031,GB
1388588032,1388588287,EU
1388588288,1388588543,GB
@@ -15614,19 +15126,16 @@
1388658688,1388666879,GB
1388666880,1388667391,RE
1388667392,1388675071,FR
-1388675072,1388675583,EU
-1388675584,1388676607,DE
-1388676608,1388678143,EU
+1388675072,1388678143,EU
1388678144,1388679167,DE
1388679168,1388679679,EU
1388679680,1388680703,DE
-1388680704,1388682751,EU
-1388682752,1388683263,DE
+1388680704,1388683263,EU
1388683264,1388691455,CH
1388691456,1388699647,NL
1388699648,1388707839,SE
-1388707840,1388708607,LB
-1388708608,1388711679,RU
+1388707840,1388708095,LB
+1388708096,1388711679,RU
1388711680,1388711935,LB
1388711936,1388714239,RU
1388714240,1388714495,LB
@@ -15642,8 +15151,8 @@
1388741632,1388741887,GB
1388741888,1388742143,IE
1388742144,1388743167,GB
-1388743168,1388743423,IE
-1388743424,1388743679,GB
+1388743168,1388743435,IE
+1388743436,1388743679,GB
1388743680,1388744191,IE
1388744192,1388744959,GB
1388744960,1388745215,IE
@@ -15668,8 +15177,7 @@
1388796683,1388797951,NL
1388797952,1388806143,RU
1388806144,1388814335,DE
-1388814336,1388821503,AX
-1388821504,1388822527,SE
+1388814336,1388822527,AX
1388822528,1388830719,AM
1388830720,1388838911,FI
1388838912,1388871679,RU
@@ -15687,18 +15195,14 @@
1389199872,1389200159,US
1389200160,1389210627,A2
1389210628,1389210631,US
-1389210632,1389214719,A2
-1389214720,1389215743,LY
-1389215744,1389218303,A2
-1389218304,1389219839,AF
+1389210632,1389218815,A2
+1389218816,1389219839,AF
1389219840,1389223935,A2
1389223936,1389224191,US
1389224192,1389231359,A2
1389231360,1389231615,EU
1389231616,1389232127,A2
-1389232128,1389264127,DE
-1389264128,1389264639,ES
-1389264640,1389264895,DE
+1389232128,1389264895,DE
1389264896,1389265151,TZ
1389265152,1389266957,A2
1389266958,1389266958,NG
@@ -15728,9 +15232,7 @@
1389445120,1389461503,RU
1389461504,1389477887,SE
1389477888,1389494271,BY
-1389494272,1389504511,DE
-1389504512,1389505023,FR
-1389505024,1389510655,DE
+1389494272,1389510655,DE
1389510656,1389527039,NL
1389527040,1389543423,PL
1389543424,1389557247,DE
@@ -15755,11 +15257,9 @@
1389707264,1389723647,IT
1389723648,1389756415,ES
1389756416,1389772799,SE
-1389772800,1389778431,SI
-1389778432,1389780479,RS
-1389780480,1389780991,SI
-1389780992,1389782527,HR
-1389782528,1389783039,SI
+1389772800,1389780991,SI
+1389780992,1389782015,HR
+1389782016,1389783039,SI
1389783040,1389785087,BA
1389785088,1389787135,MK
1389787136,1389789183,SI
@@ -15787,12 +15287,7 @@
1390149632,1390215167,CH
1390215168,1390280703,IS
1390280704,1390346239,TR
-1390346240,1390394367,ES
-1390394368,1390394879,PT
-1390394880,1390395391,ES
-1390395392,1390396415,FR
-1390396416,1390396927,PT
-1390396928,1390411775,ES
+1390346240,1390411775,ES
1390411776,1392508927,FR
1392508928,1394606079,PL
1394606080,1396703231,ES
@@ -15841,9 +15336,7 @@
1398896640,1398898687,CH
1398898688,1398931455,ES
1398931456,1398964223,GB
-1398964224,1398983679,NL
-1398983680,1398984191,US
-1398984192,1398996991,NL
+1398964224,1398996991,NL
1398996992,1399029759,LU
1399029760,1399062527,LV
1399062528,1399095295,FI
@@ -15861,23 +15354,23 @@
1400111104,1400373247,NL
1400373248,1400701951,DE
1400701952,1400702207,EU
-1400702208,1400705023,DE
+1400702208,1400702463,DE
+1400702464,1400702975,EU
+1400702976,1400705023,DE
1400705024,1400705791,EU
1400705792,1400707071,DE
-1400707072,1400708095,EU
-1400708096,1400708607,DE
-1400708608,1400709120,EU
+1400707072,1400709120,EU
1400709121,1400710142,DE
1400710143,1400711167,EU
1400711168,1400712191,DE
1400712192,1400713215,EU
1400713216,1400718335,DE
1400718336,1400719359,EU
-1400719360,1400722431,DE
-1400722432,1400729599,EU
+1400719360,1400721407,DE
+1400721408,1400729599,EU
1400729600,1400730623,DE
-1400730624,1400731135,EU
-1400731136,1400733695,DE
+1400730624,1400731647,EU
+1400731648,1400733695,DE
1400733696,1400897535,EU
1400897536,1400963071,NL
1400963072,1401028607,DE
@@ -15886,15 +15379,11 @@
1401159680,1401225215,PT
1401225216,1401241599,DE
1401241600,1401243135,EU
-1401243136,1401244159,DE
-1401244160,1401246719,EU
+1401243136,1401243647,DE
+1401243648,1401246719,EU
1401246720,1401257983,DE
-1401257984,1401264127,EU
-1401264128,1401264639,DE
-1401264640,1401265151,EU
-1401265152,1401265663,DE
-1401265664,1401270271,EU
-1401270272,1401273343,DE
+1401257984,1401271295,EU
+1401271296,1401273343,DE
1401273344,1401273855,EU
1401273856,1401274111,DE
1401274112,1401278463,EU
@@ -16075,17 +15564,10 @@
1402408960,1402413055,DE
1402413056,1402417151,PL
1402417152,1402421247,DE
-1402421248,1402422783,FR
-1402422784,1402423295,GB
-1402423296,1402423807,BE
-1402423808,1402424319,FR
-1402424320,1402425855,GB
-1402425856,1402426367,FR
-1402426368,1402429439,GB
-1402429440,1402431487,US
-1402431488,1402433535,GB
-1402433536,1402434047,FR
-1402434048,1402437631,GB
+1402421248,1402422271,FR
+1402422272,1402429439,GB
+1402429440,1402430463,US
+1402430464,1402437631,GB
1402437632,1402454015,DK
1402454016,1402470399,GB
1402470400,1402994687,FR
@@ -16145,12 +15627,15 @@
1404043264,1404051455,EE
1404051456,1404059647,HR
1404059648,1404076031,NO
-1404076032,1404076543,EE
-1404076544,1404081663,LV
-1404081664,1404083711,DE
-1404083712,1404084223,EE
+1404076032,1404077055,EE
+1404077056,1404081151,LV
+1404081152,1404082175,EE
+1404082176,1404083199,DE
+1404083200,1404084223,EE
1404084224,1404092415,NO
-1404092416,1404099327,SE
+1404092416,1404098815,SE
+1404098816,1404099071,EE
+1404099072,1404099327,SE
1404099328,1404099583,EE
1404099584,1404104191,SE
1404104192,1404104447,EE
@@ -16159,29 +15644,32 @@
1404112896,1404114943,HR
1404114944,1404116991,SE
1404116992,1404125183,NO
-1404125184,1404135423,SE
+1404125184,1404127743,SE
+1404127744,1404128255,EE
+1404128256,1404135423,SE
1404135424,1404137471,EE
1404137472,1404139519,SE
1404139520,1404141567,EE
1404141568,1404142079,SE
1404142080,1404142335,EE
-1404142336,1404151807,SE
+1404142336,1404145663,SE
+1404145664,1404146175,EE
+1404146176,1404151807,SE
1404151808,1404152063,EE
1404152064,1404163071,SE
1404163072,1404163327,EE
1404163328,1404163839,SE
1404163840,1404164095,EE
1404164096,1404164351,SE
-1404164352,1404164607,EE
-1404164608,1404166143,SE
+1404164352,1404165119,EE
+1404165120,1404166143,SE
1404166144,1404174335,LV
1404174336,1404184063,SE
1404184064,1404184575,EE
1404184576,1404186623,SE
1404186624,1404187647,EE
1404187648,1404188671,SE
-1404188672,1404189183,LT
-1404189184,1404190719,EE
+1404188672,1404190719,EE
1404190720,1404192767,SE
1404192768,1404194815,LV
1404194816,1404195839,LT
@@ -16200,17 +15688,20 @@
1404219392,1404220415,SE
1404220416,1404221439,EE
1404221440,1404222463,RU
-1404222464,1404222975,LV
+1404222464,1404222975,EE
1404222976,1404225535,SE
1404225536,1404227071,RU
-1404227072,1404231679,LV
+1404227072,1404227583,EE
+1404227584,1404231679,LV
1404231680,1404232191,EE
1404232192,1404232703,NO
-1404232704,1404233215,LV
+1404232704,1404233215,EE
1404233216,1404234239,SE
1404234240,1404234751,EE
1404234752,1404235775,HR
-1404235776,1404242687,SE
+1404235776,1404240895,SE
+1404240896,1404241407,EE
+1404241408,1404242687,SE
1404242688,1404242943,EE
1404242944,1404256255,SE
1404256256,1404305407,RU
@@ -16263,7 +15754,7 @@
1404870656,1404872703,LT
1404872704,1404874751,SE
1404874752,1404875775,LV
-1404875776,1404876799,LT
+1404875776,1404876799,EE
1404876800,1404895231,SE
1404895232,1404927999,DE
1404928000,1404944383,SE
@@ -16275,15 +15766,17 @@
1405044736,1405048831,SE
1405048832,1405050879,HR
1405050880,1405059071,AT
-1405059072,1405060607,SE
-1405060608,1405060863,EE
+1405059072,1405060095,SE
+1405060096,1405060863,EE
1405060864,1405062655,SE
1405062656,1405062911,EE
1405062912,1405063167,SE
1405063168,1405067263,NO
1405067264,1405075455,DE
1405075456,1405083647,EE
-1405083648,1405086719,SE
+1405083648,1405084671,SE
+1405084672,1405084927,EE
+1405084928,1405086719,SE
1405086720,1405086975,EE
1405086976,1405091839,SE
1405091840,1406140415,FR
@@ -16304,16 +15797,8 @@
1406697472,1406705663,GB
1406705664,1406708735,IT
1406708736,1406709247,A2
-1406709248,1406710271,IT
-1406710272,1406710783,A2
-1406710784,1406710927,IT
-1406710928,1406711295,A2
-1406711296,1406712831,IT
-1406712832,1406713343,A2
-1406713344,1406713855,IT
-1406713856,1406716927,NL
-1406716928,1406717439,AT
-1406717440,1406717951,NL
+1406709248,1406713855,IT
+1406713856,1406717951,NL
1406717952,1406719487,GB
1406719488,1406719743,AT
1406719744,1406719999,GB
@@ -16360,8 +15845,7 @@
1406894080,1406902271,RU
1406902272,1406910463,AT
1406910464,1406918655,SE
-1406918656,1406926335,RU
-1406926336,1406926847,DE
+1406918656,1406926847,RU
1406926848,1406935039,IT
1406935040,1406951423,RU
1406951424,1406959615,PL
@@ -16408,13 +15892,11 @@
1407532800,1407533055,US
1407533056,1407534365,GB
1407534366,1407534366,NG
-1407534367,1407535103,GB
-1407535104,1407535615,GA
+1407534367,1407535359,GB
+1407535360,1407535615,GA
1407535616,1407536127,GB
1407536128,1407536639,GA
-1407536640,1407547391,GB
-1407547392,1407547903,NG
-1407547904,1407549439,GB
+1407536640,1407549439,GB
1407549440,1407582207,RU
1407582208,1407614975,PL
1407614976,1407680511,ES
@@ -16459,8 +15941,8 @@
1408532480,1408579583,GB
1408579584,1408579839,IE
1408579840,1408584191,GB
-1408584192,1408584703,IE
-1408584704,1408597503,GB
+1408584192,1408584447,IE
+1408584448,1408597503,GB
1408597504,1408598015,IE
1408598016,1408630783,FI
1408630784,1408634879,RO
@@ -16469,17 +15951,11 @@
1408696320,1408729087,NL
1408729088,1408761855,ES
1408761856,1409286143,SE
-1409286144,1409362431,HU
-1409362432,1409362943,BG
-1409362944,1409363455,HU
-1409363456,1409363967,BG
-1409363968,1409378679,HU
+1409286144,1409378679,HU
1409378680,1409378687,RO
1409378688,1409413119,HU
1409413120,1409413375,BG
-1409413376,1409413631,HU
-1409413632,1409415167,BG
-1409415168,1409430271,HU
+1409413376,1409430271,HU
1409430272,1409430783,RO
1409430784,1409548287,HU
1409548288,1409810431,FR
@@ -16490,10 +15966,11 @@
1410009088,1410009599,A2
1410009600,1410010111,US
1410010112,1410011135,A2
-1410011136,1410011647,DE
-1410011648,1410017535,A2
+1410011136,1410011391,DE
+1410011392,1410017535,A2
1410017536,1410017791,US
-1410017792,1410042367,A2
+1410017792,1410017792,DE
+1410017793,1410042367,A2
1410042368,1410042623,US
1410042624,1410043169,A2
1410043170,1410043171,US
@@ -16564,9 +16041,7 @@
1410727936,1410736127,BG
1410736128,1410744319,RS
1410744320,1410748415,A2
-1410748416,1410758655,DE
-1410758656,1410759167,AQ
-1410759168,1410760703,DE
+1410748416,1410760703,DE
1410760704,1410768895,RU
1410768896,1410777087,GB
1410777088,1410785279,RU
@@ -16619,7 +16094,6 @@
1411883008,1411887103,PL
1411887104,1411889151,IR
1411889152,1411891199,IT
-1411891200,1411892223,IQ
1411895296,1411899391,SI
1411899392,1411901439,ES
1411901440,1411903487,IE
@@ -16632,13 +16106,9 @@
1411940352,1411973119,PL
1411973120,1411999999,SI
1412000000,1412000511,BA
-1412000512,1412001791,SI
-1412001792,1412002303,RO
-1412002304,1412002815,SI
+1412000512,1412002815,SI
1412002816,1412003839,BA
-1412003840,1412004351,BG
-1412004352,1412004863,BA
-1412004864,1412005887,SI
+1412003840,1412005887,SI
1412005888,1412038655,NL
1412038656,1412071423,RU
1412071424,1412104191,CZ
@@ -16652,8 +16122,8 @@
1412366336,1412399103,SK
1412399104,1412415487,RU
1412415488,1412416511,AE
-1412416512,1412420095,IR
-1412420096,1412420607,AE
+1412416512,1412419583,IR
+1412419584,1412420607,AE
1412420608,1412423679,IR
1412423680,1412427775,AE
1412427776,1412431871,IR
@@ -16731,9 +16201,7 @@
1422761984,1422770175,PL
1422770176,1422786559,GR
1422786560,1422852095,HU
-1422852096,1422857087,EU
-1422857088,1422857151,FR
-1422857152,1422911231,EU
+1422852096,1422911231,EU
1422911232,1422911487,NL
1422911488,1422917119,EU
1422917120,1422917375,GB
@@ -16800,23 +16268,17 @@
1424722432,1424723199,CZ
1424723200,1424724991,DE
1424724992,1424727039,GB
-1424727040,1424727551,DE
-1424727552,1424728063,PL
-1424728064,1424728319,DE
+1424727040,1424728319,DE
1424728320,1424729855,FR
1424729856,1424730879,DE
1424730880,1424733183,IE
1424733184,1424733951,NL
1424733952,1424735103,SE
-1424735104,1424736383,DE
-1424736384,1424736895,FR
-1424736896,1424738815,DE
+1424735104,1424738815,DE
1424738816,1424739583,SE
1424739584,1424746495,DE
1424746496,1424749055,IE
-1424749056,1424751615,DE
-1424751616,1424752127,IE
-1424752128,1424752639,DE
+1424749056,1424752639,DE
1424752640,1424785407,HU
1424785408,1424818175,ES
1424818176,1424850943,RU
@@ -16889,17 +16351,11 @@
1425915904,1425932287,FI
1425932288,1425948671,GR
1425948672,1425965055,DE
-1425965056,1425967871,EU
-1425967872,1425968383,DZ
-1425968384,1425970175,EU
+1425965056,1425970175,EU
1425970176,1425970431,FR
1425970432,1425971967,EU
1425971968,1425972223,A2
-1425972224,1425976831,EU
-1425976832,1425977342,GB
-1425977343,1425977343,EU
-1425977344,1425977855,IT
-1425977856,1425980415,EU
+1425972224,1425980415,EU
1425980416,1425980671,IQ
1425980672,1425981439,A2
1425981440,1425997823,RU
@@ -16950,9 +16406,7 @@
1427111936,1427177471,DE
1427177472,1427220556,NL
1427220557,1427220557,KG
-1427220558,1427227135,NL
-1427227136,1427227647,US
-1427227648,1427236631,NL
+1427220558,1427236631,NL
1427236632,1427236633,US
1427236634,1427243007,NL
1427243008,1427308543,IT
@@ -17092,9 +16546,7 @@
1432322048,1432338431,RU
1432338432,1432346623,FR
1432346624,1433403391,TR
-1433403392,1433410047,ES
-1433410048,1433410559,US
-1433410560,1433411583,ES
+1433403392,1433411583,ES
1433411584,1433419775,RU
1433419776,1433427967,LB
1433427968,1433436159,RU
@@ -17126,8 +16578,8 @@
1433614336,1433615027,DE
1433615028,1433615028,EU
1433615029,1433615359,DE
-1433615360,1433615871,FR
-1433615872,1433616383,CH
+1433615360,1433615615,FR
+1433615616,1433616383,GB
1433616384,1433624575,AE
1433624576,1433632767,LV
1433632768,1433640959,GI
@@ -17212,21 +16664,11 @@
1434613760,1434615807,BG
1434615808,1434648575,IL
1434648576,1434681343,FI
-1434681344,1434683391,NL
-1434683392,1434684415,DE
-1434684416,1434684927,NL
-1434684928,1434685439,DE
-1434685440,1434695679,NL
-1434695680,1434696191,DE
-1434696192,1434696703,NL
+1434681344,1434696703,NL
1434696704,1434697727,DE
-1434697728,1434700031,NL
-1434700032,1434700543,DE
-1434700544,1434705919,NL
+1434697728,1434705919,NL
1434705920,1434707967,DE
-1434707968,1434711039,NL
-1434711040,1434711551,DE
-1434711552,1434714111,NL
+1434707968,1434714111,NL
1434714112,1434746879,AZ
1434746880,1434779647,CZ
1434779648,1434812415,GB
@@ -17250,8 +16692,7 @@
1436424192,1436426239,CH
1436426240,1436428287,BA
1436428288,1436430335,GB
-1436430336,1436430847,US
-1436430848,1436432383,RU
+1436430336,1436432383,RU
1436432384,1436436479,GB
1436436480,1436438527,LV
1436438528,1436440575,IT
@@ -17263,7 +16704,7 @@
1436452864,1436453314,GB
1436453315,1436453315,EU
1436453316,1436453631,GB
-1436453632,1436453887,NL
+1436453632,1436453887,EU
1436453888,1436454911,GB
1436454912,1436456959,AZ
1436456960,1436459007,GB
@@ -17337,9 +16778,7 @@
1438384128,1438400511,FI
1438400512,1438433279,SE
1438433280,1438515199,GB
-1438515200,1438523391,DE
-1438523392,1438523903,NL
-1438523904,1438580735,DE
+1438515200,1438580735,DE
1438580736,1438646271,NL
1438646272,1438662655,RU
1438662656,1438679039,ES
@@ -17514,13 +16953,11 @@
1441636352,1441644543,PL
1441644544,1441645823,GB
1441645824,1441646079,GB
-1441646080,1441647871,GB
-1441647872,1441648383,CH
-1441648384,1441649407,GB
+1441646080,1441649407,GB
1441649408,1441649919,GB
1441649920,1441652223,GB
1441652224,1441652479,GB
-1441652480,1441652735,DE
+1441652480,1441652735,GB
1441652736,1441660927,SK
1441660928,1441669119,ES
1441669120,1441677311,GE
@@ -17536,9 +16973,7 @@
1441701888,1441710079,AT
1441710080,1441718271,SE
1441718272,1441726463,DE
-1441726464,1441729023,KW
-1441729024,1441729535,SG
-1441729536,1441734655,KW
+1441726464,1441734655,KW
1441734656,1441742847,RU
1441742848,1441751039,CZ
1441751040,1441759231,DE
@@ -17582,7 +17017,9 @@
1445433856,1445434111,BE
1445434112,1445435391,NL
1445435392,1445435647,BE
-1445435648,1445462015,NL
+1445435648,1445448127,NL
+1445448128,1445448191,BE
+1445448192,1445462015,NL
1445462016,1445986303,IE
1445986304,1446051839,DK
1446051840,1446117375,CZ
@@ -17603,9 +17040,7 @@
1446739968,1446772735,HU
1446772736,1446805503,SA
1446805504,1446838271,FI
-1446838272,1446862079,SI
-1446862080,1446862591,HR
-1446862592,1446871039,SI
+1446838272,1446871039,SI
1446871040,1446903807,CZ
1446903808,1446906879,A2
1446906880,1446907135,IQ
@@ -17699,14 +17134,15 @@
1466097664,1466099711,ES
1466099712,1466101759,PL
1466101760,1466103807,DE
-1466103808,1466104319,GB
-1466104320,1466104442,FR
+1466103808,1466104116,FR
+1466104117,1466104117,GB
+1466104118,1466104442,FR
1466104443,1466104443,GB
1466104444,1466104467,FR
1466104468,1466104468,GB
-1466104469,1466104831,FR
-1466104832,1466105343,BE
-1466105344,1466105855,FR
+1466104469,1466105343,FR
+1466105344,1466105599,GB
+1466105600,1466105855,FR
1466105856,1466122239,PL
1466122240,1466130431,LV
1466130432,1466138623,PL
@@ -17734,9 +17170,7 @@
1466592000,1466613759,DE
1466613760,1466615807,ES
1466615808,1466616575,GB
-1466616576,1466616831,DE
-1466616832,1466617343,ES
-1466617344,1466630143,DE
+1466616576,1466630143,DE
1466630144,1466695679,IR
1466695680,1466761215,FI
1466761216,1466826751,SA
@@ -17815,8 +17249,8 @@
1475094528,1475096575,RU
1475096576,1475098623,BH
1475098624,1475101695,GB
-1475101696,1475102207,ZA
-1475102208,1475102719,GB
+1475101696,1475101951,ZA
+1475101952,1475102719,GB
1475102720,1475104767,FR
1475104768,1475106815,RU
1475106816,1475108863,SE
@@ -17846,8 +17280,7 @@
1475151872,1475153919,BE
1475153920,1475155967,GB
1475155968,1475158015,NL
-1475158016,1475159551,IS
-1475159552,1475160063,GB
+1475158016,1475160063,IS
1475160064,1475162111,RU
1475162112,1475170303,GB
1475170304,1475172351,ES
@@ -17953,9 +17386,7 @@
1475575808,1475592191,AT
1475592192,1475608575,GB
1475608576,1475624959,RU
-1475624960,1475627775,JE
-1475627776,1475628287,GB
-1475628288,1475639039,JE
+1475624960,1475639039,JE
1475639040,1475639295,GB
1475639296,1475639391,JE
1475639392,1475639399,GB
@@ -17967,9 +17398,7 @@
1475674112,1475690495,DE
1475690496,1475706879,CH
1475706880,1475723263,RU
-1475723264,1475725311,GB
-1475725312,1475725823,RU
-1475725824,1475726079,GB
+1475723264,1475726079,GB
1475726080,1475726335,RU
1475726336,1475726847,GB
1475726848,1475727103,RU
@@ -17981,13 +17410,11 @@
1475729664,1475729671,UA
1475729672,1475729919,GB
1475729920,1475731455,UA
-1475731456,1475732479,GB
-1475732480,1475732991,RU
-1475732992,1475735807,GB
+1475731456,1475735807,GB
1475735808,1475736063,RU
1475736064,1475738111,GB
-1475738112,1475739351,RU
-1475739352,1475739647,GB
+1475738112,1475738879,RU
+1475738880,1475739647,GB
1475739648,1475756031,BG
1475756032,1475772415,GB
1475772416,1475788799,LV
@@ -18004,12 +17431,7 @@
1475870720,1475878911,NO
1475878912,1475887103,IT
1475887104,1475895295,PL
-1475895296,1475899903,GB
-1475899904,1475900415,IE
-1475900416,1475900927,GB
-1475900928,1475901439,IE
-1475901440,1475902463,CH
-1475902464,1475903487,GB
+1475895296,1475903487,GB
1475903488,1475911679,IR
1475911680,1475919871,MD
1475919872,1475921983,IT
@@ -18070,10 +17492,8 @@
1476304896,1476313087,BG
1476313088,1476315135,FI
1476315136,1476316159,US
-1476316160,1476316671,SG
-1476316672,1476317183,CN
-1476317184,1476317695,FI
-1476317696,1476319231,DE
+1476316160,1476317183,FI
+1476317184,1476319231,DE
1476319232,1476321279,FI
1476321280,1476329471,MC
1476329472,1476337663,RU
@@ -18245,24 +17665,13 @@
1489567744,1489600511,BH
1489600512,1489633279,RU
1489633280,1489635327,IT
-1489635328,1489635838,GB
-1489635839,1489635839,EU
-1489635840,1489636863,IT
-1489636864,1489637887,EU
-1489637888,1489638399,A2
-1489638400,1489638911,EU
-1489638912,1489640447,IT
-1489640448,1489640959,EU
-1489640960,1489641471,IT
-1489641472,1489641983,EU
-1489641984,1489642495,IT
-1489642496,1489642751,EU
-1489642752,1489644543,IT
+1489635328,1489639423,EU
+1489639424,1489640447,IT
+1489640448,1489642751,EU
+1489642752,1489643519,IT
+1489643520,1489644543,EU
1489644544,1489644799,IQ
-1489644800,1489645055,A2
-1489645056,1489645567,IT
-1489645568,1489646079,A2
-1489646080,1489646335,EU
+1489644800,1489646335,EU
1489646336,1489646591,US
1489646592,1489647615,EU
1489647616,1489648639,IT
@@ -18274,13 +17683,7 @@
1489651200,1489653759,IT
1489653760,1489657855,EU
1489657856,1489659903,IT
-1489659904,1489661951,EU
-1489661952,1489662463,GB
-1489662464,1489662975,EU
-1489662976,1489663999,IT
-1489664000,1489664511,LY
-1489664512,1489665535,EU
-1489665536,1489666047,IT
+1489659904,1489666047,EU
1489666048,1489698815,GB
1489698816,1489731583,MT
1489731584,1489764351,BG
@@ -18405,9 +17808,7 @@
1494368256,1494376447,IE
1494376448,1494384639,SE
1494384640,1494392831,RU
-1494392832,1494398975,NL
-1494398976,1494399487,US
-1494399488,1494401023,NL
+1494392832,1494401023,NL
1494401024,1494409215,LV
1494409216,1494417407,FI
1494417408,1494425599,TR
@@ -18429,9 +17830,7 @@
1494581248,1494589439,RU
1494589440,1494592511,NL
1494592512,1494593535,US
-1494593536,1494594559,NL
-1494594560,1494595071,US
-1494595072,1494597631,NL
+1494593536,1494597631,NL
1494597632,1494605823,IT
1494605824,1494614015,GB
1494614016,1494616063,RU
@@ -18491,9 +17890,7 @@
1495146496,1495150591,FR
1495150592,1495151615,EU
1495151616,1495153663,FR
-1495153664,1495154175,EU
-1495154176,1495154687,FR
-1495154688,1495167743,EU
+1495153664,1495167743,EU
1495167744,1495167999,FR
1495168000,1495168767,EU
1495168768,1495169023,GB
@@ -18530,8 +17927,7 @@
1495261184,1495261439,EU
1495261440,1495263231,PT
1495263232,1495265279,GB
-1495265280,1495265791,DE
-1495265792,1495267327,US
+1495265280,1495267327,US
1495267328,1495269375,SE
1495269376,1495306239,RO
1495306240,1495306573,GB
@@ -18541,22 +17937,15 @@
1495326720,1495330815,MD
1495330816,1495334911,RO
1495334912,1495335935,MD
-1495335936,1495622143,RO
-1495622144,1495622655,A2
-1495622656,1495875583,RO
+1495335936,1495875583,RO
1495875584,1495891967,MD
-1495891968,1495937023,RO
-1495937024,1495937535,SE
-1495937536,1496078335,RO
+1495891968,1496078335,RO
1496078336,1496079359,MD
1496079360,1496121343,RO
1496121344,1496122367,MD
1496122368,1496178943,RO
1496178944,1496179199,AE
-1496179200,1496197119,RO
-1496197120,1496197631,MD
-1496197632,1496262655,RO
-1496262656,1496262911,AE
+1496179200,1496262911,RO
1496262912,1496263167,US
1496263168,1496295423,RO
1496295424,1496297471,GB
@@ -18581,9 +17970,7 @@
1500078080,1500086271,GB
1500086272,1500094463,RU
1500094464,1500102655,AT
-1500102656,1500108799,NL
-1500108800,1500109311,DE
-1500109312,1500110847,NL
+1500102656,1500110847,NL
1500110848,1500119039,UA
1500119040,1500127231,TR
1500127232,1500135423,FI
@@ -18619,9 +18006,7 @@
1500209152,1500211199,KZ
1500211200,1500213247,IT
1500213248,1500217343,RU
-1500217344,1500217855,CZ
-1500217856,1500218879,DE
-1500218880,1500219391,EE
+1500217344,1500219391,DE
1500219392,1500221439,RU
1500221440,1500223487,SK
1500223488,1500225535,PL
@@ -18671,9 +18056,7 @@
1502642176,1502658559,IR
1502658560,1502674943,AT
1502674944,1502691327,DE
-1502691328,1502703103,GB
-1502703104,1502703615,SE
-1502703616,1502707711,GB
+1502691328,1502707711,GB
1502707712,1502715903,RU
1502715904,1502717951,IT
1502717952,1502719999,GB
@@ -18699,8 +18082,8 @@
1502975456,1502975487,IE
1502975488,1502975743,FR
1502975744,1502975999,DE
-1502976000,1502977535,FR
-1502977536,1502979071,US
+1502976000,1502978047,FR
+1502978048,1502979071,US
1502979072,1502979135,FR
1502979136,1502979199,GB
1502979200,1502979215,FR
@@ -18709,13 +18092,8 @@
1502980352,1502980607,US
1502980608,1502981887,FR
1502981888,1502982143,NL
-1502982144,1502982655,DE
-1502982656,1502984703,FR
-1502984704,1502989055,DE
-1502989056,1502989567,TR
-1502989568,1502996735,DE
-1502996736,1502997247,PL
-1502997248,1502999734,DE
+1502982144,1502986239,FR
+1502986240,1502999734,DE
1502999735,1502999735,SA
1502999736,1502999737,DE
1502999738,1502999738,SA
@@ -18967,9 +18345,7 @@
1505681408,1505689599,RU
1505689600,1505697791,NO
1505697792,1505705983,IE
-1505705984,1505708543,DE
-1505708544,1505709055,AT
-1505709056,1505714175,DE
+1505705984,1505714175,DE
1505714176,1505722367,LV
1505722368,1505738751,PL
1505738752,1505746943,GB
@@ -18993,9 +18369,7 @@
1506377728,1506410495,HR
1506410496,1506422063,DE
1506422064,1506422079,GB
-1506422080,1506441727,DE
-1506441728,1506442239,MU
-1506442240,1506443263,DE
+1506422080,1506443263,DE
1506443264,1506445087,GB
1506445088,1506445119,DE
1506445120,1506445135,GB
@@ -19053,9 +18427,7 @@
1506465189,1506465279,EU
1506465280,1506466399,GB
1506466400,1506466431,DE
-1506466432,1506467839,GB
-1506467840,1506468351,IT
-1506468352,1506468863,GB
+1506466432,1506468863,GB
1506468864,1506469119,IT
1506469120,1506469663,GB
1506469664,1506469695,IT
@@ -19188,9 +18560,7 @@
1508802560,1508818943,GB
1508818944,1508830719,RO
1508830720,1508831487,SK
-1508831488,1508831743,RO
-1508831744,1508832255,SK
-1508832256,1508835327,RO
+1508831488,1508835327,RO
1508835328,1508851711,CZ
1508851712,1508868095,PL
1508868096,1508884479,RU
@@ -19215,8 +18585,7 @@
1509486592,1509490687,CZ
1509490688,1509494783,DK
1509494784,1509498879,RU
-1509498880,1509501439,DE
-1509501440,1509502975,CH
+1509498880,1509502975,DE
1509502976,1509507071,RU
1509507072,1509511167,GB
1509511168,1509515263,LT
@@ -19424,8 +18793,7 @@
1518927872,1518944255,RU
1518944256,1518960639,SE
1518960640,1518961663,LT
-1518961664,1518962175,EE
-1518962176,1518962687,LV
+1518961664,1518962687,SE
1518962688,1518964735,NO
1518964736,1518966783,HR
1518966784,1518967807,SE
@@ -19455,9 +18823,9 @@
1519927616,1519927679,NL
1519927680,1519931135,GB
1519931136,1519934463,NL
-1519934464,1519934975,GB
-1519934976,1519935487,NL
-1519935488,1519938559,GB
+1519934464,1519936191,GB
+1519936192,1519936255,DK
+1519936256,1519938559,GB
1519938560,1519939583,NL
1519939584,1519943679,GB
1519943680,1519976447,AT
@@ -19562,9 +18930,7 @@
1533474816,1533476863,FR
1533476864,1533478911,IE
1533478912,1533480959,RS
-1533480960,1533481983,NL
-1533481984,1533482495,GB
-1533482496,1533483007,NL
+1533480960,1533483007,NL
1533483008,1533485055,AM
1533485056,1533485951,GB
1533485952,1533486079,SE
@@ -19594,7 +18960,9 @@
1533540352,1533542399,AT
1533542400,1533607935,HU
1533607936,1533640703,LV
-1533640704,1533669375,RU
+1533640704,1533663231,RU
+1533663232,1533665279,NL
+1533665280,1533669375,RU
1533669376,1533671423,DE
1533671424,1533673471,FI
1533673472,1533677567,DE
@@ -19621,9 +18989,7 @@
1533851648,1533853695,CH
1533853696,1533868287,GB
1533868288,1533868543,TR
-1533868544,1533870079,GB
-1533870080,1533870591,ES
-1533870592,1533874175,GB
+1533868544,1533874175,GB
1533874176,1533878271,DE
1533878272,1533880319,CZ
1533880320,1533882367,GB
@@ -19635,7 +19001,7 @@
1533902848,1533911039,RU
1533911040,1533913087,ES
1533913088,1533915135,IT
-1533915136,1533919231,GB
+1533915136,1533919231,NL
1533919232,1533921279,IT
1533921280,1533923327,RU
1533923328,1533925375,TR
@@ -19650,11 +19016,15 @@
1534590976,1534656511,HU
1534656512,1534711807,FR
1534711808,1534712831,BE
-1534712832,1534717663,FR
+1534712832,1534714751,FR
+1534714752,1534714767,DE
+1534714768,1534717663,FR
1534717664,1534717679,GB
1534717680,1534720003,FR
1534720004,1534720007,ES
-1534720008,1534720471,FR
+1534720008,1534720023,FR
+1534720024,1534720027,PL
+1534720028,1534720471,FR
1534720472,1534720479,DE
1534720480,1534721619,FR
1534721620,1534721623,ES
@@ -19716,8 +19086,7 @@
1535717376,1535721471,CH
1535721472,1535721727,DE
1535721728,1535737855,CH
-1535737856,1535770111,HU
-1535770112,1535770623,SR
+1535737856,1535770623,HU
1535770624,1535803391,CH
1535803392,1535836159,GR
1535836160,1535868927,HU
@@ -19734,8 +19103,8 @@
1536045056,1536045311,IQ
1536045312,1536045567,LB
1536045568,1536047103,DE
-1536047104,1536047615,LB
-1536047616,1536049151,DE
+1536047104,1536047359,LB
+1536047360,1536049151,DE
1536049152,1536051199,IT
1536051200,1536057343,RU
1536057344,1536061439,IE
@@ -19826,8 +19195,8 @@
1537212416,1538260991,FR
1538260992,1538785279,BE
1538785280,1538793471,NL
-1538793472,1538797055,DE
-1538797056,1538801663,NL
+1538793472,1538797567,DE
+1538797568,1538801663,NL
1538801664,1538809855,IR
1538809856,1538818047,GE
1538818048,1538826239,NO
@@ -19838,9 +19207,7 @@
1538859008,1538875391,RU
1538875392,1538883583,RS
1538883584,1538891775,BE
-1538891776,1538894079,DE
-1538894080,1538894591,FR
-1538894592,1538894847,DE
+1538891776,1538894847,DE
1538894848,1538895871,FR
1538895872,1538896895,DE
1538896896,1538897919,FR
@@ -20114,8 +19481,7 @@
1539477504,1539478015,PL
1539478016,1539478527,CH
1539478528,1539479039,RO
-1539479040,1539479551,DK
-1539479552,1539480063,GB
+1539479040,1539480063,GB
1539480064,1539480575,DK
1539480576,1539481087,PL
1539481088,1539481599,GB
@@ -20157,8 +19523,7 @@
1539503104,1539504127,RU
1539504128,1539504639,AT
1539504640,1539505151,UA
-1539505152,1539505663,RU
-1539505664,1539506175,AT
+1539505152,1539506175,RU
1539506176,1539506687,NL
1539506688,1539507199,UA
1539507200,1539508223,RO
@@ -20655,7 +20020,6 @@
1539778816,1539779071,RO
1539779072,1539779327,GB
1539779328,1539779583,CH
-1539779584,1539779839,PL
1539779840,1539780095,NL
1539780096,1539780351,RU
1539780352,1539780607,AT
@@ -20947,8 +20311,8 @@
1539950848,1539951103,RU
1539951104,1539951615,UA
1539951616,1539953663,RU
-1539953664,1539954175,CH
-1539954176,1539954687,KZ
+1539953664,1539954175,AT
+1539954176,1539954687,RU
1539954688,1539956735,RO
1539956736,1539957759,UA
1539957760,1539958783,RU
@@ -21279,7 +20643,7 @@
1540291072,1540291583,BE
1540291584,1540292095,UA
1540292096,1540292607,RU
-1540292608,1540293119,FR
+1540292608,1540293119,IT
1540293120,1540293631,DK
1540293632,1540295167,UA
1540295168,1540295679,PL
@@ -21344,7 +20708,6 @@
1540330496,1540331007,PL
1540331008,1540331519,IT
1540331520,1540332031,GB
-1540332032,1540332543,RU
1540332544,1540333055,PL
1540333056,1540333567,NO
1540333568,1540334079,RO
@@ -21599,7 +20962,6 @@
1540416256,1540416511,CH
1540416512,1540416767,RU
1540416768,1540417023,NL
-1540417024,1540417279,RU
1540417280,1540417535,UA
1540417536,1540417791,RU
1540417792,1540418047,HR
@@ -22640,8 +22002,7 @@
1540920576,1540920831,PL
1540920832,1540921087,HU
1540921088,1540921599,RO
-1540921600,1540921855,MT
-1540921856,1540922111,EU
+1540921600,1540922111,MT
1540922112,1540922367,ES
1540922368,1540922879,RO
1540922880,1540923135,DE
@@ -22770,7 +22131,7 @@
1540966912,1540967935,RU
1540967936,1540968447,UA
1540968960,1540969471,RO
-1540969472,1540969983,NL
+1540969472,1540969983,GB
1540969984,1540970495,DE
1540970496,1540971007,IE
1540971008,1540971519,UA
@@ -23686,7 +23047,7 @@
1541420032,1541420543,RU
1541420544,1541421055,NL
1541421056,1541421567,PL
-1541421568,1541422079,CZ
+1541421568,1541422079,GB
1541422080,1541422591,PL
1541422592,1541423103,RU
1541423616,1541424127,AT
@@ -23697,7 +23058,8 @@
1541426176,1541426687,RU
1541426688,1541427199,UA
1541427200,1541428223,RU
-1541428224,1541429247,UA
+1541428224,1541428991,UA
+1541428992,1541429247,RU
1541429248,1541429759,FI
1541429760,1541430271,CZ
1541430272,1541430783,LT
@@ -23867,7 +23229,7 @@
1541572608,1541573119,RU
1541573120,1541573631,UA
1541573632,1541574655,RU
-1541574656,1541575167,DK
+1541574656,1541575167,SE
1541575168,1541575423,PL
1541575424,1541575679,IT
1541575680,1541577727,RU
@@ -24254,8 +23616,7 @@
1541795584,1541795839,ES
1541795840,1541796863,UA
1541796864,1541797375,RU
-1541797376,1541797887,NL
-1541797888,1541798143,GB
+1541797376,1541798143,GB
1541798144,1541798911,PL
1541798912,1541799935,CZ
1541799936,1541800447,FR
@@ -24543,8 +23904,7 @@
1541958144,1541958655,RS
1541958656,1541959679,RU
1541959680,1541959935,PL
-1541959936,1541960191,RU
-1541960192,1541960703,NL
+1541959936,1541960703,RU
1541960704,1541961727,UA
1541961728,1541962751,RU
1541962752,1541963007,GB
@@ -24568,7 +23928,8 @@
1541974016,1541975551,RU
1541975552,1541975807,TR
1541975808,1541976319,PL
-1541976320,1541977087,UA
+1541976320,1541976575,UA
+1541976576,1541977087,RU
1541977088,1541977343,IT
1541977344,1541977599,GB
1541977600,1541977855,RO
@@ -24587,7 +23948,8 @@
1541984768,1541985279,RO
1541985280,1541986303,CZ
1541986304,1541986815,RU
-1541986816,1541988351,SK
+1541986816,1541987327,CZ
+1541987328,1541988351,SK
1541988352,1541988607,FR
1541988608,1541988863,RU
1541988864,1541989631,RO
@@ -24619,7 +23981,6 @@
1542000640,1542000895,GB
1542000896,1542001151,UA
1542001152,1542001663,PL
-1542001664,1542001919,SC
1542001920,1542002175,HU
1542002176,1542002687,NL
1542002688,1542002943,RS
@@ -24707,7 +24068,7 @@
1542055936,1542057471,PL
1542057472,1542060031,RU
1542060032,1542060287,SK
-1542060288,1542060543,DE
+1542060288,1542060543,RO
1542060544,1542061055,PL
1542061056,1542062079,IT
1542062080,1542064127,UA
@@ -25187,7 +24548,8 @@
1542346240,1542348287,RU
1542348288,1542348799,MD
1542348800,1542349823,RU
-1542349824,1542351359,UA
+1542349824,1542350847,UA
+1542350848,1542351359,CZ
1542351360,1542351615,BG
1542351616,1542351871,PL
1542351872,1542353151,RU
@@ -25553,7 +24915,7 @@
1542540800,1542541311,GB
1542541312,1542542335,UA
1542542336,1542542847,RU
-1542542848,1542543359,IT
+1542542848,1542543359,GB
1542543360,1542544383,RU
1542544384,1542544639,IR
1542544640,1542544895,UA
@@ -25759,8 +25121,7 @@
1546108928,1546113023,IM
1546113024,1546121215,RU
1546121216,1546123263,FR
-1546123264,1546124799,ES
-1546124800,1546125311,FR
+1546123264,1546125311,ES
1546125312,1546256383,GB
1546256384,1546264575,RU
1546264576,1546266623,TR
@@ -25796,8 +25157,7 @@
1546328064,1546330111,CZ
1546330112,1546332159,SE
1546332160,1546334207,GB
-1546334208,1546335743,DE
-1546335744,1546336255,GB
+1546334208,1546336255,DE
1546336256,1546338303,CZ
1546338304,1546340351,GB
1546340352,1546342399,DK
@@ -26182,10 +25542,7 @@
1566265344,1566266367,US
1566266368,1566269407,A2
1566269408,1566269439,DE
-1566269440,1566271487,NO
-1566271488,1566271999,FI
-1566272000,1566272511,SE
-1566272512,1566273535,NO
+1566269440,1566273535,NO
1566273536,1566277631,RU
1566277632,1566281727,IT
1566281728,1566285823,CZ
@@ -26340,19 +25697,11 @@
1567424512,1567490047,CY
1567490048,1567555583,IR
1567555584,1567621119,AT
-1567621120,1567696383,RO
-1567696384,1567696895,MD
-1567696896,1567705087,RO
+1567621120,1567705087,RO
1567705088,1567707135,MD
-1567707136,1567712767,RO
-1567712768,1567713279,DE
-1567713280,1567715327,RO
+1567707136,1567715327,RO
1567715328,1567717375,MD
-1567717376,1567742975,RO
-1567742976,1567743487,MD
-1567743488,1567750655,RO
-1567750656,1567751167,SE
-1567751168,1567752191,RO
+1567717376,1567752191,RO
1567752192,1567756287,MD
1567756288,1567763521,RO
1567763522,1567763522,EU
@@ -26474,9 +25823,7 @@
1570645248,1570652159,FR
1570652160,1570655999,SE
1570656000,1570656255,GB
-1570656256,1570660863,SE
-1570660864,1570661375,NO
-1570661376,1570668543,SE
+1570656256,1570668543,SE
1570668544,1570701311,RU
1570701312,1570717695,PL
1570717696,1570725887,HR
@@ -26489,40 +25836,36 @@
1570764800,1570766847,DE
1570766848,1571291135,DK
1571291136,1571422207,RO
-1571422208,1571422975,CZ
-1571422976,1571423231,RU
-1571423232,1571423743,CZ
-1571423744,1571423999,RU
-1571424000,1571424255,CZ
+1571422208,1571422719,CZ
+1571422720,1571423231,RU
+1571423232,1571423487,CZ
+1571423488,1571423999,RU
+1571424000,1571424255,KZ
1571424256,1571424511,KG
-1571424512,1571425279,CZ
+1571424512,1571424767,AM
+1571424768,1571425279,CZ
1571425280,1571425535,RU
-1571425536,1571428351,CZ
-1571428352,1571428863,RU
-1571428864,1571429375,CZ
+1571425536,1571429375,CZ
1571429376,1571435519,UA
1571435520,1571436543,CZ
1571436544,1571438591,RU
1571438592,1571441663,UA
1571441664,1571441791,RU
1571441792,1571441919,DE
-1571441920,1571442175,CZ
-1571442176,1571442687,NL
+1571441920,1571442687,CZ
1571442688,1571443199,UA
1571443200,1571443455,CZ
1571443456,1571443711,UA
1571443712,1571444735,CZ
1571444736,1571446783,NL
-1571446784,1571447807,KZ
-1571447808,1571448831,CZ
+1571446784,1571448831,CZ
1571448832,1571450879,US
1571450880,1571451903,UA
1571451904,1571452927,RU
1571452928,1571453951,CZ
1571453952,1571454975,GB
1571454976,1571455999,RU
-1571456000,1571456511,CY
-1571456512,1571457023,CZ
+1571456000,1571457023,CZ
1571457024,1571458047,UA
1571458048,1571459071,CZ
1571459072,1571463167,UA
@@ -26548,24 +25891,25 @@
1571524608,1571526655,RU
1571526656,1571528703,CZ
1571528704,1571529727,MD
-1571529728,1571530239,RU
-1571530240,1571531263,CZ
+1571529728,1571531263,CZ
1571531264,1571531775,UA
1571531776,1571532799,RU
1571532800,1571534079,CZ
1571534080,1571534847,RU
1571534848,1571535103,LV
1571535104,1571535871,CZ
-1571535872,1571539967,RU
-1571539968,1571541503,CZ
-1571541504,1571542015,CY
-1571542016,1571544063,CZ
+1571535872,1571538943,RU
+1571538944,1571541248,CZ
+1571541249,1571541504,UA
+1571541505,1571543551,CZ
+1571543552,1571543807,UA
+1571543808,1571544063,CZ
1571544064,1571545087,RU
1571545088,1571545343,CZ
1571545344,1571545599,UA
-1571545600,1571546111,CZ
-1571546112,1571546623,KZ
-1571546624,1571549183,CZ
+1571545600,1571545855,CZ
+1571545856,1571546111,RU
+1571546112,1571549183,CZ
1571549184,1571552255,UA
1571552256,1571553279,CZ
1571553280,1571684351,IL
@@ -26650,14 +25994,12 @@
1571995648,1572012031,UA
1572012032,1572020223,NO
1572020224,1572028415,SE
-1572028416,1572028927,RU
+1572028416,1572028927,GB
1572028928,1572029183,UA
-1572029184,1572029439,GB
-1572029440,1572029951,RU
-1572029952,1572030463,GB
+1572029184,1572030463,GB
1572030464,1572042751,RU
-1572042752,1572043263,GB
-1572043264,1572044799,RU
+1572042752,1572043775,GB
+1572043776,1572044799,RU
1572044800,1572061183,IT
1572061184,1572077567,PL
1572077568,1572093951,RU
@@ -26681,8 +26023,7 @@
1572257792,1572274175,FR
1572274176,1572276223,FI
1572276224,1572277247,US
-1572277248,1572277759,DE
-1572277760,1572290559,SG
+1572277248,1572290559,SG
1572290560,1572306943,RU
1572306944,1572323327,BG
1572323328,1572339711,UA
@@ -26702,7 +26043,8 @@
1572392960,1572393471,NL
1572393472,1572393983,GB
1572393984,1572394495,DE
-1572394496,1572397055,US
+1572394496,1572394751,FR
+1572394752,1572397055,US
1572397056,1572401151,AZ
1572401152,1572405247,GB
1572405248,1572409343,CZ
@@ -26728,9 +26070,7 @@
1572491264,1572495359,IT
1572495360,1572499455,RU
1572499456,1572503551,TR
-1572503552,1572506111,IT
-1572506112,1572506623,GR
-1572506624,1572507647,IT
+1572503552,1572507647,IT
1572507648,1572511743,GB
1572511744,1572515839,DE
1572515840,1572519935,NL
@@ -26911,8 +26251,9 @@
1578434560,1578500095,HU
1578500096,1578565631,FI
1578565632,1578582015,FR
-1578582016,1578584575,IT
-1578584576,1578586111,PT
+1578582016,1578584063,IT
+1578584064,1578585087,FR
+1578585088,1578586111,PT
1578586112,1578588159,ES
1578588160,1578590207,PL
1578590208,1578592175,FR
@@ -26926,9 +26267,7 @@
1578593472,1578593479,GB
1578593480,1578595419,FR
1578595420,1578595423,GB
-1578595424,1578596351,FR
-1578596352,1578596863,GB
-1578596864,1578602495,FR
+1578595424,1578602495,FR
1578602496,1578604543,NL
1578604544,1578606591,GB
1578606592,1578607725,DE
@@ -26982,9 +26321,7 @@
1581826048,1581842431,GB
1581842432,1581858815,BG
1581858816,1581875199,IT
-1581875200,1581890559,TR
-1581890560,1581891071,GB
-1581891072,1581891583,TR
+1581875200,1581891583,TR
1581891584,1581907967,RU
1581907968,1581924351,IT
1581924352,1581940735,UA
@@ -27124,7 +26461,7 @@
1585199104,1585201151,NL
1585201152,1585205247,IT
1585205248,1585207295,FR
-1585207296,1585211391,NL
+1585207296,1585209343,NL
1585211392,1585213439,CZ
1585213440,1585214463,GB
1585214464,1585217535,NL
@@ -27146,17 +26483,14 @@
1585242112,1585244159,RU
1585244160,1585246207,FR
1585246208,1585248255,RU
-1585248256,1585249279,CZ
-1585249280,1585249791,DE
-1585249792,1585250303,CZ
+1585248256,1585250303,CZ
1585250304,1585254399,RU
1585254400,1585256447,GB
1585256448,1585258495,DE
1585258496,1585260543,GB
1585260544,1585264639,RU
1585264640,1585265663,MT
-1585265664,1585266175,IM
-1585266176,1585266687,MT
+1585265664,1585266687,IM
1585266688,1585270783,DE
1585270784,1585272831,IT
1585272832,1585274879,RU
@@ -27378,17 +26712,14 @@
1588068352,1588592639,GB
1588592640,1588621311,RO
1588621312,1588625407,MD
-1588625408,1588689407,RO
-1588689408,1588689919,DE
-1588689920,1588723711,RO
+1588625408,1588723711,RO
1588723712,1588854783,UA
1588854784,1588985855,RU
1588985856,1589182463,IR
1589182464,1589198847,OM
1589198848,1589200895,FR
1589200896,1589202943,IT
-1589202944,1589203455,SE
-1589203456,1589204991,NL
+1589202944,1589204991,NL
1589204992,1589207039,DE
1589207040,1589215231,IT
1589215232,1589247999,GB
@@ -27467,8 +26798,8 @@
1590151168,1590153215,TR
1590153216,1590157311,RU
1590157312,1590157823,GB
-1590157824,1590158335,IE
-1590158336,1590161407,GB
+1590157824,1590158079,IE
+1590158080,1590161407,GB
1590161408,1590163455,DE
1590163456,1590165503,NL
1590165504,1590176643,AE
@@ -27497,17 +26828,16 @@
1592053760,1592057855,NL
1592057856,1592061951,RS
1592061952,1592066047,RU
-1592066048,1592067583,US
-1592067584,1592068095,CY
-1592068096,1592068607,US
-1592068608,1592070143,CY
+1592066048,1592066559,CY
+1592066560,1592067583,US
+1592067584,1592070143,CY
1592070144,1592074239,RU
1592074240,1592078335,SK
1592078336,1592082431,NL
1592082432,1592086527,GB
1592086528,1592087551,CZ
-1592087552,1592088063,PL
-1592088064,1592090623,CZ
+1592087552,1592087807,PL
+1592087808,1592090623,CZ
1592090624,1592094719,RU
1592094720,1592098815,RS
1592098816,1592102911,GB
@@ -27570,9 +26900,7 @@
1592393728,1592459263,SE
1592459264,1592524799,TR
1592524800,1592557567,GB
-1592557568,1592576511,BG
-1592576512,1592577023,FR
-1592577024,1592590335,BG
+1592557568,1592590335,BG
1592590336,1592623103,FI
1592623104,1592655871,RU
1592655872,1592786943,FR
@@ -27601,9 +26929,7 @@
1593147392,1593163775,RU
1593163776,1593180159,AT
1593180160,1593196543,NO
-1593196544,1593210879,SE
-1593210880,1593211391,NO
-1593211392,1593212927,SE
+1593196544,1593212927,SE
1593212928,1593229311,PL
1593229312,1593245695,EE
1593245696,1593247743,NL
@@ -27685,7 +27011,11 @@
1596950528,1596950783,UA
1596950784,1596951551,CZ
1596951552,1596952063,NL
-1596952064,1596981247,CZ
+1596952064,1596952575,UA
+1596952576,1596952831,RU
+1596952832,1596953599,CZ
+1596953600,1596954623,UA
+1596954624,1596981247,CZ
1596981248,1597243391,PL
1597243392,1597505535,RU
1597505536,1597767679,KZ
@@ -27714,8 +27044,8 @@
1599127552,1599143935,CZ
1599143936,1599160319,UA
1599160320,1599176703,IR
-1599176704,1599188991,FR
-1599188992,1599189503,DE
+1599176704,1599189247,FR
+1599189248,1599189503,DE
1599189504,1599190015,FR
1599190016,1599190271,EU
1599190272,1599193087,FR
@@ -27804,9 +27134,7 @@
1602291712,1602293759,SA
1602293760,1602295807,GB
1602295808,1602297855,NL
-1602297856,1602298879,IL
-1602298880,1602299391,MT
-1602299392,1602299903,GB
+1602297856,1602299903,IL
1602299904,1602301951,GR
1602301952,1602303999,DE
1602304000,1602306047,RU
@@ -27873,10 +27201,7 @@
1602441216,1602443263,GB
1602443264,1602445311,RU
1602445312,1602447359,DE
-1602447360,1602447871,GB
-1602447872,1602448383,DE
-1602448384,1602448895,NL
-1602448896,1602449407,GB
+1602447360,1602449407,GB
1602449408,1602451455,LV
1602451456,1602453503,DE
1602453504,1602455551,SK
@@ -27966,8 +27291,7 @@
1603067928,1603071999,GB
1603072000,1603076095,CZ
1603076096,1603080191,RU
-1603080192,1603080447,GB
-1603080448,1603080703,SE
+1603080192,1603080703,GB
1603080704,1603080831,US
1603080832,1603080959,SE
1603080960,1603081087,DE
@@ -28003,9 +27327,7 @@
1603133440,1603137535,RU
1603137536,1603141631,KW
1603141632,1603145727,ES
-1603145728,1603146239,IL
-1603146240,1603146751,US
-1603146752,1603149823,IL
+1603145728,1603149823,IL
1603149824,1603153919,RU
1603153920,1603158015,NL
1603158016,1603162111,DE
@@ -28092,10 +27414,7 @@
1604919296,1604927487,NO
1604927488,1604935679,IT
1604935680,1604952063,RU
-1604952064,1604958719,DE
-1604958720,1604959231,RU
-1604959232,1604959743,DE
-1604959744,1604960255,RU
+1604952064,1604960255,DE
1604960256,1604968447,BG
1604968448,1604976639,ES
1604976640,1604993023,FR
@@ -28169,18 +27488,11 @@
1605125905,1605125920,DE
1605125921,1605126911,GB
1605126912,1605127167,EU
-1605127168,1605127679,US
-1605127680,1605128191,GB
-1605128192,1605128703,US
-1605128704,1605129215,GB
-1605129216,1605129727,US
-1605129728,1605130244,GB
+1605127168,1605130244,GB
1605130245,1605130245,EU
1605130246,1605130247,GB
1605130248,1605130248,EU
-1605130249,1605131263,GB
-1605131264,1605131775,US
-1605131776,1605132287,GB
+1605130249,1605132287,GB
1605132288,1605148671,RU
1605148672,1605156863,PT
1605156864,1605165055,JO
@@ -28227,9 +27539,7 @@
1605697536,1605734399,RU
1605734400,1605736447,GB
1605736448,1605742591,RU
-1605742592,1605743103,GB
-1605743104,1605744127,RU
-1605744128,1605744639,GB
+1605742592,1605744639,GB
1605744640,1605756927,RU
1605756928,1605763071,GB
1605763072,1605795839,RU
@@ -28268,7 +27578,8 @@
1607617536,1607618559,EU
1607618560,1607620607,ES
1607620608,1607621375,IT
-1607621376,1607622655,EU
+1607621376,1607621631,EU
+1607621632,1607622655,IT
1607622656,1607624703,ES
1607624704,1607625983,IT
1607625984,1607626239,EU
@@ -28292,24 +27603,18 @@
1607761920,1607766015,SY
1607766016,1607794687,EG
1607794688,1607802879,RU
-1607802880,1607811583,GB
-1607811584,1607813631,RU
-1607813632,1607815167,GB
-1607815168,1607819263,RU
-1607819264,1607820287,GB
+1607802880,1607820287,GB
1607820288,1607821055,RU
-1607821056,1607821823,GB
-1607821824,1607822335,RU
-1607822336,1607822847,GB
-1607822848,1607826687,RU
+1607821056,1607823359,GB
+1607823360,1607824895,RU
+1607824896,1607825919,GB
+1607825920,1607826687,RU
1607826688,1607827455,GB
1607827456,1607860223,RU
1607860224,1607892991,ES
1607892992,1607893055,GB
1607893056,1607893119,DE
-1607893120,1607893247,ES
-1607893248,1607893311,AT
-1607893312,1607925759,ES
+1607893120,1607925759,ES
1607925760,1607926783,RU
1607926784,1607927807,UA
1607927808,1607929855,RU
@@ -28374,10 +27679,8 @@
1611227136,1611235327,CA
1611235328,1611923455,US
1611923456,1612185599,CA
-1612185600,1612611329,US
-1612611330,1612611330,CA
-1612611331,1612611583,US
-1612611584,1612636159,CA
+1612185600,1612611327,US
+1612611328,1612636159,CA
1612636160,1613471743,US
1613471744,1613479935,JM
1613479936,1613488127,US
@@ -28407,9 +27710,7 @@
1614786560,1618837503,US
1618837504,1618841599,CA
1618841600,1618849791,US
-1618849792,1618852863,CA
-1618852864,1618853375,US
-1618853376,1618862079,CA
+1618849792,1618862079,CA
1618862080,1618866175,US
1618866176,1618870271,CA
1618870272,1618984959,US
@@ -28459,7 +27760,10 @@
1654546432,1654550527,VG
1654550528,1654554623,US
1654554624,1654558719,CA
-1654558720,1654648831,US
+1654558720,1654597375,US
+1654597376,1654597631,US
+1654597632,1654648575,US
+1654648576,1654648831,US
1654648832,1654652927,CA
1654652928,1673527295,US
1673527296,1673560063,CA
@@ -28467,9 +27771,7 @@
1673986048,1674051583,CA
1674051584,1674575871,US
1674575872,1677721599,CA
-1677721600,1680534015,US
-1680534016,1680534527,CN
-1680534528,1680535551,US
+1677721600,1680535551,US
1680535552,1680539647,CA
1680539648,1680564223,US
1680564224,1680572415,CA
@@ -28717,7 +28019,6 @@
1728316416,1728317439,MY
1728317440,1728319487,JP
1728319488,1728320511,AU
-1728320512,1728321535,PH
1728321536,1728322559,JP
1728322560,1728323583,MY
1728323584,1728324607,JP
@@ -29016,7 +28317,7 @@
1728593152,1728593407,AU
1728593408,1728593663,IN
1728593664,1728593919,ID
-1728593920,1728595967,JP
+1728593920,1728594943,JP
1728595968,1728596479,NZ
1728596480,1728598015,ID
1728598016,1728599039,NZ
@@ -29028,7 +28329,6 @@
1728606208,1728607231,PK
1728607232,1728608255,IN
1728608256,1728608511,SG
-1728608512,1728608767,IN
1728608768,1728609023,ID
1728609024,1728610303,IN
1728610304,1728611327,TH
@@ -29297,7 +28597,6 @@
1728861184,1728861439,ID
1728861440,1728862207,AU
1728862208,1728863231,PH
-1728863232,1728864255,HK
1728864256,1728865279,AF
1728865280,1728866303,AU
1728866304,1728867327,VN
@@ -29352,7 +28651,7 @@
1728905472,1728905727,PK
1728905728,1728907263,IN
1728907264,1728908287,NZ
-1728908288,1728912383,JP
+1728909312,1728912383,JP
1728912384,1728913407,TH
1728913408,1728914431,PH
1728914432,1728915199,ID
@@ -30272,6 +29571,7 @@
1729829888,1729831935,AU
1729831936,1729832191,ID
1729832192,1729832447,NZ
+1729832448,1729832959,AU
1729832960,1729833983,JP
1729833984,1729835007,SG
1729835008,1729836031,IN
@@ -30283,6 +29583,51 @@
1729842176,1729843199,HK
1729843200,1729844223,JP
1729844224,1729845247,IN
+1729845248,1729846271,NZ
+1729846272,1729847295,AU
+1729847296,1729848319,CN
+1729848320,1729849343,TH
+1729849344,1729850367,MY
+1729850368,1729851391,HK
+1729851392,1729852415,MY
+1729852416,1729853439,MM
+1729853440,1729853695,IN
+1729853696,1729853951,NZ
+1729853952,1729854463,PH
+1729854464,1729855487,HK
+1729855488,1729856511,KR
+1729856512,1729857535,AU
+1729857536,1729858559,JP
+1729858560,1729859583,IN
+1729859584,1729860607,HK
+1729860608,1729861631,KR
+1729861632,1729862655,AU
+1729862656,1729863679,JP
+1729863680,1729864703,AU
+1729864704,1729866751,IN
+1729866752,1729867775,AU
+1729867776,1729868799,CN
+1729868800,1729869823,HK
+1729869824,1729870847,JP
+1729870848,1729871871,AU
+1729871872,1729872895,JP
+1729872896,1729873919,AU
+1729873920,1729874943,TH
+1729874944,1729875455,MY
+1729875456,1729875967,ID
+1729875968,1729876991,CN
+1729876992,1729878015,JP
+1729878016,1729879039,NZ
+1729879040,1729880063,JP
+1729880064,1729881087,AU
+1729881088,1729882111,SG
+1729882112,1729883135,IN
+1729883136,1729884159,VN
+1729884160,1729885183,CN
+1729885184,1729886207,JP
+1729886208,1729887743,ID
+1729887744,1729887999,VU
+1729888000,1729888255,IN
1729888256,1729889279,KH
1729889280,1729891327,CN
1729891328,1729892351,ID
@@ -30719,7 +30064,6 @@
1744229376,1744230399,IN
1744230400,1744230655,HK
1744230656,1744230911,MY
-1744230912,1744231423,IN
1744231424,1744232447,VN
1744232448,1744233471,IN
1744233472,1744234495,KH
@@ -30919,9 +30263,126 @@
1744434176,1744435199,CN
1744435200,1744436223,IN
1744436224,1744437247,CN
+1744437248,1744439295,JP
+1744439296,1744439807,AU
+1744439808,1744440319,IN
+1744440320,1744441343,HK
+1744441344,1744442367,IN
+1744442368,1744443391,AU
+1744443392,1744444415,VN
+1744444416,1744445439,IN
+1744445440,1744446463,CN
+1744446464,1744447487,JP
+1744447488,1744447743,IN
+1744447744,1744447999,HK
+1744448000,1744448511,BD
+1744448512,1744449535,IN
+1744449536,1744450559,NZ
+1744450560,1744451583,HK
+1744451584,1744452607,SG
+1744452608,1744453119,AU
+1744453120,1744453375,IN
+1744453376,1744453631,AU
+1744453632,1744454655,SG
+1744454656,1744455679,BD
+1744455680,1744456703,JP
+1744456704,1744459775,IN
+1744459776,1744460799,NZ
+1744460800,1744462847,JP
+1744462848,1744463871,NZ
+1744463872,1744464895,CN
+1744464896,1744465919,JP
+1744465920,1744466943,IN
+1744466944,1744467967,NZ
+1744467968,1744468991,JP
+1744468992,1744470015,CN
+1744470016,1744471039,TH
+1744471040,1744472063,NP
+1744472064,1744473087,IN
+1744473088,1744474111,SG
+1744474112,1744481279,IN
+1744481280,1744482303,JP
+1744482304,1744483327,IN
+1744483328,1744484351,CN
+1744484352,1744486399,IN
+1744486400,1744487423,CN
+1744487424,1744487935,TH
+1744487936,1744488191,NZ
+1744488192,1744488447,ID
+1744488448,1744489471,JP
+1744489472,1744490495,NZ
+1744490496,1744491519,IN
+1744491520,1744492543,AU
+1744492544,1744493567,CN
+1744493568,1744494079,AU
+1744494080,1744494591,PK
+1744494592,1744495615,CN
+1744495616,1744497663,NZ
+1744497664,1744498687,CN
+1744498688,1744500735,AU
+1744500736,1744502783,CN
+1744502784,1744503807,MY
+1744503808,1744504831,AU
+1744504832,1744505855,MY
+1744505856,1744506367,AU
+1744506368,1744506623,ID
+1744506624,1744506879,AU
+1744506880,1744510975,IN
+1744510976,1744511999,CN
+1744512000,1744513023,HK
+1744513024,1744513535,ID
+1744513536,1744513791,AU
+1744513792,1744514047,IN
+1744514048,1744514559,ID
+1744514560,1744514815,IN
+1744514816,1744515071,AU
+1744515072,1744516095,IN
+1744516096,1744517119,HK
+1744517120,1744519167,IN
+1744519168,1744520191,AU
+1744520192,1744521215,TH
+1744521216,1744523263,JP
+1744523264,1744524287,IN
+1744524288,1744525311,CN
+1744525312,1744526335,HK
+1744526336,1744527359,IN
+1744527360,1744528383,CN
+1744528384,1744529407,IN
+1744529408,1744530431,KR
+1744530432,1744530943,SG
+1744530944,1744531455,AU
+1744531456,1744532479,HK
+1744532480,1744533503,JP
+1744533504,1744534527,BD
+1744534528,1744536575,CN
+1744536576,1744537087,PW
+1744537088,1744538623,AU
+1744538624,1744539647,HK
+1744539648,1744540671,AU
+1744540672,1744541695,IN
+1744541696,1744542719,ID
+1744542720,1744543743,JP
+1744543744,1744544767,CN
+1744544768,1744545791,HK
+1744545792,1744546047,NZ
+1744546048,1744546559,AU
+1744546816,1744547839,AU
+1744547840,1744548863,AF
+1744548864,1744549887,ID
+1744549888,1744551935,IN
+1744551936,1744552959,JP
+1744552960,1744553471,SG
+1744553472,1744553983,HK
+1744553984,1744555007,MY
+1744555008,1744556031,CN
+1744556032,1744562175,IN
+1744562176,1744563199,BD
+1744563200,1744565247,CN
+1744565248,1744566271,HK
1769996288,1772093439,MA
1772093440,1772617727,KE
1772617728,1773142015,AO
+1773142016,1773273087,ZA
1774190592,1774452735,EG
1774452736,1774714879,NG
1774714880,1775239167,EG
@@ -30936,9 +30397,7 @@
1777049600,1777053695,ZA
1777053696,1777057791,BF
1777057792,1777061887,NG
-1777061888,1777062399,SD
-1777062400,1777062655,SS
-1777062656,1777063935,SD
+1777061888,1777063935,SD
1777063936,1777065983,MZ
1777065984,1777070079,GQ
1777070080,1777074175,BW
@@ -30987,15 +30446,13 @@
1795557376,1795557631,IN
1795557632,1795560447,US
1795560448,1795560959,CA
-1795560960,1795561471,US
-1795561472,1795562239,CA
+1795560960,1795561983,US
+1795561984,1795562239,CA
1795562240,1795562495,US
1795562496,1795563519,CA
1795563520,1795565823,US
1795565824,1795566079,CA
-1795566080,1795568127,US
-1795568128,1795568639,CA
-1795568640,1795569663,US
+1795566080,1795569663,US
1795569664,1795570175,CA
1795570176,1795583999,US
1795584000,1795588095,SG
@@ -31042,7 +30499,13 @@
1822519296,1822523391,CA
1822523392,1822531583,US
1822531584,1822535679,CA
-1822535680,1822572543,US
+1822535680,1822552575,US
+1822552576,1822553087,AT
+1822553088,1822553343,US
+1822553344,1822553599,BR
+1822553600,1822553855,US
+1822553856,1822554111,HK
+1822554112,1822572543,US
1822572544,1822605311,CA
1822605312,1822654463,US
1822654464,1822662143,CA
@@ -31275,9 +30738,14 @@
1833529344,1833533439,GB
1833533440,1833537535,RU
1833537536,1833541631,AT
-1833541632,1833542655,GB
+1833541632,1833541887,GB
+1833541888,1833542143,IN
+1833542144,1833542655,GB
1833542656,1833542911,IN
-1833542912,1833545215,GB
+1833542912,1833543167,GB
+1833543168,1833543423,IN
+1833543424,1833544959,GB
+1833544960,1833545215,IN
1833545216,1833545471,NL
1833545472,1833545727,GB
1833545728,1833549823,IT
@@ -31286,8 +30754,7 @@
1833558016,1833562111,RO
1833562112,1833566207,PS
1833566208,1833570303,SE
-1833570304,1833571327,GB
-1833571328,1833571583,NL
+1833570304,1833571583,NL
1833571584,1833573631,GB
1833573632,1833574399,NL
1833574400,1833578495,YE
@@ -31361,9 +30828,7 @@
1835008000,1835532287,RO
1835532288,1835540479,SE
1835540480,1835548671,DE
-1835548672,1835549695,GB
-1835549696,1835550207,ES
-1835550208,1835565055,GB
+1835548672,1835565055,GB
1835565056,1835573247,AL
1835573248,1835581439,UA
1835581440,1835589631,BG
@@ -31510,8 +30975,8 @@
1836646400,1836679167,RS
1836679168,1836683263,BG
1836683264,1836685311,RO
-1836685312,1836685823,BG
-1836685824,1836687359,GR
+1836685312,1836686335,BG
+1836686336,1836687359,GR
1836687360,1836711935,BG
1836711936,1836728319,UA
1836728320,1836744703,RS
@@ -31573,9 +31038,7 @@
1839454208,1839456255,RU
1839456256,1839458759,RO
1839458760,1839458760,RO
-1839458761,1839459327,RO
-1839459328,1839459839,DE
-1839459840,1839460351,RO
+1839458761,1839460351,RO
1839460352,1839462399,RU
1839462400,1839464447,FI
1839464448,1839497215,CZ
@@ -31589,11 +31052,9 @@
1839759360,1839792127,RU
1839792128,1839794847,GB
1839794848,1839794879,CH
-1839794880,1839806463,GB
-1839806464,1839811071,US
-1839811072,1839812607,GB
-1839812608,1839814143,US
-1839814144,1839816703,GB
+1839794880,1839809535,GB
+1839809536,1839810047,US
+1839810048,1839816703,GB
1839816704,1839824895,NO
1839824896,1839890431,RU
1839890432,1839923199,GB
@@ -31621,15 +31082,7 @@
1841168384,1841233919,FR
1841233920,1841299455,RU
1841299456,1841430527,DE
-1841430528,1841516543,RU
-1841516544,1841516884,US
-1841516885,1841516885,RU
-1841516886,1841517055,US
-1841517056,1841517567,RU
-1841517568,1841517823,US
-1841517824,1841518079,RU
-1841518080,1841518335,US
-1841518336,1841561599,RU
+1841430528,1841561599,RU
1841561600,1841565695,PL
1841565696,1841569791,RU
1841569792,1841577983,PL
@@ -31706,8 +31159,8 @@
1841954816,1841971199,RU
1841971200,1841979391,CZ
1841979392,1841983487,NL
-1841983488,1841983999,GI
-1841984000,1841985535,IM
+1841983488,1841983743,GI
+1841983744,1841985535,IM
1841985536,1841987583,SI
1841987584,1841995775,DK
1841995776,1842003967,RU
@@ -31908,8 +31361,7 @@
1844076736,1844076799,GB
1844076800,1844077567,IE
1844077568,1844078591,GB
-1844078592,1844080127,DE
-1844080128,1844080639,PL
+1844078592,1844080639,DE
1844080640,1844082687,GE
1844082688,1844084735,DE
1844084736,1844086783,RU
@@ -31969,12 +31421,10 @@
1844207616,1844211711,RU
1844211712,1844215807,SK
1844215808,1844219903,BE
-1844219904,1844220415,US
-1844220416,1844220927,DE
+1844219904,1844220159,US
+1844220160,1844220927,DE
1844220928,1844222975,A2
-1844222976,1844223103,DE
-1844223104,1844223487,A2
-1844223488,1844223999,DE
+1844222976,1844223999,DE
1844224000,1844228095,GB
1844228096,1844232191,DK
1844232192,1844236287,ES
@@ -32000,11 +31450,7 @@
1844330496,1844334591,GB
1844334592,1844342783,RU
1844342784,1844346879,IT
-1844346880,1844349439,GB
-1844349440,1844349951,US
-1844349952,1844350207,GB
-1844350208,1844350719,CA
-1844350720,1844350975,GB
+1844346880,1844350975,GB
1844350976,1844355071,SY
1844355072,1844359167,KZ
1844359168,1844363263,IR
@@ -32864,9 +32310,7 @@
1940357120,1940389887,JP
1940389888,1940914175,CN
1940914176,1941045247,JP
-1941045248,1941046783,HK
-1941046784,1941047295,AU
-1941047296,1941049343,HK
+1941045248,1941049343,HK
1941049344,1941051391,AU
1941051392,1941052415,KH
1941052416,1941053439,AU
@@ -33126,9 +32570,13 @@
1964173728,1964173743,JP
1964173744,1964173776,AP
1964173777,1964173777,JP
-1964173778,1964174495,AP
+1964173778,1964173823,AP
+1964173824,1964174079,HK
+1964174080,1964174335,AU
+1964174336,1964174495,SG
1964174496,1964174511,SN
-1964174512,1964175359,AP
+1964174512,1964174591,SG
+1964174592,1964175359,AP
1964175360,1964179455,GB
1964179456,1964244991,TW
1964244992,1964249087,AU
@@ -33351,7 +32799,7 @@
1991852032,1991868415,CN
1991868416,1991901183,SG
1991901184,1992097791,CN
-1992097792,1992163327,HK
+1992097792,1992163327,SG
1992163328,1992818687,CN
1992818688,1992949759,SG
1992949760,1993342975,CN
@@ -34514,8 +33962,7 @@
2151794688,2151796735,IT
2151796736,2151798783,NL
2151798784,2151799807,DE
-2151799808,2151800319,NL
-2151800320,2151800831,DE
+2151799808,2151800831,NL
2151800832,2151809023,PT
2151809024,2151940095,IT
2151940096,2152100863,RU
@@ -34548,10 +33995,7 @@
2155825152,2155827199,AE
2155827200,2155831295,PL
2155831296,2155833343,RU
-2155833344,2155833855,SE
-2155833856,2155834367,NL
-2155834368,2155834879,SE
-2155834880,2155835391,NL
+2155833344,2155835391,SE
2155835392,2155839487,RO
2155839488,2155843583,FR
2155843584,2155845631,RU
@@ -34943,9 +34387,7 @@
2193096704,2193162239,US
2193162240,2193178623,UA
2193178624,2193180671,GB
-2193180672,2193181695,IR
-2193181696,2193182207,DE
-2193182208,2193182719,IR
+2193180672,2193182719,IR
2193182720,2193184767,PT
2193184768,2193186815,ES
2193186816,2193188863,PL
@@ -35140,11 +34582,7 @@
2212761600,2212762623,GB
2212762624,2212766719,FI
2212766720,2212767743,GB
-2212767744,2212805631,FI
-2212805632,2212806143,CN
-2212806144,2212810751,FI
-2212810752,2212811263,US
-2212811264,2212823039,FI
+2212767744,2212823039,FI
2212823040,2212954111,US
2212954112,2213019647,GB
2213019648,2213085183,CA
@@ -35318,9 +34756,7 @@
2254080000,2254082047,FR
2254082048,2254084095,NO
2254084096,2254094335,RU
-2254094336,2254096383,RO
-2254096384,2254096895,GB
-2254096896,2254098431,RO
+2254094336,2254098431,RO
2254098432,2254100479,RU
2254100480,2254102527,CH
2254102528,2254110719,IT
@@ -35514,7 +34950,10 @@
2293055232,2293080063,EU
2293080064,2293088255,BE
2293088256,2293104639,EU
-2293104640,2293891071,US
+2293104640,2293825535,US
+2293825536,2293834239,IN
+2293834240,2293834495,US
+2293834496,2293891071,IN
2293891072,2293956607,AU
2293956608,2294022143,JP
2294022144,2294677503,US
@@ -36088,11 +35527,7 @@
2372501504,2372505599,UA
2372505600,2372507647,NL
2372507648,2372509695,IT
-2372509696,2372510207,AE
-2372510208,2372510719,ES
-2372510720,2372510975,A2
-2372510976,2372511231,GR
-2372511232,2372511743,A2
+2372509696,2372511743,A2
2372511744,2372513791,SI
2372513792,2372534271,GB
2372534272,2372665343,US
@@ -36134,7 +35569,9 @@
2374516736,2374524927,AM
2374524928,2374525717,FR
2374525718,2374525718,BE
-2374525719,2374529023,FR
+2374525719,2374528261,FR
+2374528262,2374528262,PL
+2374528263,2374529023,FR
2374529024,2374531071,RU
2374531072,2374533119,NL
2374533120,2374565887,HR
@@ -36260,8 +35697,8 @@
2382430208,2382626815,CA
2382626816,2382653183,US
2382653184,2382653439,CN
-2382653440,2382678527,US
-2382678528,2382684159,CA
+2382653440,2382675967,US
+2382675968,2382684159,CA
2382684160,2382692351,US
2382692352,2383085567,CA
2383085568,2383151103,US
@@ -36618,7 +36055,9 @@
2449477632,2449479679,AL
2449479680,2449481727,FR
2449481728,2449489919,RO
-2449489920,2449491967,FR
+2449489920,2449490943,FR
+2449490944,2449491199,DE
+2449491200,2449491967,FR
2449491968,2449494015,NL
2449494016,2449496063,UA
2449496064,2449498111,FR
@@ -36665,15 +36104,10 @@
2453805056,2453807103,FI
2453807104,2453815295,GB
2453815296,2453831679,RO
-2453831680,2453832191,IQ
-2453832192,2453832703,IR
-2453832704,2453833727,IQ
+2453831680,2453833727,IQ
2453833728,2453835775,ES
2453835776,2453837823,FR
-2453837824,2453838335,LU
-2453838336,2453838847,EU
-2453838848,2453839359,SE
-2453839360,2453839871,LU
+2453837824,2453839871,EU
2453839872,2453852159,RU
2453852160,2453856255,RO
2453856256,2453858303,DE
@@ -36699,7 +36133,9 @@
2454885504,2454885631,GB
2454885632,2454904999,US
2454905000,2454905007,BR
-2454905008,2454906943,US
+2454905008,2454905919,US
+2454905920,2454905951,AR
+2454905952,2454906943,US
2454906944,2454906951,CL
2454906952,2454913023,US
2454913024,2454978559,CL
@@ -36787,12 +36223,11 @@
2461603764,2461605887,GB
2461605888,2461607935,LB
2461607936,2461609983,FR
-2461609984,2461610111,NL
-2461610112,2461610463,BE
-2461610464,2461611519,NL
+2461609984,2461611519,NL
2461611520,2461611575,BE
2461611576,2461611583,NL
-2461611584,2461612031,BE
+2461611584,2461611775,BE
+2461611776,2461612031,NL
2461612032,2461613567,IL
2461613568,2461613823,PS
2461613824,2461614079,IL
@@ -36873,9 +36308,9 @@
2466242560,2466250751,GE
2466250752,2466318335,US
2466318336,2466318591,SG
-2466318592,2466323475,US
-2466323476,2466323477,IN
-2466323478,2466326015,US
+2466318592,2466323455,US
+2466323456,2466323711,SG
+2466323712,2466326015,US
2466326016,2466326271,SG
2466326272,2466336767,US
2466336768,2466337023,SG
@@ -37001,11 +36436,47 @@
2479226880,2479357951,US
2479357952,2479423487,AU
2479423488,2479489023,GB
-2479489024,2479584767,US
+2479489024,2479554559,US
+2479554560,2479554815,US
+2479554816,2479557631,US
+2479557632,2479557887,US
+2479557888,2479558143,US
+2479558144,2479558399,US
+2479558400,2479558655,US
+2479558656,2479558911,US
+2479558912,2479559167,US
+2479559168,2479559423,US
+2479559424,2479559679,US
+2479559680,2479559935,US
+2479559936,2479560191,US
+2479560192,2479560447,US
+2479560448,2479560703,US
+2479560704,2479560959,US
+2479560960,2479579135,US
+2479579136,2479579391,US
+2479579392,2479579903,US
+2479579904,2479580159,US
+2479580160,2479580671,US
+2479580672,2479580927,US
+2479580928,2479581439,US
+2479581440,2479581695,US
+2479581696,2479582207,US
+2479582208,2479582463,US
+2479582464,2479584767,US
2479584768,2479585023,US
-2479585024,2479586815,US
+2479585024,2479585279,US
+2479585280,2479585535,US
+2479585536,2479586815,US
2479586816,2479587071,US
-2479587072,2479620095,US
+2479587072,2479603711,US
+2479603712,2479603967,US
+2479603968,2479604223,US
+2479604224,2479604479,US
+2479604480,2479604735,US
+2479604736,2479604991,US
+2479604992,2479605247,US
+2479605248,2479605503,US
+2479605504,2479620095,US
2479620096,2479685631,DE
2479685632,2479947775,US
2479947776,2480013311,AU
@@ -37198,7 +36669,9 @@
2500392960,2500393215,IN
2500393216,2500393983,US
2500393984,2500394239,GB
-2500394240,2500535295,US
+2500394240,2500532749,US
+2500532750,2500532750,GR
+2500532751,2500535295,US
2500535296,2500535551,IE
2500535552,2500537343,US
2500537344,2500537599,GB
@@ -37290,7 +36763,9 @@
2509930496,2509934591,RU
2509934592,2509936639,DE
2509936640,2509937665,AT
-2509937666,2509937919,RU
+2509937666,2509937752,RU
+2509937753,2509937753,AT
+2509937754,2509937919,RU
2509937920,2509938175,IT
2509938176,2509938431,US
2509938432,2509938687,DE
@@ -37494,10 +36969,9 @@
2546039040,2547187711,US
2547187712,2547318783,GB
2547318784,2547515391,US
-2547517440,2547517951,FR
-2547518464,2547521535,DE
-2547523584,2547527679,FR
+2547531776,2547548159,NL
2547548160,2547646463,RU
+2547646464,2547679231,NL
2548039680,2548563967,GB
2548563968,2548826111,IR
2548826112,2548827391,AT
@@ -37506,7 +36980,11 @@
2548828672,2548829439,RU
2548829440,2548829695,AT
2548829696,2548829951,NL
-2548829952,2548830207,AE
+2548829952,2548829973,AE
+2548829974,2548829974,DE
+2548829975,2548830035,AE
+2548830036,2548830036,DE
+2548830037,2548830207,AE
2548830208,2548830463,US
2548830464,2548830719,DE
2548830720,2548830975,IT
@@ -37516,7 +36994,9 @@
2548831744,2548831999,US
2548832000,2548832255,ES
2548832256,2548832511,IS
-2548832512,2548833791,RU
+2548832512,2548832767,RU
+2548832768,2548833279,CH
+2548833280,2548833791,RU
2548833792,2548834047,RO
2548834048,2548834303,RU
2548834304,2548842495,GB
@@ -37699,7 +37179,14 @@
2574319616,2574647295,US
2574647296,2574778367,CN
2574778368,2583691263,JP
-2583691264,2584018943,US
+2583691264,2583695359,ZA
+2583695360,2583697407,BW
+2583697408,2583699455,CI
+2583699456,2583707647,GA
+2583707648,2583724031,AO
+2583724032,2583728127,UG
+2583740416,2583756799,NA
+2583756800,2584018943,US
2584018944,2584084479,CA
2584084480,2584215551,US
2584215552,2584281087,GB
@@ -37739,13 +37226,20 @@
2587067648,2587067903,GB
2587067904,2587068415,US
2587068416,2587068479,GB
-2587068480,2587377663,US
+2587068480,2587240389,US
+2587240390,2587240390,FR
+2587240391,2587249417,US
+2587249418,2587249418,FR
+2587249419,2587377663,US
2587377664,2587381759,IT
2587381760,2587443199,US
2587443200,2587447295,CH
-2587447296,2587926527,US
+2587447296,2587492351,US
+2587492352,2587493375,ES
+2587493376,2587926527,US
2587926528,2587930623,BG
2587930624,2587951103,US
+2588934144,2589982719,SC
2600534016,2600665087,US
2600665088,2600730623,CA
2600730624,2600796159,NO
@@ -37797,7 +37291,7 @@
2608728320,2609053695,US
2609053696,2609119231,GB
2609119232,2609184767,FR
-2609184768,2609250303,DE
+2609184768,2609250303,PL
2609250304,2609381375,US
2609381376,2609446911,GB
2609446912,2609512447,DK
@@ -38067,8 +37561,8 @@
2650275840,2650341375,US
2650341376,2650406911,NO
2650406912,2650423295,US
-2650423296,2650439679,JP
-2650439680,2650603519,US
+2650423296,2650472447,JP
+2650472448,2650603519,US
2650603520,2650669055,CO
2650669056,2650734591,US
2650734592,2650800127,CN
@@ -38217,9 +37711,7 @@
2667513856,2667515903,GB
2667515904,2667517951,CZ
2667517952,2667518975,SK
-2667518976,2667519231,CZ
-2667519232,2667519743,SK
-2667519744,2667522047,CZ
+2667518976,2667522047,CZ
2667522048,2667524095,GB
2667524096,2667526143,RU
2667526144,2667528191,LV
@@ -38562,11 +38054,9 @@
2688286720,2688352255,DE
2688352256,2688418825,CH
2688418826,2688418826,EU
-2688418827,2688420863,CH
-2688420864,2688421119,SG
+2688418827,2688421119,CH
2688421120,2688421375,AP
-2688421376,2688421887,US
-2688421888,2688548863,CH
+2688421376,2688548863,CH
2688548864,2688614399,AU
2688614400,2688679935,US
2688679936,2688745471,IT
@@ -38580,21 +38070,15 @@
2689269760,2689335295,TR
2689335296,2689400831,US
2689466368,2689531903,IT
-2689531904,2689535999,US
-2689536000,2689536511,GB
-2689536512,2689545727,US
-2689545728,2689546239,GB
-2689546240,2689566207,US
-2689566208,2689566719,GB
-2689566720,2689568255,US
-2689568256,2689568767,GB
-2689568768,2689586687,US
-2689586688,2689587199,GB
-2689587200,2689593343,US
-2689593344,2689593855,GB
-2689593856,2689594367,US
-2689594368,2689594879,GB
-2689594880,2689597439,US
+2689531904,2689536255,US
+2689536256,2689536511,GB
+2689536512,2689566207,US
+2689566208,2689566463,GB
+2689566464,2689586687,US
+2689586688,2689586943,GB
+2689586944,2689593343,US
+2689593344,2689593599,GB
+2689593600,2689597439,US
2689597440,2689662975,IT
2689662976,2689794047,US
2689794048,2689802239,DE
@@ -38801,7 +38285,9 @@
2720399360,2720464895,FR
2720464896,2721382399,US
2721382400,2721447935,CA
-2721447936,2722693119,US
+2721447936,2721579007,US
+2721579008,2721644543,IN
+2721644544,2722693119,US
2722693120,2722758655,CA
2722758656,2723479551,US
2723479552,2723545087,CA
@@ -38903,9 +38389,22 @@
2731908096,2731909119,CA
2731909120,2731911167,US
2731911168,2731912191,DM
-2731912192,2732086271,US
+2731912192,2731921663,US
+2731921664,2731921727,BE
+2731921728,2732086271,US
2732086272,2732087295,CA
-2732087296,2732099583,US
+2732087296,2732105727,US
+2732105728,2732107775,JM
+2732107776,2732109823,US
+2732110848,2732111871,US
+2732111872,2732113919,CA
+2732113920,2732189695,US
+2732189696,2732192767,CA
+2732192768,2732201983,US
+2732201984,2732203007,VG
+2732203008,2732204031,US
+2732204032,2732206079,CA
+2732206080,2732228607,US
2732589056,2733637631,US
2734686208,2734751743,CN
2734751744,2734817279,GB
@@ -39164,7 +38663,10 @@
2769879040,2769944575,ZA
2769944576,2770272255,US
2770272256,2770337791,AU
-2770337792,2772631551,US
+2770337792,2770993151,US
+2770993152,2771124223,IN
+2771124224,2771451903,US
+2772434944,2772631551,US
2772631552,2772697087,AU
2772697088,2772762623,US
2772762624,2772828159,AU
@@ -39210,8 +38712,7 @@
2778071040,2778333183,US
2778333184,2778398719,CA
2778398720,2779054079,US
-2779054080,2779070463,SZ
-2779070464,2779119615,ZA
+2779054080,2779119615,ZA
2779119616,2779906047,US
2779906048,2779971583,CA
2779971584,2780037119,US
@@ -39224,13 +38725,9 @@
2780495872,2780561407,AU
2780561408,2780758015,US
2780758016,2780823551,AU
-2780823552,2780930047,US
-2780930048,2780930559,GB
-2780930560,2780931071,US
+2780823552,2780931071,US
2780931072,2780932351,GB
-2780932352,2780932607,US
-2780932608,2780933119,GB
-2780933120,2780954623,US
+2780932352,2780954623,US
2780954624,2781020159,KR
2781020160,2781478911,US
2781478912,2781544447,HK
@@ -39254,69 +38751,7 @@
2783182848,2783248383,AU
2783248384,2783313919,KR
2783313920,2783379455,US
-2783379456,2783383039,ZA
-2783383040,2783383295,US
-2783383296,2783384575,ZA
-2783384576,2783384831,US
-2783384832,2783386623,ZA
-2783386624,2783386879,US
-2783386880,2783388159,ZA
-2783388160,2783388415,US
-2783388416,2783388927,ZA
-2783388928,2783389183,US
-2783389184,2783390719,ZA
-2783390720,2783390975,US
-2783390976,2783394815,ZA
-2783394816,2783395071,US
-2783395072,2783396351,ZA
-2783396352,2783396863,US
-2783396864,2783399167,ZA
-2783399168,2783399679,US
-2783399680,2783405311,ZA
-2783405312,2783405567,US
-2783405568,2783408127,ZA
-2783408128,2783408383,US
-2783408384,2783408895,ZA
-2783408896,2783409151,US
-2783409152,2783409407,ZA
-2783409408,2783409663,US
-2783409664,2783410431,ZA
-2783410432,2783410687,US
-2783410688,2783411711,ZA
-2783411712,2783411967,US
-2783411968,2783412223,ZA
-2783412224,2783412735,US
-2783412736,2783415551,ZA
-2783415552,2783416063,US
-2783416064,2783417087,ZA
-2783417088,2783417343,US
-2783417344,2783417599,ZA
-2783417600,2783417855,US
-2783417856,2783419647,ZA
-2783419648,2783419903,US
-2783419904,2783420415,ZA
-2783420416,2783420671,US
-2783420672,2783425023,ZA
-2783425024,2783425279,US
-2783425280,2783426815,ZA
-2783426816,2783427071,US
-2783427072,2783428607,ZA
-2783428608,2783428863,US
-2783428864,2783429119,ZA
-2783429120,2783429375,US
-2783429376,2783430399,ZA
-2783430400,2783430655,US
-2783430656,2783431679,ZA
-2783431680,2783431935,US
-2783431936,2783432447,ZA
-2783432448,2783432703,US
-2783432704,2783437055,ZA
-2783437056,2783437311,US
-2783437312,2783440127,ZA
-2783440128,2783440383,US
-2783440384,2783442943,ZA
-2783442944,2783443199,US
-2783443200,2783444991,ZA
+2783379456,2783444991,ZA
2783444992,2783510527,US
2783510528,2783576063,ZA
2783576064,2783969279,US
@@ -39777,8 +39212,8 @@
2870083584,2870089727,FR
2870089728,2870091775,DE
2870091776,2870095871,FR
-2870095872,2870096383,SG
-2870096384,2870149119,FR
+2870095872,2870096127,SG
+2870096128,2870149119,FR
2870149120,2870214655,HU
2870214656,2870280191,DK
2870280192,2870345727,NL
@@ -39860,7 +39295,9 @@
2882469888,2882535423,SG
2882535424,2883583999,CN
2883584000,2885681151,VN
-2885681152,2886729727,US
+2885681152,2886667022,US
+2886667023,2886667278,DE
+2886667279,2886729727,US
2887778304,2889875455,US
2894069760,2894921727,US
2894921728,2895118335,GB
@@ -39953,8 +39390,8 @@
2916319232,2916335615,PR
2916335616,2916368383,US
2916368384,2916401151,CA
-2916401152,2916481023,US
-2916481024,2916481535,US
+2916401152,2916478975,US
+2916478976,2916481535,US
2916481536,2916515839,US
2916515840,2916519935,CA
2916519936,2916581375,US
@@ -39980,13 +39417,9 @@
2917572608,2917580799,CA
2917580800,2917621759,US
2917621760,2917629951,CA
-2917629952,2917647871,US
-2917647872,2917648383,CN
-2917648384,2917653503,US
+2917629952,2917653503,US
2917653504,2917654015,GB
-2917654016,2917660671,US
-2917660672,2917661183,GB
-2917661184,2917706239,US
+2917654016,2917706239,US
2917706240,2917707007,CA
2917707008,2918014975,US
2918014976,2918023167,CA
@@ -39996,7 +39429,9 @@
2918051840,2918121471,CA
2918121472,2918154239,US
2918154240,2918170623,CA
-2918170624,2918187775,US
+2918170624,2918186751,US
+2918186752,2918187007,US
+2918187008,2918187775,US
2918187776,2918187839,CA
2918187840,2918232063,US
2918232064,2918236159,CA
@@ -40018,10 +39453,10 @@
2918404096,2918408191,PR
2918408192,2918432767,US
2918432768,2918436863,CA
-2918436864,2918469631,US
-2918469632,2918472703,CA
-2918472704,2918473215,US
-2918473216,2918473727,CA
+2918436864,2918465279,US
+2918465280,2918465535,US
+2918465536,2918469631,US
+2918469632,2918473727,CA
2918473728,2918477823,US
2918477824,2918481919,CA
2918481920,2918502078,US
@@ -40038,10 +39473,7 @@
2918699008,2918703103,CA
2918703104,2918760447,US
2918760448,2918776831,CA
-2918776832,2918828031,US
-2918828032,2918828543,UA
-2918828544,2918829055,ES
-2918829056,2918830079,US
+2918776832,2918830079,US
2918830080,2918834175,CA
2918834176,2918842367,US
2918842368,2918875135,CA
@@ -40055,8 +39487,8 @@
2919055360,2919057407,CN
2919057408,2919059455,IN
2919059456,2919063551,CN
-2919063552,2919064063,MX
-2919064064,2919067647,CN
+2919063552,2919064575,US
+2919064576,2919067647,CN
2919067648,2919070983,US
2919070984,2919070991,GB
2919070992,2919159873,US
@@ -40116,9 +39548,7 @@
2928252612,2928252612,US
2928252613,2928252987,US
2928252988,2928252988,US
-2928252989,2928261375,US
-2928261376,2928261887,CA
-2928261888,2928263167,US
+2928252989,2928263167,US
2928263168,2928279551,CA
2928279552,2928312319,US
2928312320,2928316415,CA
@@ -40307,7 +39737,9 @@
2954647552,2954657791,ES
2954657792,2954756095,JO
2954756096,2954821631,TR
-2954821632,2954824455,FR
+2954821632,2954823395,FR
+2954823396,2954823399,GB
+2954823400,2954824455,FR
2954824456,2954824463,NL
2954824464,2954827799,FR
2954827800,2954827807,DE
@@ -40315,7 +39747,9 @@
2954828800,2954828815,NL
2954828816,2954829751,FR
2954829752,2954829752,ES
-2954829753,2954829843,FR
+2954829753,2954829759,FR
+2954829760,2954829823,ES
+2954829824,2954829843,FR
2954829844,2954829847,DE
2954829848,2954832343,FR
2954832344,2954832347,CH
@@ -40355,8 +39789,8 @@
2954899456,2954901503,ES
2954901504,2954903551,IT
2954903552,2954911743,JP
-2954911744,2954919423,NL
-2954919424,2954919935,IE
+2954911744,2954918911,NL
+2954918912,2954919935,IE
2954919936,2954928127,RU
2954928128,2954932223,PL
2954932224,2954936319,RU
@@ -40412,11 +39846,9 @@
2956504576,2956504831,NL
2956504832,2956505087,RU
2956505088,2956506111,NL
-2956506112,2956506623,GB
-2956506624,2956507135,RU
+2956506112,2956507135,RU
2956507136,2956508159,NL
-2956508160,2956508671,RU
-2956508672,2956509183,NL
+2956508160,2956509183,RU
2956509184,2956517375,GB
2956517376,2956521471,NL
2956521472,2956525567,SE
@@ -40900,7 +40332,7 @@
2960863744,2960863999,GB
2960864000,2960864255,DE
2960864256,2960864767,GB
-2960864768,2960865279,AT
+2960864768,2960865279,DE
2960865280,2960865535,RU
2960865536,2960865791,HR
2960865792,2960866303,GB
@@ -41111,14 +40543,12 @@
2987569152,2987573247,FR
2987573248,2987577343,TR
2987577344,2987585535,RU
-2987585536,2987589119,DE
-2987589120,2987589631,US
+2987585536,2987589631,DE
2987589632,2987593727,FR
2987593728,2987597823,LT
2987597824,2987601919,ES
2987601920,2987606015,IS
-2987606016,2987606527,US
-2987606528,2987610111,DE
+2987606016,2987610111,DE
2987610112,2987614207,RU
2987614208,2987618303,PL
2987618304,2987622399,NL
@@ -41269,9 +40699,9 @@
2988459128,2988459135,PL
2988459136,2988459679,FR
2988459680,2988459683,ES
-2988459684,2988459689,FR
-2988459690,2988459690,PL
-2988459691,2988459863,FR
+2988459684,2988459687,FR
+2988459688,2988459691,PL
+2988459692,2988459863,FR
2988459864,2988459867,ES
2988459868,2988460575,FR
2988460576,2988460591,PT
@@ -41300,7 +40730,9 @@
2988482576,2988482579,CZ
2988482580,2988484831,FR
2988484832,2988484847,GB
-2988484848,2988487071,FR
+2988484848,2988485683,FR
+2988485684,2988485687,PL
+2988485688,2988487071,FR
2988487072,2988487075,ES
2988487076,2988490686,FR
2988490687,2988490687,BE
@@ -41314,7 +40746,9 @@
2988500416,2988500447,CZ
2988500448,2988502051,FR
2988502052,2988502055,PL
-2988502056,2988502881,FR
+2988502056,2988502655,FR
+2988502656,2988502719,DE
+2988502720,2988502881,FR
2988502882,2988502882,IT
2988502883,2988504371,FR
2988504372,2988504375,PL
@@ -41330,9 +40764,7 @@
2988519424,2988521471,PL
2988521472,2988524271,FR
2988524272,2988524287,DE
-2988524288,2988525055,FR
-2988525056,2988525567,PL
-2988525568,2988525887,FR
+2988524288,2988525887,FR
2988525888,2988525951,GB
2988525952,2988526415,FR
2988526416,2988526423,ES
@@ -41427,17 +40859,7 @@
2991521792,2991538175,RS
2991538176,2991554559,SI
2991554560,2991570943,GB
-2991570944,2991571455,IT
-2991571456,2991571967,GB
-2991571968,2991572479,IT
-2991572480,2991572991,IL
-2991572992,2991573503,GB
-2991573504,2991574015,ES
-2991574016,2991574527,DE
-2991574528,2991575039,GB
-2991575040,2991575551,NL
-2991575552,2991576063,GB
-2991576064,2991587327,IT
+2991570944,2991587327,IT
2991587328,2991718399,SA
2991718400,2991849471,CH
2991849472,2991980543,NL
@@ -41771,8 +41193,8 @@
3001831424,3001835519,BA
3001835520,3001839615,RU
3001839616,3001843711,ES
-3001843712,3001846271,RU
-3001846272,3001846783,GB
+3001843712,3001845759,RU
+3001845760,3001846783,GB
3001846784,3001847807,RU
3001847808,3001851903,GB
3001851904,3001855999,IT
@@ -41877,9 +41299,7 @@
3002691584,3002693631,MK
3002693632,3002695679,NO
3002695680,3002697727,RU
-3002697728,3002698239,DE
-3002698240,3002698751,NL
-3002698752,3002699775,DE
+3002697728,3002699775,DE
3002699776,3002701823,SE
3002701824,3002703871,NL
3002703872,3002705919,DE
@@ -41977,7 +41397,8 @@
3003074560,3003076607,IT
3003076608,3003078143,GB
3003078144,3003078151,US
-3003078152,3003080703,GB
+3003078152,3003078155,IN
+3003078156,3003080703,GB
3003080704,3003082751,FR
3003082752,3003084799,ES
3003086848,3003088895,RU
@@ -42005,12 +41426,15 @@
3003123968,3003124479,CO
3003124480,3003124735,AR
3003124736,3003125247,SV
+3003125248,3003125503,AR
+3003125504,3003125759,CO
3003125760,3003126783,CL
3003126784,3003127807,CR
+3003127808,3003128063,CO
3003129856,3003138047,CR
3003154432,3003154687,CL
3003154688,3003154943,EC
-3003155456,3003158527,AR
+3003154944,3003158527,AR
3003187200,3003252735,CO
3003252736,3003449343,CL
3003580416,3003645951,PE
@@ -42047,13 +41471,14 @@
3006464000,3006480383,SV
3006496768,3006529535,CR
3006529536,3006660607,DO
+3006791680,3006922751,CL
3006922752,3006988287,BO
3007184896,3007250431,AR
3007250432,3007299583,CR
3007299584,3007301631,PA
-3007303680,3007305727,AR
-3007307776,3007311871,CL
-3007311872,3007312895,AR
+3007301632,3007305727,AR
+3007307776,3007310847,CL
+3007310848,3007312895,AR
3007312896,3007313919,CL
3007313920,3007314943,AR
3007314944,3007315967,HN
@@ -42070,12 +41495,15 @@
3025604352,3025604637,SG
3025604638,3025607167,IN
3025607168,3025607423,SG
-3025607424,3025633535,IN
+3025607424,3025607679,HK
+3025607680,3025633535,IN
3025633536,3025633791,HK
3025633792,3025637375,IN
3025637376,3025637631,HK
3025637632,3025637887,MY
-3025637888,3025638399,IN
+3025637888,3025638279,IN
+3025638280,3025638287,SG
+3025638288,3025638399,IN
3025638400,3025638655,SG
3025638656,3025639167,IN
3025639168,3025639175,SG
@@ -42338,7 +41766,8 @@
3039035392,3039166463,DO
3039166464,3039231999,PA
3039297536,3039363071,PY
-3039363072,3039428607,BZ
+3039363072,3039412223,BZ
+3039412224,3039420415,CL
3039428608,3039559679,CL
3039690752,3039821823,AR
3039821824,3040870399,CO
@@ -42368,6 +41797,7 @@
3047424000,3047948287,AR
3047948288,3048079359,CL
3048079360,3048095743,CO
+3048128512,3048144895,CR
3048144896,3048210431,EC
3048210432,3048275967,PE
3048275968,3048292351,AR
@@ -42392,15 +41822,21 @@
3049193472,3049255935,PA
3049255936,3049256959,US
3049256960,3049259007,PA
-3049259008,3049267199,AR
-3049275392,3049283583,AR
+3049259008,3049283583,AR
3049283584,3049291775,BZ
3049291776,3049324543,CO
3049324544,3049521151,CR
-3049652224,3049783295,EC
+3049652224,3049750527,EC
+3049750528,3049754623,PE
+3049754624,3049762815,AR
+3049762816,3049766911,HN
+3049766912,3049775103,CO
+3049775104,3049783295,PA
3049783296,3050045439,CL
+3050045440,3050307583,CO
3050307584,3050373119,VE
3050373120,3050405887,AR
+3050405888,3050438655,GT
3050438656,3050504191,HN
3051356160,3051376895,CR
3051376896,3051377151,PA
@@ -42414,7 +41850,7 @@
3051398144,3051399167,AR
3051399168,3051400191,DO
3051400192,3051401215,EC
-3051401216,3051403263,AR
+3051401216,3051405311,AR
3051405312,3051407359,CR
3051407360,3051408383,PE
3051408384,3051409407,DO
@@ -42425,6 +41861,10 @@
3051429888,3051438079,VE
3051438080,3051450367,CO
3051450368,3051454463,CL
+3051454464,3051456511,SV
+3051456512,3051457535,AR
+3051457536,3051460607,CL
+3051460608,3051462655,AR
3051462656,3051470847,PE
3051479040,3051487231,CU
3051487232,3051552767,CL
@@ -42439,7 +41879,7 @@
3051971840,3051972351,PA
3051972352,3051973887,CR
3051973888,3051974143,PA
-3051974144,3051986943,CR
+3051974144,3051995135,CR
3051995136,3052011519,PE
3052011520,3052273663,CO
3052273664,3052404735,AR
@@ -42757,16 +42197,17 @@
3103852800,3103853567,PL
3103853568,3103853823,NO
3103853824,3103854079,RU
+3103854080,3103854335,FR
+3103854336,3103854591,AE
+3103854592,3103854847,UA
3103916032,3103917055,CH
3103917056,3103918079,IT
3103918080,3103919103,DE
-3103919104,3103920127,US
+3103919104,3103920127,IR
3103920128,3103921151,DE
3103921152,3103922175,CH
3103922176,3103923199,NL
-3103923200,3103923455,SE
-3103923456,3103923967,NL
-3103923968,3103924223,SE
+3103923200,3103924223,SE
3103924224,3103925247,RU
3103925248,3103926271,PL
3103926272,3103927295,CZ
@@ -42809,12 +42250,9 @@
3103968256,3103969279,GB
3103969280,3103970303,BG
3103970304,3103971327,UA
-3103971328,3103972351,GB
-3103972352,3103972863,IE
-3103972864,3103973375,GB
+3103971328,3103973375,GB
3103973376,3103974399,KZ
-3103974400,3103974911,LT
-3103974912,3103975423,SE
+3103974400,3103975423,SE
3103975424,3103976447,SA
3103976448,3103977471,GB
3103977472,3103978495,NL
@@ -42865,7 +42303,7 @@
3104025600,3104026623,RU
3104026624,3104027647,NL
3104027648,3104028671,RU
-3104028672,3104030719,DE
+3104028672,3104029695,DE
3104030720,3104031743,HR
3104031744,3104032767,FR
3104032768,3104033791,IR
@@ -42986,11 +42424,10 @@
3104153600,3104154623,RU
3104154624,3104155647,DK
3104155648,3104156671,DE
-3104156672,3104157695,RO
-3104157696,3104158719,TR
+3104156672,3104157697,RO
+3104157698,3104158719,TR
3104158720,3104159743,IT
-3104159744,3104160255,DE
-3104160256,3104160767,CH
+3104159744,3104160767,CH
3104160768,3104161791,GB
3104161792,3104162815,RU
3104162816,3104164863,IT
@@ -43027,8 +42464,7 @@
3104195584,3104196607,DE
3104196608,3104197631,IT
3104197632,3104198655,GR
-3104198656,3104199167,GB
-3104199168,3104199679,RU
+3104198656,3104199679,GB
3104199680,3104200703,NL
3104200704,3104201727,IT
3104201728,3104202751,FR
@@ -43172,8 +42608,7 @@
3104349184,3104350207,RU
3104350208,3104352255,CZ
3104352256,3104353279,DE
-3104353280,3104353792,IR
-3104353793,3104354303,DE
+3104353280,3104354303,IR
3104354304,3104355327,NL
3104355328,3104356351,RU
3104356352,3104357375,AT
@@ -43318,10 +42753,7 @@
3104514048,3104515071,RU
3104515072,3104516095,GB
3104516096,3104517119,CY
-3104517120,3104517630,US
-3104517631,3104517631,IL
-3104517632,3104518142,US
-3104518143,3104518143,IL
+3104517120,3104518143,IL
3104518144,3104519167,RU
3104519168,3104520191,IT
3104520192,3104521215,CH
@@ -43660,8 +43092,7 @@
3104879616,3104880639,CZ
3104880640,3104881663,DE
3104881664,3104882687,AT
-3104882688,3104883199,MT
-3104883200,3104883711,DK
+3104882688,3104883711,MT
3104883712,3104884735,DE
3104884736,3104885759,SE
3104885760,3104886783,GB
@@ -43750,8 +43181,7 @@
3104974848,3104975871,AL
3104975872,3104976895,RU
3104976896,3104977919,GB
-3104977920,3104978431,NL
-3104978432,3104978943,DE
+3104977920,3104978943,DE
3104978944,3104979967,BG
3104979968,3104980991,HR
3104980992,3104982015,SK
@@ -43863,7 +43293,7 @@
3105097728,3105098751,FR
3105098752,3105099775,SE
3105099776,3105100799,FR
-3105100800,3105101823,BY
+3105100800,3105101823,PL
3105101824,3105102847,IQ
3105102848,3105103871,HR
3105103872,3105104895,GB
@@ -43900,7 +43330,7 @@
3105138688,3105139711,NO
3105139712,3105140735,PL
3105140736,3105142783,RU
-3105142784,3105143807,NL
+3105142784,3105143807,UA
3105143808,3105144831,DE
3105144832,3105145855,ES
3105145856,3105146879,CZ
@@ -44153,8 +43583,7 @@
3105418240,3105419263,CZ
3105419264,3105420287,NL
3105420288,3105421311,RU
-3105421312,3105421823,US
-3105421824,3105422335,NL
+3105421312,3105422335,NL
3105422336,3105423359,IR
3105423360,3105424383,LT
3105424384,3105426431,RU
@@ -44200,8 +43629,7 @@
3105466368,3105467391,BE
3105467392,3105468415,GB
3105468416,3105469439,RU
-3105469440,3105469951,SE
-3105469952,3105470463,EU
+3105469440,3105470463,EU
3105470464,3105471487,CZ
3105471488,3105472511,GB
3105472512,3105473535,CH
@@ -44239,7 +43667,7 @@
3105510400,3105511423,SA
3105511424,3105512447,FR
3105512448,3105513471,GB
-3105513472,3105514495,ES
+3105513472,3105514495,DE
3105514496,3105515519,RU
3105515520,3105516543,FR
3105516544,3105517567,NL
@@ -44356,7 +43784,9 @@
3105634304,3105635327,NL
3105635328,3105636351,GB
3105636352,3105637375,IT
-3105637376,3105638399,NL
+3105637376,3105637631,NL
+3105637632,3105637887,DE
+3105637888,3105638399,US
3105638400,3105639423,IM
3105639424,3105640447,DE
3105640448,3105641471,IT
@@ -44420,6 +43850,7 @@
3105707008,3105708031,PL
3105708032,3105709055,AT
3105709056,3105710079,SA
+3105710080,3105711103,IT
3105711104,3105712127,RS
3105712128,3105713151,IT
3105713152,3105714175,NL
@@ -44427,14 +43858,22 @@
3105715200,3105716223,DE
3105716224,3105717247,TR
3105717248,3105719295,RU
-3105720320,3105721343,GB
+3105719296,3105721343,GB
3105721344,3105722367,SI
3105722368,3105723391,IT
3105723392,3105724415,FR
3105724416,3105725439,CH
3105725440,3105726463,SK
3105726464,3105727487,IT
-3105727488,3105728511,NL
+3105727488,3105727743,NO
+3105727744,3105727999,BE
+3105728000,3105728127,AT
+3105728128,3105728191,FI
+3105728192,3105728255,PT
+3105728256,3105728319,TR
+3105728320,3105728383,PL
+3105728384,3105728447,CZ
+3105728448,3105728511,LT
3105728512,3105729535,DE
3105729536,3105731583,GB
3105731584,3105732607,FR
@@ -44444,6 +43883,162 @@
3105735680,3105736703,IS
3105736704,3105737727,NL
3105737728,3105738751,IT
+3105738752,3105739775,GB
+3105739776,3105740799,ES
+3105740800,3105741823,DE
+3105741824,3105742847,IR
+3105742848,3105744895,GB
+3105744896,3105745919,FR
+3105745920,3105746943,UA
+3105746944,3105747967,DE
+3105747968,3105748991,FR
+3105748992,3105750015,IT
+3105750016,3105751039,UA
+3105751040,3105752063,RU
+3105752064,3105753087,IR
+3105753088,3105754111,GB
+3105754112,3105756159,RU
+3105756160,3105757183,US
+3105757184,3105758207,GB
+3105758208,3105759231,FR
+3105759232,3105760255,DE
+3105760256,3105761279,LB
+3105761280,3105762303,RU
+3105762304,3105763327,IT
+3105763328,3105764351,FR
+3105764352,3105765375,BE
+3105765376,3105766399,NL
+3105766400,3105770495,IT
+3105770496,3105771519,IR
+3105771520,3105772543,IT
+3105772544,3105773567,UA
+3105773568,3105774591,AZ
+3105774592,3105775615,FR
+3105775616,3105776639,RU
+3105776640,3105777663,DK
+3105777664,3105778687,RU
+3105778688,3105780735,IT
+3105780736,3105781759,RU
+3105781760,3105782783,SK
+3105782784,3105783807,PL
+3105783808,3105785855,FR
+3105785856,3105786879,SI
+3105786880,3105787903,ES
+3105787904,3105788927,AL
+3105788928,3105789951,SA
+3105789952,3105790975,SE
+3105790976,3105791999,DE
+3105792000,3105793023,DK
+3105793024,3105794047,NL
+3105794048,3105795071,GB
+3105795072,3105796095,LU
+3105796096,3105797119,NL
+3105797120,3105798143,IT
+3105798144,3105799167,IS
+3105799168,3105800191,IT
+3105800192,3105801215,RU
+3105801216,3105802239,ES
+3105802240,3105803263,UA
+3105803264,3105804287,NL
+3105804288,3105805311,FR
+3105805312,3105806335,GB
+3105806336,3105807359,FR
+3105807360,3105808383,RU
+3105808384,3105809407,NO
+3105809408,3105810431,RU
+3105810432,3105811455,IL
+3105811456,3105812479,NL
+3105812480,3105814527,ES
+3105814528,3105815551,JO
+3105815552,3105816575,BE
+3105816576,3105817599,FR
+3105817600,3105818623,DE
+3105818624,3105819647,NL
+3105819648,3105820671,GB
+3105820672,3105821695,US
+3105821696,3105822719,ES
+3105822720,3105823743,PL
+3105823744,3105824767,AT
+3105824768,3105825791,RS
+3105825792,3105826815,CZ
+3105826816,3105827839,FR
+3105827840,3105828863,LV
+3105828864,3105829887,PL
+3105829888,3105830911,AT
+3105830912,3105831935,IT
+3105831936,3105832959,DE
+3105832960,3105833983,IT
+3105833984,3105835007,FI
+3105835008,3105836031,KZ
+3105836032,3105837055,DK
+3105837056,3105838079,PL
+3105838080,3105839103,UA
+3105839104,3105840127,PL
+3105840128,3105841151,EE
+3105841152,3105842175,IE
+3105842176,3105843199,CH
+3105843200,3105844223,ES
+3105844224,3105847295,RU
+3105847296,3105848319,BG
+3105848320,3105849343,IR
+3105849344,3105850367,US
+3105850368,3105851391,RU
+3105851392,3105852415,FI
+3105852416,3105853439,SE
+3105853440,3105854463,NL
+3105854464,3105855487,FR
+3105855488,3105856511,GB
+3105856512,3105857535,PT
+3105857536,3105859583,RU
+3105859584,3105860607,GB
+3105860608,3105861631,NL
+3105861632,3105862655,DK
+3105862656,3105863679,CH
+3105863680,3105864703,PL
+3105864704,3105865727,AE
+3105865728,3105866751,RU
+3105866752,3105867775,SE
+3105867776,3105868799,NL
+3105868800,3105869823,GB
+3105869824,3105870847,DE
+3105870848,3105871871,AT
+3105871872,3105872895,PL
+3105872896,3105873919,GB
+3105873920,3105874943,AT
+3105874944,3105875967,NL
+3105875968,3105876991,GB
+3105876992,3105878015,ES
+3105878016,3105879039,EE
+3105879040,3105880063,NL
+3105880064,3105881087,CH
+3105881088,3105882111,GB
+3105882112,3105883135,MD
+3105883136,3105884159,PL
+3105884160,3105885183,SE
+3105885184,3105886207,TR
+3105886208,3105887231,ES
+3105887232,3105888255,AL
+3105888256,3105889279,RO
+3105889280,3105890303,ES
+3105890304,3105891327,DE
+3105891328,3105892351,PT
+3105892352,3105893375,GB
+3105893376,3105894399,AZ
+3105894400,3105895423,PL
+3105895424,3105896447,GB
+3105896448,3105897471,RU
+3105897472,3105898495,UA
+3105898496,3105899519,CZ
+3105899520,3105900543,RU
+3105900544,3105902591,GB
+3105902592,3105903615,DE
+3105903616,3105904639,RU
+3105904640,3105905663,NO
+3105905664,3105906687,IE
+3105906688,3105908735,FR
+3105908736,3105910783,GB
+3105910784,3105911807,IL
+3105911808,3105912831,DE
3120562176,3120594943,CO
3120594944,3120599039,AR
3120599040,3120601087,EC
@@ -44612,7 +44207,8 @@
3131310080,3131572223,VE
3131572224,3131834367,CO
3131834368,3132096511,CL
-3132096512,3132227583,CR
+3132096512,3132194815,CR
+3132219392,3132227583,AR
3132227584,3132293119,EC
3132293120,3132309503,HN
3132309504,3132313599,CR
@@ -44771,9 +44367,7 @@
3158897856,3158897919,UA
3158897920,3158898207,DE
3158898208,3158898271,CZ
-3158898272,3158898431,DE
-3158898432,3158898687,US
-3158898688,3158900735,DE
+3158898272,3158900735,DE
3158900736,3158917119,FR
3158917120,3158933503,DE
3158933504,3158949887,RU
@@ -44872,7 +44466,8 @@
3160315904,3160317951,KZ
3160317952,3160322047,RU
3160322048,3160324095,CH
-3160324096,3160328191,IT
+3160324096,3160325119,IT
+3160326144,3160328191,IT
3160328192,3160330239,FR
3160330240,3160332287,RU
3160332288,3160334335,NO
@@ -44962,12 +44557,7 @@
3161784320,3161800703,FI
3161800704,3161817087,SA
3161817088,3161833471,PL
-3161833472,3161835007,MK
-3161835008,3161839103,AT
-3161839104,3161840639,MK
-3161840640,3161843199,AT
-3161843200,3161844223,MK
-3161844224,3161849855,AT
+3161833472,3161849855,AT
3161849856,3161866239,BE
3161866240,3161882623,IR
3161882624,3161899007,DE
@@ -45051,13 +44641,9 @@
3162636288,3162669055,FR
3162669056,3162681343,RU
3162681344,3162682367,UA
-3162682368,3162682879,RU
-3162682880,3162683391,LV
-3162683392,3162685439,RU
+3162682368,3162685439,RU
3162685440,3162693631,UA
-3162693632,3162698751,RU
-3162698752,3162699263,NL
-3162699264,3162701823,RU
+3162693632,3162701823,RU
3162701824,3162734591,MD
3162734592,3162767359,RU
3162767360,3162800127,SA
@@ -45119,11 +44705,7 @@
3164936192,3164937749,LT
3164937750,3164937750,FR
3164937751,3164938239,LT
-3164938240,3164947967,FR
-3164947968,3164948479,BE
-3164948480,3164949503,FR
-3164949504,3164950015,BE
-3164950016,3164951663,FR
+3164938240,3164951663,FR
3164951664,3164951671,PL
3164951672,3164952224,FR
3164952225,3164952231,GB
@@ -45178,7 +44760,7 @@
3166654464,3166658559,RU
3166658560,3166662655,UA
3166662656,3166666751,RU
-3166666752,3166667263,DE
+3166666752,3166667263,PL
3166667264,3166667775,CZ
3166667776,3166668799,GB
3166668800,3166670847,RO
@@ -45197,13 +44779,9 @@
3166699520,3166961663,DE
3166961664,3167223807,SI
3167223808,3167748095,NL
-3167748096,3167781887,RO
-3167781888,3167782399,A2
-3167782400,3167870975,RO
+3167748096,3167870975,RO
3167870976,3167879167,MD
-3167879168,3167950847,RO
-3167950848,3167951359,A2
-3167951360,3167986687,RO
+3167879168,3167986687,RO
3167986688,3167987711,GB
3167987712,3167989759,MD
3167989760,3168005887,RO
@@ -45212,11 +44790,7 @@
3168096256,3168100351,MD
3168100352,3168110591,RO
3168110592,3168111615,GB
-3168111616,3168195583,RO
-3168195584,3168196095,DE
-3168196096,3168223743,RO
-3168223744,3168224255,MD
-3168224256,3168272383,RO
+3168111616,3168272383,RO
3168272384,3168534527,IT
3168534528,3168796671,GB
3168796672,3168829439,FR
@@ -45331,7 +44905,9 @@
3187947988,3187948799,GT
3187948800,3187948927,HN
3187948928,3187949567,GT
-3187949568,3187953663,BQ
+3187949568,3187950126,BQ
+3187950127,3187950127,CW
+3187950128,3187953663,BQ
3187953664,3187955711,CL
3187955712,3187957759,CR
3187957760,3187961855,CL
@@ -45794,9 +45370,7 @@
3194994688,3195011071,AR
3195019264,3195023359,AR
3195023360,3195024383,CL
-3195024384,3195024639,HN
-3195024640,3195024895,UY
-3195024896,3195025407,HN
+3195024384,3195025407,UY
3195025408,3195043839,AR
3195043840,3195056127,CO
3195056128,3195060223,AR
@@ -46147,7 +45721,9 @@
3222072064,3222072319,SE
3222072320,3222075135,US
3222075136,3222075391,CH
-3222075392,3222305535,US
+3222075392,3222274559,US
+3222274560,3222274815,AU
+3222274816,3222305535,US
3222305536,3222309119,SE
3222309120,3222309375,DE
3222309376,3222313727,SE
@@ -46380,17 +45956,9 @@
3223583488,3223584767,US
3223584768,3223594495,SE
3223594496,3223595007,AT
-3223595008,3223598079,SE
-3223598080,3223598591,CZ
-3223598592,3223599103,SE
+3223595008,3223599103,SE
3223599104,3223599615,AT
-3223599616,3223602687,SE
-3223602688,3223603199,CZ
-3223603200,3223619583,SE
-3223619584,3223620095,CZ
-3223620096,3223628799,SE
-3223628800,3223629311,CZ
-3223629312,3223650303,SE
+3223599616,3223650303,SE
3223650304,3223715839,CH
3223715840,3223781375,DK
3223781376,3223784191,US
@@ -46720,7 +46288,7 @@
3225427968,3225428991,US
3225429504,3225429759,CA
3225430016,3225431039,CA
-3225431040,3225431551,RU
+3225431040,3225431551,CZ
3225431552,3225434111,US
3225434112,3225436159,CA
3225436160,3225444607,US
@@ -46925,15 +46493,7 @@
3225874944,3225875199,GB
3225875456,3225875967,US
3225876480,3225878527,US
-3225878528,3225892351,SE
-3225892352,3225892863,FR
-3225892864,3225894399,SE
-3225894400,3225895423,GB
-3225895424,3225896447,SE
-3225896448,3225896959,CZ
-3225896960,3225900543,SE
-3225900544,3225901567,CZ
-3225901568,3225917183,SE
+3225878528,3225917183,SE
3225917184,3225917439,NL
3225917440,3225923327,SE
3225923328,3225923583,IN
@@ -46943,9 +46503,7 @@
3225933056,3225933311,AT
3225933312,3225934335,SE
3225934336,3225934591,AT
-3225934592,3225935871,SE
-3225935872,3225936383,CZ
-3225936384,3225936639,SE
+3225934592,3225936639,SE
3225936640,3225936895,US
3225936896,3225938175,SE
3225938176,3225938431,RU
@@ -46987,10 +46545,7 @@
3226177536,3226178559,US
3226178560,3226189823,CA
3226189824,3226191871,US
-3226191872,3226201087,CA
-3226201344,3226201855,CA
-3226201856,3226202111,US
-3226202112,3226206207,CA
+3226191872,3226206207,CA
3226206208,3226207231,US
3226207744,3226215423,GB
3226215424,3226236927,US
@@ -47020,9 +46575,7 @@
3226305536,3226307327,GB
3226307328,3226307583,US
3226307584,3226308095,ES
-3226308096,3226365439,US
-3226365440,3226365951,DE
-3226365952,3226374143,US
+3226308096,3226374143,US
3226374144,3226375423,DE
3226375424,3226397695,US
3226397696,3226400255,DE
@@ -47411,7 +46964,9 @@
3227459002,3227459002,US
3227459003,3227461119,CA
3227461120,3227461631,US
-3227461632,3227464447,CA
+3227461632,3227461959,CA
+3227461960,3227461963,US
+3227461964,3227464447,CA
3227464448,3227464575,US
3227464576,3227465147,CA
3227465148,3227465151,US
@@ -47722,7 +47277,9 @@
3228405760,3228406015,IN
3228406016,3228406271,US
3228406272,3228407039,FR
-3228407040,3228430847,DE
+3228407040,3228413183,DE
+3228413184,3228413695,SG
+3228413696,3228430847,DE
3228430848,3228431103,ZA
3228431104,3228434431,DE
3228434432,3228477695,US
@@ -47787,24 +47344,20 @@
3228631040,3228696575,NL
3228696576,3228826371,IL
3228826372,3228826372,US
-3228826373,3228827647,IL
-3228827648,3228828159,PS
-3228828160,3228829183,IL
-3228829184,3228829695,PS
-3228829696,3228830719,IL
+3228826373,3228830719,IL
3228830720,3228833791,PS
3228833792,3229024255,IL
3229024256,3229061119,US
3229061120,3229062433,CA
3229062434,3229062450,US
-3229062451,3229062655,CA
-3229062656,3229063167,US
-3229063168,3229064951,CA
+3229062451,3229064951,CA
3229064952,3229064955,US
3229064956,3229065215,CA
-3229065216,3229093119,US
-3229093120,3229093375,AU
-3229093376,3229155327,US
+3229065216,3229092607,US
+3229092608,3229092863,AU
+3229092864,3229093119,US
+3229093120,3229093631,AU
+3229093632,3229155327,US
3229155328,3229159423,SE
3229159424,3229159935,AT
3229159936,3229160959,SE
@@ -48382,9 +47935,10 @@
3231121408,3231149311,US
3231149312,3231149567,CA
3231149568,3231154431,US
-3231155200,3231155711,US
-3231155712,3231156223,CA
-3231156224,3231188479,US
+3231155200,3231156223,CA
+3231156224,3231174655,US
+3231174656,3231182847,CN
+3231182848,3231188479,US
3231188480,3231188735,NO
3231188736,3231190527,US
3231190528,3231190783,GB
@@ -48559,9 +48113,7 @@
3231539200,3231547391,CA
3231547392,3231547647,US
3231547648,3231547903,NO
-3231547904,3231550207,US
-3231550208,3231550719,DE
-3231550720,3231551231,US
+3231547904,3231551231,US
3231551232,3231551999,CA
3231552000,3231553023,US
3231553024,3231553791,JP
@@ -48623,7 +48175,7 @@
3231675904,3231676159,IE
3231676672,3231676927,FR
3231676928,3231677183,FI
-3231677440,3231686655,US
+3231677440,3231694847,US
3231694848,3231711231,CA
3231711232,3231713023,US
3231713024,3231713279,CA
@@ -48706,6 +48258,7 @@
3231793152,3231793663,BE
3231794176,3231800319,US
3231800320,3231801343,CN
+3231801344,3231809535,CA
3231809536,3231810047,NZ
3231810560,3231825919,US
3231825920,3231842303,CA
@@ -48864,8 +48417,9 @@
3232774144,3232825343,SE
3232825344,3233288191,US
3233288192,3233292287,CA
-3233292288,3233349631,US
-3233480704,3233484799,US
+3233292288,3233431551,US
+3233431552,3233464319,CA
+3233464320,3233484799,US
3233484800,3233487359,ES
3233487872,3233488895,CA
3233488896,3233548287,US
@@ -49134,8 +48688,7 @@
3234240388,3234240511,EU
3234240512,3234240607,US
3234240608,3234240611,IL
-3234240612,3234250751,US
-3234267136,3234269695,US
+3234240612,3234269695,US
3234270208,3234271231,CA
3234271232,3234275327,PT
3234275328,3234279423,AU
@@ -49143,10 +48696,10 @@
3234283520,3234310367,US
3234310368,3234310371,HK
3234310372,3234316287,US
-3234332672,3234349055,US
+3234316288,3234320383,CA
+3234320384,3234349055,US
3234349056,3234353151,NZ
-3234353152,3234381823,US
-3234398208,3234549759,US
+3234353152,3234549759,US
3234549760,3234550015,RU
3234553856,3234556415,US
3234556416,3234556927,CA
@@ -49265,8 +48818,7 @@
3234855168,3234855935,US
3234856192,3234856447,US
3234856960,3234861055,CA
-3234861056,3234906111,US
-3234922496,3234988031,US
+3234861056,3234988031,US
3234988032,3234991103,CA
3234991104,3235004415,US
3235004416,3235020799,CA
@@ -49279,9 +48831,7 @@
3235276800,3235278847,US
3235278848,3235282943,BB
3235282944,3235315711,CA
-3235315712,3235389439,US
-3235389440,3235389951,VE
-3235389952,3235512319,US
+3235315712,3235512319,US
3235512320,3235577855,JP
3235577856,3235643391,CA
3235643392,3235774463,US
@@ -49387,29 +48937,18 @@
3236695040,3236696063,CA
3236696064,3236757503,US
3236757504,3236765695,CA
-3236765696,3236774911,US
-3236774912,3236775423,HK
-3236775424,3236775679,US
-3236775680,3236776191,CA
-3236776192,3236778239,US
-3236778240,3236778751,GB
-3236778752,3236781823,US
-3236781824,3236782335,ES
-3236782336,3236784383,US
-3236784384,3236784895,IT
-3236784896,3236786687,US
-3236786688,3236787199,CA
-3236787200,3236788479,US
+3236765696,3236788479,US
3236788480,3236789503,GB
3236789504,3236823039,US
3236823040,3236826111,CH
3236826112,3236827135,CA
-3236827136,3236958207,US
+3236827136,3236828159,US
+3236828160,3236829183,US
+3236829184,3236829951,US
+3236829952,3236958207,US
3236958208,3236962303,AU
-3236962304,3237022207,US
-3237022208,3237022719,CA
-3237022720,3237023231,US
-3237023232,3237023743,CA
+3236962304,3237021695,US
+3237021696,3237023743,CA
3237023744,3237036031,US
3237036032,3237052415,CA
3237052416,3237154815,US
@@ -49417,6 +48956,8 @@
3237155840,3237156863,AU
3237156864,3237163007,US
3237163008,3237167103,DM
+3237167104,3237179391,US
+3237179392,3237183487,CA
3237183488,3237216255,US
3237216256,3237281791,JP
3237281792,3237285119,US
@@ -49481,7 +49022,9 @@
3237554432,3237554434,AU
3237554435,3237554435,AP
3237554436,3237554687,AU
-3237554688,3237560319,US
+3237554688,3237568511,US
+3237568512,3237572607,CA
+3237572608,3237576703,US
3237576704,3237609471,CA
3237609472,3237613567,US
3237613568,3237614591,CA
@@ -49529,7 +49072,8 @@
3237773312,3237777407,CA
3237777408,3237781503,US
3237781504,3237785599,CA
-3237785600,3237789695,US
+3237785600,3237797887,US
+3237797888,3237801983,CA
3237806080,3237857535,US
3237858304,3237863423,CA
3237863424,3237896191,US
@@ -49783,7 +49327,7 @@
3239105280,3239105535,CH
3239105536,3239105791,DE
3239105792,3239106047,RO
-3239106048,3239106559,DE
+3239106048,3239106559,AT
3239106560,3239106815,ES
3239106816,3239107071,CH
3239107072,3239107327,RO
@@ -50265,7 +49809,7 @@
3239789056,3239789567,DE
3239789568,3239790079,FR
3239790080,3239790591,RO
-3239790592,3239791103,NL
+3239790592,3239791103,LV
3239791104,3239791615,CH
3239792128,3239792639,FR
3239792640,3239793151,UA
@@ -50572,7 +50116,6 @@
3240192512,3240193023,RO
3240193024,3240193535,GB
3240193536,3240194047,PL
-3240194048,3240194559,GB
3240194560,3240195071,AT
3240195072,3240195583,GB
3240195584,3240196095,RO
@@ -50584,7 +50127,7 @@
3240199168,3240199679,RU
3240199680,3240200191,NL
3240200192,3240200703,RO
-3240200704,3240201215,SE
+3240200704,3240201215,GB
3240201216,3240201727,RO
3240201728,3240202239,CH
3240202240,3240202751,RU
@@ -50946,7 +50489,7 @@
3240739072,3240739327,CH
3240739328,3240739583,FR
3240739584,3240739839,LV
-3240739840,3240740095,US
+3240739840,3240740095,DE
3240740096,3240740351,LT
3240740352,3240740607,IT
3240740608,3240741119,DE
@@ -51108,7 +50651,6 @@
3241036800,3241037055,GB
3241037056,3241037311,RU
3241037312,3241037567,BE
-3241037568,3241037823,DK
3241037824,3241038079,NL
3241038080,3241038335,UA
3241038336,3241038591,DE
@@ -51225,9 +50767,7 @@
3241481728,3241481983,PT
3241481984,3241482239,DE
3241482240,3241484799,SE
-3241484800,3241485311,BE
-3241485312,3241485567,GB
-3241485568,3241496575,BE
+3241484800,3241496575,BE
3241496576,3241496831,AT
3241496832,3241497343,BE
3241497344,3241497599,UA
@@ -51240,7 +50780,7 @@
3241499904,3241500159,DE
3241500160,3241500671,GB
3241500672,3241501439,BE
-3241501440,3241501951,GB
+3241501440,3241501951,EU
3241501952,3241502463,BE
3241503232,3241503487,RS
3241503488,3241508095,BE
@@ -51314,9 +50854,7 @@
3242590208,3242655743,IT
3242655744,3242721279,NO
3242721280,3242852351,CH
-3242852352,3242911231,BE
-3242911232,3242911743,NL
-3242911744,3242917887,BE
+3242852352,3242917887,BE
3242917888,3242950655,NO
3242950656,3242983423,BE
3242983424,3243048959,IT
@@ -51416,11 +50954,8 @@
3243982848,3243991039,HU
3243991040,3243999231,BE
3243999232,3244031999,NO
-3244032000,3244034047,GR
-3244034048,3244035071,CY
-3244035072,3244097535,GR
+3244032000,3244097535,GR
3244097536,3244098559,DE
-3244098560,3244099583,GB
3244099584,3244100607,FR
3244100608,3244102655,UA
3244102656,3244103679,CH
@@ -51482,15 +51017,9 @@
3244452864,3244453119,EU
3244453120,3244545279,DE
3244545280,3244545535,EU
-3244545536,3244592127,DE
-3244592128,3244592639,CH
-3244592640,3244624895,DE
+3244545536,3244624895,DE
3244624896,3244625919,CH
-3244625920,3244794367,DE
-3244794368,3244794879,CA
-3244794880,3244813311,DE
-3244813312,3244813823,CA
-3244813824,3244818431,DE
+3244625920,3244818431,DE
3244818432,3244818687,ES
3244818688,3244818943,AT
3244818944,3244819199,PL
@@ -52197,7 +51726,7 @@
3245162496,3245163007,DE
3245163008,3245163519,KE
3245163520,3245164543,RU
-3245164544,3245165055,DE
+3245164544,3245165055,BE
3245165056,3245165567,AT
3245165568,3245166079,RU
3245166080,3245166591,TZ
@@ -52445,10 +51974,10 @@
3245307392,3245307903,FI
3245307904,3245308415,RO
3245308416,3245308927,ES
-3245308928,3245309439,SE
+3245309184,3245309439,SE
3245309440,3245309951,UA
3245309952,3245311999,CZ
-3245312000,3245314047,GB
+3245312000,3245314047,DE
3245314048,3245315071,PL
3245315072,3245316095,IT
3245316096,3245317119,SE
@@ -52502,12 +52031,10 @@
3245998080,3246129151,GB
3246129152,3246260223,RU
3246260224,3246325759,PT
-3246325760,3246326015,EU
-3246326016,3246326527,ES
-3246326528,3246351615,EU
+3246325760,3246351615,EU
3246351616,3246352639,ES
-3246352640,3246378495,EU
-3246378496,3246379007,ES
+3246352640,3246378751,EU
+3246378752,3246379007,ES
3246379008,3246381055,GB
3246381056,3246381567,EU
3246381568,3246381823,ES
@@ -52630,7 +52157,9 @@
3247255296,3247255551,NL
3247255552,3247265791,DE
3247265792,3247266047,NL
-3247266048,3247277055,DE
+3247266048,3247276287,DE
+3247276288,3247276543,NL
+3247276544,3247277055,DE
3247277056,3247277311,NL
3247277312,3247278479,DE
3247278480,3247278487,NL
@@ -52638,13 +52167,19 @@
3247278536,3247278543,NL
3247278544,3247281303,DE
3247281304,3247281311,NL
-3247281312,3247282679,DE
+3247281312,3247282345,DE
+3247282346,3247282353,NL
+3247282354,3247282679,DE
3247282680,3247282687,NL
-3247282688,3247286783,DE
+3247282688,3247286104,DE
+3247286105,3247286105,NL
+3247286106,3247286783,DE
3247286784,3247287039,NL
3247287040,3247299363,DE
3247299364,3247299364,EU
-3247299365,3247306143,DE
+3247299365,3247302833,DE
+3247302834,3247302834,NL
+3247302835,3247306143,DE
3247306144,3247306151,NL
3247306152,3247308799,DE
3247308800,3247309055,BG
@@ -52765,15 +52300,10 @@
3247794439,3247794439,EU
3247794440,3247800319,FR
3247800320,3247816703,DK
-3247816704,3247817727,EU
-3247817728,3247820799,BE
-3247820800,3247822335,CH
-3247822336,3247822847,DE
-3247822848,3247823359,EU
-3247823360,3247823871,AT
-3247823872,3247825407,EU
-3247825408,3247825919,CH
-3247825920,3247826943,BE
+3247816704,3247818751,EU
+3247818752,3247820799,BE
+3247820800,3247821823,CH
+3247821824,3247826943,EU
3247826944,3247828991,CH
3247828992,3247833087,BE
3247833088,3247833599,RU
@@ -52951,7 +52481,6 @@
3248788480,3248788735,FR
3248788736,3248788991,UA
3248788992,3248789503,FR
-3248789504,3248789759,RO
3248789760,3248790015,FR
3248790016,3248790271,DE
3248790272,3248790527,DK
@@ -52959,9 +52488,15 @@
3248790784,3248791039,PL
3248791040,3248791295,BE
3248791296,3248791551,DE
-3248791552,3248792319,EU
+3248791552,3248792063,GB
+3248792064,3248792319,EU
3248792320,3248792575,GB
-3248792576,3248799743,EU
+3248792576,3248796607,EU
+3248796608,3248796863,GB
+3248796864,3248798975,EU
+3248798976,3248799231,GB
+3248799232,3248799735,EU
+3248799736,3248799743,GB
3248799744,3248800255,NL
3248800256,3248800767,RU
3248800768,3248801279,FR
@@ -52970,7 +52505,7 @@
3248802304,3248802815,FR
3248802816,3248803327,RU
3248803328,3248804351,GB
-3248804352,3248804863,EU
+3248804352,3248804863,LV
3248804864,3248805375,DE
3248805376,3248805887,RU
3248805888,3248806399,NL
@@ -53227,46 +52762,30 @@
3249868800,3249869823,NL
3249869824,3249871359,SE
3249871360,3249871615,US
-3249871616,3249910271,SE
-3249910272,3249910783,NL
-3249910784,3249912319,GB
-3249912320,3249926655,SE
+3249871616,3249910783,SE
+3249910784,3249911807,GB
+3249911808,3249926655,SE
3249926656,3249926911,AU
-3249926912,3249931263,SE
-3249931264,3249931775,NL
-3249931776,3249932287,SE
+3249926912,3249932287,SE
3249932288,3249934335,US
-3249934336,3249935871,SE
-3249935872,3249936383,DE
-3249936384,3249968127,SE
+3249934336,3249968127,SE
3249968128,3249969151,FR
-3249969152,3250012159,SE
+3249969152,3249972479,SE
+3249972480,3249972735,DE
+3249972736,3250012159,SE
3250012160,3250013183,DE
-3250013184,3250014207,SE
-3250014208,3250014719,DE
-3250014720,3250015231,SE
-3250015232,3250015743,FI
-3250015744,3250015999,SE
+3250013184,3250015999,SE
3250016000,3250016127,DK
-3250016128,3250016767,SE
-3250016768,3250017279,NL
-3250017280,3250017791,SE
-3250017792,3250018303,DE
-3250018304,3250018815,FR
-3250018816,3250020863,SE
+3250016128,3250020863,SE
3250020864,3250021375,IT
3250021376,3250022399,FR
-3250022400,3250022911,SE
-3250022912,3250023423,FR
+3250022400,3250023423,SE
3250023424,3250024447,DE
3250024448,3250026495,SE
3250026496,3250027519,FR
3250027520,3250032639,SE
3250032640,3250032895,AP
-3250032896,3250039295,SE
-3250039296,3250039807,DK
-3250039808,3250040319,GB
-3250040320,3250061311,SE
+3250032896,3250061311,SE
3250061312,3250192383,FI
3250192384,3250192639,AT
3250192640,3250192895,RU
@@ -53846,7 +53365,9 @@
3251252736,3251256831,CH
3251256832,3251257343,GB
3251257344,3251259903,BE
-3251259904,3251261439,FR
+3251259904,3251260159,FR
+3251260160,3251260671,EU
+3251260672,3251261439,FR
3251261440,3251264255,CH
3251264256,3251265535,FR
3251265536,3251267839,NL
@@ -53940,13 +53461,9 @@
3251806208,3251810047,BE
3251810048,3251812607,FI
3251812608,3251814143,BE
-3251814144,3251814655,FI
-3251814656,3251815167,BE
-3251815168,3251815679,LU
+3251814144,3251815679,FI
3251815680,3251817471,BE
-3251817472,3251817983,FI
-3251817984,3251818495,BE
-3251818496,3251896319,FI
+3251817472,3251896319,FI
3251896320,3252166655,NO
3252166656,3252167679,SE
3252167680,3252176127,NL
@@ -53954,13 +53471,14 @@
3252177920,3252178943,HR
3252178944,3252179455,SE
3252179456,3252189183,NL
-3252189184,3252189695,NO
-3252189696,3252190719,SE
+3252189184,3252190719,SE
3252190720,3252190975,NO
3252190976,3252191231,SE
3252191232,3252196351,HR
3252196352,3252197375,SE
-3252197376,3252205567,HR
+3252197376,3252202495,HR
+3252202496,3252203007,SE
+3252203008,3252205567,HR
3252205568,3252205823,SE
3252205824,3252206079,NO
3252206080,3252207615,SE
@@ -53977,11 +53495,10 @@
3252248576,3252256767,NL
3252256768,3252273151,NO
3252273152,3252276223,SE
-3252276224,3252277759,NO
-3252277760,3252278271,SE
+3252276224,3252277247,NO
+3252277248,3252278271,SE
3252278272,3252279295,HR
-3252279296,3252279807,NO
-3252279808,3252280319,SE
+3252279296,3252280319,SE
3252280320,3252286463,HR
3252286464,3252289535,SE
3252289536,3252289791,BG
@@ -54036,7 +53553,9 @@
3252346368,3252346623,GB
3252346624,3252355071,GR
3252355072,3252355327,GB
-3252355328,3252358911,LT
+3252355328,3252356351,LT
+3252356352,3252356863,EU
+3252356864,3252358911,LT
3252358912,3252359167,DE
3252359168,3252362239,DK
3252362240,3252362495,PL
@@ -54074,8 +53593,8 @@
3252387328,3252387583,PL
3252387584,3252387839,RU
3252387840,3252404223,LT
-3252404224,3252406271,NO
-3252406272,3252410758,LT
+3252404224,3252405759,NO
+3252405760,3252410758,LT
3252410759,3252410759,SL
3252410760,3252411903,LT
3252411904,3252411967,GN
@@ -54083,19 +53602,13 @@
3252415488,3252415743,US
3252415744,3252421631,LT
3252421632,3252423679,NO
-3252423680,3252436991,LT
-3252436992,3252437503,NG
-3252437504,3252449791,LT
+3252423680,3252449791,LT
3252449792,3252450047,DK
3252450048,3252452543,LT
3252452544,3252452551,SS
3252452552,3252455679,LT
3252455680,3252455807,BI
-3252455808,3252456447,LT
-3252456448,3252456959,BJ
-3252456960,3252461055,LT
-3252461056,3252461567,NO
-3252461568,3252469759,LT
+3252455808,3252469759,LT
3252469760,3252473855,NL
3252473856,3252486143,LT
3252486144,3252490239,BE
@@ -54125,7 +53638,6 @@
3252516864,3252517119,FR
3252517120,3252517375,EU
3252517376,3252517631,PL
-3252517632,3252517887,BE
3252517888,3252518143,DK
3252518144,3252518399,NL
3252518400,3252518655,PL
@@ -54249,7 +53761,7 @@
3252937728,3252938239,FR
3252938240,3252938751,UA
3252938752,3252939263,RU
-3252939264,3252939775,EU
+3252939264,3252939775,DE
3252939776,3252940287,RO
3252940288,3252940799,PT
3252940800,3252941311,RU
@@ -54288,30 +53800,22 @@
3253005056,3253010431,AT
3253010432,3253075967,FI
3253075968,3253207039,RO
-3253207040,3253265407,RU
-3253265408,3253265919,AM
-3253265920,3253270527,RU
+3253207040,3253270527,RU
3253270528,3253271551,BY
3253271552,3253338111,RU
3253338112,3253401343,SE
3253401344,3253401599,EU
3253401600,3253405563,SE
3253405564,3253405564,EU
-3253405565,3253409279,SE
-3253409280,3253409791,AT
-3253409792,3253430783,SE
+3253405565,3253430783,SE
3253430784,3253431039,BE
3253431040,3253441023,SE
3253441024,3253441535,AT
3253441536,3253454335,SE
3253454336,3253454591,EU
-3253454592,3253454847,SE
-3253454848,3253455359,NL
-3253455360,3253463039,SE
+3253454592,3253463039,SE
3253463040,3253464063,GB
-3253464064,3253464575,SE
-3253464576,3253465087,NL
-3253465088,3253469183,SE
+3253464064,3253469183,SE
3253469184,3253471231,AO
3253471232,3253534719,PT
3253534720,3253600255,GB
@@ -54519,7 +54023,7 @@
3253901824,3253902079,SI
3253902080,3253902335,DK
3253902336,3253904383,UA
-3253904384,3253904895,ES
+3253904384,3253904895,GB
3253904896,3253905151,UA
3253905152,3253905407,RU
3253905408,3253905919,PL
@@ -54545,7 +54049,7 @@
3253917184,3253917439,CY
3253917440,3253917695,PL
3253917696,3253918207,RU
-3253918208,3253918719,DE
+3253918208,3253918719,CH
3253918720,3253919743,IL
3253919744,3253923839,GB
3253923840,3253927935,GR
@@ -54606,17 +54110,11 @@
3254494208,3254494527,GP
3254494528,3254495055,FR
3254495056,3254495063,DJ
-3254495064,3254496767,FR
-3254496768,3254497247,DZ
-3254497248,3254508031,FR
-3254508032,3254508543,GQ
-3254508544,3254508799,FR
+3254495064,3254508799,FR
3254508800,3254508831,MQ
3254508832,3254521855,FR
-3254521856,3254522143,GB
-3254522144,3254552319,FR
-3254552320,3254552831,IR
-3254552832,3254607871,FR
+3254521856,3254522111,GB
+3254522112,3254607871,FR
3254607872,3254608895,RE
3254608896,3254609151,FR
3254609152,3254610687,RE
@@ -54635,9 +54133,7 @@
3254615552,3254615552,YT
3254615553,3254615807,FR
3254615808,3254615808,YT
-3254615809,3254623743,FR
-3254623744,3254624255,US
-3254624256,3254648831,FR
+3254615809,3254648831,FR
3254648832,3254648895,DK
3254648896,3254649087,GB
3254649088,3254649855,AL
@@ -54839,7 +54335,6 @@
3254841344,3254841599,PL
3254841600,3254841855,IE
3254841856,3254842111,LV
-3254842112,3254842367,GB
3254842368,3254842623,PL
3254842624,3254842879,RU
3254842880,3254843135,SE
@@ -54932,18 +54427,64 @@
3255172352,3255172607,DE
3255172608,3255173119,FR
3255173120,3255173631,SH
-3255173632,3255174143,EU
-3255174144,3255174399,GB
-3255174400,3255176191,EU
+3255173632,3255173647,EU
+3255173648,3255173711,GB
+3255173712,3255173759,EU
+3255173760,3255173823,GB
+3255173824,3255173839,EU
+3255173840,3255175167,GB
+3255175168,3255175199,EU
+3255175200,3255175231,GB
+3255175232,3255175247,EU
+3255175248,3255175263,GB
+3255175264,3255175279,EU
+3255175280,3255175295,GB
+3255175296,3255175311,EU
+3255175312,3255175327,GB
+3255175328,3255175431,EU
+3255175432,3255175447,GB
+3255175448,3255175455,EU
+3255175456,3255175503,GB
+3255175504,3255175511,EU
+3255175512,3255175535,GB
+3255175536,3255175551,EU
+3255175552,3255175559,GB
+3255175560,3255175591,EU
+3255175592,3255175607,GB
+3255175608,3255175679,EU
+3255175680,3255175935,GB
+3255175936,3255176191,EU
3255176192,3255177215,GB
-3255177216,3255189759,EU
-3255189760,3255191807,GB
-3255191808,3255195391,EU
-3255195392,3255195903,GB
-3255195904,3255196927,EU
-3255196928,3255197439,GB
-3255197440,3255197695,EU
-3255197696,3255205887,GB
+3255177216,3255177471,EU
+3255177472,3255177855,GB
+3255177856,3255177983,EU
+3255177984,3255187199,GB
+3255187200,3255187455,DE
+3255187456,3255187711,GB
+3255187712,3255188479,EU
+3255188480,3255191807,GB
+3255191808,3255192319,EU
+3255192320,3255193863,GB
+3255193864,3255193887,EU
+3255193888,3255193959,GB
+3255193960,3255193967,EU
+3255193968,3255193975,GB
+3255193976,3255193983,GI
+3255193984,3255193999,GB
+3255194000,3255194015,EU
+3255194016,3255194039,GB
+3255194040,3255194055,EU
+3255194056,3255194063,GB
+3255194064,3255194071,EU
+3255194072,3255194431,GB
+3255194432,3255194495,EU
+3255194496,3255194559,GB
+3255194560,3255194623,EU
+3255194624,3255194703,GB
+3255194704,3255194719,EU
+3255194720,3255194815,GB
+3255194816,3255194879,EU
+3255194880,3255205887,GB
3255205888,3255214079,FR
3255214080,3255222271,CH
3255222272,3255223295,DE
@@ -55099,7 +54640,6 @@
3255412736,3255413247,DE
3255413248,3255413503,LV
3255413504,3255413759,UZ
-3255413760,3255414271,GB
3255414272,3255414527,TR
3255414528,3255414783,LV
3255414784,3255415807,BE
@@ -55117,28 +54657,17 @@
3255434466,3255434720,GB
3255434721,3255434721,EU
3255434722,3255436287,GB
-3255436288,3255449599,EU
-3255449600,3255450111,BE
-3255450112,3255450623,EU
-3255450624,3255451135,DE
-3255451136,3255452671,FR
-3255452672,3255468031,EU
-3255468032,3255468543,GB
-3255468544,3255470079,EU
-3255470080,3255470591,AT
-3255470592,3255474175,EU
-3255474176,3255476735,GB
-3255476736,3255483391,EU
+3255436288,3255451647,EU
+3255451648,3255452671,FR
+3255452672,3255474175,EU
+3255474176,3255476223,GB
+3255476224,3255483391,EU
3255483392,3255484415,DE
3255484416,3255485439,EU
3255485440,3255486463,FR
-3255486464,3255486975,EU
-3255486976,3255487487,GB
-3255487488,3255488511,EU
+3255486464,3255488511,EU
3255488512,3255489535,AT
-3255489536,3255490047,EU
-3255490048,3255490559,DE
-3255490560,3255492607,EU
+3255489536,3255492607,EU
3255492608,3255496703,GB
3255496704,3255498751,EU
3255498752,3255500799,FR
@@ -55181,24 +54710,18 @@
3255660544,3255666431,NL
3255666432,3255666687,DE
3255666688,3255697407,NL
-3255697408,3255704575,SE
-3255704576,3255705087,FR
-3255705088,3255716351,SE
-3255716352,3255716863,CH
-3255716864,3255743231,SE
+3255697408,3255743231,SE
3255743232,3255743487,IT
3255743488,3255743743,SE
3255743744,3255743999,US
3255744000,3255745535,SE
-3255745536,3255746047,DK
-3255746048,3255762431,SE
-3255762432,3255762943,BE
+3255745536,3255745791,DK
+3255745792,3255762943,SE
3255762944,3255791615,DE
3255791616,3255792639,UA
3255792640,3255793663,RU
3255793664,3255794943,PL
-3255794944,3255795199,RU
-3255795200,3255795711,UA
+3255794944,3255795711,RU
3255795712,3255799039,DE
3255799040,3255799295,SE
3255799296,3255800575,DE
@@ -55217,9 +54740,7 @@
3256025088,3256057855,NO
3256057856,3256082431,DK
3256082432,3256090623,LV
-3256090624,3256164863,IT
-3256164864,3256165375,SE
-3256165376,3256221695,IT
+3256090624,3256221695,IT
3256221696,3256223743,SE
3256223744,3256225791,NL
3256225792,3256229887,SE
@@ -55331,9 +54852,7 @@
3256693760,3256694783,IT
3256694784,3256695807,DE
3256695808,3256696831,UA
-3256696832,3256697087,BE
-3256697088,3256697855,EU
-3256697856,3256698367,IT
+3256696832,3256698367,EU
3256698368,3256698623,NL
3256698624,3256698879,GB
3256698880,3256701439,EU
@@ -55343,12 +54862,9 @@
3256705280,3256705535,EU
3256705536,3256705791,BE
3256705792,3256706047,AT
-3256706048,3256706559,GR
-3256706560,3256709631,EU
+3256706048,3256709631,EU
3256709632,3256709887,AT
-3256709888,3256710143,EU
-3256710144,3256710655,AT
-3256710656,3256711167,SE
+3256709888,3256711167,EU
3256711168,3256711423,DE
3256711424,3256713215,EU
3256713216,3256727551,PL
@@ -55598,9 +55114,7 @@
3257564672,3257565183,RO
3257565184,3257573375,CY
3257573376,3257574015,CH
-3257574016,3257574911,EU
-3257574912,3257575423,BE
-3257575424,3257576447,EU
+3257574016,3257576447,EU
3257576448,3257577471,AT
3257577472,3257581567,DE
3257581568,3257585663,UA
@@ -55617,36 +55131,54 @@
3257663488,3257729023,UA
3257729024,3257731295,DE
3257731296,3257731327,NL
-3257731328,3257745639,DE
+3257731328,3257745599,DE
+3257745600,3257745608,NL
+3257745609,3257745639,DE
3257745640,3257745647,NL
3257745648,3257750783,DE
3257750784,3257751039,NL
3257751040,3257751679,DE
3257751680,3257751687,NL
-3257751688,3257762303,DE
+3257751688,3257757135,DE
+3257757136,3257757136,NL
+3257757137,3257757139,DE
+3257757140,3257757140,NL
+3257757141,3257758895,DE
+3257758896,3257758903,NL
+3257758904,3257762303,DE
3257762304,3257762559,NL
3257762560,3257769727,DE
3257769728,3257769983,NL
-3257769984,3257778175,DE
+3257769984,3257774911,DE
+3257774912,3257774919,NL
+3257774920,3257778175,DE
3257778176,3257778431,NL
-3257778432,3257781495,DE
+3257778432,3257778791,DE
+3257778792,3257778799,NL
+3257778800,3257781090,DE
+3257781091,3257781091,NL
+3257781092,3257781495,DE
3257781496,3257781503,NL
-3257781504,3257790567,DE
+3257781504,3257784831,DE
+3257784832,3257785087,NL
+3257785088,3257786397,DE
+3257786398,3257786398,NL
+3257786399,3257786466,DE
+3257786467,3257786467,NL
+3257786468,3257787577,DE
+3257787578,3257787578,NL
+3257787579,3257790567,DE
3257790568,3257790575,NL
3257790576,3257791943,DE
3257791944,3257791951,NL
-3257791952,3257793719,DE
-3257793720,3257793727,NL
-3257793728,3257794047,DE
+3257791952,3257794047,DE
3257794048,3257794303,NL
3257794304,3257794559,DE
-3257794560,3257827327,GB
-3257827328,3257827839,IE
-3257827840,3257829375,GB
+3257794560,3257829375,GB
3257829376,3257830399,IE
3257830400,3257835519,GB
-3257835520,3257844223,IE
-3257844224,3257844735,GB
+3257835520,3257843711,IE
+3257843712,3257844735,GB
3257844736,3257860095,IE
3257860096,3257925631,SE
3257925632,3257925887,AT
@@ -55707,7 +55239,6 @@
3258067968,3258068223,RO
3258068224,3258068479,CH
3258068736,3258068991,DE
-3258068992,3258069247,NL
3258069248,3258069503,PL
3258069504,3258069759,RO
3258069760,3258070015,UA
@@ -55733,7 +55264,6 @@
3258076928,3258077183,UA
3258077184,3258077439,GB
3258077440,3258077695,UA
-3258077696,3258077951,NL
3258077952,3258078207,PL
3258078208,3258078463,TR
3258078464,3258078719,UA
@@ -55974,16 +55504,11 @@
3258974208,3259039743,DE
3259039744,3259105279,PT
3259105280,3259170815,GB
-3259170816,3259219967,RU
-3259219968,3259220479,BY
-3259220480,3259223295,RU
-3259223296,3259223807,TM
+3259170816,3259223807,RU
3259223808,3259224831,KZ
-3259224832,3259225343,TJ
+3259224832,3259225343,RU
3259225344,3259226111,AZ
-3259226112,3259226623,UZ
-3259226624,3259227135,AM
-3259227136,3259236351,RU
+3259226112,3259236351,RU
3259236352,3259236863,SE
3259236864,3259237119,CH
3259237120,3259240447,SE
@@ -56001,9 +55526,7 @@
3259250723,3259250723,EU
3259250724,3259252479,SE
3259252480,3259252735,EU
-3259252736,3259265023,SE
-3259265024,3259265535,DE
-3259265536,3259281407,SE
+3259252736,3259281407,SE
3259281408,3259282431,US
3259282432,3259301887,SE
3259301888,3259302143,DE
@@ -56011,11 +55534,7 @@
3259302400,3259303423,CH
3259303424,3259305983,SE
3259305984,3259310079,NL
-3259310080,3259311103,EU
-3259311104,3259311615,DE
-3259311616,3259312639,EU
-3259312640,3259313151,GB
-3259313152,3259317247,EU
+3259310080,3259317247,EU
3259317248,3259318271,CH
3259318272,3259334655,GB
3259334656,3259338751,DE
@@ -56039,44 +55558,20 @@
3259367424,3259432959,GB
3259432960,3259435263,SE
3259435264,3259435519,IT
-3259435520,3259438591,SE
-3259438592,3259439103,NO
-3259439104,3259454719,SE
+3259435520,3259454719,SE
3259454720,3259454975,EU
3259454976,3259458559,SE
3259458560,3259459583,CZ
3259459584,3259470847,SE
3259470848,3259471871,US
-3259471872,3259484671,SE
-3259484672,3259485183,ES
+3259471872,3259485183,SE
3259485184,3259485695,AT
3259485696,3259491327,SE
3259491328,3259492351,CZ
-3259492352,3259495935,SE
-3259495936,3259496447,DK
-3259496448,3259498495,SE
-3259498496,3259521023,GB
-3259521024,3259521535,NL
-3259521536,3259541503,GB
+3259492352,3259498495,SE
+3259498496,3259541503,GB
3259541504,3259543551,NL
-3259543552,3259545599,GB
-3259545600,3259546111,LB
-3259546112,3259581439,GB
-3259581440,3259581951,ES
-3259581952,3259587583,GB
-3259587584,3259588095,ES
-3259588096,3259588607,IT
-3259588608,3259628031,GB
-3259628032,3259628543,CH
-3259628544,3259640831,GB
-3259640832,3259641343,ES
-3259641344,3259650047,GB
-3259650048,3259650559,NL
-3259650560,3259651071,GB
-3259651072,3259652095,NL
-3259652096,3259701759,GB
-3259701760,3259702271,DE
-3259702272,3259760639,GB
+3259543552,3259760639,GB
3259760640,3259814399,DE
3259814400,3259814655,AT
3259814656,3259821823,DE
@@ -56103,7 +55598,6 @@
3259966464,3259967487,DE
3259967488,3259968511,RS
3259968512,3259969535,RU
-3259969536,3259970559,FR
3259970560,3259971583,CZ
3259971584,3259972607,IT
3259972608,3259973631,UA
@@ -56120,8 +55614,7 @@
3260021760,3260022271,GR
3260022272,3260022783,NL
3260022784,3260284927,GB
-3260284928,3260415487,RU
-3260415488,3260415999,BY
+3260284928,3260415999,RU
3260416000,3260481535,FI
3260481536,3260547071,RU
3260547072,3260547327,DE
@@ -56428,11 +55921,56 @@
3262119936,3262124031,AX
3262124032,3262128127,DE
3262128128,3262136319,GB
-3262136320,3262139391,EU
+3262136320,3262137599,EU
+3262137600,3262137855,DE
+3262137856,3262139391,EU
3262139392,3262140415,GB
-3262140416,3262141439,EU
+3262140416,3262140671,DE
+3262140672,3262141183,EU
+3262141184,3262141439,DE
3262141440,3262142463,ES
-3262142464,3262152703,EU
+3262142464,3262142719,DE
+3262142720,3262143487,EU
+3262143488,3262143743,GB
+3262143744,3262143999,EU
+3262144000,3262144047,DE
+3262144048,3262145023,EU
+3262145024,3262145279,DE
+3262145280,3262145551,EU
+3262145552,3262145567,DE
+3262145568,3262145615,EU
+3262145616,3262145631,DE
+3262145632,3262145663,EU
+3262145664,3262145791,DE
+3262145792,3262146047,GB
+3262146048,3262146815,DE
+3262146816,3262147583,EU
+3262147584,3262147839,DE
+3262147840,3262148607,EU
+3262148608,3262148863,DE
+3262148864,3262148879,EU
+3262148880,3262148919,DE
+3262148920,3262148927,EU
+3262148928,3262149119,DE
+3262149120,3262149151,FR
+3262149152,3262149159,DE
+3262149160,3262149167,EU
+3262149168,3262149375,FR
+3262149376,3262149631,EU
+3262149632,3262149887,DE
+3262149888,3262150911,EU
+3262150912,3262151047,DE
+3262151048,3262151071,EU
+3262151072,3262151103,DE
+3262151104,3262151135,EU
+3262151136,3262151151,DE
+3262151152,3262151167,EU
+3262151168,3262151423,DE
+3262151424,3262151935,EU
+3262151936,3262152191,DE
+3262152192,3262152663,EU
+3262152664,3262152671,DE
+3262152672,3262152703,EU
3262152704,3262185471,AT
3262185472,3262200575,DE
3262200576,3262200831,EU
@@ -56472,7 +56010,6 @@
3262425088,3262425343,GR
3262425344,3262425599,RU
3262425600,3262426111,UA
-3262426112,3262426623,DE
3262426624,3262427135,GB
3262427136,3262427647,FR
3262427648,3262428159,DK
@@ -56535,13 +56072,9 @@
3262473753,3262473753,US
3262473754,3262474043,DE
3262474044,3262474044,GB
-3262474045,3262474051,DE
-3262474052,3262474052,SG
-3262474053,3262474183,DE
+3262474045,3262474183,DE
3262474184,3262474184,SG
-3262474185,3262474204,DE
-3262474205,3262474205,SG
-3262474206,3262474236,DE
+3262474185,3262474236,DE
3262474237,3262474237,SG
3262474238,3262474347,DE
3262474348,3262474351,AU
@@ -56596,7 +56129,6 @@
3262509568,3262510079,RO
3262510080,3262511103,FR
3262511104,3262511615,GB
-3262511616,3262512127,DE
3262512128,3262512639,UA
3262512640,3262513151,DE
3262513152,3262578687,AT
@@ -56606,16 +56138,15 @@
3262636032,3262644223,BE
3262644224,3262648319,NL
3262648320,3262648575,EU
-3262648576,3262648831,DE
-3262648832,3262649855,NL
+3262648576,3262649855,NL
3262649856,3262650111,DE
3262650112,3262664703,NL
3262664704,3262665727,DE
3262665728,3262665983,EU
3262665984,3262666751,DE
3262666752,3262667007,EU
-3262667008,3262671359,DE
-3262671360,3262690815,NL
+3262667008,3262670847,DE
+3262670848,3262690815,NL
3262690816,3262691583,DE
3262691584,3262693375,NL
3262693376,3262701567,DE
@@ -56627,13 +56158,9 @@
3262722560,3262722815,DE
3262722816,3262724863,NL
3262724864,3262725119,DE
-3262725120,3262725631,NL
-3262725632,3262726143,DE
-3262726144,3262732799,NL
+3262725120,3262732799,NL
3262732800,3262733055,DE
-3262733056,3262736383,NL
-3262736384,3262736895,DE
-3262736896,3262753791,NL
+3262733056,3262753791,NL
3262753792,3262754815,DE
3262754816,3262832639,NL
3262832640,3262840319,DE
@@ -56745,17 +56272,7 @@
3263168512,3263430655,GB
3263430656,3263432703,SE
3263432704,3263433215,AT
-3263433216,3263436799,SE
-3263436800,3263437311,GB
-3263437312,3263443455,SE
-3263443456,3263443967,NL
-3263443968,3263446527,SE
-3263446528,3263447039,DE
-3263447040,3263458815,SE
-3263458816,3263459327,FR
-3263459328,3263467519,SE
-3263467520,3263468031,IT
-3263468032,3263469567,SE
+3263433216,3263469567,SE
3263469568,3263470591,SG
3263470592,3263475711,SE
3263475712,3263476735,JP
@@ -56777,9 +56294,7 @@
3263526144,3263561727,EU
3263561728,3263627263,NL
3263627264,3263692799,RU
-3263692800,3263764991,FI
-3263764992,3263765503,BE
-3263765504,3263823871,FI
+3263692800,3263823871,FI
3263823872,3263826943,DE
3263826944,3263827199,AT
3263827200,3263833903,DE
@@ -56893,8 +56408,7 @@
3264334336,3264334847,UA
3264334848,3264335359,PL
3264335360,3264335871,SK
-3264335872,3264336383,NL
-3264336384,3264336895,GB
+3264335872,3264336895,GB
3264336896,3264337407,RU
3264337408,3264338431,UA
3264338432,3264338943,DE
@@ -56917,9 +56431,7 @@
3264345088,3264346111,NL
3264346112,3264347135,SE
3264347136,3264348159,DE
-3264348160,3264372223,FR
-3264372224,3264372735,GB
-3264372736,3264375039,FR
+3264348160,3264375039,FR
3264375040,3264376063,SE
3264376064,3264376319,HR
3264376320,3264376575,UA
@@ -57042,7 +56554,7 @@
3264651776,3264652287,IT
3264652288,3264652799,RU
3264652800,3264653311,PL
-3264653312,3264653823,EU
+3264653312,3264653823,DE
3264653824,3264654335,PL
3264654336,3264654847,DE
3264654848,3264655359,UA
@@ -57222,7 +56734,9 @@
3265140000,3265140015,BE
3265140016,3265141135,CH
3265141136,3265141151,GB
-3265141152,3265141759,CH
+3265141152,3265141553,CH
+3265141554,3265141557,IE
+3265141558,3265141759,CH
3265141760,3265141767,GB
3265141768,3265141791,CH
3265141792,3265141887,GB
@@ -57234,64 +56748,40 @@
3265175552,3265183743,NL
3265183744,3265191935,BY
3265191936,3265200127,CH
-3265200128,3265218559,GB
-3265218560,3265219071,NL
-3265219072,3265265663,GB
+3265200128,3265265663,GB
3265265664,3265331199,SK
-3265331200,3265334783,GB
-3265334784,3265335807,EU
-3265335808,3265337343,GB
-3265337344,3265337855,EU
-3265337856,3265340415,GB
-3265340416,3265341951,EU
-3265341952,3265343487,GB
-3265343488,3265343999,DE
-3265344000,3265344511,EU
-3265344512,3265345023,DE
-3265345024,3265345535,EU
+3265331200,3265334271,GB
+3265334272,3265336319,EU
+3265336320,3265337343,GB
+3265337344,3265338367,EU
+3265338368,3265340415,GB
+3265340416,3265342463,EU
+3265342464,3265343487,GB
+3265343488,3265345535,EU
3265345536,3265347583,DE
-3265347584,3265349119,FR
-3265349120,3265349631,EU
-3265349632,3265352191,FR
-3265352192,3265353215,EU
-3265353216,3265353727,DE
-3265353728,3265354751,EU
-3265354752,3265355263,DE
-3265355264,3265355775,FR
-3265355776,3265357823,EU
-3265357824,3265358847,NL
-3265358848,3265359359,EU
-3265359360,3265359871,NL
-3265359872,3265360383,EU
-3265360384,3265360895,CH
+3265347584,3265348607,FR
+3265348608,3265349631,EU
+3265349632,3265351679,FR
+3265351680,3265360895,EU
3265360896,3265361919,GB
3265361920,3265363967,IT
3265363968,3265366015,ES
-3265366016,3265366527,EU
-3265366528,3265367039,DK
-3265367040,3265368063,EU
+3265366016,3265368063,EU
3265368064,3265369087,DK
-3265369088,3265370111,EU
-3265370112,3265370623,DK
-3265370624,3265371135,EU
+3265369088,3265371135,EU
3265371136,3265376255,DE
-3265376256,3265376767,EU
-3265376768,3265378303,GB
+3265376256,3265377279,EU
+3265377280,3265378303,GB
3265378304,3265379327,NL
3265379328,3265380351,EU
3265380352,3265382399,GB
-3265382400,3265382911,CH
-3265382912,3265383935,EU
-3265383936,3265384447,GB
-3265384448,3265386495,DE
+3265382400,3265386495,EU
3265386496,3265386751,NL
3265386752,3265387007,EU
3265387008,3265387263,SE
3265387264,3265388543,EU
3265388544,3265392639,GB
-3265392640,3265393151,EU
-3265393152,3265394175,GB
-3265394176,3265394687,EU
+3265392640,3265394687,EU
3265394688,3265396735,GB
3265396736,3265527807,DE
3265527808,3265582476,GB
@@ -57303,8 +56793,7 @@
3265595904,3265596415,RU
3265596416,3265596927,GB
3265596928,3265597439,FR
-3265597440,3265597951,MC
-3265597952,3265599999,RU
+3265597440,3265599999,RU
3265600000,3265600511,HU
3265600512,3265601023,GB
3265601024,3265601535,RU
@@ -57353,7 +56842,6 @@
3265902592,3265904383,GB
3265904384,3265904639,RO
3265904640,3265904895,DE
-3265904896,3265905151,UA
3265905152,3265905663,GB
3265905664,3265905919,IE
3265905920,3265906175,GB
@@ -57445,9 +56933,27 @@
3266345984,3266346495,GB
3266346496,3266346751,IT
3266346752,3266347007,FR
-3266347008,3266351615,EU
-3266351616,3266352127,GB
-3266352128,3266354687,EU
+3266347008,3266351359,EU
+3266351360,3266352607,GB
+3266352608,3266352895,EU
+3266352896,3266353567,GB
+3266353568,3266353583,EU
+3266353584,3266353591,GB
+3266353592,3266353663,EU
+3266353664,3266353671,GB
+3266353672,3266353679,EU
+3266353680,3266353687,GB
+3266353688,3266353775,EU
+3266353776,3266353783,US
+3266353784,3266353855,EU
+3266353856,3266353863,GB
+3266353864,3266353879,EU
+3266353880,3266353887,GB
+3266353888,3266353895,EU
+3266353896,3266353903,GB
+3266353904,3266353919,EU
+3266353920,3266354175,GB
+3266354176,3266354687,EU
3266354688,3266355199,GB
3266355200,3266363391,RO
3266363392,3266371583,GB
@@ -57561,94 +57067,44 @@
3267368481,3267368481,EU
3267368482,3267428351,DK
3267428352,3267493887,GB
-3267493888,3267494399,EU
-3267494400,3267494911,GB
-3267494912,3267495423,EU
-3267495424,3267495935,GB
-3267495936,3267496959,EU
-3267496960,3267497983,GB
-3267497984,3267499519,EU
-3267499520,3267500031,GB
-3267500032,3267500543,EU
-3267500544,3267504127,GB
-3267504128,3267506175,EU
-3267506176,3267506687,DE
-3267506688,3267508223,EU
-3267508224,3267508735,DE
-3267508736,3267509759,EU
-3267509760,3267510271,GB
-3267510272,3267512831,FR
-3267512832,3267513343,GB
+3267493888,3267501055,EU
+3267501056,3267504127,GB
+3267504128,3267511295,EU
+3267511296,3267512319,FR
+3267512320,3267513343,EU
3267513344,3267514367,FR
3267514368,3267515391,DE
-3267515392,3267515903,EU
-3267515904,3267517951,DE
-3267517952,3267518463,EU
-3267518464,3267518975,DE
-3267518976,3267519487,EU
-3267519488,3267519999,DE
-3267520000,3267520511,EU
+3267515392,3267516415,EU
+3267516416,3267517439,DE
+3267517440,3267520511,EU
3267520512,3267521535,DE
3267521536,3267522559,EU
-3267522560,3267524095,DE
-3267524096,3267527167,EU
-3267527168,3267527679,DE
+3267522560,3267523583,DE
+3267523584,3267527679,EU
3267527680,3267528703,FR
3267528704,3267529727,EU
3267529728,3267530751,AT
-3267530752,3267531263,EU
-3267531264,3267532799,FR
+3267530752,3267531775,EU
+3267531776,3267532799,FR
3267532800,3267534847,EU
3267534848,3267536895,FR
-3267536896,3267537407,EU
-3267537408,3267538943,FR
-3267538944,3267539455,EU
-3267539456,3267539967,NL
-3267539968,3267540991,EU
-3267540992,3267541503,NL
-3267541504,3267542015,EU
-3267542016,3267542527,GB
-3267542528,3267543551,EU
-3267543552,3267544063,GB
-3267544064,3267546111,EU
-3267546112,3267546623,ES
-3267546624,3267547135,FR
-3267547136,3267547647,EU
-3267547648,3267548159,GB
-3267548160,3267548671,EU
-3267548672,3267549183,GB
+3267536896,3267537919,EU
+3267537920,3267538943,FR
+3267538944,3267549183,EU
3267549184,3267550207,DK
-3267550208,3267550719,EU
-3267550720,3267551231,DK
-3267551232,3267551743,AT
-3267551744,3267552255,EU
-3267552256,3267552767,AT
-3267552768,3267553279,EU
-3267553280,3267554303,DK
-3267554304,3267556863,EU
-3267556864,3267557375,IL
-3267557376,3267557887,EU
-3267557888,3267558399,IL
-3267558400,3267558911,CH
-3267558912,3267559423,EU
+3267550208,3267559423,EU
3267559424,3267624959,DE
3267624960,3267630079,EU
3267630080,3267631615,GB
3267631616,3267634175,EU
3267634176,3267635199,GB
-3267635200,3267638783,EU
-3267638784,3267639295,CZ
-3267639296,3267645439,EU
+3267635200,3267645439,EU
3267645440,3267645695,GB
3267645696,3267648255,EU
3267648256,3267648511,GB
3267648512,3267649279,EU
3267649280,3267649535,DE
-3267649536,3267655679,EU
-3267655680,3267656191,IT
-3267656192,3267658751,EU
-3267658752,3267659263,CH
-3267659264,3267662847,EU
+3267649536,3267662847,EU
3267662848,3267663023,GB
3267663024,3267663039,IE
3267663040,3267663103,GB
@@ -57657,21 +57113,14 @@
3267666944,3267667455,EU
3267667456,3267667967,GB
3267667968,3267670015,EU
-3267670016,3267671551,ZA
-3267671552,3267680255,EU
-3267680256,3267680767,SK
-3267680768,3267684351,EU
+3267670016,3267671039,ZA
+3267671040,3267684351,EU
3267684352,3267684863,GB
-3267684864,3267685375,EU
-3267685376,3267685887,NL
-3267685888,3267686399,CH
-3267686400,3267690495,EU
+3267684864,3267690495,EU
3267690496,3267691519,FI
3267691520,3267692543,SE
3267692544,3267756031,FI
-3267756032,3267760639,SE
-3267760640,3267761151,NO
-3267761152,3267821567,SE
+3267756032,3267821567,SE
3267821568,3267824639,FR
3267824640,3267824895,MQ
3267824896,3267845375,FR
@@ -57691,25 +57140,254 @@
3268173824,3268182015,MT
3268182016,3268198399,PL
3268198400,3268214783,MA
-3268214784,3268218111,EU
+3268214784,3268215583,EU
+3268215584,3268215615,GB
+3268215616,3268215647,EU
+3268215648,3268215679,GB
+3268215680,3268215711,EU
+3268215712,3268215743,GB
+3268215744,3268215807,EU
+3268215808,3268216063,GB
+3268216064,3268218111,EU
3268218112,3268218367,GB
-3268218368,3268226559,EU
-3268226560,3268226815,GB
-3268226816,3268235935,EU
-3268235936,3268235967,GB
-3268235968,3268238639,EU
-3268238640,3268238655,GB
-3268238656,3268238815,EU
-3268238816,3268238831,GB
-3268238832,3268239615,EU
-3268239616,3268240127,GB
-3268240128,3268249599,EU
+3268218368,3268219807,EU
+3268219808,3268219823,GB
+3268219824,3268221439,EU
+3268221440,3268221471,GB
+3268221472,3268221503,EU
+3268221504,3268221599,GB
+3268221600,3268221695,EU
+3268221696,3268221951,GB
+3268221952,3268222975,EU
+3268222976,3268223167,GB
+3268223168,3268223199,EU
+3268223200,3268223231,GB
+3268223232,3268224767,EU
+3268224768,3268225023,US
+3268225024,3268226367,EU
+3268226368,3268226399,GB
+3268226400,3268226495,EU
+3268226496,3268226815,GB
+3268226816,3268227327,EU
+3268227328,3268227391,GB
+3268227392,3268227519,EU
+3268227520,3268227615,GB
+3268227616,3268231167,EU
+3268231168,3268231199,GB
+3268231200,3268231319,EU
+3268231320,3268231359,GB
+3268231360,3268231391,EU
+3268231392,3268231423,GB
+3268231424,3268231647,EU
+3268231648,3268231679,GB
+3268231680,3268231743,EU
+3268231744,3268231807,GB
+3268231808,3268232223,EU
+3268232224,3268232243,GB
+3268232244,3268232351,EU
+3268232352,3268232367,GB
+3268232368,3268232383,EU
+3268232384,3268232415,GB
+3268232416,3268232479,EU
+3268232480,3268232575,GB
+3268232576,3268232959,EU
+3268232960,3268233087,GB
+3268233088,3268233983,EU
+3268233984,3268234047,GB
+3268234048,3268234175,EU
+3268234176,3268234239,GB
+3268234240,3268234559,EU
+3268234560,3268234623,GB
+3268234624,3268235007,EU
+3268235008,3268235263,GB
+3268235264,3268235519,DE
+3268235520,3268235775,GB
+3268235776,3268235935,EU
+3268235936,3268236031,GB
+3268236032,3268236191,EU
+3268236192,3268236207,GB
+3268236208,3268236543,EU
+3268236544,3268236607,GB
+3268236608,3268236671,EU
+3268236672,3268236799,GB
+3268236800,3268238335,EU
+3268238336,3268238359,GB
+3268238360,3268238479,EU
+3268238480,3268238847,GB
+3268238848,3268239583,EU
+3268239584,3268240127,GB
+3268240128,3268240159,EU
+3268240160,3268240191,GB
+3268240192,3268240383,EU
+3268240384,3268240399,GB
+3268240400,3268240479,EU
+3268240480,3268240487,GB
+3268240488,3268240687,EU
+3268240688,3268240695,GB
+3268240696,3268240711,EU
+3268240712,3268240735,GB
+3268240736,3268240743,EU
+3268240744,3268240751,GB
+3268240752,3268240975,EU
+3268240976,3268240991,GB
+3268240992,3268241007,EU
+3268241008,3268241023,GB
+3268241024,3268241543,EU
+3268241544,3268241551,GB
+3268241552,3268241639,EU
+3268241640,3268241655,GB
+3268241656,3268242495,EU
+3268242496,3268242523,GB
+3268242524,3268242879,EU
+3268242880,3268243071,GB
+3268243072,3268243327,EU
+3268243328,3268243391,GB
+3268243392,3268243743,EU
+3268243744,3268243775,GB
+3268243776,3268244775,EU
+3268244776,3268244783,GB
+3268244784,3268244791,EU
+3268244792,3268244799,GB
+3268244800,3268245503,EU
+3268245504,3268245759,GB
+3268245760,3268246271,EU
+3268246272,3268246783,GB
+3268246784,3268246799,EU
+3268246800,3268246807,GB
+3268246808,3268246975,EU
+3268246976,3268246991,GB
+3268246992,3268248319,EU
+3268248320,3268248447,GB
+3268248448,3268248511,EU
+3268248512,3268248543,GB
+3268248544,3268249599,EU
3268249600,3268251647,GB
-3268251648,3268254591,EU
+3268251648,3268254463,EU
+3268254464,3268254543,GB
+3268254544,3268254591,EU
3268254592,3268254607,GB
-3268254608,3268265983,EU
+3268254608,3268254623,EU
+3268254624,3268254639,GB
+3268254640,3268254895,EU
+3268254896,3268254903,GB
+3268254904,3268255823,EU
+3268255824,3268255863,GB
+3268255864,3268255871,EU
+3268255872,3268255887,GB
+3268255888,3268255895,EU
+3268255896,3268255919,GB
+3268255920,3268255951,EU
+3268255952,3268255959,GB
+3268255960,3268255967,EU
+3268255968,3268255983,GB
+3268255984,3268256895,EU
+3268256896,3268256959,GB
+3268256960,3268257023,EU
+3268257024,3268257055,GB
+3268257056,3268257087,EU
+3268257088,3268257119,GB
+3268257120,3268257415,EU
+3268257416,3268257419,GB
+3268257420,3268257431,EU
+3268257432,3268257439,IT
+3268257440,3268257463,EU
+3268257464,3268257471,GB
+3268257472,3268257487,EU
+3268257488,3268257527,GB
+3268257528,3268258559,EU
+3268258560,3268258623,GB
+3268258624,3268258687,EU
+3268258688,3268258751,GB
+3268258752,3268259519,EU
+3268259520,3268259527,GB
+3268259528,3268259543,EU
+3268259544,3268259551,GB
+3268259552,3268259559,EU
+3268259560,3268259575,GB
+3268259576,3268259807,EU
+3268259808,3268259815,GB
+3268259816,3268259831,EU
+3268259832,3268260095,GB
+3268260096,3268260351,EU
+3268260352,3268260383,GB
+3268260384,3268260415,EU
+3268260416,3268260447,GB
+3268260448,3268260511,EU
+3268260512,3268260607,GB
+3268260608,3268260639,EU
+3268260640,3268260647,GB
+3268260648,3268260655,EU
+3268260656,3268260671,GB
+3268260672,3268261935,EU
+3268261936,3268261951,GB
+3268261952,3268262767,EU
+3268262768,3268262783,GB
+3268262784,3268262879,EU
+3268262880,3268262887,GB
+3268262888,3268263231,EU
+3268263232,3268263263,GB
+3268263264,3268263775,EU
+3268263776,3268263783,GB
+3268263784,3268264735,EU
+3268264736,3268264767,GB
+3268264768,3268265415,EU
+3268265416,3268265431,GB
+3268265432,3268265983,EU
3268265984,3268266495,GB
-3268266496,3268280319,EU
+3268266496,3268266983,EU
+3268266984,3268266991,GB
+3268266992,3268267535,EU
+3268267536,3268267551,GB
+3268267552,3268267583,EU
+3268267584,3268267599,GB
+3268267600,3268267615,EU
+3268267616,3268267647,GB
+3268267648,3268267743,EU
+3268267744,3268267775,GB
+3268267776,3268267951,EU
+3268267952,3268267959,GB
+3268267960,3268268543,EU
+3268268544,3268268799,GB
+3268268800,3268270351,EU
+3268270352,3268270367,GB
+3268270368,3268270495,EU
+3268270496,3268270511,GB
+3268270512,3268270847,EU
+3268270848,3268271359,GB
+3268271360,3268271911,EU
+3268271912,3268271919,GB
+3268271920,3268271927,EU
+3268271928,3268271935,GB
+3268271936,3268272703,EU
+3268272704,3268272711,GB
+3268272712,3268272727,EU
+3268272728,3268272735,GB
+3268272736,3268273023,EU
+3268273024,3268273151,GB
+3268273152,3268274111,EU
+3268274112,3268274175,GB
+3268274176,3268274455,EU
+3268274456,3268274459,GB
+3268274460,3268274527,EU
+3268274528,3268274543,GB
+3268274544,3268274559,EU
+3268274560,3268274591,GB
+3268274592,3268275983,EU
+3268275984,3268275999,GB
+3268276000,3268276639,EU
+3268276640,3268276655,GB
+3268276656,3268276671,EU
+3268276672,3268276687,GB
+3268276688,3268276863,EU
+3268276864,3268276895,GB
+3268276896,3268277055,EU
+3268277056,3268277119,GB
+3268277120,3268277759,EU
+3268277760,3268278015,GB
+3268278016,3268278463,EU
+3268278464,3268278495,GB
+3268278496,3268280063,EU
+3268280064,3268280319,GB
3268280320,3268345855,FR
3268345856,3268411391,GB
3268411392,3268426751,AT
@@ -57760,7 +57438,7 @@
3268765184,3268765695,RU
3268765696,3268766719,UA
3268766720,3268767231,IL
-3268767232,3268767743,UA
+3268767232,3268767743,RU
3268767744,3268768255,NL
3268768256,3268768767,BE
3268768768,3268769279,RU
@@ -57777,29 +57455,164 @@
3269066752,3269132287,SE
3269132288,3269197823,GR
3269197824,3269263359,RU
-3269263360,3269266943,EU
+3269263360,3269264639,EU
+3269264640,3269264895,DE
+3269264896,3269265855,EU
+3269265856,3269265919,DE
+3269265920,3269266175,GB
+3269266176,3269266687,EU
+3269266688,3269266943,DE
3269266944,3269267455,GB
-3269267456,3269276159,EU
-3269276160,3269276287,GB
-3269276288,3269277183,EU
+3269267456,3269272575,EU
+3269272576,3269272583,DE
+3269272584,3269272703,EU
+3269272704,3269272831,DE
+3269272832,3269272847,GB
+3269272848,3269272863,NL
+3269272864,3269272887,GB
+3269272888,3269272895,EU
+3269272896,3269273087,NL
+3269273088,3269273343,DE
+3269273344,3269273599,EU
+3269273600,3269273855,GB
+3269273856,3269275647,DE
+3269275648,3269275903,EU
+3269275904,3269276159,DE
+3269276160,3269276415,GB
+3269276416,3269277183,EU
3269277184,3269277695,FR
-3269277696,3269278719,NL
-3269278720,3269279743,EU
-3269279744,3269281279,NL
-3269281280,3269282303,EU
+3269277696,3269277759,GB
+3269277760,3269278719,NL
+3269278720,3269279231,EU
+3269279232,3269279487,NL
+3269279488,3269279671,EU
+3269279672,3269279679,CH
+3269279680,3269279743,EU
+3269279744,3269280255,GB
+3269280256,3269280271,DE
+3269280272,3269280767,NL
+3269280768,3269281023,GB
+3269281024,3269281279,DE
+3269281280,3269281535,FR
+3269281536,3269282047,EU
+3269282048,3269282303,DE
3269282304,3269282559,GB
-3269282560,3269291775,EU
+3269282560,3269282815,FR
+3269282816,3269283327,EU
+3269283328,3269283583,DE
+3269283584,3269283871,EU
+3269283872,3269283903,DE
+3269283904,3269284095,EU
+3269284096,3269284351,GB
+3269284352,3269284863,EU
+3269284864,3269285055,FR
+3269285056,3269285087,EU
+3269285088,3269285135,DE
+3269285136,3269285151,GB
+3269285152,3269285215,DE
+3269285216,3269285311,EU
+3269285312,3269285327,DE
+3269285328,3269285335,EU
+3269285336,3269285343,FR
+3269285344,3269285344,GB
+3269285345,3269285345,EU
+3269285346,3269285631,GB
+3269285632,3269285887,DE
+3269285888,3269286399,EU
+3269286400,3269286463,DE
+3269286464,3269288687,EU
+3269288688,3269288959,DE
+3269288960,3269290559,EU
+3269290560,3269290575,DE
+3269290576,3269290591,EU
+3269290592,3269290687,DE
+3269290688,3269290735,EU
+3269290736,3269290743,DE
+3269290744,3269291263,EU
+3269291264,3269291519,DE
+3269291520,3269291575,GB
+3269291576,3269291583,EU
+3269291584,3269291647,GB
+3269291648,3269291775,EU
3269291776,3269292287,ES
-3269292288,3269305855,EU
+3269292288,3269293119,EU
+3269293120,3269293151,DE
+3269293152,3269293207,EU
+3269293208,3269293215,DE
+3269293216,3269293247,EU
+3269293248,3269293279,DE
+3269293280,3269293375,EU
+3269293376,3269293391,DE
+3269293392,3269293855,EU
+3269293856,3269293887,DE
+3269293888,3269293919,EU
+3269293920,3269293951,DE
+3269293952,3269296231,EU
+3269296232,3269296235,DE
+3269296236,3269296367,EU
+3269296368,3269296375,DE
+3269296376,3269297151,EU
+3269297152,3269297663,GB
+3269297664,3269298663,EU
+3269298664,3269298671,DE
+3269298672,3269303039,EU
+3269303040,3269303295,DE
+3269303296,3269303423,GB
+3269303424,3269303551,EU
+3269303552,3269303679,DE
+3269303680,3269305343,EU
+3269305344,3269305351,DE
+3269305352,3269305855,EU
3269305856,3269306879,DE
-3269306880,3269317663,EU
+3269306880,3269307647,EU
+3269307648,3269307903,DE
+3269307904,3269310655,EU
+3269310656,3269310671,DE
+3269310672,3269310975,EU
+3269310976,3269311231,DE
+3269311232,3269311871,EU
+3269311872,3269311999,DE
+3269312000,3269313791,EU
+3269313792,3269314175,DE
+3269314176,3269314191,EU
+3269314192,3269314199,DE
+3269314200,3269315583,EU
+3269315584,3269315591,DE
+3269315592,3269317631,EU
+3269317632,3269317663,GB
3269317664,3269317671,IE
-3269317672,3269319167,EU
-3269319168,3269319679,DE
-3269319680,3269320703,EU
+3269317672,3269317887,GB
+3269317888,3269318399,DE
+3269318400,3269318655,GB
+3269318656,3269318983,DE
+3269318984,3269319007,EU
+3269319008,3269319047,DE
+3269319048,3269319055,EU
+3269319056,3269319071,DE
+3269319072,3269319135,EU
+3269319136,3269320447,DE
+3269320448,3269320703,EU
3269320704,3269321727,GB
-3269321728,3269327871,EU
-3269327872,3269328383,DE
+3269321728,3269322239,EU
+3269322240,3269322495,DE
+3269322496,3269322655,EU
+3269322656,3269322671,DE
+3269322672,3269322751,EU
+3269322752,3269323263,DE
+3269323264,3269326847,EU
+3269326848,3269326855,DE
+3269326856,3269326959,EU
+3269326960,3269326971,DE
+3269326972,3269326991,EU
+3269326992,3269326999,DE
+3269327000,3269327023,EU
+3269327024,3269327039,DE
+3269327040,3269327055,EU
+3269327056,3269327103,DE
+3269327104,3269327759,EU
+3269327760,3269327767,DE
+3269327768,3269327863,EU
+3269327864,3269328383,DE
3269328384,3269328895,EU
3269328896,3269459967,GB
3269459968,3269525503,ES
@@ -57814,36 +57627,17 @@
3269918720,3269984255,DE
3269984256,3270049791,AT
3270049792,3270115327,DE
-3270115328,3270125055,EU
-3270125056,3270125567,DK
-3270125568,3270143999,EU
-3270144000,3270144511,NO
-3270144512,3270148351,EU
+3270115328,3270148351,EU
3270148352,3270149887,FI
3270149888,3270150655,EU
3270150656,3270151423,FI
3270151424,3270152703,EU
3270152704,3270153727,FI
-3270153728,3270155007,EU
-3270155008,3270155519,FI
-3270155520,3270156287,EU
-3270156288,3270156799,DK
-3270156800,3270166527,EU
+3270153728,3270166527,EU
3270166528,3270167551,NO
-3270167552,3270170111,EU
-3270170112,3270170623,NO
-3270170624,3270182911,EU
-3270182912,3270183423,CH
-3270183424,3270190079,EU
-3270190080,3270190591,IT
-3270190592,3270190911,CH
-3270190912,3270230271,EU
-3270230272,3270230783,LU
-3270230784,3270235135,EU
+3270167552,3270235135,EU
3270235136,3270236159,NL
-3270236160,3270238207,EU
-3270238208,3270238719,NL
-3270238720,3270246399,EU
+3270236160,3270246399,EU
3270246400,3270348287,SE
3270348288,3270348543,EU
3270348544,3270377471,SE
@@ -57994,69 +57788,29 @@
3271163904,3271224319,FR
3271224320,3271224575,MQ
3271224576,3271229439,FR
-3271229440,3271301631,FI
-3271301632,3271302143,AX
-3271302144,3271360511,FI
-3271360512,3271361023,GB
-3271361024,3271361535,EU
-3271361536,3271362559,GB
-3271362560,3271364607,EU
-3271364608,3271365631,GB
-3271365632,3271367679,EU
-3271367680,3271368191,GB
-3271368192,3271368703,EU
-3271368704,3271369727,GB
-3271369728,3271370239,EU
-3271370240,3271370751,GB
-3271370752,3271374335,EU
-3271374336,3271374847,DE
-3271374848,3271375359,EU
-3271375360,3271375871,CH
-3271375872,3271376895,EU
-3271376896,3271377407,ES
-3271377408,3271377919,NL
-3271377920,3271378431,BE
-3271378432,3271378943,EU
+3271229440,3271360511,FI
+3271360512,3271378943,EU
3271378944,3271380991,GB
-3271380992,3271382015,EU
-3271382016,3271382527,IT
-3271382528,3271383039,IL
-3271383040,3271385599,EU
-3271385600,3271386111,DE
-3271386112,3271389183,EU
+3271380992,3271389183,EU
3271389184,3271391231,DE
-3271391232,3271391743,NL
-3271391744,3271392767,EU
-3271392768,3271393279,FR
-3271393280,3271393791,AT
-3271393792,3271395327,EU
+3271391232,3271395327,EU
3271395328,3271396351,IT
-3271396352,3271398399,EU
-3271398400,3271398911,DE
-3271398912,3271399423,EU
-3271399424,3271399935,BE
-3271399936,3271401983,EU
-3271401984,3271402495,DK
-3271402496,3271407103,EU
-3271407104,3271407615,AT
-3271407616,3271409663,EU
+3271396352,3271409663,EU
3271409664,3271417855,BE
-3271417856,3271418367,EU
-3271418368,3271418879,FR
-3271418880,3271419391,EU
-3271419392,3271422463,FR
-3271422464,3271423487,EU
-3271423488,3271423999,FR
-3271424000,3271425535,EU
-3271425536,3271426047,DE
+3271417856,3271419903,EU
+3271419904,3271421951,FR
+3271421952,3271426047,EU
3271426048,3271491583,FR
3271491584,3271513343,DK
3271513344,3271513599,EU
3271513600,3271557119,DK
3271557120,3271589887,BE
3271589888,3271688191,NO
-3271688192,3271694847,EU
-3271694848,3271695103,GB
+3271688192,3271691775,EU
+3271691776,3271692031,US
+3271692032,3271692287,GB
+3271692288,3271694591,EU
+3271694592,3271695103,GB
3271695104,3271696383,EU
3271696384,3271698431,GB
3271698432,3271704575,EU
@@ -58137,7 +57891,7 @@
3271913984,3271914495,RO
3271914496,3271915007,ES
3271915008,3271915519,SE
-3271915520,3271916031,NL
+3271915520,3271916031,DE
3271916032,3271916543,GB
3271916544,3271917311,UA
3271917312,3271925759,RU
@@ -58184,13 +57938,9 @@
3272065024,3272073727,GB
3272073728,3272073855,IE
3272073856,3272081407,GB
-3272081408,3272081919,PT
-3272081920,3272082431,CV
-3272082432,3272084025,PT
+3272081408,3272084025,PT
3272084026,3272084026,AO
-3272084027,3272086015,PT
-3272086016,3272086527,ST
-3272086528,3272087551,PT
+3272084027,3272087551,PT
3272087552,3272088575,MR
3272088576,3272089599,PT
3272089600,3272090111,NO
@@ -58247,32 +57997,162 @@
3272138240,3272138751,BG
3272138752,3272146943,DE
3272146944,3272212479,RU
-3272212480,3272213503,ES
-3272213504,3272214271,EU
+3272212480,3272212991,GB
+3272212992,3272213375,ES
+3272213376,3272213391,IT
+3272213392,3272213399,GB
+3272213400,3272213407,ES
+3272213408,3272213415,NL
+3272213416,3272213423,ES
+3272213424,3272213431,NL
+3272213432,3272213439,GB
+3272213440,3272213471,ES
+3272213472,3272213487,CY
+3272213488,3272213495,GB
+3272213496,3272213503,ES
+3272213504,3272213567,IT
+3272213568,3272213575,GB
+3272213576,3272213583,IE
+3272213584,3272213599,DE
+3272213600,3272213631,EU
+3272213632,3272213639,NL
+3272213640,3272213655,EU
+3272213656,3272213663,IT
+3272213664,3272213671,EU
+3272213672,3272213679,IT
+3272213680,3272213695,EU
+3272213696,3272213735,IT
+3272213736,3272213751,EU
+3272213752,3272213759,IT
+3272213760,3272214015,NL
+3272214016,3272214271,ES
3272214272,3272214527,GB
3272214528,3272215039,FR
-3272215040,3272217087,EU
+3272215040,3272215295,ES
+3272215296,3272215551,NL
+3272215552,3272215807,CH
+3272215808,3272215823,NL
+3272215824,3272215871,EU
+3272215872,3272215879,BE
+3272215880,3272215883,EU
+3272215884,3272215919,CH
+3272215920,3272215935,NL
+3272215936,3272215999,GB
+3272216000,3272216015,EU
+3272216016,3272216031,DE
+3272216032,3272216039,EU
+3272216040,3272216047,GB
+3272216048,3272216191,EU
+3272216192,3272216207,BE
+3272216208,3272216215,EU
+3272216216,3272216223,FR
+3272216224,3272216231,DE
+3272216232,3272216239,EU
+3272216240,3272216255,NL
+3272216256,3272216287,CH
+3272216288,3272216303,EU
+3272216304,3272216311,ES
+3272216312,3272216319,EU
+3272216320,3272216351,NL
+3272216352,3272216383,DE
+3272216384,3272216447,CH
+3272216448,3272216451,EU
+3272216452,3272216455,NL
+3272216456,3272216463,EU
+3272216464,3272216479,FR
+3272216480,3272216495,IR
+3272216496,3272216511,EU
+3272216512,3272216575,IT
+3272216576,3272216895,GB
+3272216896,3272216911,FR
+3272216912,3272216927,DE
+3272216928,3272216959,EU
+3272216960,3272217007,GB
+3272217008,3272217087,EU
3272217088,3272217151,GB
-3272217152,3272217855,EU
+3272217152,3272217215,EU
+3272217216,3272217279,BE
+3272217280,3272217303,DE
+3272217304,3272217311,BE
+3272217312,3272217343,EU
+3272217344,3272217599,GB
+3272217600,3272217631,CH
+3272217632,3272217855,EU
3272217856,3272217875,ES
-3272217876,3272218111,EU
+3272217876,3272217879,EU
+3272217880,3272217895,IT
+3272217896,3272217911,ES
+3272217912,3272217919,EU
+3272217920,3272217983,DE
+3272217984,3272218079,ES
+3272218080,3272218111,EU
3272218112,3272218623,GB
-3272218624,3272219663,EU
-3272219664,3272219679,FR
-3272219680,3272222207,EU
-3272222208,3272222271,ES
-3272222272,3272223999,EU
+3272218624,3272218639,RU
+3272218640,3272218671,DE
+3272218672,3272218687,EU
+3272218688,3272218719,DE
+3272218720,3272218879,EU
+3272218880,3272219135,BE
+3272219136,3272219391,NL
+3272219392,3272219647,GB
+3272219648,3272219903,FR
+3272219904,3272220159,DE
+3272220160,3272220415,FR
+3272220416,3272221183,GB
+3272221184,3272221439,NL
+3272221440,3272221447,SE
+3272221448,3272221455,NO
+3272221456,3272221463,SE
+3272221464,3272221695,EU
+3272221696,3272221951,NL
+3272221952,3272222207,GB
+3272222208,3272222463,ES
+3272222464,3272222719,NL
+3272222720,3272222975,EU
+3272222976,3272223015,GB
+3272223016,3272223023,EU
+3272223024,3272223039,GB
+3272223040,3272223231,EU
+3272223232,3272223487,NL
+3272223488,3272223503,SG
+3272223504,3272223743,EU
+3272223744,3272223775,GI
+3272223776,3272223807,EU
+3272223808,3272223815,CY
+3272223816,3272223823,EU
+3272223824,3272223839,GB
+3272223840,3272223999,EU
3272224000,3272224255,GB
-3272224256,3272225279,EU
-3272225280,3272225791,IT
-3272225792,3272227839,EU
-3272227840,3272228351,ES
-3272228352,3272228863,NL
+3272224256,3272224383,GI
+3272224384,3272224511,EU
+3272224512,3272225279,GB
+3272225280,3272225535,IT
+3272225536,3272225791,GB
+3272225792,3272225855,EU
+3272225856,3272225919,GB
+3272225920,3272226047,EU
+3272226048,3272226815,FR
+3272226816,3272227071,GB
+3272227072,3272227327,FR
+3272227328,3272227359,US
+3272227360,3272227511,GB
+3272227512,3272227519,EU
+3272227520,3272227583,GB
+3272227584,3272227839,FR
+3272227840,3272228095,ES
+3272228096,3272228223,GB
+3272228224,3272228351,ES
+3272228352,3272228607,FR
+3272228608,3272228623,NL
+3272228624,3272228631,CY
+3272228632,3272228639,NL
+3272228640,3272228671,IT
+3272228672,3272228703,DE
+3272228704,3272228735,FR
+3272228736,3272228799,NL
+3272228800,3272228863,CH
3272228864,3272237055,LU
-3272237056,3272238079,IM
-3272238080,3272238591,GB
-3272238592,3272244223,IM
-3272244224,3272245247,GB
+3272237056,3272245247,IM
3272245248,3272261631,FI
3272261632,3272261887,MT
3272261888,3272262143,BG
@@ -58320,8 +58200,8 @@
3272392704,3272400895,AT
3272400896,3272402559,EU
3272402560,3272402623,GB
-3272402624,3272403455,EU
-3272403456,3272404991,FR
+3272402624,3272403967,EU
+3272403968,3272404991,FR
3272404992,3272406015,DE
3272406016,3272407039,NL
3272407040,3272409087,EU
@@ -58404,16 +58284,10 @@
3272628224,3272629247,UA
3272629248,3272638463,RU
3272638464,3272646655,ES
-3272646656,3272652287,GB
-3272652288,3272652799,FR
-3272652800,3272654847,GB
+3272646656,3272654847,GB
3272654848,3272663039,FI
3272663040,3272671231,AT
-3272671232,3272706559,SE
-3272706560,3272707071,IE
-3272707072,3272713471,SE
-3272713472,3272713983,GB
-3272713984,3272736767,SE
+3272671232,3272736767,SE
3272736768,3272737791,IT
3272737792,3272738815,GB
3272738816,3272739839,IL
@@ -58478,11 +58352,7 @@
3272908032,3272908287,CH
3272908288,3272908543,AT
3272908544,3272908799,DE
-3272908800,3272909823,SK
-3272909824,3272910335,NO
-3272910336,3272911871,SK
-3272911872,3272912383,CZ
-3272912384,3272916991,SK
+3272908800,3272916991,SK
3272916992,3272917503,MC
3272917504,3272918527,RU
3272918528,3272919039,FR
@@ -58586,41 +58456,220 @@
3273302016,3273310207,RU
3273310208,3273318399,AT
3273318400,3273326591,GB
-3273326592,3273327359,EU
+3273326592,3273326847,IE
+3273326848,3273326983,EU
+3273326984,3273326987,DE
+3273326988,3273326991,EU
+3273326992,3273327047,DE
+3273327048,3273327263,EU
+3273327264,3273327287,DE
+3273327288,3273327359,EU
3273327360,3273327615,IE
-3273327616,3273329663,EU
-3273329664,3273329919,GB
-3273329920,3273330431,EU
-3273330432,3273330687,GB
-3273330688,3273330943,EU
-3273330944,3273331199,GB
-3273331200,3273334271,EU
+3273327616,3273328511,EU
+3273328512,3273328639,DE
+3273328640,3273329191,GB
+3273329192,3273329199,EU
+3273329200,3273329215,DE
+3273329216,3273329279,GB
+3273329280,3273329311,EU
+3273329312,3273329327,GB
+3273329328,3273329407,EU
+3273329408,3273329423,GB
+3273329424,3273329439,DE
+3273329440,3273330175,GB
+3273330176,3273330183,IR
+3273330184,3273330191,IE
+3273330192,3273330199,GB
+3273330200,3273330223,IE
+3273330224,3273330271,GB
+3273330272,3273330431,IE
+3273330432,3273331199,GB
+3273331200,3273331711,EU
+3273331712,3273331791,GB
+3273331792,3273331807,EU
+3273331808,3273331967,GB
+3273331968,3273332031,DE
+3273332032,3273332095,GB
+3273332096,3273332223,DE
+3273332224,3273332479,GB
+3273332480,3273332543,EU
+3273332544,3273332575,DE
+3273332576,3273332607,EU
+3273332608,3273332671,DE
+3273332672,3273333055,EU
+3273333056,3273333119,DE
+3273333120,3273334271,EU
3273334272,3273334783,DE
-3273334784,3273335295,EU
+3273334784,3273335039,EU
+3273335040,3273335295,DE
3273335296,3273335807,GB
-3273335808,3273336881,EU
-3273336882,3273336882,DE
-3273336883,3273339391,EU
-3273339392,3273339903,DE
+3273335808,3273335935,EU
+3273335936,3273335999,DE
+3273336000,3273336847,EU
+3273336848,3273336863,DE
+3273336864,3273336871,GB
+3273336872,3273336895,DE
+3273336896,3273336959,EU
+3273336960,3273337087,DE
+3273337088,3273337855,EU
+3273337856,3273338111,DE
+3273338112,3273338623,EU
+3273338624,3273338879,DE
+3273338880,3273339135,EU
+3273339136,3273339903,DE
3273339904,3273340415,GB
3273340416,3273340927,EU
-3273340928,3273341439,FR
-3273341440,3273342975,EU
+3273340928,3273341695,FR
+3273341696,3273341951,DE
+3273341952,3273342207,GB
+3273342208,3273342463,EU
+3273342464,3273342975,DE
3273342976,3273343999,GB
3273344000,3273344767,DE
-3273344768,3273366015,EU
+3273344768,3273345023,EU
+3273345024,3273345279,DE
+3273345280,3273346815,EU
+3273346816,3273347071,DE
+3273347072,3273347839,EU
+3273347840,3273348351,DE
+3273348352,3273349119,EU
+3273349120,3273349631,DE
+3273349632,3273350271,EU
+3273350272,3273350287,DE
+3273350288,3273350335,EU
+3273350336,3273350351,DE
+3273350352,3273351423,EU
+3273351424,3273351455,DE
+3273351456,3273351503,EU
+3273351504,3273351519,DE
+3273351520,3273351871,EU
+3273351872,3273351903,DE
+3273351904,3273351935,EU
+3273351936,3273352191,DE
+3273352192,3273352927,EU
+3273352928,3273352959,DE
+3273352960,3273352991,EU
+3273352992,3273353023,DE
+3273353024,3273355519,EU
+3273355520,3273356287,DE
+3273356288,3273359887,EU
+3273359888,3273359903,DE
+3273359904,3273360015,EU
+3273360016,3273360079,DE
+3273360080,3273361471,EU
+3273361472,3273361535,DE
+3273361536,3273361631,EU
+3273361632,3273361663,DE
+3273361664,3273361791,EU
+3273361792,3273361823,DE
+3273361824,3273361855,EU
+3273361856,3273361919,DE
+3273361920,3273362047,EU
+3273362048,3273362175,DE
+3273362176,3273362239,EU
+3273362240,3273362255,DE
+3273362256,3273363207,EU
+3273363208,3273363211,DE
+3273363212,3273363327,EU
+3273363328,3273363391,DE
+3273363392,3273364607,EU
+3273364608,3273364735,DE
+3273364736,3273364991,EU
+3273364992,3273365247,DE
+3273365248,3273365503,EU
+3273365504,3273365519,NL
+3273365520,3273365543,GB
+3273365544,3273365759,NL
+3273365760,3273365767,GB
+3273365768,3273365887,EU
+3273365888,3273366015,FR
3273366016,3273366527,DE
-3273366528,3273368063,EU
+3273366528,3273367295,EU
+3273367296,3273367423,DE
+3273367424,3273367551,EU
+3273367552,3273367567,DE
+3273367568,3273368063,EU
3273368064,3273368575,DE
-3273368576,3273372671,EU
-3273372672,3273373695,DE
-3273373696,3273375743,EU
+3273368576,3273369343,EU
+3273369344,3273369855,DE
+3273369856,3273370623,EU
+3273370624,3273371135,DE
+3273371136,3273371711,EU
+3273371712,3273371743,DE
+3273371744,3273371759,EU
+3273371760,3273371775,DE
+3273371776,3273371807,EU
+3273371808,3273371823,DE
+3273371824,3273371871,EU
+3273371872,3273371875,DE
+3273371876,3273371999,EU
+3273372000,3273372055,DE
+3273372056,3273372671,EU
+3273372672,3273372927,GB
+3273372928,3273373183,NL
+3273373184,3273373455,GB
+3273373456,3273373567,DE
+3273373568,3273373695,GB
+3273373696,3273375231,EU
+3273375232,3273375551,DE
+3273375552,3273375743,EU
3273375744,3273375871,DE
-3273375872,3273382143,EU
+3273375872,3273375999,EU
+3273376000,3273376255,DE
+3273376256,3273376535,EU
+3273376536,3273376543,DE
+3273376544,3273377791,EU
+3273377792,3273378095,DE
+3273378096,3273378559,EU
+3273378560,3273378815,DE
+3273378816,3273381887,EU
+3273381888,3273382143,DE
3273382144,3273382399,GB
-3273382400,3273390111,EU
-3273390112,3273390143,DE
-3273390144,3273392127,EU
+3273382400,3273382463,DE
+3273382464,3273382479,EU
+3273382480,3273382591,DE
+3273382592,3273382639,EU
+3273382640,3273382687,DE
+3273382688,3273384191,EU
+3273384192,3273384703,DE
+3273384704,3273384959,EU
+3273384960,3273385215,DE
+3273385216,3273385279,EU
+3273385280,3273385343,DE
+3273385344,3273385471,EU
+3273385472,3273385727,DE
+3273385728,3273385759,EU
+3273385760,3273385791,DE
+3273385792,3273385855,EU
+3273385856,3273385919,DE
+3273385920,3273387055,EU
+3273387056,3273387071,DE
+3273387072,3273387215,EU
+3273387216,3273387231,DE
+3273387232,3273387263,EU
+3273387264,3273387519,DE
+3273387520,3273387551,EU
+3273387552,3273387583,DE
+3273387584,3273388159,EU
+3273388160,3273388223,DE
+3273388224,3273388543,EU
+3273388544,3273388807,DE
+3273388808,3273388815,EU
+3273388816,3273388863,DE
+3273388864,3273388871,EU
+3273388872,3273388879,DE
+3273388880,3273388903,EU
+3273388904,3273388911,DE
+3273388912,3273388927,GB
+3273388928,3273389055,DE
+3273389056,3273390079,EU
+3273390080,3273390207,DE
+3273390208,3273390335,EU
+3273390336,3273390463,DE
+3273390464,3273391103,EU
+3273391104,3273391359,DE
+3273391360,3273391871,EU
+3273391872,3273392127,DE
3273392128,3273392639,PL
3273392640,3273393663,RO
3273393664,3273394175,BG
@@ -58665,9 +58714,7 @@
3273687040,3273719807,DE
3273719808,3273720831,NL
3273720832,3273720847,IE
-3273720848,3273721855,NL
-3273721856,3273722367,GB
-3273722368,3273726719,NL
+3273720848,3273726719,NL
3273726720,3273726975,GB
3273726976,3273727087,NL
3273727088,3273727088,GB
@@ -58799,7 +58846,7 @@
3274164224,3274164735,AT
3274165248,3274165759,GB
3274165760,3274166271,RU
-3274166272,3274166783,RO
+3274166272,3274166783,AT
3274166784,3274167295,UA
3274167296,3274167807,BG
3274168320,3274168831,PL
@@ -58822,9 +58869,7 @@
3274177536,3274178047,UA
3274178048,3274178559,NL
3274178560,3274244095,GB
-3274244096,3274255106,DK
-3274255107,3274255107,EU
-3274255108,3274309631,DK
+3274244096,3274309631,DK
3274309632,3274326015,FR
3274326016,3274334719,RU
3274334720,3274335231,PL
@@ -58922,47 +58967,159 @@
3274424320,3274435711,SE
3274435712,3274435839,US
3274435840,3274440703,SE
-3274440704,3274446847,EU
-3274446848,3274447743,GB
-3274447744,3274450175,EU
-3274450176,3274450431,GB
-3274450432,3274450591,EU
-3274450592,3274450623,GB
-3274450624,3274451199,EU
-3274451200,3274451711,GB
-3274451712,3274452991,EU
-3274452992,3274453503,GB
-3274453504,3274455343,EU
+3274440704,3274442751,EU
+3274442752,3274443263,GB
+3274443264,3274443519,EU
+3274443520,3274443647,GB
+3274443648,3274443711,EU
+3274443712,3274443775,GB
+3274443776,3274443807,EU
+3274443808,3274444031,GB
+3274444032,3274446335,EU
+3274446336,3274447871,GB
+3274447872,3274448383,EU
+3274448384,3274448639,GB
+3274448640,3274448895,EU
+3274448896,3274449663,GB
+3274449664,3274449919,EU
+3274449920,3274450623,GB
+3274450624,3274450655,EU
+3274450656,3274450687,GB
+3274450688,3274451199,EU
+3274451200,3274452255,GB
+3274452256,3274452263,EU
+3274452264,3274452311,GB
+3274452312,3274452319,EU
+3274452320,3274452335,GB
+3274452336,3274452343,EU
+3274452344,3274452367,GB
+3274452368,3274452383,EU
+3274452384,3274452391,GB
+3274452392,3274452399,EU
+3274452400,3274452423,GB
+3274452424,3274452431,EU
+3274452432,3274452439,GB
+3274452440,3274452447,EU
+3274452448,3274452455,GB
+3274452456,3274452463,EU
+3274452464,3274452471,GB
+3274452472,3274452495,EU
+3274452496,3274452543,GB
+3274452544,3274452559,EU
+3274452560,3274452575,GB
+3274452576,3274452655,EU
+3274452656,3274452703,GB
+3274452704,3274452735,EU
+3274452736,3274452927,GB
+3274452928,3274452991,EU
+3274452992,3274453767,GB
+3274453768,3274453783,EU
+3274453784,3274453791,GB
+3274453792,3274453799,EU
+3274453800,3274453847,GB
+3274453848,3274453863,EU
+3274453864,3274453871,GB
+3274453872,3274453887,EU
+3274453888,3274453903,GB
+3274453904,3274453919,EU
+3274453920,3274453935,GB
+3274453936,3274453943,EU
+3274453944,3274453951,GB
+3274453952,3274453959,EU
+3274453960,3274453975,GB
+3274453976,3274453983,EU
+3274453984,3274453991,GB
+3274453992,3274453999,EU
+3274454000,3274454271,GB
+3274454272,3274454655,EU
+3274454656,3274455311,GB
+3274455312,3274455327,EU
+3274455328,3274455335,GB
+3274455336,3274455343,EU
3274455344,3274455351,GB
-3274455352,3274457087,EU
-3274457088,3274458111,GB
-3274458112,3274459391,EU
-3274459392,3274459903,GB
-3274459904,3274460671,EU
-3274460672,3274461183,GB
-3274461184,3274461695,EU
-3274461696,3274462207,GB
+3274455352,3274455359,EU
+3274455360,3274455375,GB
+3274455376,3274455383,EU
+3274455384,3274455391,GB
+3274455392,3274455399,EU
+3274455400,3274455423,GB
+3274455424,3274455431,EU
+3274455432,3274455439,GB
+3274455440,3274455447,EU
+3274455448,3274455503,GB
+3274455504,3274455519,EU
+3274455520,3274455535,GB
+3274455536,3274455743,EU
+3274455744,3274455807,GB
+3274455808,3274455871,EU
+3274455872,3274455935,GB
+3274455936,3274455967,EU
+3274455968,3274456359,GB
+3274456360,3274456367,EU
+3274456368,3274456375,GB
+3274456376,3274456383,EU
+3274456384,3274456391,GB
+3274456392,3274456399,EU
+3274456400,3274456407,GB
+3274456408,3274456415,EU
+3274456416,3274456447,GB
+3274456448,3274456455,EU
+3274456456,3274456511,GB
+3274456512,3274456527,EU
+3274456528,3274456535,GB
+3274456536,3274456543,EU
+3274456544,3274456559,GB
+3274456560,3274456567,EU
+3274456568,3274460223,GB
+3274460224,3274460415,EU
+3274460416,3274462207,GB
3274462208,3274462463,EU
-3274462464,3274462975,GB
-3274462976,3274463487,EU
-3274463488,3274464767,GB
-3274464768,3274465279,EU
-3274465280,3274465791,GB
-3274465792,3274467327,EU
-3274467328,3274467839,GB
-3274467840,3274468095,EU
-3274468096,3274468863,GB
-3274468864,3274473471,EU
-3274473472,3274481407,GB
-3274481408,3274490879,EU
-3274490880,3274491135,GB
-3274491136,3274491279,EU
-3274491280,3274491287,GB
-3274491288,3274491391,EU
-3274491392,3274491647,GB
-3274491648,3274491903,EU
-3274491904,3274504447,GB
-3274504448,3274506239,EU
+3274462464,3274465023,GB
+3274465024,3274465151,EU
+3274465152,3274466351,GB
+3274466352,3274466367,EU
+3274466368,3274466399,GB
+3274466400,3274466415,EU
+3274466416,3274466463,GB
+3274466464,3274466559,EU
+3274466560,3274466735,GB
+3274466736,3274466743,EU
+3274466744,3274466763,GB
+3274466764,3274466767,EU
+3274466768,3274466783,GB
+3274466784,3274466815,EU
+3274466816,3274467099,GB
+3274467100,3274467103,EU
+3274467104,3274467307,GB
+3274467308,3274467327,EU
+3274467328,3274470383,GB
+3274470384,3274470399,EU
+3274470400,3274470535,GB
+3274470536,3274470655,EU
+3274470656,3274471423,GB
+3274471424,3274471535,EU
+3274471536,3274471615,GB
+3274471616,3274471679,EU
+3274471680,3274471935,GB
+3274471936,3274472959,EU
+3274472960,3274483711,GB
+3274483712,3274489599,EU
+3274489600,3274489855,GB
+3274489856,3274490175,EU
+3274490176,3274491247,GB
+3274491248,3274491255,EU
+3274491256,3274491295,GB
+3274491296,3274491303,EU
+3274491304,3274491319,GB
+3274491320,3274491327,EU
+3274491328,3274491383,GB
+3274491384,3274491391,EU
+3274491392,3274504447,GB
+3274504448,3274505727,EU
+3274505728,3274505791,GB
+3274505792,3274505792,EU
+3274505793,3274505855,GB
+3274505856,3274506239,EU
3274506240,3274571775,IT
3274571776,3274579967,GR
3274579968,3274580991,UA
@@ -59078,50 +59235,27 @@
3274850304,3274866687,GB
3274866688,3274883071,DE
3274883072,3274899455,EE
-3274899456,3274900991,EU
-3274900992,3274901503,DE
-3274901504,3274903039,EU
-3274903040,3274909183,DE
-3274909184,3274910207,EU
-3274910208,3274910719,DE
-3274910720,3274913279,EU
-3274913280,3274914815,DE
-3274914816,3274917375,EU
-3274917376,3274917887,NL
-3274917888,3274918399,BE
-3274918400,3274920959,EU
+3274899456,3274903551,EU
+3274903552,3274908671,DE
+3274908672,3274913791,EU
+3274913792,3274914815,DE
+3274914816,3274920959,EU
3274920960,3274921983,BE
3274921984,3274923263,EU
3274923264,3274924031,NL
-3274924032,3274924543,EU
-3274924544,3274925055,FR
-3274925056,3274926079,EU
+3274924032,3274926079,EU
3274926080,3274928127,FR
-3274928128,3274929663,EU
-3274929664,3274930175,BE
-3274930176,3274930687,IT
-3274930688,3274933247,EU
-3274933248,3274933759,GB
-3274933760,3274935295,EU
-3274935296,3274935807,GB
-3274935808,3274939391,EU
+3274928128,3274939391,EU
3274939392,3274940415,ZA
3274940416,3274941439,EU
3274941440,3274942463,DE
3274942464,3274943487,FR
-3274943488,3274943999,EU
-3274944000,3274944511,FR
+3274943488,3274944511,EU
3274944512,3274948607,NL
3274948608,3274951679,DK
3274951680,3274952703,EU
3274952704,3274953727,AT
-3274953728,3274955263,EU
-3274955264,3274955775,SE
-3274955776,3274958335,EU
-3274958336,3274958847,AT
-3274958848,3274960895,EU
-3274960896,3274961407,AT
-3274961408,3274964991,EU
+3274953728,3274964991,EU
3274964992,3275030527,DE
3275030528,3275096063,ES
3275096064,3275104767,RU
@@ -59173,85 +59307,109 @@
3275399168,3275407359,AT
3275407360,3275415551,GB
3275415552,3275423743,UA
-3275423744,3275423999,EU
-3275424000,3275424511,GB
-3275424512,3275424767,EU
-3275424768,3275425279,GB
-3275425280,3275425791,EU
-3275425792,3275426303,GB
-3275426304,3275426815,EU
-3275426816,3275427327,GB
-3275427328,3275427583,EU
-3275427584,3275428351,GB
-3275428352,3275429887,EU
+3275423744,3275423751,GB
+3275423752,3275423775,EU
+3275423776,3275423839,GB
+3275423840,3275423871,EU
+3275423872,3275424743,GB
+3275424744,3275424751,EU
+3275424752,3275425343,GB
+3275425344,3275425535,EU
+3275425536,3275425559,GB
+3275425560,3275425791,EU
+3275425792,3275428407,GB
+3275428408,3275428415,EU
+3275428416,3275428447,GB
+3275428448,3275429887,EU
3275429888,3275430143,GB
-3275430144,3275431935,EU
-3275431936,3275432447,GB
-3275432448,3275432703,EU
-3275432704,3275432959,GB
+3275430144,3275430271,EU
+3275430272,3275430399,GB
+3275430400,3275430591,EU
+3275430592,3275430631,GB
+3275430632,3275430655,EU
+3275430656,3275430911,GB
+3275430912,3275431935,EU
+3275431936,3275432959,GB
3275432960,3275433983,EU
-3275433984,3275434495,GB
-3275434496,3275434751,EU
-3275434752,3275435007,GB
-3275435008,3275435263,EU
-3275435264,3275435519,GB
+3275433984,3275435519,GB
3275435520,3275435775,EU
3275435776,3275436543,GB
-3275436544,3275437055,EU
-3275437056,3275437567,GB
-3275437568,3275438079,EU
-3275438080,3275438591,GB
-3275438592,3275438719,EU
-3275438720,3275438847,GB
-3275438848,3275439687,EU
-3275439688,3275439775,GB
-3275439776,3275440127,EU
-3275440128,3275440639,GB
-3275440640,3275442175,EU
-3275442176,3275442687,GB
-3275442688,3275443199,EU
-3275443200,3275443215,GB
-3275443216,3275444223,EU
+3275436544,3275436799,EU
+3275436800,3275438847,GB
+3275438848,3275439103,EU
+3275439104,3275441407,GB
+3275441408,3275441423,EU
+3275441424,3275441439,GB
+3275441440,3275441471,EU
+3275441472,3275441535,GB
+3275441536,3275441599,EU
+3275441600,3275441823,GB
+3275441824,3275441919,EU
+3275441920,3275442047,GB
+3275442048,3275442175,EU
+3275442176,3275442723,GB
+3275442724,3275443199,EU
+3275443200,3275443227,GB
+3275443228,3275443231,EU
+3275443232,3275443239,GB
+3275443240,3275443255,EU
+3275443256,3275443311,GB
+3275443312,3275443327,EU
+3275443328,3275443391,GB
+3275443392,3275443423,EU
+3275443424,3275443439,GB
+3275443440,3275443447,EU
+3275443448,3275443727,GB
+3275443728,3275443759,EU
+3275443760,3275443775,GB
+3275443776,3275444223,EU
3275444224,3275444735,GB
3275444736,3275446271,EU
3275446272,3275447039,GB
-3275447040,3275448319,EU
-3275448320,3275448831,GB
-3275448832,3275449343,EU
-3275449344,3275450111,GB
-3275450112,3275450367,EU
-3275450368,3275450879,GB
-3275450880,3275452415,EU
-3275452416,3275453439,GB
-3275453440,3275453695,EU
-3275453696,3275454975,GB
-3275454976,3275455487,EU
-3275455488,3275455999,GB
-3275456000,3275456447,EU
-3275456448,3275457023,GB
-3275457024,3275457535,FK
-3275457536,3275458559,GB
-3275458560,3275459071,IE
-3275459072,3275460351,EU
+3275447040,3275447055,EU
+3275447056,3275447151,GB
+3275447152,3275448319,EU
+3275448320,3275450207,GB
+3275450208,3275450223,EU
+3275450224,3275450879,GB
+3275450880,3275451231,EU
+3275451232,3275451263,GB
+3275451264,3275451391,EU
+3275451392,3275451663,GB
+3275451664,3275451679,EU
+3275451680,3275451711,GB
+3275451712,3275452415,EU
+3275452416,3275457023,GB
+3275457024,3275457791,FK
+3275457792,3275458559,GB
+3275458560,3275460095,IE
+3275460096,3275460223,GB
+3275460224,3275460239,IE
+3275460240,3275460351,EU
3275460352,3275460607,IE
-3275460608,3275468740,GB
-3275468741,3275468741,IE
-3275468742,3275472895,GB
-3275472896,3275473151,EU
-3275473152,3275473407,GB
-3275473408,3275473663,EU
-3275473664,3275474175,GB
-3275474176,3275474431,EU
-3275474432,3275474943,GB
-3275474944,3275474951,EU
-3275474952,3275474959,GB
-3275474960,3275475199,EU
-3275475200,3275475455,GB
-3275475456,3275476991,EU
-3275476992,3275477503,GB
-3275477504,3275479039,EU
-3275479040,3275480319,GB
-3275480320,3275489279,EU
+3275460608,3275460863,HK
+3275460864,3275468655,GB
+3275468656,3275468671,IE
+3275468672,3275468735,GB
+3275468736,3275468751,IE
+3275468752,3275468767,GB
+3275468768,3275468799,IE
+3275468800,3275475875,GB
+3275475876,3275475967,EU
+3275475968,3275476223,GB
+3275476224,3275476991,EU
+3275476992,3275477567,GB
+3275477568,3275477759,EU
+3275477760,3275478271,GB
+3275478272,3275478527,EU
+3275478528,3275481087,GB
+3275481088,3275483135,EU
+3275483136,3275483647,GB
+3275483648,3275485183,EU
+3275485184,3275485215,GB
+3275485216,3275485247,EU
+3275485248,3275485375,GB
+3275485376,3275489279,EU
3275489280,3275497471,GB
3275497472,3275505663,DE
3275505664,3275506175,PL
@@ -59704,42 +59862,26 @@
3276451584,3276455935,EU
3276455936,3276464127,BE
3276464128,3276472319,GR
-3276472320,3276473343,EU
-3276473344,3276473855,AT
-3276473856,3276477439,EU
-3276477440,3276477951,CH
-3276477952,3276479999,EU
+3276472320,3276479999,EU
3276480000,3276480511,FR
-3276480512,3276481023,EU
-3276481024,3276481535,RU
-3276481536,3276485631,EU
+3276480512,3276485631,EU
3276485632,3276486655,GB
3276486656,3276493567,EU
3276493568,3276493823,GB
3276493824,3276494335,EU
3276494336,3276494591,GB
-3276494592,3276498431,EU
-3276498432,3276498943,DE
-3276498944,3276502527,EU
-3276502528,3276505087,DE
-3276505088,3276506623,EU
-3276506624,3276507135,ZA
-3276507136,3276508927,EU
+3276494592,3276503039,EU
+3276503040,3276505087,DE
+3276505088,3276508927,EU
3276508928,3276509183,GB
3276509184,3276510207,IT
3276510208,3276512255,EU
3276512256,3276513023,ZA
-3276513024,3276518911,EU
-3276518912,3276519423,BE
-3276519424,3276521983,EU
-3276521984,3276523519,NL
-3276523520,3276529663,EU
-3276529664,3276530175,NL
-3276530176,3276530687,EU
-3276530688,3276532639,NL
-3276532640,3276532640,EU
-3276532641,3276532735,NL
-3276532736,3276534527,EU
+3276513024,3276522495,EU
+3276522496,3276523519,NL
+3276523520,3276530687,EU
+3276530688,3276531711,NL
+3276531712,3276534527,EU
3276534528,3276534783,AU
3276534784,3276537343,EU
3276537344,3276537599,AT
@@ -59781,7 +59923,7 @@
3276695040,3276695551,RU
3276695552,3276696063,UA
3276696064,3276696575,RO
-3276696576,3276697087,CZ
+3276696576,3276697087,EU
3276697088,3276697599,GB
3276697600,3276698111,UA
3276698112,3276699647,RU
@@ -59800,42 +59942,20 @@
3276731392,3276732415,UA
3276732416,3276733439,DE
3276733440,3276734463,UA
-3276734464,3276735999,EU
-3276736000,3276736511,AT
-3276736512,3276739583,EU
-3276739584,3276740095,CH
-3276740096,3276741631,EU
-3276741632,3276742655,FR
-3276742656,3276744191,EU
-3276744192,3276744703,BE
-3276744704,3276746751,EU
-3276746752,3276748287,CH
-3276748288,3276751359,EU
-3276751360,3276751871,GB
-3276751872,3276752383,EU
-3276752384,3276752895,GB
-3276752896,3276758015,EU
+3276734464,3276746751,EU
+3276746752,3276747775,CH
+3276747776,3276758015,EU
3276758016,3276759039,GB
-3276759040,3276759551,DE
-3276759552,3276760063,EU
+3276759040,3276760063,EU
3276760064,3276761087,DE
-3276761088,3276764671,EU
-3276764672,3276765183,DE
+3276761088,3276765183,EU
3276765184,3276766207,GB
-3276766208,3276770303,EU
-3276770304,3276770815,ES
-3276770816,3276773375,EU
-3276773376,3276773887,DK
-3276773888,3276775423,EU
-3276775424,3276781055,NL
-3276781056,3276781567,EU
+3276766208,3276775423,EU
+3276775424,3276780543,NL
+3276780544,3276781567,EU
3276781568,3276782591,BE
-3276782592,3276783103,EU
-3276783104,3276783615,IT
-3276783616,3276783871,EU
-3276783872,3276784383,FR
-3276784384,3276794367,EU
-3276794368,3276795903,BE
+3276782592,3276794879,EU
+3276794880,3276795903,BE
3276795904,3276797951,AT
3276797952,3276799999,EU
3276800000,3276824575,GB
@@ -59868,7 +59988,10 @@
3276866560,3276866687,GB
3276866688,3276866815,IT
3276866816,3276867071,EU
-3276867072,3276868607,IT
+3276867072,3276867327,GB
+3276867328,3276867583,IT
+3276867584,3276868095,GB
+3276868096,3276868607,IT
3276868608,3276868863,GB
3276868864,3276869119,IT
3276869120,3276870143,GB
@@ -59877,12 +60000,10 @@
3276870656,3276871423,IT
3276871424,3276873983,GB
3276873984,3276874239,ES
-3276874240,3276875263,GB
-3276875264,3276875775,NL
-3276875776,3276876383,GB
+3276874240,3276876383,GB
3276876384,3276876415,NL
-3276876416,3276881919,GB
-3276881920,3276883199,IT
+3276876416,3276882431,GB
+3276882432,3276883199,IT
3276883200,3276883711,GB
3276883712,3276883967,IT
3276883968,3276886363,GB
@@ -59891,10 +60012,10 @@
3276886784,3276887039,DE
3276887040,3276888575,GB
3276888576,3276888831,IT
-3276888832,3276890623,GB
-3276890624,3276891135,IT
-3276891136,3276892159,GB
-3276892160,3276893951,IT
+3276888832,3276892159,GB
+3276892160,3276893183,IT
+3276893184,3276893439,GB
+3276893440,3276893951,IT
3276893952,3276894207,GB
3276894208,3276894463,IT
3276894464,3276895743,GB
@@ -60004,7 +60125,6 @@
3277184768,3277185023,UA
3277185024,3277185279,SA
3277185280,3277185535,RU
-3277185536,3277185791,DE
3277185792,3277186047,PL
3277186048,3277186303,IT
3277186304,3277186559,DE
@@ -60034,7 +60154,8 @@
3277193216,3277258751,NL
3277258752,3277324287,TR
3277324288,3277324799,RU
-3277324800,3277325311,KZ
+3277324800,3277325055,KZ
+3277325056,3277325311,RU
3277325312,3277326335,IT
3277326336,3277326847,GB
3277326848,3277327359,AT
@@ -60044,7 +60165,6 @@
3277328896,3277329407,NL
3277329408,3277329919,GB
3277329920,3277330431,RU
-3277330432,3277330943,RO
3277330944,3277331455,UA
3277331456,3277332479,PL
3277332480,3277332991,NL
@@ -60146,15 +60266,46 @@
3277388544,3277388799,HU
3277388800,3277389311,RU
3277389312,3277389823,AM
-3277389824,3277399295,GB
+3277389824,3277394943,GB
+3277394944,3277395455,US
+3277395456,3277399295,GB
3277399296,3277399311,BE
3277399312,3277399359,GB
3277399360,3277399551,BE
-3277399552,3277455359,GB
+3277399552,3277402591,GB
+3277402592,3277402607,ES
+3277402608,3277403135,GB
+3277403136,3277403215,FR
+3277403216,3277403231,GB
+3277403232,3277403247,FR
+3277403248,3277403263,GB
+3277403264,3277403295,FR
+3277403296,3277403423,GB
+3277403424,3277403439,FR
+3277403440,3277403647,GB
+3277403648,3277403807,ES
+3277403808,3277404159,GB
+3277404160,3277404287,DE
+3277404288,3277404303,GB
+3277404304,3277404319,DE
+3277404320,3277404415,GB
+3277404416,3277404463,IT
+3277404464,3277404495,GB
+3277404496,3277404511,IT
+3277404512,3277404543,GB
+3277404544,3277404559,IT
+3277404560,3277404591,GB
+3277404592,3277404607,IT
+3277404608,3277404671,GB
+3277404672,3277404719,CH
+3277404720,3277405183,GB
+3277405184,3277405263,SE
+3277405264,3277452639,GB
+3277452640,3277452647,IE
+3277452648,3277452655,DK
+3277452656,3277455359,GB
3277455360,3277463551,DE
-3277463552,3277464063,US
-3277464064,3277464575,FR
-3277464576,3277471743,US
+3277463552,3277471743,US
3277471744,3277474815,NL
3277474816,3277475711,BE
3277475712,3277476607,NL
@@ -60351,16 +60502,10 @@
3278020608,3278028799,RU
3278028800,3278036991,DE
3278036992,3278045183,FR
-3278045184,3278054911,GB
-3278054912,3278055423,NL
-3278055424,3278061567,GB
+3278045184,3278061567,GB
3278061568,3278065663,NL
3278065664,3278110719,GB
-3278110720,3278115839,SE
-3278115840,3278116351,ES
-3278116352,3278125055,SE
-3278125056,3278125567,NL
-3278125568,3278176255,SE
+3278110720,3278176255,SE
3278176256,3278221091,FR
3278221092,3278221093,GB
3278221094,3278241791,FR
@@ -60511,93 +60656,37 @@
3279123456,3279123711,RE
3279123712,3279159295,FR
3279159296,3279290367,PL
-3279290368,3279290879,EU
-3279290880,3279291391,NL
-3279291392,3279291903,EU
-3279291904,3279294463,NL
-3279294464,3279295999,EU
-3279296000,3279296511,ZA
-3279296512,3279297023,ES
-3279297024,3279297535,EU
-3279297536,3279298047,SE
-3279298048,3279298559,ZA
-3279298560,3279299071,DE
-3279299072,3279299583,EU
-3279299584,3279300095,DE
-3279300096,3279301631,EU
+3279290368,3279292415,EU
+3279292416,3279294463,NL
+3279294464,3279301631,EU
3279301632,3279304703,DE
-3279304704,3279305727,EU
-3279305728,3279306751,DE
-3279306752,3279307263,EU
-3279307264,3279307775,FR
-3279307776,3279308287,EU
-3279308288,3279308799,FR
-3279308800,3279309311,EU
-3279309312,3279310335,FR
-3279310336,3279310847,EU
+3279304704,3279310847,EU
3279310848,3279311871,DE
-3279311872,3279316479,EU
-3279316480,3279317503,IT
-3279317504,3279320063,EU
+3279311872,3279320063,EU
3279320064,3279321087,FR
-3279321088,3279321599,EU
-3279321600,3279322111,DK
-3279322112,3279323391,EU
-3279323392,3279323903,GB
-3279323904,3279324671,EU
-3279324672,3279325183,GB
-3279325184,3279326719,EU
-3279326720,3279329279,GB
+3279321088,3279327231,EU
+3279327232,3279329279,GB
3279329280,3279331327,EU
-3279331328,3279332863,GB
-3279332864,3279334399,EU
-3279334400,3279334911,GB
-3279334912,3279335935,EU
-3279335936,3279339519,GB
-3279339520,3279340031,EU
-3279340032,3279340543,IT
-3279340544,3279341055,EU
-3279341056,3279341567,IT
-3279341568,3279343871,EU
+3279331328,3279332351,GB
+3279332352,3279337471,EU
+3279337472,3279339519,GB
+3279339520,3279343871,EU
3279343872,3279344127,BE
-3279344128,3279345151,EU
-3279345152,3279345663,SE
-3279345664,3279346687,GB
-3279346688,3279347199,EU
-3279347200,3279347711,FR
-3279347712,3279348223,SE
-3279348224,3279349759,EU
-3279349760,3279350783,DE
-3279350784,3279351295,EU
-3279351296,3279351807,GB
-3279351808,3279352319,DK
-3279352320,3279353343,EU
-3279353344,3279354879,DK
-3279354880,3279355391,AT
-3279355392,3279373311,EU
+3279344128,3279353855,EU
+3279353856,3279354879,DK
+3279354880,3279373311,EU
3279373312,3279374335,FI
3279374336,3279374591,EU
3279374592,3279375359,FI
-3279375360,3279380479,EU
-3279380480,3279380991,CH
-3279380992,3279383295,EU
-3279383296,3279383807,CH
-3279383808,3279384319,EU
-3279384320,3279384831,CH
-3279384832,3279421439,EU
+3279375360,3279421439,EU
3279421440,3279486975,IT
3279486976,3279552511,NL
3279552512,3279560703,LV
3279560704,3279568895,GB
3279568896,3279577087,IT
3279577088,3279585279,BE
-3279585280,3279585791,DE
-3279585792,3279586815,GB
-3279586816,3279587327,DE
-3279587328,3279589375,GB
-3279589376,3279589887,DE
-3279589888,3279593983,GB
-3279593984,3279594495,DE
+3279585280,3279594239,GB
+3279594240,3279594495,DE
3279594496,3279596543,GB
3279596544,3279597311,DE
3279597312,3279598591,GB
@@ -60681,17 +60770,9 @@
3280009728,3280010239,GB
3280010240,3280010751,UA
3280010752,3280011263,TR
-3280011264,3280015871,EU
-3280015872,3280016383,GB
-3280016384,3280017919,EU
-3280017920,3280018431,IT
-3280018432,3280019967,EU
-3280019968,3280020479,CH
-3280020480,3280023551,EU
+3280011264,3280023551,EU
3280023552,3280024575,IT
-3280024576,3280037887,EU
-3280037888,3280038399,CH
-3280038400,3280076799,EU
+3280024576,3280076799,EU
3280076800,3280084991,GB
3280084992,3280093183,BA
3280093184,3280109567,GR
@@ -60856,9 +60937,7 @@
3280658176,3280658431,DE
3280658432,3280660479,MT
3280660480,3280662527,RU
-3280662528,3280662783,DE
-3280662784,3280663295,CZ
-3280663296,3280666623,DE
+3280662528,3280666623,DE
3280666624,3280732159,NO
3280732160,3280764927,DE
3280764928,3280765951,TJ
@@ -60901,11 +60980,9 @@
3280934912,3280936959,DE
3280936960,3280955709,GB
3280955710,3280955713,DE
-3280955714,3280956415,GB
-3280956416,3280956927,DE
-3280956928,3280991231,GB
-3280991232,3280991743,DE
-3280991744,3280994559,GB
+3280955714,3280991231,GB
+3280991232,3280991487,DE
+3280991488,3280994559,GB
3280994560,3280994815,RU
3280994816,3280995071,NL
3280995072,3280995327,DE
@@ -60938,16 +61015,28 @@
3281010688,3281018879,BE
3281018880,3281027071,CZ
3281027072,3281027327,GB
-3281027328,3281027775,EU
-3281027776,3281027791,GB
-3281027792,3281028095,EU
-3281028096,3281028159,GB
-3281028160,3281030399,EU
+3281027328,3281027583,EU
+3281027584,3281027615,GB
+3281027616,3281027631,EU
+3281027632,3281027679,GB
+3281027680,3281027695,EU
+3281027696,3281027743,GB
+3281027744,3281027775,EU
+3281027776,3281027807,GB
+3281027808,3281027839,EU
+3281027840,3281027903,GB
+3281027904,3281028063,EU
+3281028064,3281028159,GB
+3281028160,3281028991,EU
+3281028992,3281029055,GB
+3281029056,3281030399,EU
3281030400,3281035263,GB
3281035264,3281043455,CH
3281043456,3281059839,RU
3281059840,3281062911,DE
-3281062912,3281063167,EU
+3281062912,3281063039,EU
+3281063040,3281063111,DE
+3281063112,3281063167,EU
3281063168,3281125375,DE
3281125376,3281133567,SK
3281133568,3281141759,IR
@@ -61039,7 +61128,7 @@
3281969152,3281969663,RU
3281969664,3281970175,PL
3281970176,3281970687,RU
-3281970688,3281971199,LI
+3281970688,3281971199,CH
3281971200,3281971711,RU
3281971712,3281972223,RO
3281972224,3281972735,DE
@@ -61291,7 +61380,6 @@
3283493120,3283493375,IL
3283493376,3283493887,PL
3283493888,3283494143,DK
-3283494144,3283494399,GB
3283494400,3283494655,PL
3283494656,3283494911,DK
3283494912,3283495167,PL
@@ -61336,47 +61424,19 @@
3283540992,3283541503,RO
3283541504,3283542015,CH
3283542016,3283550207,IT
-3283550208,3283551231,EU
-3283551232,3283552255,AT
-3283552256,3283554815,EU
-3283554816,3283555327,CH
-3283555328,3283561471,EU
+3283550208,3283561471,EU
3283561472,3283562495,GB
3283562496,3283563519,EU
-3283563520,3283565055,GB
-3283565056,3283566079,EU
-3283566080,3283566591,GB
-3283566592,3283568639,EU
+3283563520,3283564543,GB
+3283564544,3283568639,EU
3283568640,3283569663,GB
3283569664,3283570687,EU
3283570688,3283570943,GB
-3283570944,3283573247,EU
-3283573248,3283574271,GB
-3283574272,3283575807,EU
-3283575808,3283576319,DE
-3283576320,3283576831,EU
+3283570944,3283576831,EU
3283576832,3283579903,DE
-3283579904,3283582463,EU
-3283582464,3283582975,DE
-3283582976,3283591679,EU
-3283591680,3283592191,DE
-3283592192,3283592703,CH
-3283592704,3283593215,EU
+3283579904,3283593215,EU
3283593216,3283595263,IT
-3283595264,3283595775,DE
-3283595776,3283597311,EU
-3283597312,3283597823,GB
-3283597824,3283603455,EU
-3283603456,3283603967,GB
-3283603968,3283607551,EU
-3283607552,3283608575,BE
-3283608576,3283609087,EU
-3283609088,3283609599,DE
-3283609600,3283610111,EU
-3283610112,3283610623,DE
-3283610624,3283612159,EU
-3283612160,3283612671,IT
-3283612672,3283615743,EU
+3283595264,3283615743,EU
3283615744,3283623935,HU
3283623936,3283632127,DK
3283632128,3283632639,NL
@@ -61394,9 +61454,7 @@
3283639296,3283639807,CH
3283639808,3283640319,DE
3283640320,3283648511,DK
-3283648512,3283650047,BE
-3283650048,3283650559,DE
-3283650560,3283650927,BE
+3283648512,3283650927,BE
3283650928,3283650943,GB
3283650944,3283650975,BE
3283650976,3283651007,GB
@@ -61446,7 +61504,7 @@
3283977728,3283978751,RU
3283978752,3283979263,RO
3283979264,3283979775,IL
-3283979776,3283980287,EU
+3283979776,3283980287,NO
3283980288,3283980799,RO
3283980800,3283981823,CH
3283981824,3283983359,RO
@@ -61607,7 +61665,7 @@
3284099328,3284099583,HU
3284099584,3284100095,GR
3284100096,3284100607,AM
-3284100608,3284101119,US
+3284100608,3284101119,EU
3284101120,3284101631,UA
3284101632,3284102143,GB
3284102144,3284102399,DK
@@ -61700,7 +61758,7 @@
3284684288,3284684799,FR
3284684800,3284685311,DE
3284685312,3284685823,NL
-3284685824,3284686335,DE
+3284685824,3284686335,US
3284686336,3284686847,RO
3284686848,3284687359,PL
3284687360,3284687871,UA
@@ -61773,7 +61831,6 @@
3285076480,3285076735,EU
3285076736,3285082111,NL
3285082112,3285084159,AT
-3285084160,3285085183,LU
3285085184,3285086207,GB
3285086208,3285088255,PL
3285088256,3285088511,RO
@@ -61784,7 +61841,7 @@
3285098496,3285114879,GB
3285114880,3285115903,RU
3285115904,3285116415,PL
-3285116416,3285116927,RU
+3285116416,3285116927,CZ
3285116928,3285117439,UA
3285117440,3285117951,RU
3285117952,3285118463,FR
@@ -61883,39 +61940,16 @@
3285454080,3285454335,GB
3285454336,3285457919,EU
3285457920,3285458175,GB
-3285458176,3285458431,EU
-3285458432,3285458943,GB
-3285458944,3285459967,EU
-3285459968,3285460479,FI
-3285460480,3285460991,DK
-3285460992,3285464575,EU
-3285464576,3285465087,BE
-3285465088,3285468671,EU
-3285468672,3285469183,DE
-3285469184,3285470207,EU
-3285470208,3285470719,DE
-3285470720,3285471231,EU
-3285471232,3285471743,DE
-3285471744,3285471999,EU
+3285458176,3285459967,EU
+3285459968,3285460223,FI
+3285460224,3285471999,EU
3285472000,3285472255,DE
3285472256,3285472511,US
3285472512,3285476029,EU
3285476030,3285476030,AT
3285476031,3285480959,EU
3285480960,3285481215,CH
-3285481216,3285484543,EU
-3285484544,3285485055,IE
-3285485056,3285486591,EU
-3285486592,3285487103,IT
-3285487104,3285489151,EU
-3285489152,3285489663,GB
-3285489664,3285494271,EU
-3285494272,3285494783,IT
-3285494784,3285495807,EU
-3285495808,3285496319,DE
-3285496320,3285497343,EU
-3285497344,3285497855,DE
-3285497856,3285498623,EU
+3285481216,3285498623,EU
3285498624,3285498879,CH
3285498880,3285501727,EU
3285501728,3285501759,GB
@@ -61979,7 +62013,7 @@
3285765120,3285766143,UA
3285766144,3285766655,DE
3285766656,3285767679,UA
-3285767680,3285768191,EU
+3285767680,3285768191,FR
3285768192,3285768703,RU
3285768704,3285768959,RO
3285768960,3285769215,PL
@@ -62025,15 +62059,15 @@
3285876736,3285909503,RU
3285909504,3285910335,EU
3285910336,3285910399,ES
-3285910400,3285919743,EU
+3285910400,3285911559,EU
+3285911560,3285911567,GB
+3285911568,3285917695,EU
+3285917696,3285917703,GB
+3285917704,3285919743,EU
3285919744,3285921791,QA
3285921792,3285922047,EU
3285922048,3285922303,FR
-3285922304,3285922815,EU
-3285922816,3285923327,KW
-3285923328,3285928447,EU
-3285928448,3285928959,ES
-3285928960,3285934591,EU
+3285922304,3285934591,EU
3285934592,3285934847,ES
3285934848,3285935103,GB
3285935104,3285935871,EU
@@ -62046,16 +62080,13 @@
3285939184,3285939191,GB
3285939192,3285939743,EU
3285939744,3285939759,GB
-3285939760,3285940735,EU
-3285940736,3285941247,GB
-3285941248,3285943551,EU
+3285939760,3285939839,EU
+3285939840,3285939967,GB
+3285939968,3285943551,EU
3285943552,3285943647,GB
3285943648,3285943679,NG
3285943680,3285943807,GB
-3285943808,3285944319,EU
-3285944320,3285944831,US
-3285944832,3285945343,DK
-3285945344,3285946111,EU
+3285943808,3285946111,EU
3285946112,3285946367,ES
3285946368,3285951487,EU
3285951488,3285951743,GB
@@ -62063,9 +62094,7 @@
3285953536,3285954047,PK
3285954048,3285962751,EU
3285962752,3285963775,DE
-3285963776,3285964799,EU
-3285964800,3285966335,GB
-3285966336,3285975039,EU
+3285963776,3285975039,EU
3285975040,3286013695,FR
3286013696,3286013951,RE
3286013952,3286106111,FR
@@ -62100,7 +62129,7 @@
3286317056,3286317567,RU
3286317568,3286318079,RO
3286318080,3286318591,CH
-3286318592,3286319103,A2
+3286318592,3286319103,EU
3286319104,3286320127,RO
3286320128,3286321151,PL
3286321152,3286322175,CZ
@@ -62192,9 +62221,7 @@
3286499328,3286564863,HU
3286564864,3286566655,AE
3286566656,3286567423,KW
-3286567424,3286571007,AE
-3286571008,3286571519,KW
-3286571520,3286630399,AE
+3286567424,3286630399,AE
3286630400,3286638591,BG
3286638592,3286646783,AT
3286646784,3286654975,RU
@@ -62237,10 +62264,7 @@
3286773760,3286777855,DE
3286777856,3286778111,GB
3286778112,3286781951,FR
-3286781952,3286789119,GB
-3286789120,3286789631,DE
-3286789632,3286790143,FR
-3286790144,3286794239,GB
+3286781952,3286794239,GB
3286794240,3286888447,DE
3286888448,3286889471,IE
3286889472,3286892543,DE
@@ -62410,7 +62434,6 @@
3287180288,3287181311,RU
3287181312,3287182335,UZ
3287182336,3287185407,UA
-3287185408,3287186431,SE
3287186432,3287187455,FI
3287187456,3287196671,DE
3287196672,3287198719,PL
@@ -62470,8 +62493,7 @@
3287443968,3287444479,BG
3287444480,3287444991,PL
3287444992,3287445503,DE
-3287445504,3287446015,GB
-3287446016,3287446527,UA
+3287445504,3287446527,UA
3287446528,3287447039,PL
3287447040,3287447551,IL
3287447552,3287448063,DK
@@ -62563,7 +62585,7 @@
3287632384,3287632895,SE
3287632896,3287633407,RU
3287633408,3287633919,SK
-3287633920,3287634431,GB
+3287633920,3287634431,UA
3287634432,3287634943,RO
3287634944,3287635455,PL
3287635456,3287635967,DE
@@ -62576,7 +62598,7 @@
3287639552,3287640063,RU
3287640064,3287640575,PL
3287640576,3287641087,SI
-3287641088,3287641599,A2
+3287641088,3287641599,EU
3287641600,3287642111,FI
3287642112,3287642623,UA
3287642624,3287643135,BE
@@ -62684,7 +62706,7 @@
3287736832,3287737343,LV
3287737344,3287737855,GB
3287737856,3287738367,FR
-3287738368,3287738879,CH
+3287738368,3287738879,GB
3287738880,3287739391,DE
3287739392,3287739903,NL
3287739904,3287740415,PT
@@ -62733,7 +62755,21 @@
3287834624,3287842815,GB
3287842816,3287851007,DE
3287851008,3287859199,UA
-3287859200,3287867391,EU
+3287859200,3287859455,GB
+3287859456,3287859711,FK
+3287859712,3287859967,EU
+3287859968,3287860479,GB
+3287860480,3287861247,EU
+3287861248,3287862015,GB
+3287862016,3287863807,EU
+3287863808,3287864063,GB
+3287864064,3287866383,EU
+3287866384,3287866439,GB
+3287866440,3287866495,EU
+3287866496,3287866591,GB
+3287866592,3287866607,EU
+3287866608,3287866623,GB
+3287866624,3287867391,EU
3287867392,3287867903,UA
3287867904,3287868415,PL
3287868416,3287868927,RO
@@ -62788,9 +62824,7 @@
3288006656,3288072191,GR
3288072192,3288088575,SE
3288088576,3288104959,RS
-3288104960,3288151039,DE
-3288151040,3288151551,NL
-3288151552,3288236031,DE
+3288104960,3288236031,DE
3288236032,3288236543,LI
3288236544,3288237055,FR
3288237056,3288238591,RO
@@ -62850,7 +62884,7 @@
3288428544,3288428799,CU
3288428800,3288429311,IN
3288429312,3288429567,ZA
-3288429568,3288430335,GH
+3288430080,3288430335,GH
3288430336,3288430591,EG
3288430592,3288432639,SC
3288432640,3288433407,ZA
@@ -62946,6 +62980,7 @@
3288774656,3288774911,ZA
3288774912,3288775167,EG
3288775168,3288777727,NG
+3288777728,3288778239,TZ
3288778240,3288778495,ZA
3288778496,3288778751,MU
3288778752,3288779007,EG
@@ -62959,8 +62994,7 @@
3288787968,3288788223,EG
3288788224,3288792831,ZA
3288792832,3288793087,AO
-3288793088,3289002751,ZA
-3289002752,3289003007,TZ
+3288793088,3289003007,ZA
3289005056,3289005311,TZ
3289005312,3289014527,ZA
3289014528,3289014783,EG
@@ -62968,14 +63002,21 @@
3289015296,3289015551,CM
3289015552,3289020159,ZA
3289020160,3289020415,UG
-3289020416,3289044991,ZA
+3289020416,3289020671,EG
+3289020672,3289020927,ZA
+3289021440,3289024767,ZA
+3289025024,3289025535,UG
+3289026048,3289027327,ZA
+3289027328,3289027583,TZ
+3289027584,3289041407,ZA
+3289041408,3289041663,NG
+3289041664,3289044991,ZA
3289044992,3289047039,ML
-3289047040,3289063423,ZA
-3289069568,3289070335,ZA
-3289070336,3289070591,ZW
-3289070592,3289070847,NA
-3289070848,3289071103,ZA
-3289071616,3289086975,ZA
+3289047040,3289048063,ZA
+3289048064,3289048319,UG
+3289048320,3289048831,ZA
+3289048832,3289049087,NG
+3289049088,3289086975,ZA
3289086976,3289087231,SZ
3289087232,3289120767,ZA
3289120768,3289123327,PR
@@ -63025,8 +63066,7 @@
3290031360,3290060287,ZA
3290060288,3290060543,SZ
3290060544,3290103807,ZA
-3290103808,3290104319,JO
-3290104320,3290104831,EG
+3290103808,3290104831,US
3290104832,3290106879,VE
3290106880,3290116095,US
3290116096,3290118143,PE
@@ -63037,7 +63077,7 @@
3290169344,3290171135,ZA
3290171136,3290171391,SZ
3290171392,3290171647,ZA
-3290171904,3290172159,NG
+3290171904,3290172159,ZA
3290172160,3290172415,KE
3290172416,3290181631,ZA
3290181632,3290185727,PR
@@ -63082,11 +63122,10 @@
3290980352,3290984447,ZA
3290988544,3290992639,KE
3290992640,3290996735,GH
+3290996736,3291000831,NG
3291004928,3291021311,NG
3291021312,3291029503,ZA
-3291029504,3291033343,TZ
-3291033344,3291033599,KE
-3291033600,3291037695,TZ
+3291029504,3291037695,TZ
3291045888,3291078655,ZA
3291078656,3291086847,DZ
3291086848,3291103231,PR
@@ -63167,9 +63206,7 @@
3291326464,3291330559,ZA
3291330560,3291331583,TZ
3291331584,3291332607,MW
-3291332608,3291332615,ZA
-3291332616,3291332863,NG
-3291332864,3291348991,ZA
+3291332608,3291348991,ZA
3291348992,3291353087,MZ
3291353088,3291353343,KE
3291353344,3291353599,EG
@@ -63207,335 +63244,32 @@
3291408384,3291410431,GM
3291410432,3291412479,NG
3291412480,3291414527,DZ
-3291414528,3291432191,ZA
-3291432192,3291432447,NA
-3291432448,3291432703,ZA
+3291414528,3291432703,ZA
3291432704,3291432959,NA
-3291432960,3291433215,ZA
-3291433216,3291433727,NA
-3291433728,3291434239,ZA
+3291432960,3291434239,ZA
3291434240,3291434751,A2
3291434752,3291435007,ZA
3291435008,3291439103,A2
+3291439104,3291447295,NG
3291447296,3291463679,CI
3291480064,3291484159,SC
-3291484160,3291486463,DE
-3291486464,3291486719,US
-3291486720,3291488255,DE
-3291488256,3291488511,US
-3291488512,3291492351,SC
-3291492352,3291492607,US
-3291492608,3291496447,SC
+3291484160,3291488255,DE
+3291488256,3291496447,SC
3291496448,3291504639,US
-3291504640,3291506431,SC
-3291506432,3291506687,US
-3291506688,3291510015,SC
-3291510016,3291510527,US
-3291510528,3291522559,SC
-3291522560,3291522815,US
-3291522816,3291529215,SC
+3291504640,3291529215,SC
3291529216,3291533311,US
3291533312,3291535359,SC
3291535360,3291537407,US
-3291537408,3291539711,SC
-3291539712,3291539967,US
-3291539968,3291540479,SC
-3291540480,3291540735,US
-3291540736,3291545599,SC
+3291537408,3291545599,SC
3291742208,3292004351,US
-3292004352,3292004863,SC
-3292004864,3292005119,US
-3292005120,3292008191,SC
-3292008192,3292008447,US
-3292008448,3292008959,SC
-3292008960,3292009471,US
-3292009472,3292011519,SC
-3292011520,3292011775,US
-3292011776,3292013055,SC
-3292013056,3292013311,US
-3292013312,3292017151,SC
-3292017152,3292017407,US
-3292017408,3292018431,SC
-3292018432,3292018943,US
-3292018944,3292020479,SC
-3292020480,3292020735,US
-3292020736,3292021247,SC
-3292021248,3292021503,US
-3292021504,3292023039,SC
-3292023040,3292023295,US
-3292023296,3292024063,SC
-3292024064,3292024319,US
-3292024320,3292025855,SC
-3292025856,3292026367,US
-3292026368,3292026879,SC
-3292026880,3292027391,US
-3292027392,3292027647,SC
-3292027648,3292027903,US
-3292027904,3292030975,SC
-3292030976,3292031231,US
-3292031232,3292031487,SC
-3292031488,3292031743,US
-3292031744,3292033023,SC
-3292033024,3292033279,US
-3292033280,3292035071,SC
-3292035072,3292035327,US
-3292035328,3292037375,SC
-3292037376,3292037631,US
-3292037632,3292039679,SC
-3292039680,3292039935,US
-3292039936,3292043007,SC
-3292043008,3292043519,US
-3292043520,3292045567,SC
-3292045568,3292045823,US
-3292045824,3292046079,SC
-3292046080,3292046335,US
-3292046336,3292047871,SC
-3292047872,3292048639,US
-3292048640,3292050687,SC
-3292050688,3292050943,US
-3292050944,3292059391,SC
-3292059392,3292059647,US
-3292059648,3292062207,SC
-3292062208,3292062719,US
-3292062720,3292062975,SC
-3292062976,3292063231,US
-3292063232,3292066303,SC
-3292066304,3292066559,US
-3292066560,3292068095,SC
-3292068096,3292068351,US
-3292068352,3292071935,SC
-3292071936,3292072191,US
-3292072192,3292072959,SC
-3292072960,3292073215,US
-3292073216,3292079103,SC
-3292079104,3292079359,US
-3292079360,3292080895,SC
-3292080896,3292081151,US
-3292081152,3292084735,SC
-3292084736,3292084991,US
-3292084992,3292088063,SC
-3292088064,3292088319,US
-3292088320,3292090367,SC
-3292090368,3292090623,US
-3292090624,3292094719,SC
-3292094720,3292094975,US
-3292094976,3292095999,SC
-3292096000,3292096255,US
-3292096256,3292097535,SC
-3292097536,3292097791,US
-3292097792,3292098815,SC
-3292098816,3292099071,US
-3292099072,3292102399,SC
-3292102400,3292102655,US
-3292102656,3292103167,SC
-3292103168,3292103423,US
-3292103424,3292103935,SC
-3292103936,3292104191,US
-3292104192,3292105215,SC
-3292105216,3292105471,US
-3292105472,3292110335,SC
-3292110336,3292110591,US
-3292110592,3292110847,SC
-3292110848,3292111103,US
-3292111104,3292112639,SC
-3292112640,3292112895,US
-3292112896,3292114687,SC
-3292114688,3292114943,US
-3292114944,3292115455,SC
-3292115456,3292115711,US
-3292115712,3292117503,SC
-3292117504,3292117759,US
-3292117760,3292118271,SC
-3292118272,3292118527,US
-3292118528,3292119295,SC
-3292119296,3292119551,US
-3292119552,3292121087,SC
-3292121088,3292121343,US
-3292121344,3292122111,SC
-3292122112,3292122879,US
-3292122880,3292128511,SC
-3292128512,3292128767,US
-3292128768,3292131583,SC
-3292131584,3292131839,US
-3292131840,3292133119,SC
-3292133120,3292133375,US
-3292133376,3292134143,SC
-3292134144,3292134399,US
-3292134400,3292134655,SC
-3292134656,3292134911,US
-3292134912,3292137983,SC
-3292137984,3292138239,US
-3292138240,3292138751,SC
-3292138752,3292139007,US
-3292139008,3292141311,SC
-3292141312,3292141567,US
-3292141568,3292143103,SC
-3292143104,3292143359,US
-3292143360,3292151551,SC
-3292151552,3292151807,US
-3292151808,3292153343,SC
-3292153344,3292153599,US
-3292153600,3292154367,SC
-3292154368,3292154623,US
-3292154624,3292162559,SC
-3292162560,3292162815,US
-3292162816,3292163583,SC
-3292163584,3292163839,US
-3292163840,3292164351,SC
-3292164352,3292164607,US
-3292164608,3292165119,SC
-3292165120,3292165375,US
-3292165376,3292166143,SC
-3292166144,3292166399,US
-3292166400,3292169215,SC
-3292169216,3292169727,US
-3292169728,3292172031,SC
-3292172032,3292172543,US
-3292172544,3292174335,SC
-3292174336,3292174591,US
-3292174592,3292175615,SC
-3292175616,3292175871,US
-3292175872,3292180479,SC
-3292180480,3292180735,US
-3292180736,3292181759,SC
-3292181760,3292182015,US
-3292182016,3292184063,SC
-3292184064,3292184319,US
-3292184320,3292185599,SC
-3292185600,3292185855,US
-3292185856,3292187135,SC
-3292187136,3292187391,US
-3292187392,3292188159,SC
-3292188160,3292188415,US
-3292188416,3292190207,SC
-3292190208,3292190463,US
-3292190464,3292190719,SC
-3292190720,3292190975,US
-3292190976,3292193279,SC
-3292193280,3292193791,US
-3292193792,3292196863,SC
-3292196864,3292197119,US
-3292197120,3292198399,SC
-3292198400,3292198655,US
-3292198656,3292199167,SC
-3292199168,3292199423,US
-3292199424,3292199679,SC
-3292199680,3292200191,US
-3292200192,3292200959,SC
-3292200960,3292201215,SE
-3292201216,3292201727,SC
-3292201728,3292201983,US
-3292201984,3292202751,SC
-3292202752,3292203007,US
-3292203008,3292203263,SC
-3292203264,3292203519,US
-3292203520,3292205311,SC
-3292205312,3292205567,US
-3292205568,3292209151,SC
-3292209152,3292209663,US
-3292209664,3292212479,SC
-3292212480,3292212735,US
-3292212736,3292213503,SC
-3292213504,3292214015,US
-3292214016,3292216575,SC
-3292216576,3292217087,US
-3292217088,3292217599,SC
-3292217600,3292217855,US
-3292217856,3292220671,SC
-3292220672,3292220927,US
-3292220928,3292221695,SC
-3292221696,3292221951,US
-3292221952,3292226047,SC
-3292226048,3292226303,US
-3292226304,3292227327,SC
-3292227328,3292227583,US
-3292227584,3292234495,SC
-3292234496,3292234751,US
-3292234752,3292236543,SC
-3292236544,3292236799,US
-3292236800,3292239103,SC
-3292239104,3292239359,US
-3292239360,3292242175,SC
-3292242176,3292242431,US
-3292242432,3292243967,SC
-3292243968,3292244223,US
-3292244224,3292248063,SC
-3292248064,3292248319,US
-3292248320,3292251647,SC
-3292251648,3292251903,US
-3292251904,3292254975,SC
-3292254976,3292255231,US
-3292255232,3292259839,SC
-3292259840,3292260351,US
-3292260352,3292261375,SC
-3292261376,3292261631,US
-3292261632,3292262655,SC
-3292262656,3292262911,US
-3292262912,3292263423,SC
-3292263424,3292263679,US
-3292263680,3292265471,SC
-3292265472,3292265983,US
-3292265984,3292266239,DE
-3292266240,3292266495,SC
+3292004352,3292266495,SC
3292397568,3292528639,ZA
3300917248,3300921343,MU
3300925440,3300929535,MG
3300933632,3300950015,MU
3300982784,3301175295,ZA
3301175296,3301179391,AF
-3301179392,3301181183,SC
-3301181184,3301181439,US
-3301181440,3301183743,SC
-3301183744,3301183999,US
-3301184000,3301188351,SC
-3301188352,3301188607,US
-3301188608,3301188863,SC
-3301188864,3301189119,US
-3301189120,3301189375,SC
-3301189376,3301189631,US
-3301189632,3301191167,SC
-3301191168,3301191423,US
-3301191424,3301191935,SC
-3301191936,3301192191,US
-3301192192,3301193727,SC
-3301193728,3301193983,US
-3301193984,3301197567,SC
-3301197568,3301197823,US
-3301197824,3301199359,SC
-3301199360,3301199615,US
-3301199616,3301205759,SC
-3301205760,3301206015,US
-3301206016,3301210623,SC
-3301210624,3301210879,US
-3301210880,3301213695,SC
-3301213696,3301213951,US
-3301213952,3301217535,SC
-3301217536,3301217791,US
-3301217792,3301219327,SC
-3301219328,3301219583,US
-3301219584,3301220863,SC
-3301220864,3301221119,US
-3301221120,3301221887,SC
-3301221888,3301222143,US
-3301222144,3301222911,SC
-3301222912,3301223167,US
-3301223168,3301224959,SC
-3301224960,3301225215,US
-3301225216,3301228543,SC
-3301228544,3301228799,US
-3301228800,3301230591,SC
-3301230592,3301230847,US
-3301230848,3301234687,SC
-3301234688,3301234943,US
-3301234944,3301236991,SC
-3301236992,3301237247,US
-3301237248,3301238527,SC
-3301238528,3301238783,US
-3301238784,3301241343,SC
-3301241344,3301241599,US
-3301241600,3301243647,SC
-3301243648,3301243903,US
-3301243904,3301311487,SC
+3301179392,3301311487,SC
3301311488,3301313535,SA
3301313536,3301318655,SC
3301318656,3301322751,DE
@@ -63548,65 +63282,7 @@
3301355520,3301365759,SE
3301365760,3301367807,SC
3301367808,3301371903,SE
-3301371904,3301383679,SC
-3301383680,3301383935,US
-3301383936,3301384703,SC
-3301384704,3301384959,US
-3301384960,3301387007,SC
-3301387008,3301387263,US
-3301387264,3301393151,SC
-3301393152,3301393663,US
-3301393664,3301393919,SC
-3301393920,3301394175,US
-3301394176,3301394431,SC
-3301394432,3301394687,US
-3301394688,3301397503,SC
-3301397504,3301397759,US
-3301397760,3301399295,SC
-3301399296,3301399551,US
-3301399552,3301403135,SC
-3301403136,3301403391,US
-3301403392,3301403903,SC
-3301403904,3301404159,US
-3301404160,3301405951,SC
-3301405952,3301406207,US
-3301406208,3301407231,SC
-3301407232,3301407487,US
-3301407488,3301407743,SC
-3301407744,3301407999,US
-3301408000,3301408511,SC
-3301408512,3301408767,US
-3301408768,3301410047,SC
-3301410048,3301410303,US
-3301410304,3301412351,SC
-3301412352,3301412607,US
-3301412608,3301414655,SC
-3301414656,3301414911,US
-3301414912,3301419519,SC
-3301419520,3301420031,US
-3301420032,3301423103,SC
-3301423104,3301423359,US
-3301423360,3301426943,SC
-3301426944,3301427199,US
-3301427200,3301427455,SC
-3301427456,3301427711,US
-3301427712,3301428223,SC
-3301428224,3301428479,US
-3301428480,3301431295,SC
-3301431296,3301431551,US
-3301431552,3301432063,SC
-3301432064,3301432319,US
-3301432320,3301433599,SC
-3301433600,3301434367,US
-3301434368,3301435647,SC
-3301435648,3301435903,US
-3301435904,3301437951,SC
-3301437952,3301438207,US
-3301438208,3301439999,SC
-3301440000,3301440255,US
-3301440256,3301440767,SC
-3301440768,3301441023,US
-3301441024,3301441535,SC
+3301371904,3301441535,SC
3301441536,3301445631,ZA
3301445632,3301453823,KE
3301453824,3301457919,ML
@@ -63630,9 +63306,7 @@
3301515264,3301523455,GH
3301523456,3301531647,CI
3301539840,3301543935,A2
-3301543936,3301543967,KE
-3301543968,3301544191,UG
-3301544192,3301544959,KE
+3301543936,3301544959,KE
3301544960,3301545215,A2
3301545216,3301548031,KE
3301548032,3301556223,GH
@@ -63913,8 +63587,7 @@
3320300544,3320301567,ZA
3320301568,3320302591,SO
3320302592,3320303615,GM
-3320303616,3320304127,SC
-3320304128,3320304639,GH
+3320303616,3320304639,SC
3320304640,3320305663,ZW
3320305664,3320306687,MZ
3320306688,3320307711,LR
@@ -63929,6 +63602,7 @@
3320315904,3320381439,KE
3320381440,3320446975,NA
3320446976,3320451071,SC
+3320451072,3320455167,ZA
3320455168,3320463359,NG
3320463360,3320479743,NA
3320479744,3320500223,ZA
@@ -63954,9 +63628,7 @@
3320905728,3320938495,DJ
3320938496,3320971263,AO
3320971264,3320979455,GA
-3320979456,3320982783,ZA
-3320982784,3320983039,TZ
-3320983040,3320995839,ZA
+3320979456,3320995839,ZA
3320995840,3321004031,NG
3321004032,3321008127,GM
3321008128,3321012223,ZA
@@ -63987,13 +63659,7 @@
3321790464,3321806847,LS
3321806848,3321823231,SD
3321823232,3321839615,NG
-3321839616,3321843711,GH
-3321843712,3321846783,MU
-3321846784,3321848831,GH
-3321848832,3321849855,MU
-3321849856,3321850879,GH
-3321850880,3321854975,MU
-3321854976,3321855999,GH
+3321839616,3321855999,GH
3321856000,3321860095,CV
3321860096,3321864191,ZA
3321864192,3321868287,NG
@@ -64001,12 +63667,11 @@
3321872384,3321876479,GM
3321876480,3321880575,NG
3321880576,3321884671,KM
-3321884672,3321885439,ZA
-3321885440,3321885695,LS
+3321884672,3321885695,ZA
3321885696,3321886719,NG
3321886720,3321887743,GA
3321887744,3321888767,NG
-3321954304,3321968639,US
+3321888768,3321968639,US
3321968640,3321970687,CA
3321970688,3322003455,US
3322003456,3322019839,CA
@@ -64014,9 +63679,10 @@
3322023936,3322028031,CL
3322028032,3322036223,US
3322036224,3322052607,CA
-3322052608,3322167295,US
-3322167296,3322167807,GB
-3322167808,3322609663,US
+3322052608,3322353663,US
+3322353664,3322354175,VI
+3322354176,3322354431,JP
+3322354432,3322609663,US
3322609664,3322610687,SA
3322610688,3322683391,US
3322683392,3322691583,BR
@@ -64066,22 +63732,25 @@
3323270400,3323270420,DE
3323270421,3323270421,CH
3323270422,3323270655,DE
-3323270656,3323330559,US
-3323330816,3323331071,US
+3323270656,3323331071,US
3323331072,3323331839,CA
-3323331840,3323342335,US
+3323331840,3323339263,US
+3323339776,3323340031,CA
+3323340288,3323342591,US
3323342592,3323342847,AU
3323343616,3323343871,DE
-3323343872,3323345919,US
+3323343872,3323346175,US
3323346176,3323346431,AU
3323346432,3323354111,US
3323354112,3323354367,GB
3323354368,3323355647,DE
-3323355904,3323356671,US
+3323355648,3323356671,US
3323356672,3323356927,CA
3323356928,3323378687,US
3323378688,3323378943,CA
-3323378944,3323391231,US
+3323378944,3323382783,US
+3323382784,3323383295,CA
+3323383296,3323391231,US
3323391232,3323391487,CA
3323391488,3323394559,US
3323394560,3323395071,CL
@@ -64089,10 +63758,13 @@
3323462656,3323463167,BR
3323463168,3323659263,US
3323659264,3323660543,NZ
+3323660544,3323661311,US
3323661312,3323662335,CA
3323662336,3323674623,US
-3323674624,3323681279,CA
-3323681280,3323741439,US
+3323674624,3323687073,CA
+3323687074,3323687074,US
+3323687075,3323691007,CA
+3323691008,3323741439,US
3323741440,3323741695,GB
3323741696,3323747327,US
3323747328,3323747583,GB
@@ -64129,14 +63801,16 @@
3324047616,3324048383,US
3324048384,3324051455,KN
3324051456,3324182527,CA
-3324182528,3324255231,US
+3324182528,3324193279,US
+3324193280,3324193791,CA
+3324193792,3324255231,US
3324255232,3324256255,VI
3324256256,3324260095,SA
3324260096,3324266495,US
3324266496,3324266751,AP
3324266752,3324270079,US
3324270080,3324270591,EU
-3324270592,3324277247,US
+3324270592,3324277759,US
3324277760,3324278783,CA
3324278784,3324354559,US
3324354560,3324362751,CA
@@ -64153,7 +63827,7 @@
3324655872,3324656127,CA
3324656128,3324732415,US
3324732416,3324732671,EU
-3324732672,3324772351,US
+3324732672,3324805119,US
3324837888,3324843775,US
3324843776,3324843799,SG
3324843800,3324843801,AP
@@ -64175,7 +63849,7 @@
3325132032,3325132799,US
3325132800,3325133823,BR
3325134336,3325134591,US
-3325134848,3325135359,US
+3325134848,3325135871,US
3325136128,3325136383,CA
3325136384,3325136639,US
3325136896,3325142015,US
@@ -64199,7 +63873,9 @@
3325218208,3325218239,US
3325218240,3325220863,CA
3325220864,3325220879,US
-3325220880,3325229591,CA
+3325220880,3325225671,CA
+3325225672,3325225675,US
+3325225676,3325229591,CA
3325229592,3325229599,US
3325229600,3325231103,CA
3325231104,3325232127,US
@@ -64228,19 +63904,15 @@
3325284864,3325285119,AU
3325285376,3325304831,US
3325304832,3325313023,CA
-3325313024,3325329407,US
-3325329408,3325348415,CA
-3325348416,3325348671,US
-3325348672,3325427711,CA
+3325313024,3325362175,US
+3325362176,3325427711,CA
3325427712,3325450239,ZA
3325451008,3325451263,ZA
3325451264,3325452287,US
3325452800,3325453311,ZA
3325453312,3325454335,CA
3325454336,3325463551,US
-3325463808,3325464063,ZA
-3325464064,3325465087,NA
-3325465088,3325481983,ZA
+3325463552,3325481983,ZA
3325481984,3325483007,CA
3325483008,3325488127,ZA
3325488128,3325490175,US
@@ -64281,13 +63953,9 @@
3326191296,3326191359,US
3326191360,3326191551,US
3326191552,3326191583,US
-3326191584,3326349823,US
-3326349824,3326350335,EC
-3326350336,3326406655,US
+3326191584,3326406655,US
3326406656,3326408703,CO
-3326408704,3326413823,US
-3326413824,3326414335,YE
-3326414336,3326420991,US
+3326408704,3326420991,US
3326420992,3326423039,PR
3326423040,3326613503,US
3326613504,3326615551,CA
@@ -64311,9 +63979,7 @@
3326734336,3326737663,CA
3326737664,3326737919,US
3326737920,3326738175,CA
-3326738432,3326953983,US
-3326953984,3326954495,AS
-3326954496,3327144959,US
+3326738432,3327144959,US
3327144960,3327145983,CA
3327145984,3327172863,US
3327172864,3327173119,AP
@@ -64371,8 +64037,8 @@
3328433920,3328475135,US
3328475136,3328477183,CA
3328477184,3328479231,US
-3328479232,3328481279,CA
-3328481280,3328514559,US
+3328479232,3328483327,CA
+3328483328,3328514559,US
3328515072,3328516095,DM
3328516096,3328617983,US
3328617984,3328618239,CA
@@ -64437,17 +64103,9 @@
3330866944,3330867199,CA
3330867200,3330883583,US
3330883584,3330884351,NL
-3330884352,3330888191,US
-3330888192,3330888703,AU
-3330888704,3330889471,US
+3330884352,3330889471,US
3330889472,3330890239,JP
-3330890240,3330890751,BE
-3330890752,3330891263,GB
-3330891264,3330894079,US
-3330894080,3330894591,GB
-3330894592,3330898431,US
-3330898432,3330898943,FR
-3330898944,3330904575,US
+3330890240,3330904575,US
3330904576,3330904831,CA
3330904832,3331070463,US
3331070464,3331070975,UM
@@ -64465,9 +64123,7 @@
3331352920,3331352920,US
3331352921,3331353087,US
3331353088,3331353599,US
-3331353600,3331356671,US
-3331356672,3331357183,BZ
-3331357184,3331362815,US
+3331353600,3331362815,US
3331362816,3331366911,CA
3331366912,3331527423,US
3331527424,3331527679,GB
@@ -64518,7 +64174,8 @@
3332491264,3332492031,US
3332492032,3332500735,CA
3332500736,3332500991,US
-3332500992,3332503039,CA
+3332500992,3332501247,CA
+3332501504,3332503039,CA
3332503040,3332503551,US
3332503552,3332505343,CA
3332505344,3332505855,US
@@ -64635,12 +64292,7 @@
3333675776,3333676031,CA
3333676032,3333705727,US
3333705728,3333709567,GB
-3333709568,3333710847,US
-3333710848,3333711359,GB
-3333711360,3333711871,DE
-3333711872,3333716223,US
-3333716224,3333716735,CA
-3333716736,3333721599,US
+3333709568,3333721599,US
3333721600,3333721855,JP
3333721856,3333781503,US
3333781504,3333783551,CA
@@ -64676,7 +64328,9 @@
3334934016,3334934527,CA
3334934528,3334995967,US
3334995968,3334998527,PH
-3334998528,3335011071,US
+3334998528,3335004655,US
+3335004656,3335004671,CN
+3335004672,3335011071,US
3335011072,3335011327,US
3335011328,3335012351,US
3335012352,3335028735,CA
@@ -64758,9 +64412,7 @@
3337900032,3337948671,US
3337948672,3337949183,CA
3337949184,3337957375,US
-3337957376,3337958399,CA
-3337958400,3337960447,US
-3337960448,3337963128,CA
+3337957376,3337963128,CA
3337963129,3337963129,US
3337963130,3337964031,CA
3337964032,3337964543,A2
@@ -64787,12 +64439,16 @@
3338354688,3338371071,US
3338371072,3338403839,CA
3338403840,3338424319,US
-3338424320,3338432511,CA
+3338424320,3338428415,CA
+3338428416,3338429439,US
+3338429440,3338429951,CA
+3338429952,3338430719,US
+3338430720,3338432511,CA
3338432512,3338455039,US
3338455040,3338455295,GB
3338455296,3338567679,US
3338567680,3338600447,CA
-3338665984,3338686463,US
+3338600448,3338686463,US
3338686464,3338688511,AW
3338688512,3338770431,US
3338770432,3338772479,PR
@@ -64807,8 +64463,7 @@
3339059886,3339075583,US
3339075584,3339076863,GB
3339076864,3339077631,JP
-3339077632,3339079167,US
-3339079168,3339079679,DE
+3339077632,3339079679,US
3339079680,3339080703,IT
3339080704,3339080959,US
3339080960,3339081727,HK
@@ -64816,9 +64471,7 @@
3339081984,3339082751,FR
3339082752,3339091967,US
3339091968,3339092991,NL
-3339092992,3339093503,US
-3339093504,3339094015,NL
-3339094016,3339142655,US
+3339092992,3339142655,US
3339142656,3339142911,NL
3339142912,3339146239,US
3339146496,3339147007,US
@@ -64925,11 +64578,7 @@
3341340160,3341340415,AP
3341340416,3341439200,US
3341439201,3341439201,CA
-3341439202,3341445119,US
-3341445120,3341445631,DE
-3341445632,3341479935,US
-3341479936,3341480447,DE
-3341480448,3341484287,US
+3341439202,3341484287,US
3341484288,3341485055,CA
3341485056,3341488639,US
3341488640,3341488895,JP
@@ -64972,7 +64621,9 @@
3341867008,3341869055,CA
3341869056,3341873151,US
3341873152,3341875199,US
-3341875200,3342139391,US
+3341875200,3341881087,US
+3341881088,3341881343,SG
+3341881344,3342139391,US
3342139392,3342204927,CH
3342204928,3342487551,US
3342487552,3342488575,CA
@@ -65005,9 +64656,9 @@
3342795008,3342795263,AP
3342795264,3342831103,US
3342831104,3342831359,IN
-3342831360,3342878971,US
-3342878972,3342878972,EU
-3342878973,3343013887,US
+3342831360,3342878967,US
+3342878968,3342878975,EU
+3342878976,3343013887,US
3343013888,3343015935,CA
3343015936,3343055871,US
3343055872,3343056895,CA
@@ -65036,8 +64687,8 @@
3343461376,3343465471,US
3343465472,3343466495,JM
3343466496,3343858687,US
-3343858688,3343859199,VG
-3343859200,3344116223,US
+3343858688,3343859711,VG
+3343859712,3344116223,US
3344116224,3344116735,CA
3344116736,3344126975,US
3344126976,3344127999,CA
@@ -65225,7 +64876,9 @@
3346793472,3346793983,US
3346794496,3346923519,US
3346923520,3346989055,CA
-3346989056,3347016703,US
+3346989056,3347015647,US
+3347015648,3347015663,AE
+3347015664,3347016703,US
3347016704,3347017727,CA
3347017728,3347021823,US
3347021824,3347022847,CA
@@ -65233,9 +64886,7 @@
3347033088,3347034111,CA
3347034112,3347039231,US
3347039232,3347040255,DM
-3347040256,3349268479,US
-3349268480,3349268991,CA
-3349268992,3349446911,US
+3347040256,3349446911,US
3349446912,3349447167,CA
3349447168,3349463039,US
3349463040,3349463295,CA
@@ -65250,8 +64901,8 @@
3349545984,3349551103,CA
3349551104,3349553663,US
3349553664,3349608447,CA
-3349608448,3349609215,US
-3349609216,3349610239,CA
+3349608448,3349609471,US
+3349609472,3349610239,CA
3349610240,3349614591,US
3349614592,3349617663,CA
3349617664,3349637119,US
@@ -65383,9 +65034,7 @@
3351336960,3351339007,CA
3351339008,3351357439,US
3351357440,3351359487,CA
-3351359488,3351364607,US
-3351364608,3351365119,AU
-3351365120,3351372799,US
+3351359488,3351372799,US
3351372800,3351373823,BM
3351373824,3351483391,US
3351483392,3351484415,CA
@@ -65532,12 +65181,8 @@
3355384832,3355385855,CA
3355385856,3355407359,US
3355407360,3355408383,PR
-3355408384,3355412479,US
-3355412480,3355412991,BE
-3355412992,3355431423,US
-3355431424,3355431679,US
-3355431680,3355432191,US
-3355432192,3355432959,US
+3355408384,3355430911,US
+3355430912,3355432959,US
3355432960,3355435007,CA
3355435008,3355443199,US
3355443200,3355445247,CO
@@ -65921,11 +65566,9 @@
3356284928,3356286975,AR
3356286976,3356288511,US
3356288512,3356288767,SV
-3356288768,3356289023,US
-3356289024,3356289535,SV
-3356289536,3356290303,US
+3356288768,3356290303,US
3356290304,3356290559,SV
-3356290560,3356291071,CR
+3356290560,3356291071,US
3356291072,3356293119,TT
3356293120,3356295167,AW
3356295168,3356297215,CL
@@ -66027,17 +65670,11 @@
3357407232,3357409279,AR
3357409280,3357411327,BR
3357411328,3357412351,VE
-3357412352,3357412863,PE
-3357412864,3357414399,US
+3357412352,3357414399,US
3357414400,3357415423,PR
-3357415424,3357415935,US
-3357415936,3357416447,MX
-3357416448,3357416959,VE
-3357416960,3357417471,US
+3357415424,3357417471,US
3357417472,3357418495,CL
-3357418496,3357419007,US
-3357419008,3357419519,GT
-3357419520,3357420031,SZ
+3357418496,3357420031,US
3357420032,3357421055,CO
3357421056,3357421567,US
3357421568,3357422847,NI
@@ -66350,8 +65987,8 @@
3358720000,3358728191,PR
3358728192,3358736383,CL
3358736384,3358738175,BB
-3358738176,3358738431,GD
-3358738432,3358744575,BB
+3358738176,3358738687,GD
+3358738688,3358744575,BB
3358744576,3358752767,CL
3358752768,3358756863,BB
3358756864,3358760959,CL
@@ -66400,14 +66037,10 @@
3359506432,3359508479,US
3359508480,3359510527,VE
3359510528,3359511807,US
-3359511808,3359513087,VE
-3359513088,3359513599,US
-3359513600,3359514111,VE
-3359514112,3359514623,US
+3359511808,3359512575,VE
+3359512576,3359514623,US
3359514624,3359514879,CL
-3359514880,3359520255,US
-3359520256,3359520767,AR
-3359520768,3359522815,US
+3359514880,3359522815,US
3359522816,3359539199,NI
3359539200,3359571967,PE
3359571968,3359582207,AR
@@ -66444,7 +66077,6 @@
3360276480,3360278527,VE
3360278528,3360280575,EC
3360280576,3360282623,CL
-3360282624,3360284671,CO
3360284672,3360325631,CL
3360325632,3360333823,CO
3360333824,3360342015,CL
@@ -68488,7 +68120,7 @@
3397216256,3397216767,AU
3397216768,3397217023,IN
3397217024,3397217279,SG
-3397217280,3397217791,AU
+3397217280,3397217535,AU
3397217792,3397218047,NZ
3397218048,3397218303,AU
3397218304,3397222399,CN
@@ -69976,8 +69608,8 @@
3407334400,3407335423,CN
3407335424,3407339519,AU
3407339520,3407339775,CN
-3407339776,3407340543,AU
-3407340544,3407341567,CN
+3407339776,3407340031,AU
+3407340032,3407341567,CN
3407341568,3407345919,AU
3407345920,3407346175,CN
3407346176,3407346431,AU
@@ -70311,7 +69943,7 @@
3407748608,3407750655,AU
3407750656,3407751167,SG
3407751168,3407753215,AU
-3407753216,3407753727,HK
+3407753216,3407753727,SG
3407753728,3407757823,AU
3407757824,3407758079,CN
3407758080,3407761663,AU
@@ -70882,7 +70514,8 @@
3411270656,3411271679,SG
3411271680,3411275775,CN
3411275776,3411277823,JP
-3411277824,3411278335,IN
+3411277824,3411278079,IN
+3411278080,3411278335,HK
3411278336,3411278591,SG
3411278592,3411278847,FJ
3411278848,3411296255,HK
@@ -71291,8 +70924,8 @@
3414670848,3414671359,MY
3414671360,3415080959,JP
3415080960,3415083007,SG
-3415083008,3415083519,AU
-3415083520,3415084031,SG
+3415083008,3415083023,AU
+3415083024,3415084031,SG
3415084032,3415084159,CN
3415084160,3415089151,SG
3415089152,3415097343,MY
@@ -71899,7 +71532,9 @@
3420367360,3420367615,AP
3420367616,3420369007,AU
3420369008,3420369023,HK
-3420369024,3420372991,AU
+3420369024,3420370559,AU
+3420370560,3420370575,JP
+3420370576,3420372991,AU
3420372992,3420374527,CN
3420374528,3420374783,ID
3420374784,3420375551,CN
@@ -71979,8 +71614,7 @@
3423377408,3423378431,CA
3423378432,3423378943,US
3423378944,3423379455,CA
-3423379456,3423379967,US
-3423379968,3423416319,US
+3423379456,3423416319,US
3423416320,3423417343,CA
3423417344,3423430655,US
3423430656,3423431167,TC
@@ -72026,9 +71660,7 @@
3423705856,3423797503,US
3423797504,3423801087,CA
3423801088,3423801343,US
-3423801344,3423823359,CA
-3423823360,3423823871,US
-3423823872,3423827711,CA
+3423801344,3423827711,CA
3423827712,3423827967,US
3423827968,3423830271,CA
3423830272,3423830527,US
@@ -72096,9 +71728,11 @@
3426729472,3426729983,CA
3426729984,3426744319,US
3426744320,3426746367,CA
-3426746368,3427038719,US
-3427038720,3427038975,US
-3427038976,3427112447,US
+3426746368,3427035135,US
+3427035136,3427036159,US
+3427036160,3427038719,US
+3427038720,3427039231,US
+3427039232,3427112447,US
3427112448,3427112703,CN
3427112704,3427117055,US
3427117056,3427117311,CA
@@ -72106,7 +71740,9 @@
3427127296,3427127551,CA
3427127552,3427132927,US
3427132928,3427133183,EU
-3427133184,3427426303,US
+3427133184,3427408393,US
+3427408394,3427408394,EU
+3427408395,3427426303,US
3427426304,3427426559,HK
3427426560,3427428863,US
3427428864,3427429119,GB
@@ -72122,20 +71758,13 @@
3427732736,3427735039,IE
3427735040,3427735295,US
3427735296,3427736063,HK
-3427736064,3427742719,US
-3427742720,3427743231,CH
-3427743232,3427744255,US
-3427744256,3427745279,DE
-3427745280,3427745791,TW
-3427745792,3427748863,US
+3427736064,3427748863,US
3427748864,3427749631,DE
3427749632,3427749887,US
3427749888,3427750655,DE
3427750656,3427752447,US
3427752448,3427752703,EU
-3427752704,3427759359,US
-3427759360,3427759871,GB
-3427759872,3427760127,US
+3427752704,3427760127,US
3427760128,3427760895,CA
3427760896,3427762175,US
3427762176,3427762431,DE
@@ -72210,16 +71839,14 @@
3427791872,3427792383,CA
3427792384,3427792639,NL
3427792640,3427793407,SG
-3427793408,3427793919,HK
+3427793408,3427793919,NL
3427793920,3427794175,US
3427794176,3427794943,NL
3427794944,3427796991,CA
3427796992,3427831551,US
3427831552,3427831807,MX
3427831808,3427860479,US
-3427860480,3428025343,CA
-3428025344,3428025855,US
-3428025856,3428057087,CA
+3427860480,3428057087,CA
3428057088,3428286719,US
3428286720,3428286975,CA
3428286976,3428296959,US
@@ -72238,28 +71865,22 @@
3428434944,3428435199,CA
3428435200,3428437503,US
3428437504,3428437759,MX
-3428437760,3428496639,US
-3428496640,3428497151,NL
-3428497152,3428592639,US
+3428437760,3428592639,US
3428592640,3428593919,CA
3428593920,3428598015,US
3428598016,3428598271,CA
-3428598272,3428600831,US
-3428600832,3428601343,CA
-3428601344,3428606463,US
+3428598272,3428606463,US
3428606464,3428606591,CA
3428606592,3428606655,US
3428606656,3428606719,CA
-3428606720,3428630015,US
-3428630016,3428634623,CA
+3428606720,3428607999,US
+3428608000,3428609023,CA
+3428609024,3428630527,US
+3428630528,3428634623,CA
3428634624,3428635903,US
3428635904,3428636671,CA
-3428636672,3428641279,US
-3428641280,3428641791,CA
-3428641792,3428642303,US
-3428642304,3428642815,CA
-3428642816,3428660991,US
-3428660992,3428661247,CA
+3428636672,3428660735,US
+3428660736,3428661247,CA
3428661248,3428662271,US
3428662272,3428662527,US
3428662528,3428689646,US
@@ -72351,9 +71972,7 @@
3431642624,3431657471,CA
3431657472,3431658495,US
3431658496,3431661311,CA
-3431661312,3431748607,US
-3431748608,3431749119,FR
-3431749120,3431751423,US
+3431661312,3431751423,US
3431751424,3431752703,IT
3431752704,3431753727,US
3431753728,3431755007,CA
@@ -72448,7 +72067,11 @@
3436290048,3436314367,CA
3436314368,3436476415,US
3436476416,3436478463,AW
-3436478464,3437297919,US
+3436478464,3436507391,US
+3436507392,3436507647,BB
+3436507648,3436507903,US
+3436507904,3436509183,BB
+3436509184,3437297919,US
3437297920,3437301759,CA
3437301760,3437305855,US
3437305856,3437307391,CA
@@ -72480,21 +72103,14 @@
3437359104,3437428735,CA
3437428736,3437691391,US
3437691392,3437691647,HK
-3437691648,3437691903,US
-3437691904,3437692415,FR
-3437692416,3437692671,US
+3437691648,3437692671,US
3437692672,3437693439,CA
3437693440,3437694207,US
3437694208,3437695231,AT
3437695232,3437695999,HK
-3437696000,3437696511,NL
-3437696512,3437702911,US
+3437696000,3437702911,US
3437702912,3437703167,HK
-3437703168,3437704191,US
-3437704192,3437704703,CH
-3437704704,3437708287,US
-3437708288,3437708799,FI
-3437708800,3437712639,US
+3437703168,3437712639,US
3437712640,3437713663,GB
3437713664,3437715967,US
3437715968,3437716991,DE
@@ -72502,14 +72118,7 @@
3437717248,3437718527,BE
3437718528,3437720063,US
3437720064,3437723135,SG
-3437723136,3437725183,US
-3437725184,3437725695,MN
-3437725696,3437726207,DE
-3437726208,3437726463,US
-3437726464,3437726975,GB
-3437726976,3437736447,US
-3437736448,3437737471,CL
-3437737472,3437748223,US
+3437723136,3437748223,US
3437748224,3437748479,GB
3437748480,3437748991,NL
3437748992,3437749247,US
@@ -72565,24 +72174,19 @@
3438614616,3438813183,US
3438813184,3438814207,GH
3438814208,3438895103,US
-3438895104,3438896895,HN
-3438896896,3448263423,US
-3448263424,3448263935,AG
-3448263936,3448303103,US
+3438895104,3438896127,HN
+3438896128,3438896639,US
+3438896640,3438896895,HN
+3438896896,3448303103,US
3448303104,3448303615,KY
-3448303616,3448338943,US
-3448338944,3448339455,GB
-3448339456,3448380839,US
-3448380840,3448380847,SG
-3448380848,3448398335,US
-3448398336,3448398847,CA
-3448398848,3448399359,US
-3448399360,3448399871,CA
-3448399872,3448717311,US
+3448303616,3448717311,US
3448717312,3448717567,AU
3448717568,3448838143,US
3448838144,3448838399,CA
-3448838400,3449161983,US
+3448838400,3448989695,US
+3448989696,3448990719,HK
+3448990720,3448991743,IN
+3448991744,3449161983,US
3449161984,3449162239,CA
3449162240,3449174527,US
3449174528,3449174783,CA
@@ -72590,8 +72194,8 @@
3449176064,3449176319,CA
3449176320,3449176831,US
3449176832,3449177087,CA
-3449177088,3449177599,US
-3449177600,3449178111,CA
+3449177088,3449177855,US
+3449177856,3449178111,CA
3449178112,3449182719,US
3449182720,3449182975,CA
3449182976,3449183231,US
@@ -72604,18 +72208,12 @@
3449198688,3449198719,CA
3449198720,3449204735,US
3449204736,3449205759,CA
-3449205760,3449222911,US
-3449222912,3449223423,CA
-3449223424,3449223679,US
-3449223680,3449224191,CA
-3449224192,3449225471,US
+3449205760,3449225471,US
3449225472,3449254143,CA
3449254144,3449254911,US
3449254912,3449273599,CA
3449273600,3449273855,US
-3449273856,3449278975,CA
-3449278976,3449279487,US
-3449279488,3449290495,CA
+3449273856,3449290495,CA
3449290496,3449582848,US
3449582849,3449582849,EU
3449582850,3449593855,US
@@ -72628,9 +72226,7 @@
3449823232,3449824255,CO
3449824256,3449835519,US
3449835520,3449836543,ES
-3449836544,3449843199,US
-3449843200,3449843711,YE
-3449843712,3449974783,US
+3449836544,3449974783,US
3449974784,3449976831,CA
3449976832,3450078463,US
3450078464,3450079487,US
@@ -72685,9 +72281,7 @@
3450976768,3450982399,US
3450982400,3450984447,TW
3450984448,3450986495,PH
-3450986496,3451507199,US
-3451507200,3451507711,BR
-3451507712,3451715839,US
+3450986496,3451715839,US
3451715840,3451724543,CA
3451724544,3451724799,US
3451725312,3451725567,US
@@ -72706,9 +72300,7 @@
3451767296,3451767551,CA
3451767552,3451767807,US
3451767808,3451780863,CA
-3451780864,3451879423,US
-3451879424,3451879935,DE
-3451879936,3451884287,US
+3451780864,3451884287,US
3451884288,3451884543,DE
3451884544,3451890431,US
3451890432,3451890687,AU
@@ -72738,7 +72330,9 @@
3452931328,3452931583,US
3452931584,3452934911,CA
3452934912,3452936191,US
-3452936192,3452942847,CA
+3452936192,3452938751,CA
+3452938752,3452939263,US
+3452939264,3452942847,CA
3452942848,3452943103,US
3452943104,3452953087,CA
3452953088,3452953343,US
@@ -72777,21 +72371,17 @@
3453180928,3453195263,CA
3453195264,3453195519,US
3453195520,3453206527,CA
-3453206528,3453207551,HN
-3453207552,3453207807,US
+3453206528,3453206783,US
+3453206784,3453207039,HN
+3453207040,3453207807,US
3453207808,3453208575,HN
-3453208576,3453209087,US
-3453209088,3453209599,HN
-3453209600,3453209855,US
-3453209856,3453210367,HN
-3453210368,3453210623,US
+3453208576,3453210623,US
3453210624,3453213183,CR
-3453213184,3453214719,HN
-3453214720,3453215231,GT
+3453213184,3453214207,HN
+3453214208,3453215231,US
3453215232,3453215999,SV
3453216000,3453217023,CR
-3453217024,3453217535,SV
-3453217536,3453217791,US
+3453217024,3453217791,US
3453217792,3453219327,CR
3453219328,3453219583,US
3453219584,3453219839,SV
@@ -72815,10 +72405,7 @@
3453610752,3453611007,AG
3453611008,3453611263,MS
3453611264,3453612543,DM
-3453612544,3453613055,KN
-3453613056,3453614591,AG
-3453614592,3453615103,DM
-3453615104,3453615359,AG
+3453612544,3453615359,AG
3453615360,3453615615,KN
3453615616,3453616127,AG
3453616128,3454003013,US
@@ -72896,57 +72483,29 @@
3455097856,3455109119,US
3455109120,3455111167,HN
3455111168,3455115263,SR
-3455115264,3455132159,US
-3455132160,3455133695,BO
+3455115264,3455132415,US
+3455132416,3455133695,BO
3455133696,3455320063,US
3455320064,3455322111,FR
3455322112,3455328255,US
3455328256,3455329279,DO
-3455329280,3455333887,US
-3455333888,3455334399,NL
-3455334400,3455357951,US
+3455329280,3455357951,US
3455357952,3455358975,BB
-3455358976,3455418367,US
-3455418368,3455418879,KY
-3455418880,3455421439,US
-3455421440,3455421951,BE
-3455421952,3455453439,US
+3455358976,3455453439,US
3455453440,3455453695,HT
3455453696,3455582207,US
3455582208,3455583743,SG
-3455583744,3455584255,NL
-3455584256,3455588351,US
-3455588352,3455588863,BE
-3455588864,3455596031,US
-3455596032,3455596543,CH
-3455596544,3455599615,US
-3455599616,3455600127,TW
-3455600128,3455600639,GB
-3455600640,3455601407,US
-3455601408,3455601919,GB
-3455601920,3455602175,US
-3455602176,3455602687,GB
-3455602688,3455617279,US
+3455583744,3455617279,US
3455617280,3455619071,GB
-3455619072,3455621631,US
-3455621632,3455622143,GB
-3455622144,3455627519,US
+3455619072,3455627519,US
3455627520,3455628287,DK
3455628288,3455628799,US
3455628800,3455630847,GB
3455630848,3455631359,US
3455631360,3455632639,ES
-3455632640,3455632895,US
-3455632896,3455633407,GB
-3455633408,3455634431,US
+3455632640,3455634431,US
3455634432,3455635455,DE
-3455635456,3455637759,US
-3455637760,3455638271,GB
-3455638272,3455644927,US
-3455644928,3455645439,GB
-3455645440,3455646207,US
-3455646208,3455646719,FR
-3455646720,3455713279,US
+3455635456,3455713279,US
3455713280,3455778815,CA
3455778816,3455864831,US
3455864832,3455866879,TW
@@ -72992,23 +72551,16 @@
3459327488,3459327999,CO
3459328000,3459329023,CL
3459329024,3459330047,VE
-3459330048,3459331071,US
-3459331072,3459331583,MX
+3459330048,3459331583,US
3459331584,3459332607,PA
-3459332608,3459333119,US
-3459333120,3459333631,PW
-3459333632,3459341055,US
+3459332608,3459341055,US
3459341056,3459341311,MX
-3459341312,3459348991,US
-3459348992,3459349503,IT
-3459349504,3459350527,US
+3459341312,3459350527,US
3459350528,3459352575,VE
3459352576,3459353599,US
3459353600,3459354623,CO
3459354624,3459357183,NI
-3459357184,3459359999,US
-3459360000,3459360511,VE
-3459360512,3459362815,US
+3459357184,3459362815,US
3459362816,3459364863,CO
3459364864,3459366911,AR
3459366912,3459368959,VE
@@ -73033,7 +72585,9 @@
3459513856,3459592191,US
3459592192,3459596287,CA
3459596288,3459614719,US
-3459616768,3459617023,US
+3459616768,3459616895,US
+3459616896,3459616959,CA
+3459616960,3459617023,US
3459617024,3459617791,CA
3459617792,3459617999,AP
3459618000,3459618000,ID
@@ -73054,9 +72608,7 @@
3460061688,3460061691,HK
3460061692,3460063175,US
3460063176,3460063179,HK
-3460063180,3460104703,US
-3460104704,3460105215,MX
-3460105216,3460114431,US
+3460063180,3460114431,US
3460114432,3460116479,SR
3460116480,3460161535,US
3460161536,3460165631,PR
@@ -73066,11 +72618,17 @@
3460411150,3460411150,EU
3460411151,3460507647,US
3460507648,3460507903,MX
-3460507904,3460803583,US
+3460507904,3460801023,US
+3460801024,3460801279,US
+3460801280,3460803583,US
3460803584,3460803839,US
-3460803840,3460878335,US
+3460803840,3460806399,US
+3460806400,3460806655,US
+3460806656,3460808447,US
+3460808448,3460808703,US
+3460808704,3460878335,US
3460878336,3460878591,CA
-3460878592,3460878847,US
+3460878592,3460879359,US
3460882432,3460905295,US
3460905296,3460905311,BR
3460905312,3460944127,US
@@ -73097,9 +72655,7 @@
3461808128,3461873663,CA
3461873664,3462593791,US
3462593792,3462594559,GN
-3462594560,3462633823,US
-3462633824,3462633855,SG
-3462633856,3463004159,US
+3462594560,3463004159,US
3463004160,3463006207,CO
3463006208,3463032319,US
3463032320,3463032831,PR
@@ -73111,8 +72667,8 @@
3463116800,3463118847,CO
3463118848,3463156735,US
3463156736,3463157759,BO
-3463157760,3463176191,US
-3463176192,3463176703,CW
+3463157760,3463176447,US
+3463176448,3463176703,CW
3463176704,3463184383,US
3463184384,3463192575,CA
3463192576,3463192831,US
@@ -73132,9 +72688,7 @@
3463708672,3463774207,CA
3463774208,3464127999,US
3464128000,3464128255,DE
-3464128256,3464129535,US
-3464129536,3464130047,DE
-3464130048,3464142335,US
+3464128256,3464142335,US
3464142336,3464142591,FR
3464142592,3464167679,US
3464167680,3464169215,CA
@@ -73162,7 +72716,9 @@
3464392704,3464392959,CA
3464392960,3464394751,US
3464394752,3464396799,LC
-3464396800,3464626175,US
+3464396800,3464421631,US
+3464421632,3464421887,CA
+3464422400,3464626175,US
3464626176,3464626687,CA
3464626688,3464627199,US
3464627968,3464630271,CA
@@ -73237,7 +72793,9 @@
3468361728,3468443647,US
3468443648,3468460031,CA
3468460032,3468468223,BM
-3468468224,3468623871,US
+3468468224,3468598591,US
+3468598592,3468598623,SG
+3468598624,3468623871,US
3468623872,3468656639,CA
3468656640,3468799999,US
3468800000,3468800255,GB
@@ -73297,9 +72855,7 @@
3470884864,3470885887,HK
3470885888,3471057919,US
3471057920,3471058943,VE
-3471058944,3471059455,US
-3471059456,3471059967,ES
-3471059968,3471262719,US
+3471058944,3471262719,US
3471262720,3471263743,EC
3471263744,3471265791,CO
3471265792,3471276031,US
@@ -73319,13 +72875,17 @@
3472571648,3472571903,GH
3472571904,3472614911,US
3472614912,3472615167,US
-3472615168,3473039359,US
+3472615168,3472616959,US
+3472616960,3472617215,US
+3472617216,3472618751,US
+3472618752,3472619007,US
+3472619008,3472621055,US
+3472621056,3472621311,US
+3472621312,3473039359,US
3473039360,3473041407,BM
3473041408,3473276927,US
3473276928,3473342463,CA
-3473342464,3473765887,US
-3473765888,3473766399,EC
-3473766400,3474053119,US
+3473342464,3474053119,US
3474053120,3474055167,PE
3474055168,3474391039,US
3474391040,3474456575,CA
@@ -73369,9 +72929,9 @@
3475921152,3475921407,JP
3475921408,3475996671,US
3475996672,3476029439,CA
-3476029440,3476422143,US
-3476422144,3476422655,AZ
-3476422656,3476447231,US
+3476029440,3476418559,US
+3476418560,3476421631,CA
+3476421632,3476447231,US
3476447232,3476455423,CA
3476455424,3476881407,US
3476881408,3476946943,CA
@@ -73397,39 +72957,29 @@
3479568384,3479633919,CA
3479633920,3479896063,US
3479896064,3479961599,CA
-3479961600,3480223743,US
+3479961600,3480101375,US
+3480101376,3480101887,US
+3480101888,3480104447,US
+3480104448,3480104959,US
+3480104960,3480223743,US
3480223744,3480256511,CA
-3480256512,3480284159,US
-3480284160,3480284671,CA
-3480284672,3480444927,US
+3480256512,3480444927,US
3480444928,3480449023,CA
3480453120,3480556287,US
3480556288,3480556543,HK
-3480556544,3480567039,US
-3480567040,3480567551,GB
-3480567552,3480570879,US
-3480570880,3480571391,CH
-3480571392,3480575743,US
+3480556544,3480575743,US
3480575744,3480577023,IT
3480577024,3480582655,US
3480582656,3480583423,MX
-3480583424,3480591615,US
-3480591616,3480592127,ID
-3480592128,3480595967,US
+3480583424,3480595967,US
3480595968,3480596991,SG
3480596992,3480597247,US
3480597248,3480598271,AU
-3480598272,3480598527,US
-3480598528,3480599039,AU
-3480599040,3480602879,US
+3480598272,3480602879,US
3480602880,3480603647,IT
-3480603648,3480604159,US
-3480604160,3480604671,ES
-3480604672,3480612351,US
+3480603648,3480612351,US
3480612352,3480613631,DE
-3480613632,3480907263,US
-3480907264,3480907775,FR
-3480907776,3481164801,US
+3480613632,3481164801,US
3481164802,3481164802,US
3481164803,3481165057,US
3481165058,3481165058,US
@@ -73465,11 +73015,21 @@
3483239424,3483239679,US
3483239680,3483240703,US
3483240704,3483240959,US
-3483240960,3483247359,US
+3483240960,3483242495,US
+3483242496,3483242751,US
+3483242752,3483244543,US
+3483244544,3483244799,US
+3483244800,3483247359,US
3483247360,3483247871,US
3483247872,3483248639,US
3483248640,3483249151,US
-3483249152,3483435007,US
+3483249152,3483249919,US
+3483249920,3483250175,US
+3483250176,3483251455,US
+3483251456,3483251711,US
+3483251712,3483253247,US
+3483253248,3483253503,US
+3483253504,3483435007,US
3483435008,3483533311,CA
3483533312,3483631615,US
3483631616,3483697151,CA
@@ -73481,9 +73041,7 @@
3483877376,3483893759,CA
3483893760,3484006911,US
3484006912,3484007167,AU
-3484007168,3484013055,US
-3484013056,3484013567,DE
-3484013568,3484319743,US
+3484007168,3484319743,US
3484320256,3484320511,US
3484321792,3484322047,PR
3484322048,3484323839,US
@@ -73496,11 +73054,7 @@
3484458752,3484459775,CA
3484459776,3484460735,US
3484460736,3484460751,CA
-3484460752,3484468479,US
-3484468480,3484468991,CA
-3484468992,3484469247,US
-3484469248,3484469759,CA
-3484469760,3484472831,US
+3484460752,3484472831,US
3484472832,3484473087,CA
3484473088,3484475903,US
3484475904,3484476159,CA
@@ -73527,21 +73081,13 @@
3485721057,3485721057,AE
3485721058,3485724671,US
3485724672,3485728767,US
-3485728768,3485959679,US
-3485959680,3485960191,CA
-3485960192,3486023679,US
+3485728768,3486023679,US
3486023680,3486031871,CA
3486031872,3486269439,US
3486269440,3486285823,JM
3486285824,3486302207,PR
3486302208,3486310399,CA
-3486310400,3486590463,US
-3486590464,3486590975,GB
-3486590976,3486628863,US
-3486628864,3486629375,PT
-3486629376,3486637823,US
-3486637824,3486638335,SE
-3486638336,3486646271,US
+3486310400,3486646271,US
3486646272,3486662655,CA
3486662656,3486688255,US
3486688256,3486688511,GB
@@ -73580,8 +73126,7 @@
3487766528,3487768575,CA
3487768576,3487842303,US
3487842304,3487858687,CA
-3487858688,3487859199,KY
-3487859200,3487875071,BM
+3487858688,3487875071,BM
3487875072,3487891455,US
3487891456,3487907839,CA
3487907840,3488014335,US
@@ -73598,14 +73143,16 @@
3488290816,3488291839,IN
3488291840,3488300287,US
3488300288,3488300543,A2
-3488300544,3488307711,US
-3488307712,3488308223,IN
+3488300544,3488307199,US
+3488307200,3488308223,IN
3488308224,3488350207,US
3488350208,3488415743,CA
3488415744,3488718847,US
3488718848,3488719615,A2
3488719616,3488720895,US
-3488720896,3488721919,A2
+3488720896,3488721697,A2
+3488721698,3488721698,US
+3488721699,3488721919,A2
3488721920,3488722943,US
3488722944,3488725503,A2
3488725504,3488725759,US
@@ -73626,7 +73173,9 @@
3489577216,3489578239,CN
3489578240,3489673471,US
3489673472,3489673727,PR
-3489673728,3489718271,US
+3489673728,3489685503,US
+3489685504,3489687551,BB
+3489687552,3489718271,US
3489718272,3489718527,AG
3489718528,3489718783,LC
3489718784,3489719807,AG
@@ -73636,11 +73185,7 @@
3489738752,3489740799,PH
3489740800,3489775103,US
3489775104,3489775359,BO
-3489775360,3489969151,US
-3489969152,3489969663,PR
-3489969664,3490228735,US
-3490228736,3490229247,CO
-3490229248,3490263039,US
+3489775360,3490263039,US
3490263040,3490265087,CO
3490265088,3490265343,EC
3490265344,3490267135,CO
@@ -73654,13 +73199,11 @@
3491381248,3491381503,BM
3491381504,3491381759,KY
3491381760,3491389439,BM
-3491389440,3491476991,US
-3491476992,3491478527,VI
+3491389440,3491477503,US
+3491477504,3491478527,VI
3491478528,3491508223,US
3491508224,3491512319,CA
-3491512320,3491637247,US
-3491637248,3491637759,CO
-3491637760,3491651583,US
+3491512320,3491651583,US
3491651584,3491659775,VI
3491659776,3491743743,US
3491743744,3491745791,CO
@@ -73700,7 +73243,9 @@
3492917248,3492917503,VI
3492917504,3492926079,US
3492926080,3492926095,EU
-3492926096,3492934111,US
+3492926096,3492933376,US
+3492933377,3492933377,CH
+3492933378,3492934111,US
3492934112,3492934143,GB
3492934144,3492950863,US
3492950864,3492950879,DE
@@ -74016,8 +73561,8 @@
3495653888,3495654399,CA
3495654400,3495673855,US
3495673856,3495674879,MF
-3495674880,3495675391,VG
-3495675392,3495688191,US
+3495674880,3495675903,VG
+3495675904,3495688191,US
3495688192,3495689215,CA
3495689216,3495694335,US
3495694336,3495696383,CA
@@ -74040,8 +73585,7 @@
3495847936,3495849983,CA
3495849984,3495862271,US
3495862272,3495864319,CA
-3495864320,3495864831,DM
-3495864832,3495865343,GP
+3495864320,3495865343,GP
3495865344,3495866367,US
3495866368,3495868415,LC
3495868416,3495871487,US
@@ -74083,9 +73627,7 @@
3496951808,3496959999,CA
3496960000,3497066495,US
3497066496,3497082879,CA
-3497082880,3497157375,US
-3497157376,3497157887,A2
-3497157888,3497161735,US
+3497082880,3497161735,US
3497161736,3497161743,MT
3497161744,3497161767,US
3497161768,3497161775,MT
@@ -74115,22 +73657,17 @@
3498428416,3498429439,CR
3498429440,3498509055,US
3498509056,3498510335,PR
-3498510336,3498513919,US
-3498513920,3498514431,CL
-3498514432,3498587135,US
+3498510336,3498587135,US
3498587136,3498588159,NL
3498588160,3498708991,US
3498708992,3498717183,JM
3498717184,3498760191,US
3498760192,3498762239,PR
-3498762240,3499403263,US
-3499403264,3499403775,MW
-3499403776,3499450367,US
+3498762240,3499450367,US
3499450368,3499451391,IN
3499451392,3499705343,US
3499705344,3499705855,TZ
-3499705856,3499706367,MG
-3499706368,3499986943,US
+3499705856,3499986943,US
3499986944,3499988991,KY
3499988992,3500015615,US
3500015616,3500016383,AG
@@ -74157,11 +73694,7 @@
3500664871,3500664871,CA
3500664872,3500666751,US
3500666752,3500666879,US
-3500666880,3500689407,US
-3500689408,3500689919,CL
-3500689920,3500707327,US
-3500707328,3500707839,CA
-3500707840,3500728319,US
+3500666880,3500728319,US
3500728320,3500736511,KY
3500736512,3500752895,US
3500752896,3500761087,KY
@@ -74179,31 +73712,15 @@
3501789443,3501789443,US
3501789444,3502470143,US
3502470144,3502471167,MX
-3502471168,3502518783,US
-3502518784,3502519295,LK
-3502519296,3502993407,US
-3502993408,3502993919,NL
-3502993920,3503206399,US
-3503206400,3503206911,CR
-3503206912,3503250431,US
-3503250432,3503250943,PK
-3503250944,3503323135,US
-3503323136,3503323647,KE
-3503323648,3503738879,US
+3502471168,3503738879,US
3503738880,3503740927,CO
3503740928,3503890431,US
3503890432,3503894527,CO
3503894528,3503990783,US
3503990784,3503992831,AE
-3503992832,3504086015,US
-3504086016,3504086527,LI
-3504086528,3504136191,US
+3503992832,3504136191,US
3504136192,3504138239,AZ
-3504138240,3504889343,US
-3504889344,3504889855,PK
-3504889856,3504932351,US
-3504932352,3504932863,BD
-3504932864,3505004543,US
+3504138240,3505004543,US
3505004544,3505005823,PR
3505005824,3505006079,DO
3505006080,3505012735,PR
@@ -74211,12 +73728,10 @@
3505121024,3505121279,PH
3505121280,3505424383,US
3505424384,3505425407,PK
-3505425408,3505661951,US
-3505661952,3505662463,JM
-3505662464,3505818623,US
+3505425408,3505818623,US
3505818624,3505819647,BS
-3505819648,3505999359,US
-3505999360,3506000127,PR
+3505819648,3505999871,US
+3505999872,3506000127,PR
3506000128,3506043135,US
3506043136,3506044927,PA
3506044928,3506231807,US
@@ -74264,11 +73779,7 @@
3508338688,3508404223,CA
3508404224,3508690943,US
3508690944,3508695039,CA
-3508695040,3509112831,US
-3509112832,3509114879,US
-3509114880,3509116159,US
-3509116160,3509116415,US
-3509116416,3509157887,US
+3508695040,3509157887,US
3509157888,3509166079,CA
3509166080,3509215231,US
3509215232,3509223423,CA
@@ -74341,11 +73852,11 @@
3510009856,3510239231,US
3510239232,3510246728,CA
3510246729,3510246729,US
-3510246730,3510249471,CA
-3510249472,3510249983,QA
-3510249984,3510251519,CA
+3510246730,3510251519,CA
3510251520,3510252799,DO
-3510252800,3510269951,CA
+3510252800,3510253953,CA
+3510253954,3510253954,US
+3510253955,3510269951,CA
3510269952,3510270719,LY
3510270720,3510271999,CA
3510272000,3510312959,US
@@ -74370,9 +73881,7 @@
3510479792,3510479799,IE
3510479800,3510788447,US
3510788448,3510788479,GB
-3510788480,3510844415,US
-3510844416,3510844927,CA
-3510844928,3510935551,US
+3510788480,3510935551,US
3510935552,3510943743,CA
3510943744,3511140351,US
3511140352,3511156735,CA
@@ -74418,8 +73927,7 @@
3512237312,3512238079,US
3512238080,3512240127,AW
3512240128,3512241663,BS
-3512241664,3512242175,CO
-3512242176,3512242687,US
+3512241664,3512242687,US
3512242688,3512244991,EG
3512244992,3512246015,IL
3512246016,3512246783,CL
@@ -74430,8 +73938,7 @@
3512260608,3512261631,GU
3512261632,3512262911,US
3512262912,3512263679,GT
-3512263680,3512264703,VE
-3512264704,3512267263,US
+3512263680,3512267263,US
3512267264,3512268031,TG
3512268032,3512270847,US
3512270848,3512336383,CA
@@ -74469,22 +73976,22 @@
3513499648,3513778175,US
3513778176,3513794559,CA
3513794560,3513840127,US
-3513840128,3513840383,US
-3513840384,3514007551,US
+3513840128,3513840639,US
+3513840640,3514007551,US
3514007552,3514040319,CA
-3514040320,3514367999,US
+3514040320,3514207999,US
+3514208000,3514208255,US
+3514208256,3514367999,US
3514368000,3514433535,CA
3514433536,3514580991,US
3514580992,3514589183,GB
-3514589184,3514590207,US
-3514590208,3514590719,NI
+3514589184,3514590719,US
3514590720,3514591103,SV
-3514591104,3514591743,US
-3514591744,3514592255,NI
-3514592256,3514593279,SV
-3514593280,3514596863,US
-3514596864,3514597375,SV
-3514597376,3514826751,US
+3514591104,3514592255,US
+3514592256,3514592767,SV
+3514592768,3514596863,US
+3514596864,3514597119,SV
+3514597120,3514826751,US
3514826752,3514843135,CA
3514843136,3514993919,US
3514993920,3514993983,GB
@@ -74519,8 +74026,7 @@
3516366848,3516370943,CA
3516370944,3516514303,US
3516514304,3516530687,CA
-3516530688,3516899327,US
-3516899328,3516899839,A2
+3516530688,3516899839,US
3516899840,3516900095,NG
3516900096,3516903423,US
3516903424,3516907519,CA
@@ -74566,9 +74072,7 @@
3517403904,3517404159,CA
3517404160,3517409791,US
3517409792,3517410047,CA
-3517410048,3517410303,US
-3517410304,3517410815,CA
-3517410816,3517411839,US
+3517410048,3517411839,US
3517411840,3517412095,CA
3517412096,3517416191,US
3517416192,3517416447,CA
@@ -74576,9 +74080,7 @@
3517423104,3517423359,CA
3517423360,3517431903,US
3517431904,3517431935,CA
-3517431936,3517438943,US
-3517438944,3517438975,CA
-3517438976,3517441279,US
+3517431936,3517441279,US
3517441280,3517441535,CA
3517441536,3517447863,US
3517447864,3517447871,CA
@@ -74587,13 +74089,9 @@
3517562880,3517595647,US
3517595648,3517596671,SE
3517596672,3517596927,US
-3517596928,3517597183,SE
-3517597184,3517597695,US
-3517597696,3517599359,SE
+3517596928,3517599359,SE
3517599360,3517599615,US
-3517599616,3517600767,SE
-3517600768,3517601279,US
-3517601280,3517602687,SE
+3517599616,3517602687,SE
3517602688,3517602815,US
3517602816,3517603327,SE
3517603328,3517603583,US
@@ -74644,9 +74142,7 @@
3519554048,3519554175,US
3519554176,3519676415,US
3519676416,3519709183,CA
-3519709184,3519723519,US
-3519723520,3519724031,CA
-3519724032,3519741951,US
+3519709184,3519741951,US
3519741952,3519758335,ZA
3519758336,3519873023,US
3519873024,3519901695,CA
@@ -74660,24 +74156,28 @@
3520369097,3520369097,US
3520369098,3520397311,US
3520401408,3520413439,US
-3520413440,3520413445,CA
-3520413446,3520413446,US
-3520413447,3520413695,CA
+3520413440,3520413695,CA
3520413696,3520454655,US
3520454656,3520462847,CA
-3520462848,3520527871,US
-3520527872,3520528383,A2
-3520528384,3520626687,US
+3520462848,3520626687,US
3520626688,3520634879,CA
3520634880,3520644607,US
3520644608,3520644863,US
-3520644864,3520650239,US
+3520644864,3520648703,US
+3520648704,3520648959,US
+3520648960,3520650239,US
3520650240,3520650495,US
-3520650496,3520652287,US
+3520650496,3520651775,US
+3520651776,3520652031,US
+3520652032,3520652287,US
3520652288,3520652543,US
-3520652544,3520656383,US
+3520652544,3520654079,US
+3520654080,3520654335,US
+3520654336,3520656383,US
3520656384,3520656639,US
-3520656640,3520658943,US
+3520656640,3520657407,US
+3520657408,3520657663,US
+3520657664,3520658943,US
3520658944,3520659199,US
3520659200,3520675839,US
3520675840,3520692223,CA
@@ -74766,10 +74266,7 @@
3523682304,3523686399,NZ
3523686400,3523690495,AU
3523690496,3523698687,IN
-3523698688,3523699199,JP
-3523699200,3523699711,US
-3523699712,3523707391,JP
-3523707392,3523707903,GB
+3523698688,3523707903,JP
3523707904,3523708159,AU
3523708160,3523709183,JP
3523709184,3523709951,CN
@@ -74953,8 +74450,8 @@
3547917312,3548905471,JP
3548905472,3551002623,CN
3551002624,3556769791,KR
-3556769792,3556774399,DE
-3556774400,3556786175,EU
+3556769792,3556773887,DE
+3556773888,3556786175,EU
3556786176,3556794367,RU
3556794368,3556802559,ES
3556802560,3556810751,SD
@@ -74986,11 +74483,7 @@
3556999168,3557007359,RU
3557007360,3557015551,IT
3557015552,3557023743,DE
-3557023744,3557024255,GB
-3557024256,3557024767,BE
-3557024768,3557026303,GB
-3557026304,3557026815,BE
-3557026816,3557031935,GB
+3557023744,3557031935,GB
3557031936,3557040127,IT
3557040128,3557048319,NO
3557048320,3557056511,CH
@@ -75022,13 +74515,9 @@
3557326848,3557335039,DE
3557335040,3557339135,EU
3557339136,3557339391,BE
-3557339392,3557339647,EU
-3557339648,3557340159,BE
-3557340160,3557340287,EU
+3557339392,3557340287,EU
3557340288,3557340927,BE
-3557340928,3557341951,EU
-3557341952,3557342463,BE
-3557342464,3557343231,EU
+3557340928,3557343231,EU
3557343232,3557351423,DE
3557351424,3557359615,RU
3557359616,3557360127,JE
@@ -75092,8 +74581,8 @@
3557860864,3557861983,SE
3557861984,3557862015,FI
3557862016,3557862399,SE
-3557862400,3557862911,FI
-3557862912,3557864287,SE
+3557862400,3557862655,FI
+3557862656,3557864287,SE
3557864288,3557864303,DK
3557864304,3557864311,SE
3557864312,3557864319,FI
@@ -75155,10 +74644,10 @@
3558170624,3558178815,GB
3558178816,3558187007,BG
3558187008,3558195199,DE
-3558195200,3558196735,GB
-3558196736,3558199039,US
+3558195200,3558197247,GB
+3558197248,3558199039,US
3558199040,3558199295,ES
-3558199296,3558203391,US
+3558199296,3558203391,GB
3558203392,3558211583,ES
3558211584,3558219775,GB
3558219776,3558227967,ES
@@ -75211,9 +74700,7 @@
3558440960,3558449151,SE
3558449152,3558457343,IT
3558457344,3558465535,NL
-3558465536,3558468607,GB
-3558468608,3558469119,US
-3558469120,3558473727,GB
+3558465536,3558473727,GB
3558473728,3558506495,SA
3558506496,3558514687,UA
3558514688,3558522879,SK
@@ -75243,9 +74730,7 @@
3558718208,3558718463,EU
3558718464,3558719487,NL
3558719488,3558735871,IL
-3558735872,3558737919,GG
-3558737920,3558738431,GB
-3558738432,3558743039,GG
+3558735872,3558743039,GG
3558743040,3558744063,GB
3558744064,3558752255,LB
3558752256,3558760447,SI
@@ -75313,8 +74798,7 @@
3559129088,3559137279,BG
3559137280,3559145471,GB
3559145472,3559153663,ES
-3559153664,3559177727,GB
-3559177728,3559178239,DE
+3559153664,3559178239,GB
3559178240,3559186431,LB
3559186432,3559194623,RU
3559194624,3559202815,SE
@@ -75334,9 +74818,7 @@
3559291392,3559291647,AZ
3559291648,3559292927,RU
3559292928,3559301119,JO
-3559301120,3559305215,GB
-3559305216,3559305727,US
-3559305728,3559309311,GB
+3559301120,3559309311,GB
3559309312,3559317503,PL
3559317504,3559325695,FI
3559325696,3559333887,IT
@@ -75358,15 +74840,15 @@
3559448576,3559456767,ES
3559456768,3559473151,RU
3559473152,3559489535,CH
-3559489536,3559489791,GB
-3559489792,3559490303,NL
-3559490304,3559491071,GB
+3559489536,3559491071,GB
3559491072,3559491327,NL
3559491328,3559491583,GB
3559491584,3559491839,NL
-3559491840,3559492607,GB
-3559492608,3559497471,NL
-3559497472,3559505919,GB
+3559491840,3559493119,GB
+3559493120,3559493375,NL
+3559493376,3559496703,GB
+3559496704,3559496959,NL
+3559496960,3559505919,GB
3559505920,3559514111,CH
3559514112,3559522303,AT
3559522304,3559530495,GB
@@ -75428,11 +74910,10 @@
3559989248,3559997439,PL
3559997440,3560005631,KE
3560005632,3560013823,RU
-3560013824,3560014847,ES
-3560014848,3560015871,GB
+3560013824,3560015871,GB
3560015872,3560016127,ES
-3560016128,3560016895,GB
-3560016896,3560017663,ES
+3560016128,3560017407,GB
+3560017408,3560017663,ES
3560017664,3560021247,GB
3560021248,3560021503,ES
3560021504,3560022527,GB
@@ -75478,11 +74959,7 @@
3560316928,3560325119,NL
3560325120,3560333311,DK
3560333312,3560341503,RO
-3560341504,3560344575,GB
-3560344576,3560345087,MA
-3560345088,3560345599,GB
-3560345600,3560346111,US
-3560346112,3560346623,GB
+3560341504,3560346623,GB
3560346624,3560347647,US
3560347648,3560357887,GB
3560357888,3560366079,GR
@@ -75645,11 +75122,7 @@
3561472000,3561480191,DE
3561480192,3561488383,GB
3561488384,3561496575,OM
-3561496576,3561497599,GB
-3561497600,3561498111,NL
-3561498112,3561498623,GB
-3561498624,3561500159,NL
-3561500160,3561502719,GB
+3561496576,3561502719,GB
3561502720,3561503743,NL
3561503744,3561504767,GB
3561504768,3561512959,DE
@@ -75664,15 +75137,9 @@
3561578496,3561586687,RU
3561586688,3561594879,BG
3561594880,3561603071,SE
-3561603072,3561605631,GB
-3561605632,3561606143,FR
-3561606144,3561606655,GB
-3561606656,3561607167,FR
-3561607168,3561609215,GB
-3561609216,3561609727,FR
-3561609728,3561615871,GB
-3561615872,3561616383,FR
-3561616384,3561618943,GB
+3561603072,3561609215,GB
+3561609216,3561609471,FR
+3561609472,3561618943,GB
3561618944,3561619455,ES
3561619456,3561641450,GB
3561641451,3561641451,FR
@@ -75712,11 +75179,11 @@
3561914368,3561922559,ES
3561922560,3561925009,GB
3561925010,3561925010,NL
-3561925011,3561925119,GB
-3561925120,3561925631,NL
-3561925632,3561927551,GB
-3561927552,3561928191,NL
-3561928192,3561930751,GB
+3561925011,3561927551,GB
+3561927552,3561927679,NL
+3561927680,3561929967,GB
+3561929968,3561929983,NL
+3561929984,3561930751,GB
3561930752,3561938943,NL
3561938944,3561940991,IE
3561940992,3561942015,GB
@@ -75732,7 +75199,24 @@
3562020864,3562029055,UA
3562029056,3562037247,CZ
3562037248,3562045439,CH
-3562045440,3562061823,ES
+3562045440,3562056711,ES
+3562056712,3562056719,NL
+3562056720,3562056911,ES
+3562056912,3562056927,FR
+3562056928,3562057215,ES
+3562057216,3562057247,NL
+3562057248,3562057263,BE
+3562057264,3562057471,ES
+3562057472,3562057727,DE
+3562057728,3562057975,ES
+3562057976,3562057983,FR
+3562057984,3562059327,ES
+3562059328,3562059335,CH
+3562059336,3562059391,ES
+3562059392,3562059519,CH
+3562059520,3562059647,ES
+3562059648,3562059775,CH
+3562059776,3562061823,ES
3562070016,3562078207,DE
3562078208,3562086399,SK
3562086400,3562087423,SE
@@ -75774,12 +75258,7 @@
3562364928,3562373119,PL
3562373120,3562381311,FR
3562381312,3562389503,SI
-3562389504,3562395647,GH
-3562395648,3562395903,BR
-3562395904,3562396159,TZ
-3562396160,3562396927,SZ
-3562396928,3562397183,GH
-3562397184,3562397695,SZ
+3562389504,3562397695,GH
3562397696,3562405887,GB
3562405888,3562414079,FI
3562414080,3562422271,DE
@@ -75846,11 +75325,7 @@
3562971136,3562987519,FR
3562987520,3562995711,DE
3562995712,3563003903,AT
-3563003904,3563005951,DE
-3563005952,3563006463,TR
-3563006464,3563007487,DE
-3563007488,3563007999,TR
-3563008000,3563008255,DE
+3563003904,3563008255,DE
3563008256,3563008511,PL
3563008512,3563010815,DE
3563010816,3563011071,PL
@@ -75866,10 +75341,8 @@
3563067392,3563068415,MZ
3563068416,3563069439,NG
3563069440,3563077631,HU
-3563077632,3563078399,KZ
-3563078400,3563078911,SE
-3563078912,3563079679,KZ
-3563079680,3563085823,SE
+3563077632,3563079423,KZ
+3563079424,3563085823,SE
3563085824,3563094015,RU
3563094016,3563102207,DE
3563102208,3563110399,CZ
@@ -75879,9 +75352,7 @@
3563134976,3563143167,IT
3563143168,3563151359,GB
3563151360,3563159551,DE
-3563159552,3563163647,DK
-3563163648,3563164159,SE
-3563164160,3563167743,DK
+3563159552,3563167743,DK
3563167744,3563175935,ES
3563175936,3563192319,DK
3563192320,3563200511,TR
@@ -75946,15 +75417,13 @@
3563741184,3563749375,GB
3563749376,3563765759,PL
3563765760,3563782143,ES
-3563782144,3563790335,GR
3563790336,3563798527,EE
3563798528,3563806719,FR
3563806720,3563814911,SA
3563814912,3563823103,SE
3563823104,3563831295,DE
3563831296,3563847679,RU
-3563847680,3563848191,NL
-3563848192,3563848639,GB
+3563847680,3563848639,GB
3563848640,3563848645,IT
3563848646,3563848646,NL
3563848647,3563848655,IT
@@ -75994,9 +75463,7 @@
3564023808,3564024831,IT
3564024832,3564027903,GB
3564027904,3564036095,DE
-3564036096,3564039167,A2
-3564039168,3564039679,DE
-3564039680,3564043263,A2
+3564036096,3564043263,A2
3564043264,3564044287,DE
3564044288,3564052479,CZ
3564052480,3564060671,GB
@@ -76025,9 +75492,7 @@
3564208128,3564216319,GB
3564216320,3564224511,PT
3564224512,3564232703,GB
-3564232704,3564240895,RU
-3564240896,3564241407,TJ
-3564241408,3564249087,RU
+3564232704,3564249087,RU
3564249088,3564265471,DE
3564265472,3564273663,NL
3564273664,3564306431,DE
@@ -76055,8 +75520,7 @@
3564470272,3564478463,IL
3564478464,3564486655,LU
3564486656,3564494847,CH
-3564494848,3564495203,GB
-3564495204,3564503039,EU
+3564494848,3564503039,EU
3564503040,3564511231,JO
3564511232,3564519423,RU
3564519424,3564527615,SI
@@ -76121,7 +75585,9 @@
3564847104,3564855295,IT
3564855296,3564863487,DE
3564863488,3564879871,NL
-3564879872,3564882431,GB
+3564879872,3564882015,GB
+3564882016,3564882031,NL
+3564882032,3564882431,GB
3564882432,3564882687,EU
3564882688,3564883199,GB
3564883200,3564883455,NL
@@ -76132,8 +75598,8 @@
3564886752,3564892415,GB
3564892416,3564892927,NL
3564892928,3564894207,GB
-3564894208,3564895743,NL
-3564895744,3564896255,GB
+3564894208,3564895231,NL
+3564895232,3564896255,GB
3564896256,3564904447,RU
3564904448,3564912639,DE
3564912640,3564920831,BG
@@ -76164,7 +75630,9 @@
3565036288,3565038591,GB
3565038592,3565038847,IE
3565038848,3565039615,GB
-3565039616,3565042175,IE
+3565039616,3565041663,IE
+3565041664,3565041919,GB
+3565041920,3565042175,IE
3565042176,3565043711,GB
3565043712,3565051903,AT
3565051904,3565060095,IQ
@@ -76191,25 +75659,165 @@
3565495296,3565496319,FR
3565496320,3565502463,GB
3565502464,3565503487,NL
-3565503488,3565510911,GB
-3565510912,3565511295,NL
-3565511296,3565518847,GB
+3565503488,3565518847,GB
3565518848,3565551615,TR
3565551616,3565682687,GB
3565682688,3565684995,NL
3565684996,3565684996,EU
3565684997,3565748223,NL
-3565748224,3565750271,EU
-3565750272,3565752319,GB
-3565752320,3565756415,EU
-3565756416,3565760511,GB
-3565760512,3565764375,EU
-3565764376,3565764383,GB
-3565764384,3565764607,EU
-3565764608,3565766655,GB
-3565766656,3565767423,EU
-3565767424,3565767679,GB
-3565767680,3565777919,EU
+3565748224,3565752839,GB
+3565752840,3565752855,EU
+3565752856,3565752879,GB
+3565752880,3565752887,EU
+3565752888,3565752983,GB
+3565752984,3565752991,EU
+3565752992,3565752999,GB
+3565753000,3565753015,EU
+3565753016,3565753031,GB
+3565753032,3565753039,EU
+3565753040,3565753071,GB
+3565753072,3565753079,EU
+3565753080,3565753183,GB
+3565753184,3565753247,EU
+3565753248,3565753279,GB
+3565753280,3565753343,EU
+3565753344,3565753791,GB
+3565753792,3565753799,EU
+3565753800,3565753815,GB
+3565753816,3565753823,EU
+3565753824,3565753831,GB
+3565753832,3565753839,EU
+3565753840,3565753847,GB
+3565753848,3565753983,EU
+3565753984,3565754367,GB
+3565754368,3565754495,EU
+3565754496,3565754511,GB
+3565754512,3565754623,EU
+3565754624,3565755263,GB
+3565755264,3565755279,EU
+3565755280,3565755359,GB
+3565755360,3565755375,EU
+3565755376,3565755583,GB
+3565755584,3565755647,EU
+3565755648,3565755695,GB
+3565755696,3565755703,EU
+3565755704,3565755727,GB
+3565755728,3565755735,EU
+3565755736,3565755831,GB
+3565755832,3565755839,EU
+3565755840,3565755847,GB
+3565755848,3565755855,EU
+3565755856,3565755871,GB
+3565755872,3565755879,EU
+3565755880,3565755919,GB
+3565755920,3565755927,EU
+3565755928,3565755935,GB
+3565755936,3565755943,EU
+3565755944,3565755959,GB
+3565755960,3565755967,EU
+3565755968,3565755999,GB
+3565756000,3565756007,EU
+3565756008,3565756063,GB
+3565756064,3565756071,EU
+3565756072,3565756087,GB
+3565756088,3565756095,EU
+3565756096,3565756119,GB
+3565756120,3565756135,EU
+3565756136,3565756159,GB
+3565756160,3565756287,EU
+3565756288,3565760783,GB
+3565760784,3565760791,EU
+3565760792,3565760799,GB
+3565760800,3565760807,EU
+3565760808,3565760823,GB
+3565760824,3565760831,EU
+3565760832,3565760855,GB
+3565760856,3565760863,EU
+3565760864,3565760935,GB
+3565760936,3565760943,EU
+3565760944,3565760967,GB
+3565760968,3565760975,EU
+3565760976,3565761007,GB
+3565761008,3565761015,EU
+3565761016,3565761279,GB
+3565761280,3565761343,EU
+3565761344,3565761535,GB
+3565761536,3565761543,EU
+3565761544,3565761599,GB
+3565761600,3565761615,EU
+3565761616,3565761631,GB
+3565761632,3565761639,EU
+3565761640,3565761647,GB
+3565761648,3565761655,EU
+3565761656,3565761687,GB
+3565761688,3565761703,EU
+3565761704,3565761727,GB
+3565761728,3565761751,EU
+3565761752,3565761783,GB
+3565761784,3565761791,EU
+3565761792,3565762047,GB
+3565762048,3565762303,ZA
+3565762304,3565762559,EU
+3565762560,3565762815,GB
+3565762816,3565763071,EU
+3565763072,3565763455,GB
+3565763456,3565763487,EU
+3565763488,3565763599,GB
+3565763600,3565763615,EU
+3565763616,3565763671,GB
+3565763672,3565763679,EU
+3565763680,3565763703,GB
+3565763704,3565763719,EU
+3565763720,3565763735,GB
+3565763736,3565763743,EU
+3565763744,3565763751,GB
+3565763752,3565763759,EU
+3565763760,3565763799,GB
+3565763800,3565763807,EU
+3565763808,3565763815,GB
+3565763816,3565763831,EU
+3565763832,3565763839,GB
+3565763840,3565763883,EU
+3565763884,3565763891,GB
+3565763892,3565764095,EU
+3565764096,3565764183,GB
+3565764184,3565764191,EU
+3565764192,3565764207,GB
+3565764208,3565764255,EU
+3565764256,3565764367,GB
+3565764368,3565764375,EU
+3565764376,3565764439,GB
+3565764440,3565764447,EU
+3565764448,3565764455,GB
+3565764456,3565764463,EU
+3565764464,3565764551,GB
+3565764552,3565764575,EU
+3565764576,3565766655,GB
+3565766656,3565766911,EU
+3565766912,3565767167,GB
+3565767168,3565767175,EU
+3565767176,3565767255,GB
+3565767256,3565767271,EU
+3565767272,3565767287,GB
+3565767288,3565767295,EU
+3565767296,3565767351,GB
+3565767352,3565767359,EU
+3565767360,3565767399,GB
+3565767400,3565767407,EU
+3565767408,3565767999,GB
+3565768000,3565768207,EU
+3565768208,3565768271,GB
+3565768272,3565768279,EU
+3565768280,3565768295,GB
+3565768296,3565768311,EU
+3565768312,3565768335,GB
+3565768336,3565768447,EU
+3565768448,3565768575,GB
+3565768576,3565768703,EU
+3565768704,3565768983,GB
+3565768984,3565769215,EU
+3565769216,3565769471,GB
+3565769472,3565777919,EU
3565777920,3565813759,GB
3565813760,3565879295,SA
3565879296,3566010367,GB
@@ -76249,13 +75857,127 @@
3566977024,3566993407,FR
3566993408,3567058943,TR
3567058944,3567124479,FR
-3567124480,3567141631,EU
+3567124480,3567124991,EU
+3567124992,3567125023,GB
+3567125024,3567125247,EU
+3567125248,3567125503,GB
+3567125504,3567126687,EU
+3567126688,3567126759,GB
+3567126760,3567127551,EU
+3567127552,3567127807,GB
+3567127808,3567129855,EU
+3567129856,3567129887,GB
+3567129888,3567130015,EU
+3567130016,3567130079,GB
+3567130080,3567131383,EU
+3567131384,3567131647,GB
+3567131648,3567133215,EU
+3567133216,3567133247,GB
+3567133248,3567133367,EU
+3567133368,3567133375,GB
+3567133376,3567134207,EU
+3567134208,3567134335,GB
+3567134336,3567134847,EU
+3567134848,3567134975,GB
+3567134976,3567135999,EU
+3567136000,3567136255,GB
+3567136256,3567136511,EU
+3567136512,3567136575,GB
+3567136576,3567136639,EU
+3567136640,3567136671,GB
+3567136672,3567136767,EU
+3567136768,3567136895,GB
+3567136896,3567137023,EU
+3567137024,3567137279,GB
+3567137280,3567137599,EU
+3567137600,3567137663,GB
+3567137664,3567137987,EU
+3567137988,3567137991,GB
+3567137992,3567137999,EU
+3567138000,3567138003,GB
+3567138004,3567138039,EU
+3567138040,3567138047,GB
+3567138048,3567140095,EU
+3567140096,3567140351,GB
+3567140352,3567140863,EU
+3567140864,3567140927,GB
+3567140928,3567141631,EU
3567141632,3567141887,GB
-3567141888,3567149919,EU
+3567141888,3567142271,EU
+3567142272,3567142399,GB
+3567142400,3567143431,EU
+3567143432,3567143439,GB
+3567143440,3567143519,EU
+3567143520,3567143551,GB
+3567143552,3567143679,EU
+3567143680,3567143687,GB
+3567143688,3567143871,EU
+3567143872,3567143935,GB
+3567143936,3567143951,EU
+3567143952,3567143967,GB
+3567143968,3567144171,EU
+3567144172,3567144175,GB
+3567144176,3567144319,EU
+3567144320,3567144447,GB
+3567144448,3567144767,EU
+3567144768,3567144831,GB
+3567144832,3567147527,EU
+3567147528,3567147535,GB
+3567147536,3567147551,EU
+3567147552,3567147559,GB
+3567147560,3567148519,EU
+3567148520,3567148527,GB
+3567148528,3567148799,EU
+3567148800,3567149055,GB
+3567149056,3567149087,EU
+3567149088,3567149119,GB
+3567149120,3567149903,EU
+3567149904,3567149911,GB
+3567149912,3567149919,EU
3567149920,3567149935,GB
-3567149936,3567155199,EU
-3567155200,3567155711,GB
-3567155712,3567157247,EU
+3567149936,3567151135,EU
+3567151136,3567151199,GB
+3567151200,3567151231,EU
+3567151232,3567151263,GB
+3567151264,3567151999,EU
+3567152000,3567152127,GB
+3567152128,3567152159,EU
+3567152160,3567152191,GB
+3567152192,3567152255,EU
+3567152256,3567152383,GB
+3567152384,3567152399,EU
+3567152400,3567152407,GB
+3567152408,3567152639,EU
+3567152640,3567152647,GB
+3567152648,3567152663,EU
+3567152664,3567152671,GB
+3567152672,3567152743,EU
+3567152744,3567152751,GB
+3567152752,3567152831,EU
+3567152832,3567152863,GB
+3567152864,3567152959,EU
+3567152960,3567152991,GB
+3567152992,3567153023,EU
+3567153024,3567153055,GB
+3567153056,3567153599,EU
+3567153600,3567153607,GB
+3567153608,3567153615,EU
+3567153616,3567153623,GB
+3567153624,3567153647,EU
+3567153648,3567153663,GB
+3567153664,3567153687,EU
+3567153688,3567153703,GB
+3567153704,3567153719,EU
+3567153720,3567153727,GB
+3567153728,3567153823,EU
+3567153824,3567153847,GB
+3567153848,3567154303,EU
+3567154304,3567154367,GB
+3567154368,3567155199,EU
+3567155200,3567155967,GB
+3567155968,3567156415,EU
+3567156416,3567156607,GB
+3567156608,3567157247,EU
3567157248,3567165439,CZ
3567165440,3567169535,RU
3567169536,3567173631,MK
@@ -76288,52 +76010,39 @@
3567455744,3567455999,ES
3567456000,3567456415,GB
3567456416,3567456431,ES
-3567456432,3567456767,GB
-3567456768,3567457791,ES
-3567457792,3567459935,GB
+3567456432,3567459935,GB
3567459936,3567459943,ES
-3567459944,3567461119,GB
-3567461120,3567461631,ES
-3567461632,3567463423,GB
+3567459944,3567463423,GB
3567463424,3567463679,ES
3567463680,3567465983,GB
3567465984,3567466239,ES
-3567466240,3567466751,GB
-3567466752,3567467263,ES
-3567467264,3567468543,GB
-3567468544,3567468800,ES
-3567468801,3567470079,GB
-3567470080,3567470591,ES
-3567470592,3567472639,GB
-3567472640,3567474687,ES
-3567474688,3567476735,GB
-3567476736,3567477247,ES
-3567477248,3567478783,GB
-3567478784,3567484927,ES
-3567484928,3567486975,GB
-3567486976,3567487999,ES
-3567488000,3567490559,GB
+3567466240,3567490559,GB
3567490560,3567491071,ES
3567491072,3567495167,GB
3567495168,3567495423,ES
-3567495424,3567497215,GB
-3567497216,3567497727,ES
-3567497728,3567503359,GB
+3567495424,3567503359,GB
3567503360,3567504383,ES
3567504384,3567505151,GB
3567505152,3567505407,ES
-3567505408,3567507455,GB
-3567507456,3567509503,NL
-3567509504,3567509759,GB
-3567509760,3567510271,ES
-3567510272,3567511487,GB
+3567505408,3567511487,GB
3567511488,3567511495,ES
-3567511496,3567512575,GB
-3567512576,3567513599,NL
-3567513600,3567515647,GB
-3567515648,3567517695,ES
+3567511496,3567516671,GB
+3567516672,3567517695,ES
3567517696,3567583231,RU
-3567583232,3567587327,EU
+3567583232,3567583487,AT
+3567583488,3567583743,EU
+3567583744,3567583871,AT
+3567583872,3567583935,EU
+3567583936,3567583999,AT
+3567584000,3567584255,EU
+3567584256,3567584383,AT
+3567584384,3567584399,EU
+3567584400,3567584407,AT
+3567584408,3567584511,EU
+3567584512,3567584639,AT
+3567584640,3567585791,EU
+3567585792,3567586303,GB
+3567586304,3567587327,EU
3567587328,3567591423,GB
3567591424,3567599615,IT
3567599616,3567615999,NL
@@ -76345,15 +76054,11 @@
3567618048,3567619071,IN
3567619072,3567619583,A2
3567619584,3567619839,NG
-3567619840,3567620095,TZ
+3567619840,3567620095,A2
3567620096,3567620351,IN
-3567620352,3567624703,A2
-3567624704,3567625215,LR
-3567625216,3567625727,TZ
-3567625728,3567626239,A2
+3567620352,3567626239,A2
3567626240,3567626751,TZ
-3567626752,3567627008,NG
-3567627009,3567647487,A2
+3567626752,3567647487,A2
3567647488,3567648767,GB
3567648768,3567665151,BE
3567665152,3567673343,ES
@@ -76425,9 +76130,7 @@
3569167872,3569168127,EU
3569168128,3569188863,NL
3569188864,3569221631,IT
-3569221632,3569251327,BE
-3569251328,3569251839,US
-3569251840,3569277183,BE
+3569221632,3569277183,BE
3569277184,3569277439,LU
3569277440,3569287167,BE
3569287168,3569352703,PL
@@ -76436,9 +76139,7 @@
3569614848,3569680383,GB
3569680384,3569713151,SK
3569713152,3569729535,AT
-3569729536,3569741311,FR
-3569741312,3569741823,BE
-3569741824,3569811175,FR
+3569729536,3569811175,FR
3569811176,3569811176,GP
3569811177,3569811455,FR
3569811456,3569876991,IL
@@ -76457,9 +76158,7 @@
3570401280,3570466815,FR
3570466816,3570532351,SE
3570532352,3570597887,IT
-3570597888,3570607103,GB
-3570607104,3570608127,DE
-3570608128,3570614271,GB
+3570597888,3570614271,GB
3570614272,3570617343,DE
3570617344,3570618367,GB
3570618368,3570622207,DE
@@ -76492,13 +76191,10 @@
3571343394,3571343394,DE
3571343395,3571351551,GB
3571351552,3571351807,DE
-3571351808,3571357183,GB
-3571357184,3571357695,DE
-3571357696,3571361279,GB
+3571351808,3571361279,GB
3571361280,3571361535,DE
3571361536,3571384319,GB
-3571384320,3571473919,DE
-3571473920,3571474431,NL
+3571384320,3571474431,DE
3571474432,3571475455,US
3571475456,3571482623,DE
3571482624,3571515391,BE
@@ -76582,34 +76278,27 @@
3574005760,3574071295,CY
3574071296,3574136831,IL
3574136832,3574169599,DE
-3574169600,3574172159,ES
-3574172160,3574176511,GB
-3574176512,3574177023,ES
-3574177024,3574178815,GB
-3574178816,3574180863,ES
-3574180864,3574182143,GB
+3574169600,3574182143,GB
3574182144,3574182399,ES
3574182400,3574183167,GB
3574183168,3574183679,ES
-3574183680,3574184191,GB
-3574184192,3574184703,ES
-3574184704,3574186751,GB
-3574186752,3574190079,ES
-3574190080,3574190591,GB
+3574183680,3574186751,GB
+3574186752,3574188031,ES
+3574188032,3574190591,GB
3574190592,3574190847,EU
3574190848,3574191103,ES
3574191104,3574195199,GB
3574195200,3574196223,ES
-3574196224,3574197247,GB
-3574197248,3574197759,ES
-3574197760,3574198271,GB
+3574196224,3574198271,GB
3574198272,3574199295,ES
3574199296,3574199807,GB
3574199808,3574202367,ES
3574202368,3574267903,NL
3574267904,3574333439,FR
3574333440,3574341631,GB
-3574341632,3574398975,EU
+3574341632,3574348287,EU
+3574348288,3574348543,GB
+3574348544,3574398975,EU
3574398976,3574464511,PT
3574464512,3574530047,TR
3574530048,3574594559,SE
@@ -76640,15 +76329,9 @@
3574693888,3574726655,PL
3574726656,3574792191,GB
3574792192,3574824959,CZ
-3574824960,3574825471,GB
-3574825472,3574825983,NL
-3574825984,3574827007,GB
-3574827008,3574827519,NL
-3574827520,3574830079,GB
+3574824960,3574830079,GB
3574830080,3574831103,NL
-3574831104,3574836735,GB
-3574836736,3574837759,NL
-3574837760,3574857727,GB
+3574831104,3574857727,GB
3574857728,3574923263,DE
3574923264,3574939647,RU
3574939648,3574956031,SE
@@ -76668,9 +76351,7 @@
3575562240,3575578623,DE
3575578624,3575581439,BE
3575581440,3575581695,EU
-3575581696,3575587839,BE
-3575587840,3575588351,GB
-3575588352,3575588863,BE
+3575581696,3575588863,BE
3575588864,3575589119,A2
3575589120,3575589375,BE
3575589376,3575589631,A2
@@ -76701,34 +76382,302 @@
3575873536,3575906303,EE
3575906304,3575971839,FR
3575971840,3576037375,ES
-3576037376,3576040063,EU
+3576037376,3576038207,EU
+3576038208,3576038271,GB
+3576038272,3576038335,EU
+3576038336,3576038463,GB
+3576038464,3576038527,EU
+3576038528,3576038591,GB
+3576038592,3576038911,EU
+3576038912,3576038975,GB
+3576038976,3576039167,EU
+3576039168,3576039231,GB
+3576039232,3576039359,EU
+3576039360,3576039383,GB
+3576039384,3576039391,EU
+3576039392,3576039455,GB
+3576039456,3576039519,EU
+3576039520,3576039551,GB
+3576039552,3576039583,EU
+3576039584,3576039647,GB
+3576039648,3576039807,EU
+3576039808,3576039839,GB
+3576039840,3576039903,EU
+3576039904,3576039935,GB
+3576039936,3576040063,EU
3576040064,3576040127,GB
-3576040128,3576040277,EU
-3576040278,3576040278,GB
-3576040279,3576049151,EU
-3576049152,3576049919,GB
-3576049920,3576053759,EU
-3576053760,3576054847,GB
-3576054848,3576055935,EU
+3576040128,3576040215,EU
+3576040216,3576040223,GB
+3576040224,3576040271,EU
+3576040272,3576040287,GB
+3576040288,3576040351,EU
+3576040352,3576040383,GB
+3576040384,3576040831,EU
+3576040832,3576040959,GB
+3576040960,3576041471,EU
+3576041472,3576041535,GB
+3576041536,3576041727,EU
+3576041728,3576041791,GB
+3576041792,3576041831,EU
+3576041832,3576041847,GB
+3576041848,3576041863,EU
+3576041864,3576041871,GB
+3576041872,3576041879,EU
+3576041880,3576041887,GB
+3576041888,3576041903,EU
+3576041904,3576041919,GB
+3576041920,3576041935,EU
+3576041936,3576041943,GB
+3576041944,3576041951,EU
+3576041952,3576041975,GB
+3576041976,3576042111,EU
+3576042112,3576042239,GB
+3576042240,3576042495,EU
+3576042496,3576042623,GB
+3576042624,3576042687,EU
+3576042688,3576042695,GB
+3576042696,3576042751,EU
+3576042752,3576042815,GB
+3576042816,3576045583,EU
+3576045584,3576045599,GB
+3576045600,3576045663,EU
+3576045664,3576045679,GB
+3576045680,3576045711,EU
+3576045712,3576045735,GB
+3576045736,3576045799,EU
+3576045800,3576045807,GB
+3576045808,3576045815,EU
+3576045816,3576045823,GB
+3576045824,3576048639,EU
+3576048640,3576048767,GB
+3576048768,3576048959,EU
+3576048960,3576049023,GB
+3576049024,3576049151,EU
+3576049152,3576050047,GB
+3576050048,3576053759,EU
+3576053760,3576054911,GB
+3576054912,3576055103,EU
+3576055104,3576055111,GB
+3576055112,3576055119,EU
+3576055120,3576055127,GB
+3576055128,3576055151,EU
+3576055152,3576055167,GB
+3576055168,3576055183,EU
+3576055184,3576055199,GB
+3576055200,3576055207,EU
+3576055208,3576055215,GB
+3576055216,3576055279,EU
+3576055280,3576055551,GB
+3576055552,3576055807,EU
+3576055808,3576055871,GB
+3576055872,3576055935,EU
3576055936,3576055999,GB
-3576056000,3576061687,EU
+3576056000,3576056191,EU
+3576056192,3576056255,GB
+3576056256,3576056319,EU
+3576056320,3576056447,GB
+3576056448,3576056703,EU
+3576056704,3576056767,GB
+3576056768,3576056855,EU
+3576056856,3576056871,GB
+3576056872,3576056879,EU
+3576056880,3576056887,GB
+3576056888,3576056919,EU
+3576056920,3576056927,GB
+3576056928,3576056935,EU
+3576056936,3576056943,GB
+3576056944,3576056951,EU
+3576056952,3576056975,GB
+3576056976,3576056991,EU
+3576056992,3576056999,GB
+3576057000,3576057039,EU
+3576057040,3576057055,GB
+3576057056,3576057631,EU
+3576057632,3576057647,GB
+3576057648,3576057711,EU
+3576057712,3576057743,GB
+3576057744,3576057823,EU
+3576057824,3576057839,GB
+3576057840,3576058879,EU
+3576058880,3576059007,GB
+3576059008,3576059647,EU
+3576059648,3576059679,GB
+3576059680,3576059711,EU
+3576059712,3576059743,GB
+3576059744,3576059775,EU
+3576059776,3576059807,GB
+3576059808,3576060287,EU
+3576060288,3576060351,GB
+3576060352,3576061039,EU
+3576061040,3576061055,GB
+3576061056,3576061119,EU
+3576061120,3576061135,GB
+3576061136,3576061183,EU
+3576061184,3576061247,GB
+3576061248,3576061311,EU
+3576061312,3576061439,GB
+3576061440,3576061583,EU
+3576061584,3576061591,GB
+3576061592,3576061619,EU
+3576061620,3576061631,GB
+3576061632,3576061639,EU
+3576061640,3576061647,GB
+3576061648,3576061687,EU
3576061688,3576061695,GB
-3576061696,3576078143,EU
-3576078144,3576078159,GB
-3576078160,3576085695,EU
+3576061696,3576062463,EU
+3576062464,3576062479,GB
+3576062480,3576064319,EU
+3576064320,3576064448,GB
+3576064449,3576064543,EU
+3576064544,3576064559,GB
+3576064560,3576065407,EU
+3576065408,3576065535,GB
+3576065536,3576065855,EU
+3576065856,3576065887,GB
+3576065888,3576066303,EU
+3576066304,3576066431,GB
+3576066432,3576067071,EU
+3576067072,3576067199,GB
+3576067200,3576068351,EU
+3576068352,3576068479,GB
+3576068480,3576068863,EU
+3576068864,3576068927,GB
+3576068928,3576069055,EU
+3576069056,3576069119,GB
+3576069120,3576069247,EU
+3576069248,3576069279,GB
+3576069280,3576069311,EU
+3576069312,3576069343,GB
+3576069344,3576070695,EU
+3576070696,3576070703,GB
+3576070704,3576070711,EU
+3576070712,3576070719,GB
+3576070720,3576070727,EU
+3576070728,3576070735,GB
+3576070736,3576070775,EU
+3576070776,3576070783,GB
+3576070784,3576071295,EU
+3576071296,3576071423,GB
+3576071424,3576071551,EU
+3576071552,3576071679,GB
+3576071680,3576071935,EU
+3576071936,3576071951,GB
+3576071952,3576072063,EU
+3576072064,3576072079,GB
+3576072080,3576072287,EU
+3576072288,3576072319,GB
+3576072320,3576072415,EU
+3576072416,3576072447,GB
+3576072448,3576073215,EU
+3576073216,3576073279,GB
+3576073280,3576074751,EU
+3576074752,3576074879,GB
+3576074880,3576075263,EU
+3576075264,3576075327,GB
+3576075328,3576075647,EU
+3576075648,3576075711,GB
+3576075712,3576075775,EU
+3576075776,3576075903,GB
+3576075904,3576076271,EU
+3576076272,3576076351,GB
+3576076352,3576076567,EU
+3576076568,3576076575,GB
+3576076576,3576076623,EU
+3576076624,3576076631,GB
+3576076632,3576076783,EU
+3576076784,3576076791,GB
+3576076792,3576077439,EU
+3576077440,3576077471,GB
+3576077472,3576077567,EU
+3576077568,3576077695,GB
+3576077696,3576077935,EU
+3576077936,3576077967,GB
+3576077968,3576078143,EU
+3576078144,3576078175,GB
+3576078176,3576078463,EU
+3576078464,3576078591,GB
+3576078592,3576079999,EU
+3576080000,3576080127,GB
+3576080128,3576080223,EU
+3576080224,3576080255,GB
+3576080256,3576080775,EU
+3576080776,3576080783,GB
+3576080784,3576080791,EU
+3576080792,3576080799,GB
+3576080800,3576080807,EU
+3576080808,3576080815,GB
+3576080816,3576080823,EU
+3576080824,3576080831,GB
+3576080832,3576082079,EU
+3576082080,3576082111,GB
+3576082112,3576082191,EU
+3576082192,3576082223,GB
+3576082224,3576082687,EU
+3576082688,3576082943,GB
+3576082944,3576084479,EU
+3576084480,3576084543,GB
+3576084544,3576084607,EU
+3576084608,3576084671,GB
+3576084672,3576084703,EU
+3576084704,3576084735,GB
+3576084736,3576084863,EU
+3576084864,3576084927,GB
+3576084928,3576085183,EU
+3576085184,3576085215,GB
+3576085216,3576085695,EU
3576085696,3576085711,GB
-3576085712,3576089439,EU
+3576085712,3576086015,EU
+3576086016,3576086143,GB
+3576086144,3576086367,EU
+3576086368,3576086431,GB
+3576086432,3576086495,EU
+3576086496,3576086527,GB
+3576086528,3576086567,EU
+3576086568,3576086571,GB
+3576086572,3576086575,EU
+3576086576,3576086591,GB
+3576086592,3576086599,EU
+3576086600,3576086603,GB
+3576086604,3576087807,EU
+3576087808,3576087823,GB
+3576087824,3576087951,EU
+3576087952,3576087967,GB
+3576087968,3576088031,EU
+3576088032,3576088047,GB
+3576088048,3576088223,EU
+3576088224,3576088231,GB
+3576088232,3576088375,EU
+3576088376,3576088383,GB
+3576088384,3576088479,EU
+3576088480,3576088511,GB
+3576088512,3576088959,EU
+3576088960,3576088967,GB
+3576088968,3576089023,EU
+3576089024,3576089039,GB
+3576089040,3576089439,EU
3576089440,3576089471,GB
-3576089472,3576091967,EU
+3576089472,3576089775,EU
+3576089776,3576089791,GB
+3576089792,3576091407,EU
+3576091408,3576091423,GB
+3576091424,3576091455,EU
+3576091456,3576091479,GB
+3576091480,3576091967,EU
3576091968,3576091983,GB
3576091984,3576091999,EU
3576092000,3576092031,GB
-3576092032,3576092129,EU
-3576092130,3576092130,GB
-3576092131,3576095231,EU
+3576092032,3576092127,EU
+3576092128,3576092159,GB
+3576092160,3576092863,EU
+3576092864,3576092895,GB
+3576092896,3576093063,EU
+3576093064,3576093071,GB
+3576093072,3576093183,EU
+3576093184,3576093247,GB
+3576093248,3576095231,EU
3576095232,3576096767,GB
-3576096768,3576099327,EU
-3576099328,3576100863,GB
+3576096768,3576099071,EU
+3576099072,3576100863,GB
3576100864,3576101375,EU
3576101376,3576135679,GB
3576135680,3576168447,DE
@@ -76793,9 +76742,7 @@
3576823808,3576889343,SE
3576889344,3576954879,NL
3576954880,3576987647,NO
-3576987648,3577001983,GB
-3577001984,3577002495,NL
-3577002496,3577020415,GB
+3576987648,3577020415,GB
3577020416,3577085951,NL
3577085952,3577151487,DE
3577151488,3577153023,RE
@@ -76830,17 +76777,13 @@
3577544704,3577545983,DE
3577545984,3577546111,SE
3577546112,3577610239,DE
-3577610240,3577611775,EU
-3577611776,3577612287,DE
-3577612288,3577618943,EU
-3577618944,3577619455,GB
-3577619456,3577625599,EU
+3577610240,3577625599,EU
3577625600,3577625855,GB
3577625856,3577626111,EU
3577626112,3577626367,GB
3577626368,3577628671,EU
-3577628672,3577630207,CH
-3577630208,3577632511,EU
+3577628672,3577629695,CH
+3577629696,3577632511,EU
3577632512,3577632767,GB
3577632768,3577635839,EU
3577635840,3577636863,DE
@@ -76854,12 +76797,10 @@
3577642240,3577653247,EU
3577653248,3577655295,IT
3577655296,3577663487,EU
-3577663488,3577665023,SE
-3577665024,3577669631,EU
+3577663488,3577664511,SE
+3577664512,3577669631,EU
3577669632,3577670655,BE
-3577670656,3577671167,EU
-3577671168,3577671679,BE
-3577671680,3577675775,EU
+3577670656,3577675775,EU
3577675776,3577741311,PT
3577741312,3578003455,SE
3578003456,3578040319,DE
@@ -76905,9 +76846,7 @@
3579248640,3579346943,RU
3579346944,3579361535,SE
3579361536,3579361791,NO
-3579361792,3579362815,SE
-3579362816,3579363327,NO
-3579363328,3579445247,SE
+3579361792,3579445247,SE
3579445248,3579478015,AT
3579478016,3579527167,FR
3579527168,3579543551,BA
@@ -76924,21 +76863,11 @@
3579740160,3579772927,IE
3579772928,3579838463,DE
3579838464,3580100607,ES
-3580100608,3580103167,SE
-3580103168,3580103679,LV
-3580103680,3580104703,SE
+3580100608,3580104703,SE
3580104704,3580106751,LV
-3580106752,3580107263,SE
-3580107264,3580107775,LV
-3580107776,3580112895,SE
+3580106752,3580112895,SE
3580112896,3580116991,LV
-3580116992,3580133375,SE
-3580133376,3580133887,LV
-3580133888,3580135423,SE
-3580135424,3580135531,EE
-3580135532,3580135532,SE
-3580135533,3580135935,EE
-3580135936,3580137727,SE
+3580116992,3580137727,SE
3580137728,3580137983,HR
3580137984,3580150783,SE
3580150784,3580151039,NL
@@ -76946,31 +76875,30 @@
3580162048,3580164095,EE
3580164096,3580165887,SE
3580165888,3580166143,NL
-3580166144,3580198911,SE
-3580198912,3580199423,LV
-3580199424,3580200959,EE
-3580200960,3580203007,LT
+3580166144,3580201983,SE
+3580201984,3580203007,LT
3580203008,3580203519,SE
3580203520,3580204543,RU
3580204544,3580205055,NL
-3580205056,3580207103,HR
+3580205056,3580206079,SE
+3580206080,3580207103,HR
3580207104,3580208127,LV
-3580208128,3580209151,EE
+3580208128,3580208639,SE
+3580208640,3580209151,EE
3580209152,3580213247,HR
-3580213248,3580214783,LV
-3580214784,3580215295,SE
-3580215296,3580216831,EE
-3580216832,3580220415,SE
-3580220416,3580221439,LV
-3580221440,3580223487,SE
+3580213248,3580214271,LV
+3580214272,3580215295,SE
+3580215296,3580216319,EE
+3580216320,3580223487,SE
3580223488,3580231679,DE
3580231680,3580232447,SE
-3580232448,3580233727,LT
-3580233728,3580234751,SE
-3580234752,3580236799,LT
+3580232448,3580233215,LT
+3580233216,3580234751,SE
+3580234752,3580235263,LT
+3580235264,3580235775,SE
+3580235776,3580236799,LT
3580236800,3580237567,LV
-3580237568,3580237823,SE
-3580237824,3580239871,LV
+3580237568,3580239871,SE
3580239872,3580241919,EE
3580241920,3580243967,SE
3580243968,3580244991,EE
@@ -76982,19 +76910,19 @@
3580258304,3580258815,SE
3580258816,3580260351,DE
3580260352,3580265471,AT
-3580265472,3580265983,SE
-3580265984,3580268543,EE
+3580265472,3580266495,SE
+3580266496,3580268543,EE
3580268544,3580272639,LV
3580272640,3580276735,SE
3580276736,3580280831,NL
3580280832,3580329983,RU
3580329984,3580338175,SE
-3580338176,3580339711,HR
-3580339712,3580340223,EE
+3580338176,3580338431,HR
+3580338432,3580338687,SE
+3580338688,3580339711,HR
+3580339712,3580340223,SE
3580340224,3580344319,LT
-3580344320,3580345343,SE
-3580345344,3580345855,EE
-3580345856,3580354559,SE
+3580344320,3580354559,SE
3580354560,3580362751,LT
3580362752,3580624895,GB
3580624896,3580626943,RU
@@ -77047,20 +76975,19 @@
3581158400,3581159423,EU
3581159424,3581161471,IE
3581161472,3581173759,EU
-3581173760,3581196799,NL
-3581196800,3581197823,EU
-3581197824,3581198335,GB
-3581198336,3581199871,NL
-3581199872,3581203967,EU
-3581203968,3581214719,SE
+3581173760,3581196287,NL
+3581196288,3581198335,EU
+3581198336,3581199359,NL
+3581199360,3581204479,EU
+3581204480,3581214719,SE
3581214720,3581231103,NL
3581231104,3581239295,EU
3581239296,3581241343,NL
3581241344,3581242623,EU
3581242624,3581245439,FR
3581245440,3581255679,EU
-3581255680,3581259263,FR
-3581259264,3581280255,EU
+3581255680,3581258751,FR
+3581258752,3581280255,EU
3581280256,3581411327,BE
3581411328,3581673471,GB
3581673472,3581935615,NL
@@ -77178,9 +77105,7 @@
3582697472,3582705663,FI
3582705664,3582722047,TR
3582722048,3582730239,IT
-3582730240,3582736639,ES
-3582736640,3582737151,DZ
-3582737152,3582737279,ES
+3582730240,3582737279,ES
3582737280,3582737407,DZ
3582737408,3582738431,ES
3582738432,3582746623,DK
@@ -77317,8 +77242,8 @@
3583737856,3583743487,EU
3583743488,3583743743,GB
3583743744,3583743999,IE
-3583744000,3583744383,EU
-3583744384,3583744447,GB
+3583744000,3583744319,EU
+3583744320,3583744447,GB
3583744448,3583744959,EU
3583744960,3583744991,GB
3583744992,3583746047,EU
@@ -77335,8 +77260,7 @@
3583827968,3583836159,CH
3583836160,3583844351,DE
3583844352,3583852543,KZ
-3583852544,3583853055,SG
-3583853056,3583854591,FI
+3583852544,3583854591,FI
3583854592,3583854847,GB
3583854848,3583860735,FI
3583860736,3583868927,HU
@@ -77367,13 +77291,9 @@
3584073728,3584081919,SK
3584081920,3584082007,NL
3584082008,3584082015,AT
-3584082016,3584090111,NL
-3584090112,3584090623,NO
-3584090624,3584090879,NL
+3584082016,3584090879,NL
3584090880,3584091135,NO
-3584091136,3584091391,NL
-3584091392,3584091903,NO
-3584091904,3584092415,NL
+3584091136,3584092415,NL
3584092416,3584092671,NO
3584092672,3584092927,NL
3584092928,3584093695,NO
@@ -77412,15 +77332,14 @@
3584247653,3584247956,NL
3584247957,3584247957,NL
3584247958,3584253951,NL
-3584253952,3584254463,ME
-3584254464,3584255743,AL
+3584253952,3584254975,ME
+3584254976,3584255743,AL
3584255744,3584255999,ME
3584256000,3584260095,AL
3584260096,3584260351,ME
3584260352,3584260607,RS
3584260608,3584260863,US
-3584260864,3584261631,ME
-3584261632,3584262143,AL
+3584260864,3584262143,ME
3584262144,3584270335,SE
3584270336,3584278527,FR
3584278528,3584286719,GB
@@ -77437,11 +77356,7 @@
3584376832,3584393215,DE
3584393216,3584401407,GB
3584401408,3584409599,MT
-3584409600,3584413695,RU
-3584413696,3584414207,GB
-3584414208,3584416255,RU
-3584416256,3584416767,GB
-3584416768,3584417791,RU
+3584409600,3584417791,RU
3584417792,3584434175,GB
3584434176,3584442367,LU
3584442368,3584450559,GB
@@ -77477,7 +77392,13 @@
3584663552,3584671743,FR
3584671744,3584688127,NL
3584688128,3584696319,GB
-3584696320,3584704511,ES
+3584696320,3584701751,ES
+3584701752,3584701823,NL
+3584701824,3584701991,ES
+3584701992,3584702007,CH
+3584702008,3584703095,ES
+3584703096,3584703103,BE
+3584703104,3584704511,ES
3584704512,3584720895,RU
3584720896,3584729087,GB
3584729088,3584737279,DE
@@ -77629,13 +77550,7 @@
3585810432,3585818623,GB
3585818624,3585826815,DE
3585826816,3585835007,RU
-3585835008,3585837055,NL
-3585837056,3585837567,IQ
-3585837568,3585838591,NL
-3585838592,3585839103,NG
-3585839104,3585841663,NL
-3585841664,3585842687,NG
-3585842688,3585843199,NL
+3585835008,3585843199,NL
3585843200,3585851391,NO
3585851392,3585859583,SE
3585859584,3585860607,AF
@@ -77643,7 +77558,8 @@
3585863680,3585864703,RU
3585864704,3585865471,DE
3585865472,3585865727,LB
-3585865728,3585867775,RU
+3585865728,3585867263,RU
+3585867264,3585867775,DE
3585867776,3585875967,NO
3585875968,3585884159,CH
3585884160,3585892351,IQ
@@ -77693,8 +77609,7 @@
3586162688,3586179071,FI
3586179072,3586195455,ES
3586195456,3586203647,RU
-3586203648,3586204159,ZM
-3586204160,3586205695,KE
+3586203648,3586205695,KE
3586205696,3586207743,BW
3586207744,3586207999,ZA
3586208000,3586208255,A2
@@ -77706,21 +77621,14 @@
3586228224,3586244607,BE
3586244608,3586246655,NL
3586246656,3586248703,BE
-3586248704,3586252799,NL
-3586252800,3586253183,BE
-3586253184,3586258943,NL
-3586258944,3586259455,BE
-3586259456,3586269439,NL
-3586269440,3586270207,GB
-3586270208,3586270719,ES
-3586270720,3586270975,GB
+3586248704,3586260991,NL
+3586260992,3586269183,GB
+3586269184,3586269439,NL
+3586269440,3586270975,GB
3586270976,3586271231,ES
3586271232,3586272255,GB
3586272256,3586272511,NL
-3586272512,3586273279,GB
-3586273280,3586276351,NL
-3586276352,3586276863,GB
-3586276864,3586277375,NL
+3586272512,3586277375,GB
3586277376,3586293759,TR
3586293760,3586310143,ES
3586310144,3586326527,CZ
@@ -77856,9 +77764,7 @@
3587375104,3587383295,TR
3587383296,3587391487,CZ
3587391488,3587407871,KZ
-3587407872,3587408895,BE
-3587408896,3587409407,RU
-3587409408,3587412223,BE
+3587407872,3587412223,BE
3587412224,3587413759,NL
3587413760,3587414015,BE
3587414016,3587415039,NL
@@ -77917,7 +77823,7 @@
3588079616,3588095999,CH
3588096000,3588104191,NL
3588104192,3588112383,BG
-3588112384,3588128767,FR
+3588112384,3588128767,RE
3588128768,3588145151,HU
3588145152,3588153343,PL
3588153344,3588161535,RU
@@ -77987,18 +77893,14 @@
3589030144,3589030399,FR
3589030400,3589030911,GB
3589030912,3589031167,NL
-3589031168,3589031935,GB
-3589031936,3589033983,NL
-3589033984,3589034239,GB
+3589031168,3589034239,GB
3589034240,3589034495,EU
-3589034496,3589037055,ES
+3589034496,3589037055,GB
3589037056,3589037311,EU
3589037312,3589037487,NL
3589037488,3589037495,IT
3589037496,3589037567,NL
-3589037568,3589038079,ES
-3589038080,3589040127,NL
-3589040128,3589042175,GB
+3589037568,3589042175,GB
3589042176,3589042431,NL
3589042432,3589043455,GB
3589043456,3589043711,NL
@@ -78038,15 +77940,11 @@
3589554176,3589570559,PS
3589570560,3589580543,GB
3589580544,3589580799,NL
-3589580800,3589581823,GB
-3589581824,3589582335,NL
-3589582336,3589582975,GB
+3589580800,3589582975,GB
3589582976,3589583103,NL
3589583104,3589583871,GB
3589583872,3589584127,NL
-3589584128,3589585407,GB
-3589585408,3589585919,NL
-3589585920,3589586943,GB
+3589584128,3589586943,GB
3589586944,3589603327,RS
3589603328,3589668863,FR
3589668864,3589677055,RU
@@ -78071,10 +77969,8 @@
3589828608,3589828735,EU
3589828736,3589828863,NL
3589828864,3589829631,EU
-3589829632,3589830655,GB
-3589830656,3589831167,DE
-3589831168,3589831679,US
-3589831680,3589832703,EU
+3589829632,3589830143,GB
+3589830144,3589832703,EU
3589832704,3589849087,TR
3589849088,3589865471,GB
3589865472,3589881855,GR
@@ -78110,17 +78006,13 @@
3590244352,3590244607,DE
3590244608,3590245311,FR
3590245312,3590245439,US
-3590245440,3590246399,FR
-3590246400,3590246911,US
-3590246912,3590247167,FR
+3590245440,3590247167,FR
3590247168,3590247231,US
3590247232,3590247295,FR
3590247296,3590247423,US
3590247424,3590247487,FR
3590247488,3590247551,US
-3590247552,3590248447,FR
-3590248448,3590248959,US
-3590248960,3590250239,FR
+3590247552,3590250239,FR
3590250240,3590250495,GR
3590250496,3590250751,IE
3590250752,3590251647,FR
@@ -78140,8 +78032,7 @@
3590256384,3590256735,FR
3590256736,3590256767,BE
3590256768,3590257151,US
-3590257152,3590258175,DE
-3590258176,3590258559,FR
+3590257152,3590258559,FR
3590258560,3590258687,US
3590258688,3590291455,IT
3590291456,3590299647,EG
@@ -78164,13 +78055,10 @@
3590316480,3590316543,US
3590316544,3590322175,GB
3590322176,3590322431,A2
-3590322432,3590322687,GB
-3590322688,3590323199,IQ
-3590323200,3590323711,MW
-3590323712,3590324223,GB
-3590324224,3623891967,US
-3623891968,3623892479,ZA
-3623892480,3624054783,US
+3590322432,3590324223,GB
+3590324224,3623906047,US
+3623906048,3623906303,US
+3623906304,3624054783,US
3624054784,3624056831,ZA
3624056832,3624181759,US
3624181760,3624182783,ZA
@@ -78179,8 +78067,7 @@
3624208384,3624255487,US
3624255488,3624257535,ZA
3624257536,3624271871,US
-3624271872,3624272383,SY
-3624272384,3624283135,CA
+3624271872,3624283135,CA
3624283136,3624284159,US
3624284160,3624286193,CA
3624286194,3624286194,ZA
@@ -78243,11 +78130,7 @@
3625172992,3625287679,US
3625287680,3625295871,CA
3625295872,3625418751,US
-3625418752,3625420031,CA
-3625420032,3625420543,US
-3625420544,3625422591,CA
-3625422592,3625423103,US
-3625423104,3625426943,CA
+3625418752,3625426943,CA
3625426944,3625508863,US
3625508864,3625512959,CA
3625512960,3625574399,US
@@ -78260,9 +78143,7 @@
3625959424,3625961471,GB
3625961472,3625961983,US
3625961984,3625962239,GB
-3625962240,3626091519,US
-3626091520,3626092031,AR
-3626092032,3626222653,US
+3625962240,3626222653,US
3626222654,3626222654,CA
3626222655,3626270719,US
3626270720,3626287103,CA
@@ -78314,17 +78195,9 @@
3628603392,3628604415,US
3628604416,3628605439,GT
3628605440,3628608511,IL
-3628608512,3628609023,VE
-3628609024,3628613631,US
+3628608512,3628613631,US
3628613632,3628614399,ID
-3628614400,3628614911,CO
-3628614912,3628615167,US
-3628615168,3628615679,IL
-3628615680,3628616191,US
-3628616192,3628617215,PR
-3628617216,3628617727,US
-3628617728,3628618239,CO
-3628618240,3628618751,US
+3628614400,3628618751,US
3628618752,3628619775,HN
3628619776,3628622847,US
3628622848,3628623871,PR
@@ -78337,18 +78210,11 @@
3628629760,3628631807,VE
3628631808,3628634111,US
3628634112,3628636159,AR
-3628636160,3628636671,VE
-3628636672,3628637183,US
-3628637184,3628637695,CO
-3628637696,3628638207,US
+3628636160,3628638207,US
3628638208,3628646399,CL
-3628646400,3628646911,US
-3628646912,3628647423,HN
-3628647424,3628647679,US
+3628646400,3628647679,US
3628647680,3628649727,CO
-3628649728,3628654079,US
-3628654080,3628654591,PA
-3628654592,3628655359,US
+3628649728,3628655359,US
3628655360,3628657407,CO
3628657408,3628679167,US
3628679168,3628683263,CA
@@ -78376,9 +78242,7 @@
3630040432,3630040447,CA
3630040448,3630041343,US
3630041344,3630041599,CA
-3630041600,3630046719,US
-3630046720,3630047231,CA
-3630047232,3630049279,US
+3630041600,3630049279,US
3630049280,3630049535,CA
3630049536,3630050047,US
3630050048,3630050303,CA
@@ -78398,7 +78262,9 @@
3630074112,3630074255,CA
3630074256,3630074287,US
3630074288,3630074367,CA
-3630074368,3630081151,US
+3630074368,3630080575,US
+3630080576,3630080639,CA
+3630080640,3630081151,US
3630081152,3630081279,CA
3630081280,3630086375,US
3630086376,3630086383,CA
@@ -78414,14 +78280,14 @@
3630120960,3630129151,CA
3630129152,3630141695,US
3630141696,3630141951,CA
-3630141952,3630146047,US
-3630146048,3630146559,CA
-3630146560,3630147839,US
+3630141952,3630147839,US
3630147840,3630148095,CA
3630148096,3630152959,US
3630152960,3630153215,CA
3630153216,3630157311,US
-3630157312,3630158135,CA
+3630157312,3630157567,CA
+3630157568,3630158079,US
+3630158080,3630158135,CA
3630158136,3630158151,US
3630158152,3630158335,CA
3630158336,3630161407,US
@@ -78434,8 +78300,8 @@
3630168320,3630169087,CA
3630169088,3630309375,US
3630309376,3630317567,CA
-3630317568,3630375423,US
-3630375424,3630383103,CA
+3630317568,3630375167,US
+3630375168,3630383103,CA
3630383104,3630391295,US
3630391296,3630395391,CA
3630395392,3630718975,US
@@ -78444,9 +78310,7 @@
3630745856,3630746111,UG
3630746112,3630746367,US
3630746368,3630746623,UG
-3630746624,3630746879,US
-3630746880,3630747391,TZ
-3630747392,3630780415,US
+3630746624,3630780415,US
3630780416,3630784511,CA
3630784512,3630850047,US
3630850048,3630854143,CA
@@ -78459,15 +78323,13 @@
3631096953,3631112191,US
3631112192,3631112703,VC
3631112704,3631116543,BB
-3631116544,3631117055,GD
-3631117056,3631117439,BB
-3631117440,3631117567,GD
+3631116544,3631117567,GD
3631117568,3631117823,BB
3631117824,3631118079,GD
3631118080,3631118335,BB
3631118336,3631119103,VC
-3631119104,3631120127,BB
-3631120128,3631120383,GD
+3631119104,3631119615,BB
+3631119616,3631120383,GD
3631120384,3631144959,US
3631144960,3631153151,CA
3631153152,3631284223,US
@@ -78524,10 +78386,7 @@
3632971776,3632988159,CA
3632988160,3632994047,US
3632994048,3632994303,US
-3632994304,3633029119,US
-3633029120,3633029631,PY
-3633029632,3633030143,NI
-3633030144,3633031679,US
+3632994304,3633031679,US
3633031680,3633031935,A2
3633031936,3633032191,PG
3633032192,3633036287,US
@@ -78544,18 +78403,11 @@
3633456384,3633456639,AU
3633456640,3633479679,US
3633479680,3633483775,CA
-3633483776,3633545215,US
-3633545216,3633545727,GA
-3633545728,3633547263,US
-3633547264,3633547775,GA
+3633483776,3633547775,US
3633547776,3633548287,NG
3633548288,3633548799,US
3633548800,3633548927,A2
-3633548928,3633549055,US
-3633549056,3633549567,A2
-3633549568,3633550847,US
-3633550848,3633551359,GA
-3633551360,3633552127,US
+3633548928,3633552127,US
3633552128,3633552383,A2
3633552384,3633757439,US
3633757440,3633757695,IN
@@ -78573,9 +78425,7 @@
3633889280,3633893375,CA
3633893376,3633971199,US
3633971200,3634020351,CA
-3634020352,3634037247,US
-3634037248,3634037759,CA
-3634037760,3634053119,US
+3634020352,3634053119,US
3634053120,3634061311,CL
3634061312,3634094079,US
3634094080,3634098175,SE
@@ -78615,26 +78465,15 @@
3635466240,3635470335,CA
3635470336,3635643391,US
3635643392,3635644415,JP
-3635644416,3635645439,US
-3635645440,3635645951,HK
-3635645952,3635646463,TL
-3635646464,3635646975,US
-3635646976,3635647487,GB
-3635647488,3635650559,US
+3635644416,3635650559,US
3635650560,3635652607,HK
3635652608,3635654655,US
-3635654656,3635656191,HK
-3635656192,3635656703,US
+3635654656,3635655679,HK
+3635655680,3635656703,US
3635656704,3635657727,JP
-3635657728,3635659263,US
-3635659264,3635660287,ID
-3635660288,3635660799,US
+3635657728,3635660799,US
3635660800,3635662847,HK
-3635662848,3635670527,US
-3635670528,3635671039,TL
-3635671040,3635674623,US
-3635674624,3635675135,HK
-3635675136,3635871743,US
+3635662848,3635871743,US
3635871744,3635879935,CA
3635879936,3635892223,US
3635892224,3635895785,CA
@@ -78663,9 +78502,9 @@
3636158064,3636158071,CA
3636158072,3636158207,US
3636158208,3636158215,CA
-3636158216,3636162047,US
-3636162048,3636162559,CA
-3636162560,3636166399,US
+3636158216,3636158549,US
+3636158550,3636158550,CA
+3636158551,3636166399,US
3636166400,3636166655,CA
3636166656,3636396031,US
3636396032,3636461567,CA
@@ -78673,15 +78512,11 @@
3636609024,3636621311,CA
3636621312,3636625407,US
3636625408,3636626431,AR
-3636626432,3636626943,BR
-3636626944,3636627455,US
+3636626432,3636627455,US
3636627456,3636628479,MX
-3636628480,3636628991,PE
-3636628992,3636822015,US
+3636628480,3636822015,US
3636822016,3636854783,CA
-3636854784,3636862975,US
-3636862976,3636867071,CA
-3636867072,3636887551,US
+3636854784,3636887551,US
3636887552,3636895743,CA
3636895744,3636906143,US
3636906144,3636906175,BE
@@ -78710,7 +78545,9 @@
3638350080,3638370303,US
3638370304,3638386687,CA
3638386688,3638401087,US
-3638401088,3638401279,CA
+3638401088,3638401119,CA
+3638401120,3638401151,US
+3638401152,3638401279,CA
3638401280,3638509567,US
3638509568,3638534143,CA
3638534144,3638697983,US
@@ -78739,16 +78576,11 @@
3639283712,3639369727,US
3639369728,3639372031,A2
3639372032,3639372287,US
-3639372288,3639375359,A2
-3639375360,3639375871,US
-3639375872,3639376895,A2
-3639376896,3639377407,GU
-3639377408,3639390207,US
+3639372288,3639377663,A2
+3639377664,3639390207,US
3639390208,3639394303,ZA
3639394304,3639395839,US
-3639395840,3639397887,A2
-3639397888,3639398399,US
-3639398400,3639398911,A2
+3639395840,3639398911,A2
3639398912,3639399679,US
3639399680,3639399935,HN
3639399936,3639400447,A2
@@ -78811,9 +78643,7 @@
3640312832,3640313087,TO
3640313088,3640316927,US
3640316928,3640317183,MX
-3640317184,3640318207,US
-3640318208,3640318719,NC
-3640318720,3640348671,US
+3640317184,3640348671,US
3640348672,3640350719,MX
3640350720,3640360959,US
3640360960,3640369151,CA
@@ -78861,8 +78691,8 @@
3641115272,3641115279,US
3641115280,3641132351,DE
3641132352,3641132415,IT
-3641132416,3641150975,DE
-3641150976,3641151232,CN
+3641132416,3641151231,DE
+3641151232,3641151232,CN
3641151233,3641180159,DE
3641180160,3641188351,GB
3641188352,3641192447,TJ
@@ -78923,11 +78753,7 @@
3641475072,3641479167,IT
3641479168,3641483263,GB
3641483264,3641491455,IT
-3641491456,3641493503,UA
-3641493504,3641494015,RU
-3641494016,3641495551,UA
-3641495552,3641496063,RU
-3641496064,3641499647,UA
+3641491456,3641499647,UA
3641499648,3641503743,SA
3641503744,3641507839,RU
3641507840,3641516031,NO
@@ -78966,8 +78792,8 @@
3641659392,3641663487,FR
3641663488,3641667583,MT
3641667584,3641669119,GB
-3641669120,3641670655,ZW
-3641670656,3641671167,GB
+3641669120,3641670271,ZW
+3641670272,3641671167,GB
3641671168,3641671423,ZW
3641671424,3641671679,GB
3641671680,3641679871,RU
@@ -78999,7 +78825,9 @@
3641774080,3641778175,DE
3641778176,3641782271,PL
3641782272,3641782783,BG
-3641782784,3641784575,GB
+3641782784,3641783039,GB
+3641783040,3641784063,BG
+3641784064,3641784575,GB
3641784576,3641786367,BG
3641786368,3641790463,SE
3641790464,3641794559,LT
@@ -79158,9 +78986,7 @@
3642429440,3642433535,GB
3642433536,3642435583,CY
3642435584,3642436607,RU
-3642436608,3642437119,CY
-3642437120,3642437631,GB
-3642437632,3642441727,CY
+3642436608,3642441727,CY
3642441728,3642449919,IT
3642449920,3642454015,CH
3642454016,3642458111,IT
@@ -79188,7 +79014,9 @@
3642535936,3642540031,IS
3642540032,3642544127,SE
3642544128,3642552319,RU
-3642552320,3642556415,UA
+3642552320,3642554198,UA
+3642554199,3642554199,RU
+3642554200,3642556415,UA
3642556416,3642560511,CZ
3642560512,3642561279,US
3642561280,3642561535,KG
@@ -79264,7 +79092,9 @@
3644911616,3644915711,BE
3644915712,3644919807,RU
3644919808,3644923903,DE
-3644923904,3644927999,IL
+3644923904,3644924927,IL
+3644924928,3644925183,US
+3644925184,3644927999,IL
3644928000,3644932095,GI
3644932096,3644936191,IT
3644936192,3644940287,RU
@@ -79276,9 +79106,7 @@
3644968960,3644973055,RU
3644973056,3644977151,NO
3644977152,3644981247,UA
-3644981248,3644983807,BE
-3644983808,3644984319,NL
-3644984320,3644985343,BE
+3644981248,3644985343,BE
3644985344,3644989439,RU
3644989440,3644997631,DE
3644997632,3645005823,RU
@@ -79314,7 +79142,9 @@
3645136896,3645145087,NO
3645145088,3645149183,GB
3645149184,3645161471,DE
-3645161472,3645165567,AT
+3645161472,3645163519,AT
+3645163520,3645164031,GB
+3645164032,3645165567,AT
3645165568,3645169663,TR
3645169664,3645173759,CH
3645173760,3645177855,GB
@@ -79436,17 +79266,11 @@
3645657088,3645661183,SE
3645661184,3645665279,DE
3645665280,3645669375,PL
-3645669376,3645669887,PT
-3645669888,3645670399,ES
-3645670400,3645670911,FR
+3645669376,3645670911,PT
3645670912,3645673471,ES
3645673472,3645673535,PT
3645673536,3645674239,ES
-3645674240,3645674495,PT
-3645674496,3645675007,ES
-3645675008,3645676031,PT
-3645676032,3645676543,ES
-3645676544,3645676799,PT
+3645674240,3645676799,PT
3645676800,3645677567,ES
3645677568,3645681663,AT
3645681664,3645685759,RU
@@ -79535,8 +79359,7 @@
3647966208,3647967231,GB
3647967232,3647968255,BE
3647968256,3647969279,FR
-3647969280,3647969791,IT
-3647969792,3647970047,DE
+3647969280,3647970047,DE
3647970048,3647970303,BE
3647970304,3647971327,DE
3647971328,3647972351,GB
@@ -79558,9 +79381,7 @@
3647984032,3647984047,NL
3647984048,3647984127,DE
3647984128,3647984383,NL
-3647984384,3647984639,DE
-3647984640,3647985151,DK
-3647985152,3647985663,BE
+3647984384,3647985663,DE
3647985664,3647986687,ES
3647986688,3647986943,DE
3647986944,3647987199,ES
@@ -79568,20 +79389,13 @@
3647987456,3647987711,ES
3647987712,3647988735,IT
3647988736,3647989759,BE
-3647989760,3647990783,DE
-3647990784,3647991807,ES
-3647991808,3647992831,DE
-3647992832,3647993343,BE
-3647993344,3647993855,DE
-3647993856,3647994367,BE
-3647994368,3647994879,NR
-3647994880,3647995903,BE
+3647989760,3647993087,DE
+3647993088,3647993343,BE
+3647993344,3647995519,DE
+3647995520,3647995583,BE
+3647995584,3647995903,DE
3647995904,3648004095,RU
-3648004096,3648005119,GB
-3648005120,3648006143,RU
-3648006144,3648006655,GB
-3648006656,3648007167,RU
-3648007168,3648008191,GB
+3648004096,3648008191,GB
3648008192,3648016383,FR
3648016384,3648020479,GB
3648020480,3648024575,IT
@@ -79612,9 +79426,7 @@
3648080544,3648080639,BE
3648080640,3648080895,GA
3648080896,3648081151,ZM
-3648081152,3648081407,BE
-3648081408,3648081919,MW
-3648081920,3648082239,BE
+3648081152,3648082239,BE
3648082240,3648082311,NE
3648082312,3648084223,BE
3648084224,3648084479,CD
@@ -79632,9 +79444,7 @@
3648126976,3648139263,RU
3648139264,3648143359,GB
3648143360,3648147455,DE
-3648147456,3648149503,SE
-3648149504,3648150015,GB
-3648150016,3648151551,SE
+3648147456,3648151551,SE
3648151552,3648155647,NL
3648155648,3648159743,CH
3648159744,3648163839,ES
@@ -79697,9 +79507,7 @@
3648413696,3648417791,SK
3648417792,3648425983,GB
3648425984,3648430079,IT
-3648430080,3648432639,NL
-3648432640,3648433151,DE
-3648433152,3648434175,NL
+3648430080,3648434175,NL
3648434176,3648438271,RU
3648438272,3648442367,CH
3648442368,3648446463,SE
@@ -79719,8 +79527,8 @@
3648499712,3648503807,FR
3648503808,3648511999,DE
3648512000,3648516095,NL
-3648516096,3648518143,RS
-3648518144,3648520191,MK
+3648516096,3648519167,RS
+3648519168,3648520191,MK
3648520192,3648782335,NL
3648782336,3649044479,ES
3649044480,3649110015,FR
@@ -79729,21 +79537,21 @@
3649241088,3649306623,TR
3649306624,3649372159,IL
3649372160,3649437695,IT
-3649437696,3649568767,GB
+3649437696,3649512191,GB
+3649512192,3649512447,FR
+3649512448,3649568767,GB
3649568768,3649634303,BE
3649634304,3649765375,GB
3649765376,3649830911,EG
3649830912,3649831167,NL
3649831168,3649831423,EU
3649831424,3649835007,NL
-3649835008,3649838079,ES
-3649838080,3649839103,NL
+3649835008,3649837055,ES
+3649837056,3649839103,NL
3649839104,3649840127,GB
-3649840128,3649840639,NL
-3649840640,3649843199,GB
-3649843200,3649845247,NL
-3649845248,3649845759,GB
-3649845760,3649847817,NL
+3649840128,3649841151,NL
+3649841152,3649843199,GB
+3649843200,3649847817,NL
3649847818,3649855487,DE
3649855488,3649856511,GB
3649856512,3649857535,US
@@ -79878,7 +79686,8 @@
3650519040,3650523135,HU
3650523136,3650527231,DE
3650527232,3650534911,SE
-3650534912,3650535423,NL
+3650534912,3650535167,NL
+3650535168,3650535423,SE
3650535424,3650539519,RU
3650539520,3650543615,ES
3650543616,3650548109,CH
@@ -79902,12 +79711,9 @@
3650600960,3650605055,SE
3650605056,3650609180,DE
3650609181,3650609181,LB
-3650609182,3650610175,DE
-3650610176,3650610687,KZ
-3650610688,3650611711,DE
+3650609182,3650611711,DE
3650611712,3650611967,LB
-3650611968,3650612735,KZ
-3650612736,3650617343,DE
+3650611968,3650617343,DE
3650617344,3650682879,FI
3650682880,3650748415,PL
3650748416,3650879487,GB
@@ -79932,33 +79738,61 @@
3650944512,3650945023,FR
3650945024,3651010559,DK
3651010560,3651076095,GB
-3651076096,3651079423,DE
-3651079424,3651079807,GB
-3651079808,3651081215,DE
-3651081216,3651081727,GB
-3651081728,3651084031,DE
-3651084032,3651084543,FR
-3651084544,3651108863,DE
+3651076096,3651108863,DE
3651108864,3651141631,EE
-3651141632,3651148287,DE
-3651148288,3651148799,ES
-3651148800,3651200511,DE
-3651200512,3651201023,PL
-3651201024,3651205631,DE
-3651205632,3651206143,ES
-3651206144,3651206655,DE
-3651206656,3651207167,ES
-3651207168,3651207679,EU
-3651207680,3651208703,GB
-3651208704,3651209727,EU
-3651209728,3651210751,GB
-3651210752,3651219455,EU
+3651141632,3651207167,DE
+3651207168,3651207199,GB
+3651207200,3651207223,EU
+3651207224,3651207295,GB
+3651207296,3651207423,EU
+3651207424,3651207615,GB
+3651207616,3651207647,EU
+3651207648,3651208959,GB
+3651208960,3651209215,EU
+3651209216,3651209231,US
+3651209232,3651209239,GB
+3651209240,3651209243,DE
+3651209244,3651209471,EU
+3651209472,3651210751,GB
+3651210752,3651211263,EU
+3651211264,3651211775,IR
+3651211776,3651213823,EU
+3651213824,3651214207,US
+3651214208,3651215359,EU
+3651215360,3651215395,GB
+3651215396,3651215615,EU
+3651215616,3651215871,GB
+3651215872,3651217407,EU
+3651217408,3651217535,GI
+3651217536,3651219455,EU
3651219456,3651219967,US
-3651219968,3651221503,EU
+3651219968,3651220383,EU
+3651220384,3651220415,GB
+3651220416,3651220431,EU
+3651220432,3651220479,GB
+3651220480,3651221503,EU
3651221504,3651221695,GB
-3651221696,3651230719,EU
+3651221696,3651223551,EU
+3651223552,3651223567,GB
+3651223568,3651223583,EU
+3651223584,3651223607,GB
+3651223608,3651223647,EU
+3651223648,3651223663,ES
+3651223664,3651227135,EU
+3651227136,3651227391,GB
+3651227392,3651230719,EU
3651230720,3651231743,MU
-3651231744,3651239935,EU
+3651231744,3651232255,EU
+3651232256,3651232287,GB
+3651232288,3651232319,EU
+3651232320,3651232383,GB
+3651232384,3651232447,EU
+3651232448,3651232511,GB
+3651232512,3651233791,EU
+3651233792,3651233855,GB
+3651233856,3651237375,EU
+3651237376,3651237631,SC
+3651237632,3651239935,EU
3651239936,3651272703,GB
3651272704,3651338239,CH
3651338240,3651350783,GB
@@ -80021,9 +79855,7 @@
3651908608,3651908863,US
3651908864,3651909046,DE
3651909047,3651909047,IQ
-3651909048,3651909631,DE
-3651909632,3651910143,IQ
-3651910144,3651911679,DE
+3651909048,3651911679,DE
3651911680,3651915775,NO
3651915776,3651919871,IS
3651919872,3651921919,NL
@@ -80038,15 +79870,17 @@
3651936768,3651937023,DE
3651937024,3651938047,FR
3651938048,3651939071,DE
-3651939072,3651941119,FR
-3651941120,3651942911,DE
-3651942912,3651944447,FR
+3651939072,3651939839,FR
+3651939840,3651940351,DE
+3651940352,3651941119,FR
+3651941120,3651943423,DE
+3651943424,3651944447,FR
3651944448,3651948543,ES
3651948544,3651952639,FO
3651952640,3651953663,IR
3651953664,3651954687,AE
-3651954688,3651958271,IR
-3651958272,3651960831,AE
+3651954688,3651957759,IR
+3651957760,3651960831,AE
3651960832,3651964927,GB
3651964928,3651969023,SK
3651969024,3651977215,DE
@@ -80114,9 +79948,7 @@
3653386240,3653390335,DE
3653390336,3653394431,FR
3653394432,3653402623,NL
-3653402624,3653403135,GB
-3653403136,3653403647,CD
-3653403648,3653407487,GB
+3653402624,3653407487,GB
3653407488,3653407743,US
3653407744,3653407999,GB
3653408000,3653408255,US
@@ -80138,8 +79970,7 @@
3653431296,3653435391,RU
3653435392,3653439487,DE
3653439488,3653443583,FR
-3653443584,3653447167,DE
-3653447168,3653447679,NL
+3653443584,3653447679,DE
3653447680,3653451775,LV
3653451776,3653464063,RU
3653464064,3653468159,NL
@@ -80189,7 +80020,9 @@
3653656576,3653660671,GB
3653660672,3653664767,CZ
3653664768,3653665791,NL
-3653665792,3653668863,DE
+3653665792,3653666815,DE
+3653666816,3653667839,NL
+3653667840,3653668863,DE
3653668864,3653672959,SE
3653672960,3653681151,RU
3653681152,3653685247,ES
@@ -80214,15 +80047,11 @@
3654608405,3654608405,NO
3654608406,3654608895,SE
3654608896,3654609919,NO
-3654609920,3654613503,SE
-3654613504,3654614015,NO
-3654614016,3654811647,SE
+3654609920,3654811647,SE
3654811648,3654942719,ES
3654942720,3655073791,IR
3655073792,3655335935,IT
-3655335936,3656635647,DE
-3656635648,3656635903,GB
-3656635904,3657433087,DE
+3655335936,3657433087,DE
3657433088,3659530239,CN
3659530240,3659595775,TW
3659595776,3659628543,ID
diff --git a/src/config/geoip-manual b/src/config/geoip-manual
index ff9be5691..ee217fc9b 100644
--- a/src/config/geoip-manual
+++ b/src/config/geoip-manual
@@ -69,19 +69,11 @@
# US. -KL 2012-11-27
"70.232.245.60","70.232.245.255","1189672252","1189672447","US","United States"
-# SE, because previous MaxMind entry 80.67.11.200-80.67.13.255 is SE, and
-# RIR delegation files say entire range 80.67.0.0-80.67.15.255 is SE.
-# -KL 2013-03-07
-"80.67.14.0","80.67.15.255","1346571776","1346572287","SE","Sweden"
-
# NL, because previous MaxMind entry 81.171.56.0-81.171.80.255 is NL, and
# RIR delegation files say entire range 81.171.64.0-81.171.127.255 is NL.
# -KL 2013-03-07
"81.171.81.0","81.171.81.127","1370181888","1370182015","NL","Netherlands"
-# GB, because RIPE NCC says 85.237.192.0-85.237.223.255 is GB.
-"85.237.222.0","85.237.222.255","1441652224","1441652479","GB","United Kingdom"
-
# BE, because next MaxMind entry 86.39.147.0-86.39.148.31 is BE, and RIR
# delegation files say entire range 86.39.128.0-86.39.255.255 is BE.
# -KL 2013-04-08
@@ -103,6 +95,10 @@
# -KL 2012-11-27
"91.238.214.0","91.238.215.255","1542379008","1542379519","GB","United Kingdom"
+# US, because ARIN says US for 198.159.0.0-198.159.255.255 and because
+# previous MaxMind entry is US, too. -KL 2013-08-12
+"98.159.239.0","98.159.239.255","1654648576","1654648831","US","United States"
+
# NL, because next MaxMind entry 176.56.173.0-176.56.173.63 is NL, and RIR
# delegation files say 176.56.160.0-176.56.191.255 is NL. -KL 2013-05-13
"176.56.172.0","176.56.172.255","2956504064","2956504319","NL","Netherlands"
@@ -127,6 +123,10 @@
# delegation files, too. -KL 2013-05-13
"185.25.84.0","185.25.87.255","3105444864","3105445887","GB","United Kingdom"
+# US, because ARIN says US for 192.238.16.0-192.238.23.255 and because
+# next MaxMind entry is US, too. -KL 2013-08-12
+"192.238.16.0","192.238.19.255","3236827136","3236828159","US","United States"
+
# EU, despite neither previous (RU) nor next (UA) MaxMind entry being EU,
# but because RIR delegation files agree with both previous and next
# MaxMind entry and say EU for 193.200.150.0-193.200.150.255.
@@ -144,12 +144,9 @@
"199.101.192.0","199.101.192.255","3345334272","3345334527","US","United States"
# US, because ARIN says 199.255.208.0-199.255.215.255 is US.
-"199.255.213.0","199.255.215.255","3355432192","3355432959","US","United States"
-
-# US, because next MaxMind entry 204.12.162.0-204.12.197.119 is US, and
-# RIR delegation files say 204.12.160.0-204.12.191.255 is US.
-# -KL 2013-05-13
-"204.12.160.0","204.12.161.255","3423379456","3423379967","US","United States"
+# Changed entry start from 199.255.213.0 to 199.255.208.0 on 2013-08-12.
+# -KL 2013-08-12
+"199.255.208.0","199.255.215.255","3355430912","3355432959","US","United States"
# US, because previous MaxMind entry 209.58.176.144-209.59.31.255 is US,
# and RIR delegation files say 209.59.32.0-209.59.63.255 is US.
diff --git a/src/ext/eventdns.c b/src/ext/eventdns.c
index 66280cccd..8b934c443 100644
--- a/src/ext/eventdns.c
+++ b/src/ext/eventdns.c
@@ -2298,6 +2298,10 @@ _evdns_nameserver_add_impl(const struct sockaddr *address,
evtimer_set(&ns->timeout_event, nameserver_prod_callback, ns);
+#if 1
+ ns->socket = tor_open_socket_nonblocking(address->sa_family, SOCK_DGRAM, 0);
+ if (!SOCKET_OK(ns->socket)) { err = 1; goto out1; }
+#else
ns->socket = tor_open_socket(address->sa_family, SOCK_DGRAM, 0);
if (ns->socket < 0) { err = 1; goto out1; }
#ifdef _WIN32
@@ -2314,6 +2318,7 @@ _evdns_nameserver_add_impl(const struct sockaddr *address,
}
#endif
+#endif /* 1 */
if (global_bind_addr_is_set &&
!sockaddr_is_loopback((struct sockaddr*)&global_bind_address)) {
if (bind(ns->socket, (struct sockaddr *)&global_bind_address,
@@ -3473,8 +3478,12 @@ main(int c, char **v) {
if (servertest) {
int sock;
struct sockaddr_in my_addr;
+#if 1
+ sock = tor_open_socket_nonblocking(PF_INET, SOCK_DGRAM, 0)
+#else
sock = tor_open_socket(PF_INET, SOCK_DGRAM, 0);
fcntl(sock, F_SETFL, O_NONBLOCK);
+#endif
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(10053);
my_addr.sin_addr.s_addr = INADDR_ANY;
diff --git a/src/or/addressmap.c b/src/or/addressmap.c
index 79e4b7c5e..9bc79bd84 100644
--- a/src/or/addressmap.c
+++ b/src/or/addressmap.c
@@ -798,7 +798,7 @@ address_is_in_virtual_range(const char *address)
/** Return a random address conforming to the virtual address configuration
* in <b>conf</b>.
*/
-/* private */ void
+STATIC void
get_random_virtual_addr(const virtual_addr_conf_t *conf, tor_addr_t *addr_out)
{
uint8_t tmp[4];
diff --git a/src/or/addressmap.h b/src/or/addressmap.h
index 40210ee99..417832b31 100644
--- a/src/or/addressmap.h
+++ b/src/or/addressmap.h
@@ -7,6 +7,8 @@
#ifndef TOR_ADDRESSMAP_H
#define TOR_ADDRESSMAP_H
+#include "testsupport.h"
+
void addressmap_init(void);
void addressmap_clear_excluded_trackexithosts(const or_options_t *options);
void addressmap_clear_invalid_automaps(const or_options_t *options);
@@ -52,8 +54,8 @@ typedef struct virtual_addr_conf_t {
maskbits_t bits;
} virtual_addr_conf_t;
-void get_random_virtual_addr(const virtual_addr_conf_t *conf,
- tor_addr_t *addr_out);
+STATIC void get_random_virtual_addr(const virtual_addr_conf_t *conf,
+ tor_addr_t *addr_out);
#endif
#endif
diff --git a/src/or/buffers.c b/src/or/buffers.c
index c4c847ec8..50016d3a8 100644
--- a/src/or/buffers.c
+++ b/src/or/buffers.c
@@ -19,6 +19,7 @@
#include "connection_or.h"
#include "control.h"
#include "reasons.h"
+#include "ext_orport.h"
#include "../common/util.h"
#include "../common/torlog.h"
#ifdef HAVE_UNISTD_H
@@ -1294,7 +1295,7 @@ buf_matches_at_pos(const buf_pos_t *pos, const char *s, size_t n)
/** Return the first position in <b>buf</b> at which the <b>n</b>-character
* string <b>s</b> occurs, or -1 if it does not occur. */
-/*private*/ int
+STATIC int
buf_find_string_offset(const buf_t *buf, const char *s, size_t n)
{
buf_pos_t pos;
@@ -1702,6 +1703,64 @@ fetch_from_evbuffer_socks(struct evbuffer *buf, socks_request_t *req,
}
#endif
+/** The size of the header of an Extended ORPort message: 2 bytes for
+ * COMMAND, 2 bytes for BODYLEN */
+#define EXT_OR_CMD_HEADER_SIZE 4
+
+/** Read <b>buf</b>, which should contain an Extended ORPort message
+ * from a transport proxy. If well-formed, create and populate
+ * <b>out</b> with the Extended ORport message. Return 0 if the
+ * buffer was incomplete, 1 if it was well-formed and -1 if we
+ * encountered an error while parsing it. */
+int
+fetch_ext_or_command_from_buf(buf_t *buf, ext_or_cmd_t **out)
+{
+ char hdr[EXT_OR_CMD_HEADER_SIZE];
+ uint16_t len;
+
+ check();
+ if (buf->datalen < EXT_OR_CMD_HEADER_SIZE)
+ return 0;
+ peek_from_buf(hdr, sizeof(hdr), buf);
+ len = ntohs(get_uint16(hdr+2));
+ if (buf->datalen < (unsigned)len + EXT_OR_CMD_HEADER_SIZE)
+ return 0;
+ *out = ext_or_cmd_new(len);
+ (*out)->cmd = ntohs(get_uint16(hdr));
+ (*out)->len = len;
+ buf_remove_from_front(buf, EXT_OR_CMD_HEADER_SIZE);
+ fetch_from_buf((*out)->body, len, buf);
+ return 1;
+}
+
+#ifdef USE_BUFFEREVENTS
+/** Read <b>buf</b>, which should contain an Extended ORPort message
+ * from a transport proxy. If well-formed, create and populate
+ * <b>out</b> with the Extended ORport message. Return 0 if the
+ * buffer was incomplete, 1 if it was well-formed and -1 if we
+ * encountered an error while parsing it. */
+int
+fetch_ext_or_command_from_evbuffer(struct evbuffer *buf, ext_or_cmd_t **out)
+{
+ char hdr[EXT_OR_CMD_HEADER_SIZE];
+ uint16_t len;
+ size_t buf_len = evbuffer_get_length(buf);
+
+ if (buf_len < EXT_OR_CMD_HEADER_SIZE)
+ return 0;
+ evbuffer_copyout(buf, hdr, EXT_OR_CMD_HEADER_SIZE);
+ len = ntohs(get_uint16(hdr+2));
+ if (buf_len < (unsigned)len + EXT_OR_CMD_HEADER_SIZE)
+ return 0;
+ *out = ext_or_cmd_new(len);
+ (*out)->cmd = ntohs(get_uint16(hdr));
+ (*out)->len = len;
+ evbuffer_drain(buf, EXT_OR_CMD_HEADER_SIZE);
+ evbuffer_remove(buf, (*out)->body, len);
+ return 1;
+}
+#endif
+
/** Implementation helper to implement fetch_from_*_socks. Instead of looking
* at a buffer's contents, we look at the <b>datalen</b> bytes of data in
* <b>data</b>. Instead of removing data from the buffer, we set
diff --git a/src/or/buffers.h b/src/or/buffers.h
index c947f0ba9..48b118520 100644
--- a/src/or/buffers.h
+++ b/src/or/buffers.h
@@ -12,6 +12,8 @@
#ifndef TOR_BUFFERS_H
#define TOR_BUFFERS_H
+#include "testsupport.h"
+
buf_t *buf_new(void);
buf_t *buf_new_with_capacity(size_t size);
void buf_free(buf_t *buf);
@@ -51,6 +53,8 @@ int fetch_from_buf_line(buf_t *buf, char *data_out, size_t *data_len);
int peek_buf_has_control0_command(buf_t *buf);
+int fetch_ext_or_command_from_buf(buf_t *buf, ext_or_cmd_t **out);
+
#ifdef USE_BUFFEREVENTS
int fetch_var_cell_from_evbuffer(struct evbuffer *buf, var_cell_t **out,
int linkproto);
@@ -66,6 +70,8 @@ int peek_evbuffer_has_control0_command(struct evbuffer *buf);
int write_to_evbuffer_zlib(struct evbuffer *buf, tor_zlib_state_t *state,
const char *data, size_t data_len,
int done);
+int fetch_ext_or_command_from_evbuffer(struct evbuffer *buf,
+ ext_or_cmd_t **out);
#endif
#ifdef USE_BUFFEREVENTS
@@ -75,6 +81,8 @@ int write_to_evbuffer_zlib(struct evbuffer *buf, tor_zlib_state_t *state,
#define generic_buffer_get(b,buf,buflen) evbuffer_remove((b),(buf),(buflen))
#define generic_buffer_clear(b) evbuffer_drain((b), evbuffer_get_length((b)))
#define generic_buffer_free(b) evbuffer_free((b))
+#define generic_buffer_fetch_ext_or_cmd(b, out) \
+ fetch_ext_or_command_from_evbuffer((b), (out))
#else
#define generic_buffer_new() buf_new()
#define generic_buffer_len(b) buf_datalen((b))
@@ -82,6 +90,8 @@ int write_to_evbuffer_zlib(struct evbuffer *buf, tor_zlib_state_t *state,
#define generic_buffer_get(b,buf,buflen) fetch_from_buf((buf),(buflen),(b))
#define generic_buffer_clear(b) buf_clear((b))
#define generic_buffer_free(b) buf_free((b))
+#define generic_buffer_fetch_ext_or_cmd(b, out) \
+ fetch_ext_or_command_from_buf((b), (out))
#endif
int generic_buffer_set_to_copy(generic_buffer_t **output,
const generic_buffer_t *input);
@@ -89,7 +99,7 @@ int generic_buffer_set_to_copy(generic_buffer_t **output,
void assert_buf_ok(buf_t *buf);
#ifdef BUFFERS_PRIVATE
-int buf_find_string_offset(const buf_t *buf, const char *s, size_t n);
+STATIC int buf_find_string_offset(const buf_t *buf, const char *s, size_t n);
#endif
#endif
diff --git a/src/or/channel.c b/src/or/channel.c
index 98c23d91e..7f395490c 100644
--- a/src/or/channel.c
+++ b/src/or/channel.c
@@ -2361,7 +2361,7 @@ channel_do_open_actions(channel_t *chan)
started_here = channel_is_outgoing(chan);
if (started_here) {
- circuit_build_times_network_is_live(&circ_times);
+ circuit_build_times_network_is_live(get_circuit_build_times_mutable());
rep_hist_note_connect_succeeded(chan->identity_digest, now);
if (entry_guard_register_connect_status(
chan->identity_digest, 1, 0, now) < 0) {
@@ -2379,8 +2379,14 @@ channel_do_open_actions(channel_t *chan)
/* only report it to the geoip module if it's not a known router */
if (!router_get_by_id_digest(chan->identity_digest)) {
if (channel_get_addr_if_possible(chan, &remote_addr)) {
- geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &remote_addr,
+ char *transport_name = NULL;
+ if (chan->get_transport_name(chan, &transport_name) < 0)
+ transport_name = NULL;
+
+ geoip_note_client_seen(GEOIP_CLIENT_CONNECT,
+ &remote_addr, transport_name,
now);
+ tor_free(transport_name);
}
/* Otherwise the underlying transport can't tell us this, so skip it */
}
@@ -3090,7 +3096,7 @@ channel_get_for_extend(const char *digest,
if (chan->state != CHANNEL_STATE_OPEN) {
/* If the address matches, don't launch a new connection for this
* circuit. */
- if (!channel_matches_target_addr_for_extend(chan, target_addr))
+ if (channel_matches_target_addr_for_extend(chan, target_addr))
++n_inprogress_goodaddr;
continue;
}
@@ -4106,7 +4112,7 @@ channel_matches_extend_info(channel_t *chan, extend_info_t *extend_info)
}
/**
- * Check if a channel matches a given target address
+ * Check if a channel matches a given target address; return true iff we do.
*
* This function calls into the lower layer and asks if this channel thinks
* it matches a given target address for circuit extension purposes.
diff --git a/src/or/channel.h b/src/or/channel.h
index 83d7e900f..430a0251a 100644
--- a/src/or/channel.h
+++ b/src/or/channel.h
@@ -10,7 +10,6 @@
#define TOR_CHANNEL_H
#include "or.h"
-#include "tor_queue.h"
#include "circuitmux.h"
/* Channel handler function pointer typedefs */
@@ -84,6 +83,8 @@ struct channel_s {
* available.
*/
int (*get_remote_addr)(channel_t *, tor_addr_t *);
+ int (*get_transport_name)(channel_t *chan, char **transport_out);
+
#define GRD_FLAG_ORIGINAL 1
#define GRD_FLAG_ADDR_ONLY 2
/*
diff --git a/src/or/channeltls.c b/src/or/channeltls.c
index 60693daeb..ca9e10b3f 100644
--- a/src/or/channeltls.c
+++ b/src/or/channeltls.c
@@ -55,6 +55,8 @@ static void channel_tls_close_method(channel_t *chan);
static const char * channel_tls_describe_transport_method(channel_t *chan);
static int
channel_tls_get_remote_addr_method(channel_t *chan, tor_addr_t *addr_out);
+static int
+channel_tls_get_transport_name_method(channel_t *chan, char **transport_out);
static const char *
channel_tls_get_remote_descr_method(channel_t *chan, int flags);
static int channel_tls_has_queued_writes_method(channel_t *chan);
@@ -114,6 +116,7 @@ channel_tls_common_init(channel_tls_t *tlschan)
chan->describe_transport = channel_tls_describe_transport_method;
chan->get_remote_addr = channel_tls_get_remote_addr_method;
chan->get_remote_descr = channel_tls_get_remote_descr_method;
+ chan->get_transport_name = channel_tls_get_transport_name_method;
chan->has_queued_writes = channel_tls_has_queued_writes_method;
chan->is_canonical = channel_tls_is_canonical_method;
chan->matches_extend_info = channel_tls_matches_extend_info_method;
@@ -406,6 +409,30 @@ channel_tls_get_remote_addr_method(channel_t *chan, tor_addr_t *addr_out)
}
/**
+ * Get the name of the pluggable transport used by a channel_tls_t.
+ *
+ * This implements the get_transport_name for channel_tls_t. If the
+ * channel uses a pluggable transport, copy its name to
+ * <b>transport_out</b> and return 0. If the channel did not use a
+ * pluggable transport, return -1. */
+
+static int
+channel_tls_get_transport_name_method(channel_t *chan, char **transport_out)
+{
+ channel_tls_t *tlschan = BASE_CHAN_TO_TLS(chan);
+
+ tor_assert(tlschan);
+ tor_assert(transport_out);
+ tor_assert(tlschan->conn);
+
+ if (!tlschan->conn->ext_or_transport)
+ return -1;
+
+ *transport_out = tor_strdup(tlschan->conn->ext_or_transport);
+ return 0;
+}
+
+/**
* Get endpoint description of a channel_tls_t
*
* This implements the get_remote_descr method for channel_tls_t; it returns
@@ -546,7 +573,7 @@ channel_tls_matches_extend_info_method(channel_t *chan,
}
/**
- * Check if we match a target address
+ * Check if we match a target address; return true iff we do.
*
* This implements the matches_target method for channel_tls t_; the upper
* layer wants to know if this channel matches a target address when extending
@@ -563,8 +590,7 @@ channel_tls_matches_target_method(channel_t *chan,
tor_assert(target);
tor_assert(tlschan->conn);
- return tor_addr_compare(&(tlschan->conn->real_addr),
- target, CMP_EXACT);
+ return tor_addr_eq(&(tlschan->conn->real_addr), target);
}
/**
@@ -1263,8 +1289,8 @@ channel_tls_process_versions_cell(var_cell_t *cell, channel_tls_t *chan)
const int send_versions = !started_here;
/* If we want to authenticate, send a CERTS cell */
const int send_certs = !started_here || public_server_mode(get_options());
- /* If we're a relay that got a connection, ask for authentication. */
- const int send_chall = !started_here && public_server_mode(get_options());
+ /* If we're a host that got a connection, ask for authentication. */
+ const int send_chall = !started_here;
/* If our certs cell will authenticate us, we can send a netinfo cell
* right now. */
const int send_netinfo = !started_here;
@@ -1475,6 +1501,16 @@ channel_tls_process_netinfo_cell(cell_t *cell, channel_tls_t *chan)
/* XXX maybe act on my_apparent_addr, if the source is sufficiently
* trustworthy. */
+ if (! chan->conn->handshake_state->sent_netinfo) {
+ /* If we were prepared to authenticate, but we never got an AUTH_CHALLENGE
+ * cell, then we would not previously have sent a NETINFO cell. Do so
+ * now. */
+ if (connection_or_send_netinfo(chan->conn) < 0) {
+ connection_or_close_for_error(chan->conn, 0);
+ return;
+ }
+ }
+
if (connection_or_set_state_open(chan->conn) < 0) {
log_fn(LOG_PROTOCOL_WARN, LD_OR,
"Got good NETINFO cell from %s:%d; but "
diff --git a/src/or/circuitbuild.c b/src/or/circuitbuild.c
index 43d2ffe4d..a203ceeef 100644
--- a/src/or/circuitbuild.c
+++ b/src/or/circuitbuild.c
@@ -46,13 +46,6 @@
#define MIN(a,b) ((a)<(b)?(a):(b))
#endif
-/********* START VARIABLES **********/
-
-/** A global list of all circuits at this hop. */
-extern circuit_t *global_circuitlist;
-
-/********* END VARIABLES ************/
-
static channel_t * channel_connect_for_circuit(const tor_addr_t *addr,
uint16_t port,
const char *id_digest);
@@ -779,20 +772,24 @@ circuit_send_next_onion_skin(origin_circuit_t *circ)
* it off at, we probably had a suspend event along this codepath,
* and we should discard the value.
*/
- if (timediff < 0 || timediff > 2*circ_times.close_ms+1000) {
+ if (timediff < 0 ||
+ timediff > 2*get_circuit_build_close_time_ms()+1000) {
log_notice(LD_CIRC, "Strange value for circuit build time: %ldmsec. "
"Assuming clock jump. Purpose %d (%s)", timediff,
circ->base_.purpose,
circuit_purpose_to_string(circ->base_.purpose));
} else if (!circuit_build_times_disabled()) {
/* Only count circuit times if the network is live */
- if (circuit_build_times_network_check_live(&circ_times)) {
- circuit_build_times_add_time(&circ_times, (build_time_t)timediff);
- circuit_build_times_set_timeout(&circ_times);
+ if (circuit_build_times_network_check_live(
+ get_circuit_build_times())) {
+ circuit_build_times_add_time(get_circuit_build_times_mutable(),
+ (build_time_t)timediff);
+ circuit_build_times_set_timeout(get_circuit_build_times_mutable());
}
if (circ->base_.purpose != CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT) {
- circuit_build_times_network_circ_success(&circ_times);
+ circuit_build_times_network_circ_success(
+ get_circuit_build_times_mutable());
}
}
}
@@ -2181,7 +2178,7 @@ pathbias_count_circs_in_states(entry_guard_t *guard,
int open_circuits = 0;
/* Count currently open circuits. Give them the benefit of the doubt. */
- for (circ = global_circuitlist; circ; circ = circ->next) {
+ TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) {
origin_circuit_t *ocirc = NULL;
if (!CIRCUIT_IS_ORIGIN(circ) || /* didn't originate here */
circ->marked_for_close) /* already counted */
@@ -2280,7 +2277,7 @@ pathbias_measure_use_rate(entry_guard_t *guard)
tor_lround(guard->unusable_circuits),
tor_lround(guard->collapsed_circuits),
tor_lround(guard->timeouts),
- tor_lround(circ_times.close_ms/1000));
+ tor_lround(get_circuit_build_close_time_ms()/1000));
guard->path_bias_disabled = 1;
guard->bad_since = approx_time();
entry_guards_changed();
@@ -2306,7 +2303,7 @@ pathbias_measure_use_rate(entry_guard_t *guard)
tor_lround(guard->unusable_circuits),
tor_lround(guard->collapsed_circuits),
tor_lround(guard->timeouts),
- tor_lround(circ_times.close_ms/1000));
+ tor_lround(get_circuit_build_close_time_ms()/1000));
}
} else if (pathbias_get_use_success_count(guard)/guard->use_attempts
< pathbias_get_notice_use_rate(options)) {
@@ -2330,7 +2327,7 @@ pathbias_measure_use_rate(entry_guard_t *guard)
tor_lround(guard->unusable_circuits),
tor_lround(guard->collapsed_circuits),
tor_lround(guard->timeouts),
- tor_lround(circ_times.close_ms/1000));
+ tor_lround(get_circuit_build_close_time_ms()/1000));
}
}
}
@@ -2386,7 +2383,7 @@ pathbias_measure_close_rate(entry_guard_t *guard)
tor_lround(guard->unusable_circuits),
tor_lround(guard->collapsed_circuits),
tor_lround(guard->timeouts),
- tor_lround(circ_times.close_ms/1000));
+ tor_lround(get_circuit_build_close_time_ms()/1000));
guard->path_bias_disabled = 1;
guard->bad_since = approx_time();
entry_guards_changed();
@@ -2412,7 +2409,7 @@ pathbias_measure_close_rate(entry_guard_t *guard)
tor_lround(guard->unusable_circuits),
tor_lround(guard->collapsed_circuits),
tor_lround(guard->timeouts),
- tor_lround(circ_times.close_ms/1000));
+ tor_lround(get_circuit_build_close_time_ms()/1000));
}
} else if (pathbias_get_close_success_count(guard)/guard->circ_attempts
< pathbias_get_warn_rate(options)) {
@@ -2437,7 +2434,7 @@ pathbias_measure_close_rate(entry_guard_t *guard)
tor_lround(guard->unusable_circuits),
tor_lround(guard->collapsed_circuits),
tor_lround(guard->timeouts),
- tor_lround(circ_times.close_ms/1000));
+ tor_lround(get_circuit_build_close_time_ms()/1000));
}
} else if (pathbias_get_close_success_count(guard)/guard->circ_attempts
< pathbias_get_notice_rate(options)) {
@@ -2460,7 +2457,7 @@ pathbias_measure_close_rate(entry_guard_t *guard)
tor_lround(guard->unusable_circuits),
tor_lround(guard->collapsed_circuits),
tor_lround(guard->timeouts),
- tor_lround(circ_times.close_ms/1000));
+ tor_lround(get_circuit_build_close_time_ms()/1000));
}
}
}
diff --git a/src/or/circuitlist.c b/src/or/circuitlist.c
index 1912b91dd..bb74594ec 100644
--- a/src/or/circuitlist.c
+++ b/src/or/circuitlist.c
@@ -8,7 +8,7 @@
* \file circuitlist.c
* \brief Manage the global circuit list.
**/
-
+#define CIRCUITLIST_PRIVATE
#include "or.h"
#include "channel.h"
#include "circuitbuild.h"
@@ -36,12 +36,12 @@
/********* START VARIABLES **********/
/** A global list of all circuits at this hop. */
-circuit_t *global_circuitlist=NULL;
+struct global_circuitlist_s global_circuitlist =
+ TOR_LIST_HEAD_INITIALIZER(global_circuitlist);
/** A list of all the circuits in CIRCUIT_STATE_CHAN_WAIT. */
static smartlist_t *circuits_pending_chans = NULL;
-static void circuit_free(circuit_t *circ);
static void circuit_free_cpath(crypt_path_t *cpath);
static void circuit_free_cpath_node(crypt_path_t *victim);
static void cpath_ref_decref(crypt_path_reference_t *cpath_ref);
@@ -370,21 +370,6 @@ circuit_set_state(circuit_t *circ, uint8_t state)
circ->state = state;
}
-/** Add <b>circ</b> to the global list of circuits. This is called only from
- * within circuit_new.
- */
-static void
-circuit_add(circuit_t *circ)
-{
- if (!global_circuitlist) { /* first one */
- global_circuitlist = circ;
- circ->next = NULL;
- } else {
- circ->next = global_circuitlist;
- global_circuitlist = circ;
- }
-}
-
/** Append to <b>out</b> all circuits in state CHAN_WAIT waiting for
* the given connection. */
void
@@ -442,33 +427,17 @@ circuit_count_pending_on_channel(channel_t *chan)
void
circuit_close_all_marked(void)
{
- circuit_t *tmp,*m;
-
- while (global_circuitlist && global_circuitlist->marked_for_close) {
- tmp = global_circuitlist->next;
- circuit_free(global_circuitlist);
- global_circuitlist = tmp;
- }
-
- tmp = global_circuitlist;
- while (tmp && tmp->next) {
- if (tmp->next->marked_for_close) {
- m = tmp->next->next;
- circuit_free(tmp->next);
- tmp->next = m;
- /* Need to check new tmp->next; don't advance tmp. */
- } else {
- /* Advance tmp. */
- tmp = tmp->next;
- }
- }
+ circuit_t *circ, *tmp;
+ TOR_LIST_FOREACH_SAFE(circ, &global_circuitlist, head, tmp)
+ if (circ->marked_for_close)
+ circuit_free(circ);
}
/** Return the head of the global linked list of circuits. */
-circuit_t *
-circuit_get_global_list_(void)
+struct global_circuitlist_s *
+circuit_get_global_list(void)
{
- return global_circuitlist;
+ return &global_circuitlist;
}
/** Function to make circ-\>state human-readable */
@@ -683,8 +652,9 @@ init_circuit_base(circuit_t *circ)
circ->package_window = circuit_initial_package_window();
circ->deliver_window = CIRCWINDOW_START;
+ cell_queue_init(&circ->n_chan_cells);
- circuit_add(circ);
+ TOR_LIST_INSERT_HEAD(&global_circuitlist, circ, head);
}
/** Allocate space for a new circuit, initializing with <b>p_circ_id</b>
@@ -708,7 +678,7 @@ origin_circuit_new(void)
init_circuit_base(TO_CIRCUIT(circ));
- circ_times.last_circ_at = approx_time();
+ circuit_build_times_update_last_circ(get_circuit_build_times_mutable());
return circ;
}
@@ -728,6 +698,7 @@ or_circuit_new(circid_t p_circ_id, channel_t *p_chan)
circuit_set_p_circid_chan(circ, p_circ_id, p_chan);
circ->remaining_relay_early_cells = MAX_RELAY_EARLY_CELLS_PER_CIRCUIT;
+ cell_queue_init(&circ->p_chan_cells);
init_circuit_base(TO_CIRCUIT(circ));
@@ -736,7 +707,7 @@ or_circuit_new(circid_t p_circ_id, channel_t *p_chan)
/** Deallocate space associated with circ.
*/
-static void
+STATIC void
circuit_free(circuit_t *circ)
{
void *mem;
@@ -802,6 +773,8 @@ circuit_free(circuit_t *circ)
extend_info_free(circ->n_hop);
tor_free(circ->n_chan_create_cell);
+ TOR_LIST_REMOVE(circ, head);
+
/* Remove from map. */
circuit_set_n_circid_chan(circ, 0, NULL);
@@ -837,11 +810,11 @@ circuit_free_cpath(crypt_path_t *cpath)
void
circuit_free_all(void)
{
- circuit_t *next;
- while (global_circuitlist) {
- next = global_circuitlist->next;
- if (! CIRCUIT_IS_ORIGIN(global_circuitlist)) {
- or_circuit_t *or_circ = TO_OR_CIRCUIT(global_circuitlist);
+ circuit_t *tmp, *tmp2;
+
+ TOR_LIST_FOREACH_SAFE(tmp, &global_circuitlist, head, tmp2) {
+ if (! CIRCUIT_IS_ORIGIN(tmp)) {
+ or_circuit_t *or_circ = TO_OR_CIRCUIT(tmp);
while (or_circ->resolving_streams) {
edge_connection_t *next_conn;
next_conn = or_circ->resolving_streams->next_stream;
@@ -849,8 +822,7 @@ circuit_free_all(void)
or_circ->resolving_streams = next_conn;
}
}
- circuit_free(global_circuitlist);
- global_circuitlist = next;
+ circuit_free(tmp);
}
smartlist_free(circuits_pending_chans);
@@ -920,7 +892,7 @@ circuit_dump_by_conn(connection_t *conn, int severity)
circuit_t *circ;
edge_connection_t *tmpconn;
- for (circ = global_circuitlist; circ; circ = circ->next) {
+ TOR_LIST_FOREACH(circ, &global_circuitlist, head) {
circid_t n_circ_id = circ->n_circ_id, p_circ_id = 0;
if (circ->marked_for_close) {
@@ -984,7 +956,7 @@ circuit_dump_by_chan(channel_t *chan, int severity)
tor_assert(chan);
- for (circ = global_circuitlist; circ; circ = circ->next) {
+ TOR_LIST_FOREACH(circ, &global_circuitlist, head) {
circid_t n_circ_id = circ->n_circ_id, p_circ_id = 0;
if (circ->marked_for_close) {
@@ -1025,7 +997,7 @@ origin_circuit_t *
circuit_get_by_global_id(uint32_t id)
{
circuit_t *circ;
- for (circ=global_circuitlist;circ;circ = circ->next) {
+ TOR_LIST_FOREACH(circ, &global_circuitlist, head) {
if (CIRCUIT_IS_ORIGIN(circ) &&
TO_ORIGIN_CIRCUIT(circ)->global_identifier == id) {
if (circ->marked_for_close)
@@ -1088,7 +1060,7 @@ circuit_get_by_circid_channel_impl(circid_t circ_id, channel_t *chan,
/* We comment it out because coverity complains otherwise.
{
circuit_t *circ;
- for (circ=global_circuitlist;circ;circ = circ->next) {
+ TOR_LIST_FOREACH(circ, &global_circuitlist, head) {
if (! CIRCUIT_IS_ORIGIN(circ)) {
or_circuit_t *or_circ = TO_OR_CIRCUIT(circ);
if (or_circ->p_chan == chan && or_circ->p_circ_id == circ_id) {
@@ -1170,7 +1142,7 @@ circuit_unlink_all_from_channel(channel_t *chan, int reason)
channel_unlink_all_circuits(chan);
- for (circ = global_circuitlist; circ; circ = circ->next) {
+ TOR_LIST_FOREACH(circ, &global_circuitlist, head) {
int mark = 0;
if (circ->n_chan == chan) {
circuit_set_n_circid_chan(circ, 0, NULL);
@@ -1206,8 +1178,7 @@ origin_circuit_t *
circuit_get_ready_rend_circ_by_rend_data(const rend_data_t *rend_data)
{
circuit_t *circ;
-
- for (circ = global_circuitlist; circ; circ = circ->next) {
+ TOR_LIST_FOREACH(circ, &global_circuitlist, head) {
if (!circ->marked_for_close &&
circ->purpose == CIRCUIT_PURPOSE_C_REND_READY) {
origin_circuit_t *ocirc = TO_ORIGIN_CIRCUIT(circ);
@@ -1235,11 +1206,11 @@ circuit_get_next_by_pk_and_purpose(origin_circuit_t *start,
circuit_t *circ;
tor_assert(CIRCUIT_PURPOSE_IS_ORIGIN(purpose));
if (start == NULL)
- circ = global_circuitlist;
+ circ = TOR_LIST_FIRST(&global_circuitlist);
else
- circ = TO_CIRCUIT(start)->next;
+ circ = TOR_LIST_NEXT(TO_CIRCUIT(start), head);
- for ( ; circ; circ = circ->next) {
+ for ( ; circ; circ = TOR_LIST_NEXT(circ, head)) {
if (circ->marked_for_close)
continue;
if (circ->purpose != purpose)
@@ -1262,7 +1233,7 @@ circuit_get_by_rend_token_and_purpose(uint8_t purpose, const char *token,
size_t len)
{
circuit_t *circ;
- for (circ = global_circuitlist; circ; circ = circ->next) {
+ TOR_LIST_FOREACH(circ, &global_circuitlist, head) {
if (! circ->marked_for_close &&
circ->purpose == purpose &&
tor_memeq(TO_OR_CIRCUIT(circ)->rend_token, token, len))
@@ -1324,7 +1295,7 @@ circuit_find_to_cannibalize(uint8_t purpose, extend_info_t *info,
"capacity %d, internal %d",
purpose, need_uptime, need_capacity, internal);
- for (circ_=global_circuitlist; circ_; circ_ = circ_->next) {
+ TOR_LIST_FOREACH(circ_, &global_circuitlist, head) {
if (CIRCUIT_IS_ORIGIN(circ_) &&
circ_->state == CIRCUIT_STATE_OPEN &&
!circ_->marked_for_close &&
@@ -1414,8 +1385,7 @@ void
circuit_mark_all_unused_circs(void)
{
circuit_t *circ;
-
- for (circ=global_circuitlist; circ; circ = circ->next) {
+ TOR_LIST_FOREACH(circ, &global_circuitlist, head) {
if (CIRCUIT_IS_ORIGIN(circ) &&
!circ->marked_for_close &&
!circ->timestamp_dirty)
@@ -1434,8 +1404,7 @@ void
circuit_mark_all_dirty_circs_as_unusable(void)
{
circuit_t *circ;
-
- for (circ=global_circuitlist; circ; circ = circ->next) {
+ TOR_LIST_FOREACH(circ, &global_circuitlist, head) {
if (CIRCUIT_IS_ORIGIN(circ) &&
!circ->marked_for_close &&
circ->timestamp_dirty) {
@@ -1639,12 +1608,14 @@ marked_circuit_free_cells(circuit_t *circ)
}
/** Return the number of cells used by the circuit <b>c</b>'s cell queues. */
-static size_t
+STATIC size_t
n_cells_in_circ_queues(const circuit_t *c)
{
size_t n = c->n_chan_cells.n;
- if (! CIRCUIT_IS_ORIGIN(c))
- n += TO_OR_CIRCUIT((circuit_t*)c)->p_chan_cells.n;
+ if (! CIRCUIT_IS_ORIGIN(c)) {
+ circuit_t *cc = (circuit_t *) c;
+ n += TO_OR_CIRCUIT(cc)->p_chan_cells.n;
+ }
return n;
}
@@ -1695,7 +1666,7 @@ circuits_handle_oom(size_t current_allocation)
/* This algorithm itself assumes that you've got enough memory slack
* to actually run it. */
- for (circ = global_circuitlist; circ; circ = circ->next)
+ TOR_LIST_FOREACH(circ, &global_circuitlist, head)
smartlist_add(circlist, circ);
/* This is O(n log n); there are faster algorithms we could use instead.
diff --git a/src/or/circuitlist.h b/src/or/circuitlist.h
index 03f678c5a..bf3d1b467 100644
--- a/src/or/circuitlist.h
+++ b/src/or/circuitlist.h
@@ -12,7 +12,11 @@
#ifndef TOR_CIRCUITLIST_H
#define TOR_CIRCUITLIST_H
-circuit_t * circuit_get_global_list_(void);
+#include "testsupport.h"
+
+TOR_LIST_HEAD(global_circuitlist_s, circuit_t);
+
+struct global_circuitlist_s* circuit_get_global_list(void);
const char *circuit_state_to_string(int state);
const char *circuit_purpose_to_controller_string(uint8_t purpose);
const char *circuit_purpose_to_controller_hs_state_string(uint8_t purpose);
@@ -68,5 +72,10 @@ void circuits_handle_oom(size_t current_allocation);
void channel_note_destroy_pending(channel_t *chan, circid_t id);
void channel_note_destroy_not_pending(channel_t *chan, circid_t id);
+#ifdef CIRCUITLIST_PRIVATE
+STATIC void circuit_free(circuit_t *circ);
+STATIC size_t n_cells_in_circ_queues(const circuit_t *c);
+#endif
+
#endif
diff --git a/src/or/circuitmux.c b/src/or/circuitmux.c
index c84e0ce09..47b423066 100644
--- a/src/or/circuitmux.c
+++ b/src/or/circuitmux.c
@@ -383,6 +383,7 @@ circuitmux_alloc(void)
rv = tor_malloc_zero(sizeof(*rv));
rv->chanid_circid_map = tor_malloc_zero(sizeof(*( rv->chanid_circid_map)));
HT_INIT(chanid_circid_muxinfo_map, rv->chanid_circid_map);
+ cell_queue_init(&rv->destroy_cell_queue);
return rv;
}
@@ -510,7 +511,7 @@ circuitmux_mark_destroyed_circids_usable(circuitmux_t *cmux, channel_t *chan)
{
packed_cell_t *cell;
int n_bad = 0;
- for (cell = cmux->destroy_cell_queue.head; cell; cell = cell->next) {
+ TOR_SIMPLEQ_FOREACH(cell, &cmux->destroy_cell_queue.head, next) {
circid_t circid = 0;
if (packed_cell_is_destroy(chan, cell, &circid)) {
channel_mark_circid_usable(chan, circid);
@@ -922,9 +923,9 @@ circuitmux_num_circuits(circuitmux_t *cmux)
* Attach a circuit to a circuitmux, for the specified direction.
*/
-void
-circuitmux_attach_circuit(circuitmux_t *cmux, circuit_t *circ,
- cell_direction_t direction)
+MOCK_IMPL(void,
+circuitmux_attach_circuit,(circuitmux_t *cmux, circuit_t *circ,
+ cell_direction_t direction))
{
channel_t *chan = NULL;
uint64_t channel_id;
@@ -1071,8 +1072,8 @@ circuitmux_attach_circuit(circuitmux_t *cmux, circuit_t *circ,
* no-op if not attached.
*/
-void
-circuitmux_detach_circuit(circuitmux_t *cmux, circuit_t *circ)
+MOCK_IMPL(void,
+circuitmux_detach_circuit,(circuitmux_t *cmux, circuit_t *circ))
{
chanid_circid_muxinfo_t search, *hashent = NULL;
/*
diff --git a/src/or/circuitmux.h b/src/or/circuitmux.h
index a6bc415cd..ee2f5d153 100644
--- a/src/or/circuitmux.h
+++ b/src/or/circuitmux.h
@@ -10,6 +10,7 @@
#define TOR_CIRCUITMUX_H
#include "or.h"
+#include "testsupport.h"
typedef struct circuitmux_policy_s circuitmux_policy_t;
typedef struct circuitmux_policy_data_s circuitmux_policy_data_t;
@@ -127,9 +128,11 @@ void circuitmux_notify_xmit_cells(circuitmux_t *cmux, circuit_t *circ,
void circuitmux_notify_xmit_destroy(circuitmux_t *cmux);
/* Circuit interface */
-void circuitmux_attach_circuit(circuitmux_t *cmux, circuit_t *circ,
- cell_direction_t direction);
-void circuitmux_detach_circuit(circuitmux_t *cmux, circuit_t *circ);
+MOCK_DECL(void, circuitmux_attach_circuit, (circuitmux_t *cmux,
+ circuit_t *circ,
+ cell_direction_t direction));
+MOCK_DECL(void, circuitmux_detach_circuit,
+ (circuitmux_t *cmux, circuit_t *circ));
void circuitmux_clear_num_cells(circuitmux_t *cmux, circuit_t *circ);
void circuitmux_set_num_cells(circuitmux_t *cmux, circuit_t *circ,
unsigned int n_cells);
diff --git a/src/or/circuitstats.c b/src/or/circuitstats.c
index 1d7812bf2..eaefc9edd 100644
--- a/src/or/circuitstats.c
+++ b/src/or/circuitstats.c
@@ -18,6 +18,10 @@
#undef log
#include <math.h>
+static void cbt_control_event_buildtimeout_set(
+ const circuit_build_times_t *cbt,
+ buildtimeout_set_event_t type);
+
#define CBT_BIN_TO_MS(bin) ((bin)*CBT_BIN_WIDTH + (CBT_BIN_WIDTH/2))
/** Global list of circuit build times */
@@ -26,12 +30,46 @@
// vary in their own latency. The downside of this is that guards
// can change frequently, so we'd be building a lot more circuits
// most likely.
-/* XXXX024 Make this static; add accessor functions. */
-circuit_build_times_t circ_times;
+static circuit_build_times_t circ_times;
+#ifdef TOR_UNIT_TESTS
/** If set, we're running the unit tests: we should avoid clobbering
* our state file or accessing get_options() or get_or_state() */
static int unit_tests = 0;
+#else
+#define unit_tests 0
+#endif
+
+/** Return a pointer to the data structure describing our current circuit
+ * build time history and computations. */
+const circuit_build_times_t *
+get_circuit_build_times(void)
+{
+ return &circ_times;
+}
+
+/** As get_circuit_build_times, but return a mutable pointer. */
+circuit_build_times_t *
+get_circuit_build_times_mutable(void)
+{
+ return &circ_times;
+}
+
+/** Return the time to wait before actually closing an under-construction, in
+ * milliseconds. */
+double
+get_circuit_build_close_time_ms(void)
+{
+ return circ_times.close_ms;
+}
+
+/** Return the time to wait before giving up on an under-construction circuit,
+ * in milliseconds. */
+double
+get_circuit_build_timeout_ms(void)
+{
+ return circ_times.timeout_ms;
+}
/**
* This function decides if CBT learning should be disabled. It returns
@@ -154,7 +192,7 @@ circuit_build_times_min_circs_to_observe(void)
/** Return true iff <b>cbt</b> has recorded enough build times that we
* want to start acting on the timeout it implies. */
int
-circuit_build_times_enough_to_compute(circuit_build_times_t *cbt)
+circuit_build_times_enough_to_compute(const circuit_build_times_t *cbt)
{
return cbt->total_build_times >= circuit_build_times_min_circs_to_observe();
}
@@ -438,7 +476,7 @@ circuit_build_times_get_initial_timeout(void)
* Leave estimated parameters, timeout and network liveness intact
* for future use.
*/
-void
+STATIC void
circuit_build_times_reset(circuit_build_times_t *cbt)
{
memset(cbt->circuit_build_times, 0, sizeof(cbt->circuit_build_times));
@@ -471,7 +509,7 @@ circuit_build_times_init(circuit_build_times_t *cbt)
cbt->liveness.timeouts_after_firsthop = NULL;
}
cbt->close_ms = cbt->timeout_ms = circuit_build_times_get_initial_timeout();
- control_event_buildtimeout_set(cbt, BUILDTIMEOUT_SET_EVENT_RESET);
+ cbt_control_event_buildtimeout_set(cbt, BUILDTIMEOUT_SET_EVENT_RESET);
}
/**
@@ -557,7 +595,7 @@ circuit_build_times_add_time(circuit_build_times_t *cbt, build_time_t time)
* Return maximum circuit build time
*/
static build_time_t
-circuit_build_times_max(circuit_build_times_t *cbt)
+circuit_build_times_max(const circuit_build_times_t *cbt)
{
int i = 0;
build_time_t max_build_time = 0;
@@ -598,7 +636,7 @@ circuit_build_times_min(circuit_build_times_t *cbt)
* The return value must be freed by the caller.
*/
static uint32_t *
-circuit_build_times_create_histogram(circuit_build_times_t *cbt,
+circuit_build_times_create_histogram(const circuit_build_times_t *cbt,
build_time_t *nbins)
{
uint32_t *histogram;
@@ -688,7 +726,7 @@ circuit_build_times_get_xm(circuit_build_times_t *cbt)
* the or_state_t state structure.
*/
void
-circuit_build_times_update_state(circuit_build_times_t *cbt,
+circuit_build_times_update_state(const circuit_build_times_t *cbt,
or_state_t *state)
{
uint32_t *histogram;
@@ -949,7 +987,7 @@ circuit_build_times_parse_state(circuit_build_times_t *cbt,
* an acceptable approximation because we are only concerned with the
* accuracy of the CDF of the tail.
*/
-int
+STATIC int
circuit_build_times_update_alpha(circuit_build_times_t *cbt)
{
build_time_t *x=cbt->circuit_build_times;
@@ -1033,7 +1071,7 @@ circuit_build_times_update_alpha(circuit_build_times_t *cbt)
*
* Return value is in milliseconds.
*/
-double
+STATIC double
circuit_build_times_calculate_timeout(circuit_build_times_t *cbt,
double quantile)
{
@@ -1050,6 +1088,7 @@ circuit_build_times_calculate_timeout(circuit_build_times_t *cbt,
return ret;
}
+#ifdef TOR_UNIT_TESTS
/** Pareto CDF */
double
circuit_build_times_cdf(circuit_build_times_t *cbt, double x)
@@ -1060,7 +1099,9 @@ circuit_build_times_cdf(circuit_build_times_t *cbt, double x)
tor_assert(0 <= ret && ret <= 1.0);
return ret;
}
+#endif
+#ifdef TOR_UNIT_TESTS
/**
* Generate a synthetic time using our distribution parameters.
*
@@ -1093,7 +1134,9 @@ circuit_build_times_generate_sample(circuit_build_times_t *cbt,
tor_assert(ret > 0);
return ret;
}
+#endif
+#ifdef TOR_UNIT_TESTS
/**
* Estimate an initial alpha parameter by solving the quantile
* function with a quantile point and a specific timeout value.
@@ -1114,12 +1157,13 @@ circuit_build_times_initial_alpha(circuit_build_times_t *cbt,
(tor_mathlog(cbt->Xm)-tor_mathlog(timeout_ms));
tor_assert(cbt->alpha > 0);
}
+#endif
/**
* Returns true if we need circuits to be built
*/
int
-circuit_build_times_needs_circuits(circuit_build_times_t *cbt)
+circuit_build_times_needs_circuits(const circuit_build_times_t *cbt)
{
/* Return true if < MIN_CIRCUITS_TO_OBSERVE */
return !circuit_build_times_enough_to_compute(cbt);
@@ -1130,7 +1174,7 @@ circuit_build_times_needs_circuits(circuit_build_times_t *cbt)
* right now.
*/
int
-circuit_build_times_needs_circuits_now(circuit_build_times_t *cbt)
+circuit_build_times_needs_circuits_now(const circuit_build_times_t *cbt)
{
return circuit_build_times_needs_circuits(cbt) &&
approx_time()-cbt->last_circ_at > circuit_build_times_test_frequency();
@@ -1263,7 +1307,7 @@ circuit_build_times_network_close(circuit_build_times_t *cbt,
* in the case of recent liveness changes.
*/
int
-circuit_build_times_network_check_live(circuit_build_times_t *cbt)
+circuit_build_times_network_check_live(const circuit_build_times_t *cbt)
{
if (cbt->liveness.nonlive_timeouts > 0) {
return 0;
@@ -1282,7 +1326,7 @@ circuit_build_times_network_check_live(circuit_build_times_t *cbt)
* to restart the process of building test circuits and estimating a
* new timeout.
*/
-int
+STATIC int
circuit_build_times_network_check_changed(circuit_build_times_t *cbt)
{
int total_build_times = cbt->total_build_times;
@@ -1329,7 +1373,7 @@ circuit_build_times_network_check_changed(circuit_build_times_t *cbt)
= circuit_build_times_get_initial_timeout();
}
- control_event_buildtimeout_set(cbt, BUILDTIMEOUT_SET_EVENT_RESET);
+ cbt_control_event_buildtimeout_set(cbt, BUILDTIMEOUT_SET_EVENT_RESET);
log_notice(LD_CIRC,
"Your network connection speed appears to have changed. Resetting "
@@ -1511,7 +1555,7 @@ circuit_build_times_set_timeout(circuit_build_times_t *cbt)
}
}
- control_event_buildtimeout_set(cbt, BUILDTIMEOUT_SET_EVENT_COMPUTED);
+ cbt_control_event_buildtimeout_set(cbt, BUILDTIMEOUT_SET_EVENT_COMPUTED);
timeout_rate = circuit_build_times_timeout_rate(cbt);
@@ -1546,6 +1590,8 @@ circuit_build_times_set_timeout(circuit_build_times_t *cbt)
cbt->total_build_times);
}
}
+
+#ifdef TOR_UNIT_TESTS
/** Make a note that we're running unit tests (rather than running Tor
* itself), so we avoid clobbering our state file. */
void
@@ -1553,4 +1599,46 @@ circuitbuild_running_unit_tests(void)
{
unit_tests = 1;
}
+#endif
+
+void
+circuit_build_times_update_last_circ(circuit_build_times_t *cbt)
+{
+ cbt->last_circ_at = approx_time();
+}
+
+static void
+cbt_control_event_buildtimeout_set(const circuit_build_times_t *cbt,
+ buildtimeout_set_event_t type)
+{
+ char *args = NULL;
+ double qnt;
+
+ switch (type) {
+ case BUILDTIMEOUT_SET_EVENT_RESET:
+ case BUILDTIMEOUT_SET_EVENT_SUSPENDED:
+ case BUILDTIMEOUT_SET_EVENT_DISCARD:
+ qnt = 1.0;
+ break;
+ case BUILDTIMEOUT_SET_EVENT_COMPUTED:
+ case BUILDTIMEOUT_SET_EVENT_RESUME:
+ default:
+ qnt = circuit_build_times_quantile_cutoff();
+ break;
+ }
+
+ tor_asprintf(&args, "TOTAL_TIMES=%lu "
+ "TIMEOUT_MS=%lu XM=%lu ALPHA=%f CUTOFF_QUANTILE=%f "
+ "TIMEOUT_RATE=%f CLOSE_MS=%lu CLOSE_RATE=%f",
+ (unsigned long)cbt->total_build_times,
+ (unsigned long)cbt->timeout_ms,
+ (unsigned long)cbt->Xm, cbt->alpha, qnt,
+ circuit_build_times_timeout_rate(cbt),
+ (unsigned long)cbt->close_ms,
+ circuit_build_times_close_rate(cbt));
+
+ control_event_buildtimeout_set(type, args);
+
+ tor_free(args);
+}
diff --git a/src/or/circuitstats.h b/src/or/circuitstats.h
index 87dce99f4..3343310b8 100644
--- a/src/or/circuitstats.h
+++ b/src/or/circuitstats.h
@@ -12,11 +12,14 @@
#ifndef TOR_CIRCUITSTATS_H
#define TOR_CIRCUITSTATS_H
-extern circuit_build_times_t circ_times;
+const circuit_build_times_t *get_circuit_build_times(void);
+circuit_build_times_t *get_circuit_build_times_mutable(void);
+double get_circuit_build_close_time_ms(void);
+double get_circuit_build_timeout_ms(void);
int circuit_build_times_disabled(void);
-int circuit_build_times_enough_to_compute(circuit_build_times_t *cbt);
-void circuit_build_times_update_state(circuit_build_times_t *cbt,
+int circuit_build_times_enough_to_compute(const circuit_build_times_t *cbt);
+void circuit_build_times_update_state(const circuit_build_times_t *cbt,
or_state_t *state);
int circuit_build_times_parse_state(circuit_build_times_t *cbt,
or_state_t *state);
@@ -27,9 +30,9 @@ int circuit_build_times_count_close(circuit_build_times_t *cbt,
void circuit_build_times_set_timeout(circuit_build_times_t *cbt);
int circuit_build_times_add_time(circuit_build_times_t *cbt,
build_time_t time);
-int circuit_build_times_needs_circuits(circuit_build_times_t *cbt);
+int circuit_build_times_needs_circuits(const circuit_build_times_t *cbt);
-int circuit_build_times_needs_circuits_now(circuit_build_times_t *cbt);
+int circuit_build_times_needs_circuits_now(const circuit_build_times_t *cbt);
void circuit_build_times_init(circuit_build_times_t *cbt);
void circuit_build_times_free_timeouts(circuit_build_times_t *cbt);
void circuit_build_times_new_consensus_params(circuit_build_times_t *cbt,
@@ -37,29 +40,59 @@ void circuit_build_times_new_consensus_params(circuit_build_times_t *cbt,
double circuit_build_times_timeout_rate(const circuit_build_times_t *cbt);
double circuit_build_times_close_rate(const circuit_build_times_t *cbt);
+void circuit_build_times_update_last_circ(circuit_build_times_t *cbt);
+
#ifdef CIRCUITSTATS_PRIVATE
-double circuit_build_times_calculate_timeout(circuit_build_times_t *cbt,
+STATIC double circuit_build_times_calculate_timeout(circuit_build_times_t *cbt,
double quantile);
+STATIC int circuit_build_times_update_alpha(circuit_build_times_t *cbt);
+STATIC void circuit_build_times_reset(circuit_build_times_t *cbt);
+
+/* Network liveness functions */
+STATIC int circuit_build_times_network_check_changed(
+ circuit_build_times_t *cbt);
+#endif
+
+#ifdef TOR_UNIT_TESTS
build_time_t circuit_build_times_generate_sample(circuit_build_times_t *cbt,
double q_lo, double q_hi);
+double circuit_build_times_cdf(circuit_build_times_t *cbt, double x);
void circuit_build_times_initial_alpha(circuit_build_times_t *cbt,
double quantile, double time_ms);
-int circuit_build_times_update_alpha(circuit_build_times_t *cbt);
-double circuit_build_times_cdf(circuit_build_times_t *cbt, double x);
void circuitbuild_running_unit_tests(void);
-void circuit_build_times_reset(circuit_build_times_t *cbt);
-
-/* Network liveness functions */
-int circuit_build_times_network_check_changed(circuit_build_times_t *cbt);
#endif
/* Network liveness functions */
void circuit_build_times_network_is_live(circuit_build_times_t *cbt);
-int circuit_build_times_network_check_live(circuit_build_times_t *cbt);
+int circuit_build_times_network_check_live(const circuit_build_times_t *cbt);
void circuit_build_times_network_circ_success(circuit_build_times_t *cbt);
-/* DOCDOC circuit_build_times_get_bw_scale */
-int circuit_build_times_get_bw_scale(networkstatus_t *ns);
+#ifdef CIRCUITSTATS_PRIVATE
+/** Structure for circuit build times history */
+struct circuit_build_times_s {
+ /** The circular array of recorded build times in milliseconds */
+ build_time_t circuit_build_times[CBT_NCIRCUITS_TO_OBSERVE];
+ /** Current index in the circuit_build_times circular array */
+ int build_times_idx;
+ /** Total number of build times accumulated. Max CBT_NCIRCUITS_TO_OBSERVE */
+ int total_build_times;
+ /** Information about the state of our local network connection */
+ network_liveness_t liveness;
+ /** Last time we built a circuit. Used to decide to build new test circs */
+ time_t last_circ_at;
+ /** "Minimum" value of our pareto distribution (actually mode) */
+ build_time_t Xm;
+ /** alpha exponent for pareto dist. */
+ double alpha;
+ /** Have we computed a timeout? */
+ int have_computed_timeout;
+ /** The exact value for that timeout in milliseconds. Stored as a double
+ * to maintain precision from calculations to and from quantile value. */
+ double timeout_ms;
+ /** How long we wait before actually closing the circuit. */
+ double close_ms;
+};
+#endif
#endif
diff --git a/src/or/circuituse.c b/src/or/circuituse.c
index 8fb70f585..00dbc7e23 100644
--- a/src/or/circuituse.c
+++ b/src/or/circuituse.c
@@ -31,12 +31,6 @@
#include "router.h"
#include "routerlist.h"
-/********* START VARIABLES **********/
-
-extern circuit_t *global_circuitlist; /* from circuitlist.c */
-
-/********* END VARIABLES ************/
-
static void circuit_expire_old_circuits_clientside(void);
static void circuit_increment_failure_count(void);
@@ -286,7 +280,7 @@ circuit_get_best(const entry_connection_t *conn,
tor_gettimeofday(&now);
- for (circ=global_circuitlist;circ;circ = circ->next) {
+ TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) {
origin_circuit_t *origin_circ;
if (!CIRCUIT_IS_ORIGIN(circ))
continue;
@@ -327,7 +321,7 @@ count_pending_general_client_circuits(void)
int count = 0;
- for (circ = global_circuitlist; circ; circ = circ->next) {
+ TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) {
if (circ->marked_for_close ||
circ->state == CIRCUIT_STATE_OPEN ||
circ->purpose != CIRCUIT_PURPOSE_C_GENERAL ||
@@ -375,7 +369,7 @@ circuit_conforms_to_options(const origin_circuit_t *circ,
void
circuit_expire_building(void)
{
- circuit_t *victim, *next_circ = global_circuitlist;
+ circuit_t *victim, *next_circ;
/* circ_times.timeout_ms and circ_times.close_ms are from
* circuit_build_times_get_initial_timeout() if we haven't computed
* custom timeouts yet */
@@ -393,10 +387,9 @@ circuit_expire_building(void)
* we want to be more lenient with timeouts, in case the
* user has relocated and/or changed network connections.
* See bug #3443. */
- while (next_circ) {
+ TOR_LIST_FOREACH(next_circ, circuit_get_global_list(), head) {
if (!CIRCUIT_IS_ORIGIN(next_circ) || /* didn't originate here */
next_circ->marked_for_close) { /* don't mess with marked circs */
- next_circ = next_circ->next;
continue;
}
@@ -408,9 +401,7 @@ circuit_expire_building(void)
any_opened_circs = 1;
break;
}
- next_circ = next_circ->next;
}
- next_circ = global_circuitlist;
#define SET_CUTOFF(target, msec) do { \
long ms = tor_lround(msec); \
@@ -451,12 +442,12 @@ circuit_expire_building(void)
* RTTs = 4a + 3b + 2c
* RTTs = 9h
*/
- SET_CUTOFF(general_cutoff, circ_times.timeout_ms);
- SET_CUTOFF(begindir_cutoff, circ_times.timeout_ms);
+ SET_CUTOFF(general_cutoff, get_circuit_build_timeout_ms());
+ SET_CUTOFF(begindir_cutoff, get_circuit_build_timeout_ms());
/* > 3hop circs seem to have a 1.0 second delay on their cannibalized
* 4th hop. */
- SET_CUTOFF(fourhop_cutoff, circ_times.timeout_ms * (10/6.0) + 1000);
+ SET_CUTOFF(fourhop_cutoff, get_circuit_build_timeout_ms() * (10/6.0) + 1000);
/* CIRCUIT_PURPOSE_C_ESTABLISH_REND behaves more like a RELAY cell.
* Use the stream cutoff (more or less). */
@@ -465,26 +456,25 @@ circuit_expire_building(void)
/* Be lenient with cannibalized circs. They already survived the official
* CBT, and they're usually not performance-critical. */
SET_CUTOFF(cannibalized_cutoff,
- MAX(circ_times.close_ms*(4/6.0),
+ MAX(get_circuit_build_close_time_ms()*(4/6.0),
options->CircuitStreamTimeout * 1000) + 1000);
/* Intro circs have an extra round trip (and are also 4 hops long) */
- SET_CUTOFF(c_intro_cutoff, circ_times.timeout_ms * (14/6.0) + 1000);
+ SET_CUTOFF(c_intro_cutoff, get_circuit_build_timeout_ms() * (14/6.0) + 1000);
/* Server intro circs have an extra round trip */
- SET_CUTOFF(s_intro_cutoff, circ_times.timeout_ms * (9/6.0) + 1000);
+ SET_CUTOFF(s_intro_cutoff, get_circuit_build_timeout_ms() * (9/6.0) + 1000);
- SET_CUTOFF(close_cutoff, circ_times.close_ms);
- SET_CUTOFF(extremely_old_cutoff, circ_times.close_ms*2 + 1000);
+ SET_CUTOFF(close_cutoff, get_circuit_build_close_time_ms());
+ SET_CUTOFF(extremely_old_cutoff, get_circuit_build_close_time_ms()*2 + 1000);
SET_CUTOFF(hs_extremely_old_cutoff,
- MAX(circ_times.close_ms*2 + 1000,
+ MAX(get_circuit_build_close_time_ms()*2 + 1000,
options->SocksTimeout * 1000));
- while (next_circ) {
+ TOR_LIST_FOREACH(next_circ, circuit_get_global_list(), head) {
struct timeval cutoff;
victim = next_circ;
- next_circ = next_circ->next;
if (!CIRCUIT_IS_ORIGIN(victim) || /* didn't originate here */
victim->marked_for_close) /* don't mess with marked circs */
continue;
@@ -555,12 +545,14 @@ circuit_expire_building(void)
* was a timeout, and the timeout value needs to reset if we
* see enough of them. Note this means we also need to avoid
* double-counting below, too. */
- circuit_build_times_count_timeout(&circ_times, first_hop_succeeded);
+ circuit_build_times_count_timeout(get_circuit_build_times_mutable(),
+ first_hop_succeeded);
TO_ORIGIN_CIRCUIT(victim)->relaxed_timeout = 1;
}
continue;
} else {
static ratelim_t relax_timeout_limit = RATELIM_INIT(3600);
+ const double build_close_ms = get_circuit_build_close_time_ms();
log_fn_ratelim(&relax_timeout_limit, LOG_NOTICE, LD_CIRC,
"No circuits are opened. Relaxed timeout for circuit %d "
"(a %s %d-hop circuit in state %s with channel state %s) to "
@@ -571,7 +563,8 @@ circuit_expire_building(void)
TO_ORIGIN_CIRCUIT(victim)->build_state->desired_path_len,
circuit_state_to_string(victim->state),
channel_state_to_string(victim->n_chan->state),
- (long)circ_times.close_ms, num_live_entry_guards(0));
+ (long)build_close_ms,
+ num_live_entry_guards(0));
}
}
@@ -651,7 +644,7 @@ circuit_expire_building(void)
}
if (circuit_timeout_want_to_count_circ(TO_ORIGIN_CIRCUIT(victim)) &&
- circuit_build_times_enough_to_compute(&circ_times)) {
+ circuit_build_times_enough_to_compute(get_circuit_build_times())) {
/* Circuits are allowed to last longer for measurement.
* Switch their purpose and wait. */
if (victim->purpose != CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT) {
@@ -665,8 +658,9 @@ circuit_expire_building(void)
* have a timeout. We also want to avoid double-counting
* already "relaxed" circuits, which are counted above. */
if (!TO_ORIGIN_CIRCUIT(victim)->relaxed_timeout) {
- circuit_build_times_count_timeout(&circ_times,
- first_hop_succeeded);
+ circuit_build_times_count_timeout(
+ get_circuit_build_times_mutable(),
+ first_hop_succeeded);
}
continue;
}
@@ -683,10 +677,11 @@ circuit_expire_building(void)
(long)(now.tv_sec - victim->timestamp_began.tv_sec),
victim->purpose,
circuit_purpose_to_string(victim->purpose));
- } else if (circuit_build_times_count_close(&circ_times,
+ } else if (circuit_build_times_count_close(
+ get_circuit_build_times_mutable(),
first_hop_succeeded,
victim->timestamp_created.tv_sec)) {
- circuit_build_times_set_timeout(&circ_times);
+ circuit_build_times_set_timeout(get_circuit_build_times_mutable());
}
}
}
@@ -818,7 +813,7 @@ circuit_stream_is_being_handled(entry_connection_t *conn,
get_options()->LongLivedPorts,
conn ? conn->socks_request->port : port);
- for (circ=global_circuitlist;circ;circ = circ->next) {
+ TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) {
if (CIRCUIT_IS_ORIGIN(circ) &&
!circ->marked_for_close &&
circ->purpose == CIRCUIT_PURPOSE_C_GENERAL &&
@@ -869,7 +864,7 @@ circuit_predict_and_launch_new(void)
int flags = 0;
/* First, count how many of each type of circuit we have already. */
- for (circ=global_circuitlist;circ;circ = circ->next) {
+ TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) {
cpath_build_state_t *build_state;
origin_circuit_t *origin_circ;
if (!CIRCUIT_IS_ORIGIN(circ))
@@ -948,8 +943,8 @@ circuit_predict_and_launch_new(void)
* want, don't do another -- we want to leave a few slots open so
* we can still build circuits preemptively as needed. */
if (num < MAX_UNUSED_OPEN_CIRCUITS-2 &&
- get_options()->LearnCircuitBuildTimeout &&
- circuit_build_times_needs_circuits_now(&circ_times)) {
+ ! circuit_build_times_disabled() &&
+ circuit_build_times_needs_circuits_now(get_circuit_build_times())) {
flags = CIRCLAUNCH_NEED_CAPACITY;
log_info(LD_CIRC,
"Have %d clean circs need another buildtime test circ.", num);
@@ -1084,8 +1079,8 @@ circuit_expire_old_circuits_clientside(void)
tor_gettimeofday(&now);
cutoff = now;
- if (get_options()->LearnCircuitBuildTimeout &&
- circuit_build_times_needs_circuits(&circ_times)) {
+ if (! circuit_build_times_disabled() &&
+ circuit_build_times_needs_circuits(get_circuit_build_times())) {
/* Circuits should be shorter lived if we need more of them
* for learning a good build timeout */
cutoff.tv_sec -= IDLE_TIMEOUT_WHILE_LEARNING;
@@ -1093,7 +1088,7 @@ circuit_expire_old_circuits_clientside(void)
cutoff.tv_sec -= get_options()->CircuitIdleTimeout;
}
- for (circ = global_circuitlist; circ; circ = circ->next) {
+ TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) {
if (circ->marked_for_close || !CIRCUIT_IS_ORIGIN(circ))
continue;
/* If the circuit has been dirty for too long, and there are no streams
@@ -1176,7 +1171,7 @@ circuit_expire_old_circuits_serverside(time_t now)
or_circuit_t *or_circ;
time_t cutoff = now - IDLE_ONE_HOP_CIRC_TIMEOUT;
- for (circ = global_circuitlist; circ; circ = circ->next) {
+ TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) {
if (circ->marked_for_close || CIRCUIT_IS_ORIGIN(circ))
continue;
or_circ = TO_OR_CIRCUIT(circ);
@@ -1223,7 +1218,7 @@ circuit_enough_testing_circs(void)
if (have_performed_bandwidth_test)
return 1;
- for (circ = global_circuitlist; circ; circ = circ->next) {
+ TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) {
if (!circ->marked_for_close && CIRCUIT_IS_ORIGIN(circ) &&
circ->purpose == CIRCUIT_PURPOSE_TESTING &&
circ->state == CIRCUIT_STATE_OPEN)
diff --git a/src/or/command.c b/src/or/command.c
index 876ff526a..699b02fb4 100644
--- a/src/or/command.c
+++ b/src/or/command.c
@@ -29,6 +29,7 @@
#include "hibernate.h"
#include "nodelist.h"
#include "onion.h"
+#include "rephist.h"
#include "relay.h"
#include "router.h"
#include "routerlist.h"
@@ -277,6 +278,8 @@ command_process_create_cell(cell_t *cell, channel_t *chan)
if (create_cell->handshake_type != ONION_HANDSHAKE_TYPE_FAST) {
/* hand it off to the cpuworkers, and then return. */
+ if (connection_or_digest_is_known_relay(chan->identity_digest))
+ rep_hist_note_circuit_handshake_requested(create_cell->handshake_type);
if (assign_onionskin_to_cpuworker(NULL, circ, create_cell) < 0) {
log_debug(LD_GENERAL,"Failed to hand off onionskin. Closing.");
circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_RESOURCELIMIT);
diff --git a/src/or/config.c b/src/or/config.c
index 75ec0975a..17d672885 100644
--- a/src/or/config.c
+++ b/src/or/config.c
@@ -10,7 +10,6 @@
**/
#define CONFIG_PRIVATE
-
#include "or.h"
#include "addressmap.h"
#include "channel.h"
@@ -46,6 +45,7 @@
#include "routerset.h"
#include "statefile.h"
#include "transports.h"
+#include "ext_orport.h"
#ifdef _WIN32
#include <shlobj.h>
#endif
@@ -231,6 +231,7 @@ static config_var_t option_vars_[] = {
V(ExitPolicyRejectPrivate, BOOL, "1"),
V(ExitPortStatistics, BOOL, "0"),
V(ExtendAllowPrivateAddresses, BOOL, "0"),
+ VPORT(ExtORPort, LINELIST, NULL),
V(ExtraInfoStatistics, BOOL, "1"),
V(FallbackDir, LINELIST, NULL),
@@ -282,6 +283,7 @@ static config_var_t option_vars_[] = {
V(IPv6Exit, BOOL, "0"),
VAR("ServerTransportPlugin", LINELIST, ServerTransportPlugin, NULL),
V(ServerTransportListenAddr, LINELIST, NULL),
+ V(ServerTransportOptions, LINELIST, NULL),
V(Socks4Proxy, STRING, NULL),
V(Socks5Proxy, STRING, NULL),
V(Socks5ProxyUsername, STRING, NULL),
@@ -315,7 +317,7 @@ static config_var_t option_vars_[] = {
OBSOLETE("NoPublish"),
VAR("NodeFamily", LINELIST, NodeFamilies, NULL),
V(NumCPUs, UINT, "0"),
- V(NumDirectoryGuards, UINT, "3"),
+ V(NumDirectoryGuards, UINT, "0"),
V(NumEntryGuards, UINT, "3"),
V(ORListenAddress, LINELIST, NULL),
VPORT(ORPort, LINELIST, NULL),
@@ -510,10 +512,6 @@ static const config_var_t testing_tor_network_defaults[] = {
#ifdef _WIN32
static char *get_windows_conf_root(void);
#endif
-static int options_validate(or_options_t *old_options,
- or_options_t *options,
- or_options_t *default_options,
- int from_setconf, char **msg);
static int options_act_reversible(const or_options_t *old_options, char **msg);
static int options_act(const or_options_t *old_options);
static int options_transition_allowed(const or_options_t *old,
@@ -523,7 +521,7 @@ static int options_transition_affects_workers(
const or_options_t *old_options, const or_options_t *new_options);
static int options_transition_affects_descriptor(
const or_options_t *old_options, const or_options_t *new_options);
-static int check_nickname_list(const char *lst, const char *name, char **msg);
+static int check_nickname_list(char **lst, const char *name, char **msg);
static int parse_client_transport_line(const char *line, int validate_only);
@@ -557,7 +555,7 @@ static void config_maybe_load_geoip_files_(const or_options_t *options,
#define OR_OPTIONS_MAGIC 9090909
/** Configuration format for or_options_t. */
-static config_format_t options_format = {
+STATIC config_format_t options_format = {
sizeof(or_options_t),
OR_OPTIONS_MAGIC,
STRUCT_OFFSET(or_options_t, magic_),
@@ -713,7 +711,7 @@ get_short_version(void)
/** Release additional memory allocated in options
*/
-static void
+STATIC void
or_options_free(or_options_t *options)
{
if (!options)
@@ -1477,8 +1475,14 @@ options_act(const or_options_t *old_options)
return -1;
}
- if (init_cookie_authentication(options->CookieAuthentication) < 0) {
- log_warn(LD_CONFIG,"Error creating cookie authentication file.");
+ if (init_control_cookie_authentication(options->CookieAuthentication) < 0) {
+ log_warn(LD_CONFIG,"Error creating control cookie authentication file.");
+ return -1;
+ }
+
+ /* If we have an ExtORPort, initialize its auth cookie. */
+ if (init_ext_or_cookie_authentication(!!options->ExtORPort_lines) < 0) {
+ log_warn(LD_CONFIG,"Error creating Extended ORPort cookie file.");
return -1;
}
@@ -2322,6 +2326,10 @@ compute_publishserverdescriptor(or_options_t *options)
* will generate too many circuits and potentially overload the network. */
#define MIN_MAX_CIRCUIT_DIRTINESS 10
+/** Highest allowable value for MaxCircuitDirtiness: prevents time_t
+ * overflows. */
+#define MAX_MAX_CIRCUIT_DIRTINESS (30*24*60*60)
+
/** Lowest allowable value for CircuitStreamTimeout; if this is too low, Tor
* will generate too many circuits and potentially overload the network. */
#define MIN_CIRCUIT_STREAM_TIMEOUT 10
@@ -2350,7 +2358,7 @@ compute_publishserverdescriptor(or_options_t *options)
* Log line should stay empty. If it's 0, then give us a default log
* if there are no logs defined.
*/
-static int
+STATIC int
options_validate(or_options_t *old_options, or_options_t *options,
or_options_t *default_options, int from_setconf, char **msg)
{
@@ -2843,6 +2851,12 @@ options_validate(or_options_t *old_options, or_options_t *options,
options->MaxCircuitDirtiness = MIN_MAX_CIRCUIT_DIRTINESS;
}
+ if (options->MaxCircuitDirtiness > MAX_MAX_CIRCUIT_DIRTINESS) {
+ log_warn(LD_CONFIG, "MaxCircuitDirtiness option is too high; "
+ "setting to %d days.", MAX_MAX_CIRCUIT_DIRTINESS/86400);
+ options->MaxCircuitDirtiness = MAX_MAX_CIRCUIT_DIRTINESS;
+ }
+
if (options->CircuitStreamTimeout &&
options->CircuitStreamTimeout < MIN_CIRCUIT_STREAM_TIMEOUT) {
log_warn(LD_CONFIG, "CircuitStreamTimeout option is too short; "
@@ -3086,7 +3100,7 @@ options_validate(or_options_t *old_options, or_options_t *options,
"You should also make sure you aren't listing this bridge's "
"fingerprint in any other MyFamily.");
}
- if (check_nickname_list(options->MyFamily, "MyFamily", msg))
+ if (check_nickname_list(&options->MyFamily, "MyFamily", msg))
return -1;
for (cl = options->NodeFamilies; cl; cl = cl->next) {
routerset_t *rs = routerset_new();
@@ -3149,6 +3163,19 @@ options_validate(or_options_t *old_options, or_options_t *options,
"ServerTransportListenAddr line will be ignored.");
}
+ for (cl = options->ServerTransportOptions; cl; cl = cl->next) {
+ /** If get_options_from_transport_options_line() fails with
+ 'transport' being NULL, it means that something went wrong
+ while parsing the ServerTransportOptions line. */
+ smartlist_t *options_sl =
+ get_options_from_transport_options_line(cl->value, NULL);
+ if (!options_sl)
+ REJECT("ServerTransportOptions did not parse. See logs for details.");
+
+ SMARTLIST_FOREACH(options_sl, char *, cp, tor_free(cp));
+ smartlist_free(options_sl);
+ }
+
if (options->ConstrainedSockets) {
/* If the user wants to constrain socket buffer use, make sure the desired
* limit is between MIN|MAX_TCPSOCK_BUFFER in k increments. */
@@ -3604,31 +3631,63 @@ get_default_conf_file(int defaults_file)
}
/** Verify whether lst is a string containing valid-looking comma-separated
- * nicknames, or NULL. Return 0 on success. Warn and return -1 on failure.
+ * nicknames, or NULL. Will normalise <b>lst</b> to prefix '$' to any nickname
+ * or fingerprint that needs it. Return 0 on success.
+ * Warn and return -1 on failure.
*/
static int
-check_nickname_list(const char *lst, const char *name, char **msg)
+check_nickname_list(char **lst, const char *name, char **msg)
{
int r = 0;
smartlist_t *sl;
+ int changes = 0;
- if (!lst)
+ if (!*lst)
return 0;
sl = smartlist_new();
- smartlist_split_string(sl, lst, ",",
+ smartlist_split_string(sl, *lst, ",",
SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK|SPLIT_STRIP_SPACE, 0);
- SMARTLIST_FOREACH(sl, const char *, s,
+ SMARTLIST_FOREACH_BEGIN(sl, char *, s)
{
if (!is_legal_nickname_or_hexdigest(s)) {
+ // check if first char is dollar
+ if (s[0] != '$') {
+ // Try again but with a dollar symbol prepended
+ char *prepended;
+ tor_asprintf(&prepended, "$%s", s);
+
+ if (is_legal_nickname_or_hexdigest(prepended)) {
+ // The nickname is valid when it's prepended, swap the current
+ // version with a prepended one
+ tor_free(s);
+ SMARTLIST_REPLACE_CURRENT(sl, s, prepended);
+ changes = 1;
+ continue;
+ }
+
+ // Still not valid, free and fallback to error message
+ tor_free(prepended);
+ }
+
tor_asprintf(msg, "Invalid nickname '%s' in %s line", s, name);
r = -1;
break;
}
- });
+ }
+ SMARTLIST_FOREACH_END(s);
+
+ // Replace the caller's nickname list with a fixed one
+ if (changes && r == 0) {
+ char *newNicknames = smartlist_join_strings(sl, ", ", 0, NULL);
+ tor_free(*lst);
+ *lst = newNicknames;
+ }
+
SMARTLIST_FOREACH(sl, char *, s, tor_free(s));
smartlist_free(sl);
+
return r;
}
@@ -3819,6 +3878,7 @@ options_init_from_torrc(int argc, char **argv)
}
if (command == CMD_HASH_PASSWORD) {
+ cf_defaults = tor_strdup("");
cf = tor_strdup("");
} else {
cf_defaults = load_torrc_from_disk(argc, argv, 1);
@@ -4582,6 +4642,63 @@ get_bindaddr_from_transport_listen_line(const char *line,const char *transport)
return addrport;
}
+/** Given a ServerTransportOptions <b>line</b>, return a smartlist
+ * with the options. Return NULL if the line was not well-formed.
+ *
+ * If <b>transport</b> is set, return NULL if the line is not
+ * referring to <b>transport</b>.
+ *
+ * The returned smartlist and its strings are allocated on the heap
+ * and it's the responsibility of the caller to free it. */
+smartlist_t *
+get_options_from_transport_options_line(const char *line,const char *transport)
+{
+ smartlist_t *items = smartlist_new();
+ smartlist_t *options = smartlist_new();
+ const char *parsed_transport = NULL;
+
+ smartlist_split_string(items, line, NULL,
+ SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, -1);
+
+ if (smartlist_len(items) < 2) {
+ log_warn(LD_CONFIG,"Too few arguments on ServerTransportOptions line.");
+ goto err;
+ }
+
+ parsed_transport = smartlist_get(items, 0);
+ /* If 'transport' is given, check if it matches the one on the line */
+ if (transport && strcmp(transport, parsed_transport))
+ goto err;
+
+ SMARTLIST_FOREACH_BEGIN(items, const char *, option) {
+ if (option_sl_idx == 0) /* skip the transport field (first field)*/
+ continue;
+
+ /* validate that it's a k=v value */
+ if (!string_is_key_value(LOG_WARN, option)) {
+ log_warn(LD_CONFIG, "%s is not a k=v value.", escaped(option));
+ goto err;
+ }
+
+ /* add it to the options smartlist */
+ smartlist_add(options, tor_strdup(option));
+ log_debug(LD_CONFIG, "Added %s to the list of options", escaped(option));
+ } SMARTLIST_FOREACH_END(option);
+
+ goto done;
+
+ err:
+ SMARTLIST_FOREACH(options, char*, s, tor_free(s));
+ smartlist_free(options);
+ options = NULL;
+
+ done:
+ SMARTLIST_FOREACH(items, char*, s, tor_free(s));
+ smartlist_free(items);
+
+ return options;
+}
+
/** Given the name of a pluggable transport in <b>transport</b>, check
* the configuration file to see if the user has explicitly asked for
* it to listen on a specific port. Return a <address:port> string if
@@ -4602,6 +4719,26 @@ get_transport_bindaddr_from_config(const char *transport)
return NULL;
}
+/** Given the name of a pluggable transport in <b>transport</b>, check
+ * the configuration file to see if the user has asked us to pass any
+ * parameters to the pluggable transport. Return a smartlist
+ * containing the parameters, otherwise NULL. */
+smartlist_t *
+get_options_for_server_transport(const char *transport)
+{
+ config_line_t *cl;
+ const or_options_t *options = get_options();
+
+ for (cl = options->ServerTransportOptions; cl; cl = cl->next) {
+ smartlist_t *options_sl =
+ get_options_from_transport_options_line(cl->value, transport);
+ if (options_sl)
+ return options_sl;
+ }
+
+ return NULL;
+}
+
/** Read the contents of a ServerTransportPlugin line from
* <b>line</b>. Return 0 if the line is well-formed, and -1 if it
* isn't.
@@ -5006,6 +5143,27 @@ warn_nonlocal_client_ports(const smartlist_t *ports, const char *portname,
} SMARTLIST_FOREACH_END(port);
}
+/** Warn for every Extended ORPort port in <b>ports</b> that is on a
+ * publicly routable address. */
+static void
+warn_nonlocal_ext_orports(const smartlist_t *ports, const char *portname)
+{
+ SMARTLIST_FOREACH_BEGIN(ports, const port_cfg_t *, port) {
+ if (port->type != CONN_TYPE_EXT_OR_LISTENER)
+ continue;
+ if (port->is_unix_addr)
+ continue;
+ /* XXX maybe warn even if address is RFC1918? */
+ if (!tor_addr_is_internal(&port->addr, 1)) {
+ log_warn(LD_CONFIG, "You specified a public address '%s' for %sPort. "
+ "This is not advised; this address is supposed to only be "
+ "exposed on localhost so that your pluggable transport "
+ "proxies can connect to it.",
+ fmt_addrport(&port->addr, port->port), portname);
+ }
+ } SMARTLIST_FOREACH_END(port);
+}
+
/** Given a list of port_cfg_t in <b>ports</b>, warn any controller port there
* is listening on any non-loopback address. If <b>forbid</b> is true,
* then emit a stronger warning and remove the port from the list.
@@ -5106,6 +5264,7 @@ parse_port_config(smartlist_t *out,
smartlist_t *elts;
int retval = -1;
const unsigned is_control = (listener_type == CONN_TYPE_CONTROL_LISTENER);
+ const unsigned is_ext_orport = (listener_type == CONN_TYPE_EXT_OR_LISTENER);
const unsigned allow_no_options = flags & CL_PORT_NO_OPTIONS;
const unsigned use_server_options = flags & CL_PORT_SERVER_OPTIONS;
const unsigned warn_nonlocal = flags & CL_PORT_WARN_NONLOCAL;
@@ -5183,6 +5342,8 @@ parse_port_config(smartlist_t *out,
if (warn_nonlocal && out) {
if (is_control)
warn_nonlocal_controller_ports(out, forbid_nonlocal);
+ else if (is_ext_orport)
+ warn_nonlocal_ext_orports(out, portname);
else
warn_nonlocal_client_ports(out, portname, listener_type);
}
@@ -5456,6 +5617,8 @@ parse_port_config(smartlist_t *out,
if (warn_nonlocal && out) {
if (is_control)
warn_nonlocal_controller_ports(out, forbid_nonlocal);
+ else if (is_ext_orport)
+ warn_nonlocal_ext_orports(out, portname);
else
warn_nonlocal_client_ports(out, portname, listener_type);
}
@@ -5602,6 +5765,14 @@ parse_ports(or_options_t *options, int validate_only,
goto err;
}
if (parse_port_config(ports,
+ options->ExtORPort_lines, NULL,
+ "ExtOR", CONN_TYPE_EXT_OR_LISTENER,
+ "127.0.0.1", 0,
+ CL_PORT_SERVER_OPTIONS|CL_PORT_WARN_NONLOCAL) < 0) {
+ *msg = tor_strdup("Invalid ExtORPort configuration");
+ goto err;
+ }
+ if (parse_port_config(ports,
options->DirPort_lines, options->DirListenAddress,
"Dir", CONN_TYPE_DIR_LISTENER,
"0.0.0.0", 0,
@@ -5636,6 +5807,8 @@ parse_ports(or_options_t *options, int validate_only,
!! count_real_listeners(ports, CONN_TYPE_DIR_LISTENER);
options->DNSPort_set =
!! count_real_listeners(ports, CONN_TYPE_AP_DNS_LISTENER);
+ options->ExtORPort_set =
+ !! count_real_listeners(ports, CONN_TYPE_EXT_OR_LISTENER);
if (!validate_only) {
if (configured_ports) {
@@ -5699,6 +5872,13 @@ check_server_ports(const smartlist_t *ports,
"listening on one.");
r = -1;
}
+ if (n_orport_listeners && !n_orport_advertised) {
+ log_warn(LD_CONFIG, "We are listening on an ORPort, but not advertising "
+ "any ORPorts. This will keep us from building a %s "
+ "descriptor, and make us impossible to use.",
+ options->BridgeRelay ? "bridge" : "router");
+ r = -1;
+ }
if (n_dirport_advertised && !n_dirport_listeners) {
log_warn(LD_CONFIG, "We are advertising a DirPort, but not actually "
"listening on one.");
@@ -6335,3 +6515,58 @@ config_maybe_load_geoip_files_(const or_options_t *options,
config_load_geoip_file_(AF_INET6, options->GeoIPv6File, "geoip6");
}
+/** Initialize cookie authentication (used so far by the ControlPort
+ * and Extended ORPort).
+ *
+ * Allocate memory and create a cookie (of length <b>cookie_len</b>)
+ * in <b>cookie_out</b>.
+ * Then write it down to <b>fname</b> and prepend it with <b>header</b>.
+ *
+ * If the whole procedure was successful, set
+ * <b>cookie_is_set_out</b> to True. */
+int
+init_cookie_authentication(const char *fname, const char *header,
+ int cookie_len,
+ uint8_t **cookie_out, int *cookie_is_set_out)
+{
+ char cookie_file_str_len = strlen(header) + cookie_len;
+ char *cookie_file_str = tor_malloc(cookie_file_str_len);
+ int retval = -1;
+
+ /* We don't want to generate a new cookie every time we call
+ * options_act(). One should be enough. */
+ if (*cookie_is_set_out) {
+ retval = 0; /* we are all set */
+ goto done;
+ }
+
+ /* If we've already set the cookie, free it before re-setting
+ it. This can happen if we previously generated a cookie, but
+ couldn't write it to a disk. */
+ if (*cookie_out)
+ tor_free(*cookie_out);
+
+ /* Generate the cookie */
+ *cookie_out = tor_malloc(cookie_len);
+ if (crypto_rand((char *)*cookie_out, cookie_len) < 0)
+ goto done;
+
+ /* Create the string that should be written on the file. */
+ memcpy(cookie_file_str, header, strlen(header));
+ memcpy(cookie_file_str+strlen(header), *cookie_out, cookie_len);
+ if (write_bytes_to_file(fname, cookie_file_str, cookie_file_str_len, 1)) {
+ log_warn(LD_FS,"Error writing auth cookie to %s.", escaped(fname));
+ goto done;
+ }
+
+ /* Success! */
+ log_info(LD_GENERAL, "Generated auth cookie file in '%s'.", escaped(fname));
+ *cookie_is_set_out = 1;
+ retval = 0;
+
+ done:
+ memwipe(cookie_file_str, 0, cookie_file_str_len);
+ tor_free(cookie_file_str);
+ return retval;
+}
+
diff --git a/src/or/config.h b/src/or/config.h
index 8c8167f9a..eb16e7461 100644
--- a/src/or/config.h
+++ b/src/or/config.h
@@ -90,10 +90,11 @@ uint32_t get_effective_bwburst(const or_options_t *options);
char *get_transport_bindaddr_from_config(const char *transport);
-#ifdef CONFIG_PRIVATE
-/* Used only by config.c and test.c */
+int init_cookie_authentication(const char *fname, const char *header,
+ int cookie_len,
+ uint8_t **cookie_out, int *cookie_is_set_out);
+
or_options_t *options_new(void);
-#endif
void config_register_addressmaps(const or_options_t *options);
/* XXXX024 move to connection_edge.h */
@@ -115,6 +116,21 @@ typedef struct bridge_line_t {
void bridge_line_free(bridge_line_t *bridge_line);
bridge_line_t *parse_bridge_line(const char *line);
+smartlist_t *get_options_from_transport_options_line(const char *line,
+ const char *transport);
+smartlist_t *get_options_for_server_transport(const char *transport);
+
+#ifdef CONFIG_PRIVATE
+#ifdef TOR_UNIT_TESTS
+extern struct config_format_t options_format;
+#endif
+
+STATIC void or_options_free(or_options_t *options);
+STATIC int options_validate(or_options_t *old_options,
+ or_options_t *options,
+ or_options_t *default_options,
+ int from_setconf, char **msg);
+#endif
#endif
diff --git a/src/or/confparse.c b/src/or/confparse.c
index eb0362f49..41055791e 100644
--- a/src/or/confparse.c
+++ b/src/or/confparse.c
@@ -1126,20 +1126,36 @@ static struct unit_table_t memory_units[] = {
{ "kbytes", 1<<10 },
{ "kilobyte", 1<<10 },
{ "kilobytes", 1<<10 },
+ { "kilobits", 1<<7 },
+ { "kilobit", 1<<7 },
+ { "kbits", 1<<7 },
+ { "kbit", 1<<7 },
{ "m", 1<<20 },
{ "mb", 1<<20 },
{ "mbyte", 1<<20 },
{ "mbytes", 1<<20 },
{ "megabyte", 1<<20 },
{ "megabytes", 1<<20 },
+ { "megabits", 1<<17 },
+ { "megabit", 1<<17 },
+ { "mbits", 1<<17 },
+ { "mbit", 1<<17 },
{ "gb", 1<<30 },
{ "gbyte", 1<<30 },
{ "gbytes", 1<<30 },
{ "gigabyte", 1<<30 },
{ "gigabytes", 1<<30 },
+ { "gigabits", 1<<27 },
+ { "gigabit", 1<<27 },
+ { "gbits", 1<<27 },
+ { "gbit", 1<<27 },
{ "tb", U64_LITERAL(1)<<40 },
{ "terabyte", U64_LITERAL(1)<<40 },
{ "terabytes", U64_LITERAL(1)<<40 },
+ { "terabits", U64_LITERAL(1)<<37 },
+ { "terabit", U64_LITERAL(1)<<37 },
+ { "tbits", U64_LITERAL(1)<<37 },
+ { "tbit", U64_LITERAL(1)<<37 },
{ NULL, 0 },
};
diff --git a/src/or/confparse.h b/src/or/confparse.h
index d82e1096c..924ee0d94 100644
--- a/src/or/confparse.h
+++ b/src/or/confparse.h
@@ -76,7 +76,7 @@ typedef int (*validate_fn_t)(void*,void*,int,char**);
/** Information on the keys, value types, key-to-struct-member mappings,
* variable descriptions, validation functions, and abbreviations for a
* configuration or storage format. */
-typedef struct {
+typedef struct config_format_t {
size_t size; /**< Size of the struct that everything gets parsed into. */
uint32_t magic; /**< Required 'magic value' to make sure we have a struct
* of the right type. */
diff --git a/src/or/connection.c b/src/or/connection.c
index aa3cc330d..8c66a170e 100644
--- a/src/or/connection.c
+++ b/src/or/connection.c
@@ -10,6 +10,7 @@
* on connections.
**/
+#define CONNECTION_PRIVATE
#include "or.h"
#include "buffers.h"
/*
@@ -33,6 +34,7 @@
#include "dns.h"
#include "dnsserv.h"
#include "entrynodes.h"
+#include "ext_orport.h"
#include "geoip.h"
#include "main.h"
#include "policies.h"
@@ -98,6 +100,7 @@ static smartlist_t *outgoing_addrs = NULL;
#define CASE_ANY_LISTENER_TYPE \
case CONN_TYPE_OR_LISTENER: \
+ case CONN_TYPE_EXT_OR_LISTENER: \
case CONN_TYPE_AP_LISTENER: \
case CONN_TYPE_DIR_LISTENER: \
case CONN_TYPE_CONTROL_LISTENER: \
@@ -129,6 +132,8 @@ conn_type_to_string(int type)
case CONN_TYPE_CPUWORKER: return "CPU worker";
case CONN_TYPE_CONTROL_LISTENER: return "Control listener";
case CONN_TYPE_CONTROL: return "Control";
+ case CONN_TYPE_EXT_OR: return "Extended OR";
+ case CONN_TYPE_EXT_OR_LISTENER: return "Extended OR listener";
default:
log_warn(LD_BUG, "unknown connection type %d", type);
tor_snprintf(buf, sizeof(buf), "unknown [%d]", type);
@@ -165,6 +170,18 @@ conn_state_to_string(int type, int state)
case OR_CONN_STATE_OPEN: return "open";
}
break;
+ case CONN_TYPE_EXT_OR:
+ switch (state) {
+ case EXT_OR_CONN_STATE_AUTH_WAIT_AUTH_TYPE:
+ return "waiting for authentication type";
+ case EXT_OR_CONN_STATE_AUTH_WAIT_CLIENT_NONCE:
+ return "waiting for client nonce";
+ case EXT_OR_CONN_STATE_AUTH_WAIT_CLIENT_HASH:
+ return "waiting for client hash";
+ case EXT_OR_CONN_STATE_OPEN: return "open";
+ case EXT_OR_CONN_STATE_FLUSHING: return "flushing final OKAY";
+ }
+ break;
case CONN_TYPE_EXIT:
switch (state) {
case EXIT_CONN_STATE_RESOLVING: return "waiting for dest info";
@@ -229,6 +246,7 @@ connection_type_uses_bufferevent(connection_t *conn)
case CONN_TYPE_DIR:
case CONN_TYPE_CONTROL:
case CONN_TYPE_OR:
+ case CONN_TYPE_EXT_OR:
case CONN_TYPE_CPUWORKER:
return 1;
default:
@@ -259,14 +277,18 @@ dir_connection_new(int socket_family)
* Set active_circuit_pqueue_last_recalibrated to current cell_ewma tick.
*/
or_connection_t *
-or_connection_new(int socket_family)
+or_connection_new(int type, int socket_family)
{
or_connection_t *or_conn = tor_malloc_zero(sizeof(or_connection_t));
time_t now = time(NULL);
- connection_init(now, TO_CONN(or_conn), CONN_TYPE_OR, socket_family);
+ tor_assert(type == CONN_TYPE_OR || type == CONN_TYPE_EXT_OR);
+ connection_init(now, TO_CONN(or_conn), type, socket_family);
or_conn->timestamp_last_added_nonpadding = time(NULL);
+ if (type == CONN_TYPE_EXT_OR)
+ connection_or_set_ext_or_identifier(or_conn);
+
return or_conn;
}
@@ -335,7 +357,8 @@ connection_new(int type, int socket_family)
{
switch (type) {
case CONN_TYPE_OR:
- return TO_CONN(or_connection_new(socket_family));
+ case CONN_TYPE_EXT_OR:
+ return TO_CONN(or_connection_new(type, socket_family));
case CONN_TYPE_EXIT:
return TO_CONN(edge_connection_new(type, socket_family));
@@ -377,6 +400,7 @@ connection_init(time_t now, connection_t *conn, int type, int socket_family)
switch (type) {
case CONN_TYPE_OR:
+ case CONN_TYPE_EXT_OR:
conn->magic = OR_CONNECTION_MAGIC;
break;
case CONN_TYPE_EXIT:
@@ -435,7 +459,7 @@ connection_link_connections(connection_t *conn_a, connection_t *conn_b)
* necessary, close its socket if necessary, and mark the directory as dirty
* if <b>conn</b> is an OR or OP connection.
*/
-static void
+STATIC void
connection_free_(connection_t *conn)
{
void *mem;
@@ -445,6 +469,7 @@ connection_free_(connection_t *conn)
switch (conn->type) {
case CONN_TYPE_OR:
+ case CONN_TYPE_EXT_OR:
tor_assert(conn->magic == OR_CONNECTION_MAGIC);
mem = TO_OR_CONN(conn);
memlen = sizeof(or_connection_t);
@@ -575,6 +600,13 @@ connection_free_(connection_t *conn)
log_warn(LD_BUG, "called on OR conn with non-zeroed identity_digest");
connection_or_remove_from_identity_map(TO_OR_CONN(conn));
}
+ if (conn->type == CONN_TYPE_OR || conn->type == CONN_TYPE_EXT_OR) {
+ connection_or_remove_from_ext_or_id_map(TO_OR_CONN(conn));
+ tor_free(TO_OR_CONN(conn)->ext_or_conn_id);
+ tor_free(TO_OR_CONN(conn)->ext_or_auth_correct_client_hash);
+ tor_free(TO_OR_CONN(conn)->ext_or_transport);
+ }
+
#ifdef USE_BUFFEREVENTS
if (conn->type == CONN_TYPE_OR && TO_OR_CONN(conn)->bucket_cfg) {
ev_token_bucket_cfg_free(TO_OR_CONN(conn)->bucket_cfg);
@@ -638,6 +670,7 @@ connection_about_to_close_connection(connection_t *conn)
connection_dir_about_to_close(TO_DIR_CONN(conn));
break;
case CONN_TYPE_OR:
+ case CONN_TYPE_EXT_OR:
connection_or_about_to_close(TO_OR_CONN(conn));
break;
case CONN_TYPE_AP:
@@ -877,8 +910,11 @@ check_location_for_unix_socket(const or_options_t *options, const char *path)
int r = -1;
char *p = tor_strdup(path);
cpd_check_t flags = CPD_CHECK_MODE_ONLY;
- if (get_parent_directory(p)<0)
+ if (get_parent_directory(p)<0 || p[0] != '/') {
+ log_warn(LD_GENERAL, "Bad unix socket address '%s'. Tor does not support "
+ "relative paths for unix sockets.", path);
goto done;
+ }
if (options->ControlSocketsGroupWritable)
flags |= CPD_GROUP_OK;
@@ -967,7 +1003,7 @@ connection_listener_new(const struct sockaddr *listensockaddr,
log_notice(LD_NET, "Opening %s on %s",
conn_type_to_string(type), fmt_addrport(&addr, usePort));
- s = tor_open_socket(tor_addr_family(&addr),
+ s = tor_open_socket_nonblocking(tor_addr_family(&addr),
is_tcp ? SOCK_STREAM : SOCK_DGRAM,
is_tcp ? IPPROTO_TCP: IPPROTO_UDP);
if (!SOCKET_OK(s)) {
@@ -1051,7 +1087,7 @@ connection_listener_new(const struct sockaddr *listensockaddr,
strerror(errno));
goto err;
}
- s = tor_open_socket(AF_UNIX, SOCK_STREAM, 0);
+ s = tor_open_socket_nonblocking(AF_UNIX, SOCK_STREAM, 0);
if (! SOCKET_OK(s)) {
log_warn(LD_NET,"Socket creation failed: %s.", strerror(errno));
goto err;
@@ -1099,9 +1135,6 @@ connection_listener_new(const struct sockaddr *listensockaddr,
tor_assert(0);
}
- if (set_socket_nonblocking(s) == -1)
- goto err;
-
lis_conn = listener_connection_new(type, listensockaddr->sa_family);
conn = TO_CONN(lis_conn);
conn->socket_family = listensockaddr->sa_family;
@@ -1249,7 +1282,7 @@ connection_handle_listener_read(connection_t *conn, int new_type)
tor_assert((size_t)remotelen >= sizeof(struct sockaddr_in));
memset(&addrbuf, 0, sizeof(addrbuf));
- news = tor_accept_socket(conn->s,remote,&remotelen);
+ news = tor_accept_socket_nonblocking(conn->s,remote,&remotelen);
if (!SOCKET_OK(news)) { /* accept() error */
int e = tor_socket_errno(conn->s);
if (ERRNO_IS_ACCEPT_EAGAIN(e)) {
@@ -1269,10 +1302,6 @@ connection_handle_listener_read(connection_t *conn, int new_type)
(int)news,(int)conn->s);
make_socket_reuseable(news);
- if (set_socket_nonblocking(news) == -1) {
- tor_close_socket(news);
- return 0;
- }
if (options->ConstrainedSockets)
set_constrained_socket_buffers(news, (int)options->ConstrainedSockSize);
@@ -1371,6 +1400,9 @@ connection_init_accepted_conn(connection_t *conn,
connection_start_reading(conn);
switch (conn->type) {
+ case CONN_TYPE_EXT_OR:
+ /* Initiate Extended ORPort authentication. */
+ return connection_ext_or_start_auth(TO_OR_CONN(conn));
case CONN_TYPE_OR:
control_event_or_conn_status(TO_OR_CONN(conn), OR_CONN_EVENT_NEW, 0);
rv = connection_tls_start_handshake(TO_OR_CONN(conn), 1);
@@ -1464,7 +1496,7 @@ connection_connect(connection_t *conn, const char *address,
return -1;
}
- s = tor_open_socket(protocol_family,SOCK_STREAM,IPPROTO_TCP);
+ s = tor_open_socket_nonblocking(protocol_family,SOCK_STREAM,IPPROTO_TCP);
if (! SOCKET_OK(s)) {
*socket_error = tor_socket_errno(-1);
log_warn(LD_NET,"Error creating network socket: %s",
@@ -1506,12 +1538,6 @@ connection_connect(connection_t *conn, const char *address,
}
}
- if (set_socket_nonblocking(s) == -1) {
- *socket_error = tor_socket_errno(s);
- tor_close_socket(s);
- return -1;
- }
-
if (options->ConstrainedSockets)
set_constrained_socket_buffers(s, (int)options->ConstrainedSockSize);
@@ -2883,6 +2909,8 @@ connection_handle_read_impl(connection_t *conn)
switch (conn->type) {
case CONN_TYPE_OR_LISTENER:
return connection_handle_listener_read(conn, CONN_TYPE_OR);
+ case CONN_TYPE_EXT_OR_LISTENER:
+ return connection_handle_listener_read(conn, CONN_TYPE_EXT_OR);
case CONN_TYPE_AP_LISTENER:
case CONN_TYPE_AP_TRANS_LISTENER:
case CONN_TYPE_AP_NATD_LISTENER:
@@ -3673,9 +3701,9 @@ connection_flush(connection_t *conn)
* it all, so we don't end up with many megabytes of controller info queued at
* once.
*/
-void
-connection_write_to_buf_impl_(const char *string, size_t len,
- connection_t *conn, int zlib)
+MOCK_IMPL(void,
+connection_write_to_buf_impl_,(const char *string, size_t len,
+ connection_t *conn, int zlib))
{
/* XXXX This function really needs to return -1 on failure. */
int r;
@@ -3915,6 +3943,7 @@ int
connection_is_listener(connection_t *conn)
{
if (conn->type == CONN_TYPE_OR_LISTENER ||
+ conn->type == CONN_TYPE_EXT_OR_LISTENER ||
conn->type == CONN_TYPE_AP_LISTENER ||
conn->type == CONN_TYPE_AP_TRANS_LISTENER ||
conn->type == CONN_TYPE_AP_DNS_LISTENER ||
@@ -3937,6 +3966,7 @@ connection_state_is_open(connection_t *conn)
return 0;
if ((conn->type == CONN_TYPE_OR && conn->state == OR_CONN_STATE_OPEN) ||
+ (conn->type == CONN_TYPE_EXT_OR) ||
(conn->type == CONN_TYPE_AP && conn->state == AP_CONN_STATE_OPEN) ||
(conn->type == CONN_TYPE_EXIT && conn->state == EXIT_CONN_STATE_OPEN) ||
(conn->type == CONN_TYPE_CONTROL &&
@@ -4106,6 +4136,8 @@ connection_process_inbuf(connection_t *conn, int package_partial)
switch (conn->type) {
case CONN_TYPE_OR:
return connection_or_process_inbuf(TO_OR_CONN(conn));
+ case CONN_TYPE_EXT_OR:
+ return connection_ext_or_process_inbuf(TO_OR_CONN(conn));
case CONN_TYPE_EXIT:
case CONN_TYPE_AP:
return connection_edge_process_inbuf(TO_EDGE_CONN(conn),
@@ -4166,6 +4198,8 @@ connection_finished_flushing(connection_t *conn)
switch (conn->type) {
case CONN_TYPE_OR:
return connection_or_finished_flushing(TO_OR_CONN(conn));
+ case CONN_TYPE_EXT_OR:
+ return connection_ext_or_finished_flushing(TO_OR_CONN(conn));
case CONN_TYPE_AP:
case CONN_TYPE_EXIT:
return connection_edge_finished_flushing(TO_EDGE_CONN(conn));
@@ -4221,6 +4255,7 @@ connection_reached_eof(connection_t *conn)
{
switch (conn->type) {
case CONN_TYPE_OR:
+ case CONN_TYPE_EXT_OR:
return connection_or_reached_eof(TO_OR_CONN(conn));
case CONN_TYPE_AP:
case CONN_TYPE_EXIT:
@@ -4307,6 +4342,7 @@ assert_connection_ok(connection_t *conn, time_t now)
switch (conn->type) {
case CONN_TYPE_OR:
+ case CONN_TYPE_EXT_OR:
tor_assert(conn->magic == OR_CONNECTION_MAGIC);
break;
case CONN_TYPE_AP:
@@ -4412,6 +4448,10 @@ assert_connection_ok(connection_t *conn, time_t now)
tor_assert(conn->state >= OR_CONN_STATE_MIN_);
tor_assert(conn->state <= OR_CONN_STATE_MAX_);
break;
+ case CONN_TYPE_EXT_OR:
+ tor_assert(conn->state >= EXT_OR_CONN_STATE_MIN_);
+ tor_assert(conn->state <= EXT_OR_CONN_STATE_MAX_);
+ break;
case CONN_TYPE_EXIT:
tor_assert(conn->state >= EXIT_CONN_STATE_MIN_);
tor_assert(conn->state <= EXIT_CONN_STATE_MAX_);
@@ -4544,6 +4584,7 @@ connection_free_all(void)
/* Unlink everything from the identity map. */
connection_or_clear_identity_map();
+ connection_or_clear_ext_or_id_map();
/* Clear out our list of broken connections */
clear_broken_connection_map(0);
diff --git a/src/or/connection.h b/src/or/connection.h
index 3e656ec06..0454ac2f3 100644
--- a/src/or/connection.h
+++ b/src/or/connection.h
@@ -19,7 +19,7 @@ const char *conn_type_to_string(int type);
const char *conn_state_to_string(int type, int state);
dir_connection_t *dir_connection_new(int socket_family);
-or_connection_t *or_connection_new(int socket_family);
+or_connection_t *or_connection_new(int type, int socket_family);
edge_connection_t *edge_connection_new(int type, int socket_family);
entry_connection_t *entry_connection_new(int type, int socket_family);
control_connection_t *control_connection_new(int socket_family);
@@ -130,8 +130,8 @@ int connection_outbuf_too_full(connection_t *conn);
int connection_handle_write(connection_t *conn, int force);
int connection_flush(connection_t *conn);
-void connection_write_to_buf_impl_(const char *string, size_t len,
- connection_t *conn, int zlib);
+MOCK_DECL(void, connection_write_to_buf_impl_,
+ (const char *string, size_t len, connection_t *conn, int zlib));
/* DOCDOC connection_write_to_buf */
static void connection_write_to_buf(const char *string, size_t len,
connection_t *conn);
@@ -214,5 +214,9 @@ void connection_enable_rate_limiting(connection_t *conn);
#define connection_type_uses_bufferevent(c) (0)
#endif
+#ifdef CONNECTION_PRIVATE
+STATIC void connection_free_(connection_t *conn);
+#endif
+
#endif
diff --git a/src/or/connection_edge.c b/src/or/connection_edge.c
index bb7ffb9a4..33585a094 100644
--- a/src/or/connection_edge.c
+++ b/src/or/connection_edge.c
@@ -407,7 +407,7 @@ connection_edge_finished_flushing(edge_connection_t *conn)
* that the name resolution that led us to <b>addr</b> will be valid for
* <b>ttl</b> seconds. Return -1 on error, or the number of bytes used on
* success. */
-/* private */int
+STATIC int
connected_cell_format_payload(uint8_t *payload_out,
const tor_addr_t *addr,
uint32_t ttl)
@@ -2265,7 +2265,7 @@ connection_ap_handshake_socks_reply(entry_connection_t *conn, char *reply,
* Return -1 in the case where want to send a RELAY_END cell, and < -1 when
* we don't.
**/
-/* static */ int
+STATIC int
begin_cell_parse(const cell_t *cell, begin_cell_t *bcell,
uint8_t *end_reason_out)
{
diff --git a/src/or/connection_edge.h b/src/or/connection_edge.h
index ea284cbcf..e3a95ad9e 100644
--- a/src/or/connection_edge.h
+++ b/src/or/connection_edge.h
@@ -12,6 +12,8 @@
#ifndef TOR_CONNECTION_EDGE_H
#define TOR_CONNECTION_EDGE_H
+#include "testsupport.h"
+
#define connection_mark_unattached_ap(conn, endreason) \
connection_mark_unattached_ap_((conn), (endreason), __LINE__, SHORT_FILE__)
@@ -130,9 +132,9 @@ typedef struct begin_cell_t {
unsigned is_begindir : 1;
} begin_cell_t;
-int begin_cell_parse(const cell_t *cell, begin_cell_t *bcell,
+STATIC int begin_cell_parse(const cell_t *cell, begin_cell_t *bcell,
uint8_t *end_reason_out);
-int connected_cell_format_payload(uint8_t *payload_out,
+STATIC int connected_cell_format_payload(uint8_t *payload_out,
const tor_addr_t *addr,
uint32_t ttl);
#endif
diff --git a/src/or/connection_or.c b/src/or/connection_or.c
index 361636350..120f732ce 100644
--- a/src/or/connection_or.c
+++ b/src/or/connection_or.c
@@ -37,7 +37,7 @@
#include "rephist.h"
#include "router.h"
#include "routerlist.h"
-
+#include "ext_orport.h"
#ifdef USE_BUFFEREVENTS
#include <event2/bufferevent_ssl.h>
#endif
@@ -75,6 +75,10 @@ static void connection_or_handle_event_cb(struct bufferevent *bufev,
* they form a linked list, with next_with_same_id as the next pointer. */
static digestmap_t *orconn_identity_map = NULL;
+/** Global map between Extended ORPort identifiers and OR
+ * connections. */
+static digestmap_t *orconn_ext_or_id_map = NULL;
+
/** If conn is listed in orconn_identity_map, remove it, and clear
* conn->identity_digest. Otherwise do nothing. */
void
@@ -174,6 +178,71 @@ connection_or_set_identity_digest(or_connection_t *conn, const char *digest)
#endif
}
+/** Remove the Extended ORPort identifier of <b>conn</b> from the
+ * global identifier list. Also, clear the identifier from the
+ * connection itself. */
+void
+connection_or_remove_from_ext_or_id_map(or_connection_t *conn)
+{
+ or_connection_t *tmp;
+ if (!orconn_ext_or_id_map)
+ return;
+ if (!conn->ext_or_conn_id)
+ return;
+
+ tmp = digestmap_remove(orconn_ext_or_id_map, conn->ext_or_conn_id);
+ if (!tor_digest_is_zero(conn->ext_or_conn_id))
+ tor_assert(tmp == conn);
+
+ memset(conn->ext_or_conn_id, 0, EXT_OR_CONN_ID_LEN);
+}
+
+/** Return the connection whose ext_or_id is <b>id</b>. Return NULL if no such
+ * connection is found. */
+or_connection_t *
+connection_or_get_by_ext_or_id(const char *id)
+{
+ if (!orconn_ext_or_id_map)
+ return NULL;
+ return digestmap_get(orconn_ext_or_id_map, id);
+}
+
+/** Deallocate the global Extended ORPort identifier list */
+void
+connection_or_clear_ext_or_id_map(void)
+{
+ digestmap_free(orconn_ext_or_id_map, NULL);
+ orconn_ext_or_id_map = NULL;
+}
+
+/** Creates an Extended ORPort identifier for <b>conn<b/> and deposits
+ * it into the global list of identifiers. */
+void
+connection_or_set_ext_or_identifier(or_connection_t *conn)
+{
+ char random_id[EXT_OR_CONN_ID_LEN];
+ or_connection_t *tmp;
+
+ if (!orconn_ext_or_id_map)
+ orconn_ext_or_id_map = digestmap_new();
+
+ /* Remove any previous identifiers: */
+ if (conn->ext_or_conn_id && !tor_digest_is_zero(conn->ext_or_conn_id))
+ connection_or_remove_from_ext_or_id_map(conn);
+
+ do {
+ crypto_rand(random_id, sizeof(random_id));
+ } while (digestmap_get(orconn_ext_or_id_map, random_id));
+
+ if (!conn->ext_or_conn_id)
+ conn->ext_or_conn_id = tor_malloc_zero(EXT_OR_CONN_ID_LEN);
+
+ memcpy(conn->ext_or_conn_id, random_id, EXT_OR_CONN_ID_LEN);
+
+ tmp = digestmap_set(orconn_ext_or_id_map, random_id, conn);
+ tor_assert(!tmp);
+}
+
/**************************************************************/
/** Map from a string describing what a non-open OR connection was doing when
@@ -228,7 +297,7 @@ connection_or_get_state_description(or_connection_t *orconn,
const char *conn_state;
char tls_state[256];
- tor_assert(conn->type == CONN_TYPE_OR);
+ tor_assert(conn->type == CONN_TYPE_OR || conn->type == CONN_TYPE_EXT_OR);
conn_state = conn_state_to_string(conn->type, conn->state);
tor_tls_get_state_description(orconn->tls, tls_state, sizeof(tls_state));
@@ -1077,7 +1146,7 @@ connection_or_connect(const tor_addr_t *_addr, uint16_t port,
return NULL;
}
- conn = or_connection_new(tor_addr_family(&addr));
+ conn = or_connection_new(CONN_TYPE_OR, tor_addr_family(&addr));
/*
* Set up conn so it's got all the data we need to remember for channels
@@ -1212,8 +1281,8 @@ connection_or_close_for_error(or_connection_t *orconn, int flush)
*
* Return -1 if <b>conn</b> is broken, else return 0.
*/
-int
-connection_tls_start_handshake(or_connection_t *conn, int receiving)
+MOCK_IMPL(int,
+connection_tls_start_handshake,(or_connection_t *conn, int receiving))
{
channel_listener_t *chan_listener;
channel_t *chan;
@@ -1470,7 +1539,8 @@ connection_or_handle_event_cb(struct bufferevent *bufev, short event,
int
connection_or_nonopen_was_started_here(or_connection_t *conn)
{
- tor_assert(conn->base_.type == CONN_TYPE_OR);
+ tor_assert(conn->base_.type == CONN_TYPE_OR ||
+ conn->base_.type == CONN_TYPE_EXT_OR);
if (!conn->tls)
return 1; /* it's still in proxy states or something */
if (conn->handshake_state)
@@ -1679,7 +1749,7 @@ connection_tls_finish_handshake(or_connection_t *conn)
digest_rcvd) < 0)
return -1;
- circuit_build_times_network_is_live(&circ_times);
+ circuit_build_times_network_is_live(get_circuit_build_times_mutable());
if (tor_tls_used_v1_handshake(conn->tls)) {
conn->link_proto = 1;
@@ -1713,7 +1783,7 @@ connection_or_launch_v3_or_handshake(or_connection_t *conn)
tor_assert(connection_or_nonopen_was_started_here(conn));
tor_assert(tor_tls_received_v3_certificate(conn->tls));
- circuit_build_times_network_is_live(&circ_times);
+ circuit_build_times_network_is_live(get_circuit_build_times_mutable());
connection_or_change_state(conn, OR_CONN_STATE_OR_HANDSHAKING_V3);
if (connection_init_or_handshake_state(conn, 1) < 0)
@@ -1946,7 +2016,7 @@ connection_or_process_cells_from_inbuf(or_connection_t *conn)
if (conn->chan)
channel_timestamp_active(TLS_CHAN_TO_BASE(conn->chan));
- circuit_build_times_network_is_live(&circ_times);
+ circuit_build_times_network_is_live(get_circuit_build_times_mutable());
channel_tls_handle_var_cell(var_cell, conn);
var_cell_free(var_cell);
} else {
@@ -1962,7 +2032,7 @@ connection_or_process_cells_from_inbuf(or_connection_t *conn)
if (conn->chan)
channel_timestamp_active(TLS_CHAN_TO_BASE(conn->chan));
- circuit_build_times_network_is_live(&circ_times);
+ circuit_build_times_network_is_live(get_circuit_build_times_mutable());
connection_fetch_from_buf(buf, cell_network_size, TO_CONN(conn));
/* retrieve cell info from buf (create the host-order struct from the
@@ -2042,6 +2112,12 @@ connection_or_send_netinfo(or_connection_t *conn)
tor_assert(conn->handshake_state);
+ if (conn->handshake_state->sent_netinfo) {
+ log_warn(LD_BUG, "Attempted to send an extra netinfo cell on a connection "
+ "where we already sent one.");
+ return 0;
+ }
+
memset(&cell, 0, sizeof(cell_t));
cell.command = CELL_NETINFO;
@@ -2083,6 +2159,7 @@ connection_or_send_netinfo(or_connection_t *conn)
}
conn->handshake_state->digest_sent_data = 0;
+ conn->handshake_state->sent_netinfo = 1;
connection_or_write_cell_to_buf(&cell, conn);
return 0;
@@ -2211,7 +2288,7 @@ connection_or_compute_authenticate_cell_body(or_connection_t *conn,
const tor_cert_t *id_cert=NULL, *link_cert=NULL;
const digests_t *my_digests, *their_digests;
const uint8_t *my_id, *their_id, *client_id, *server_id;
- if (tor_tls_get_my_certs(0, &link_cert, &id_cert))
+ if (tor_tls_get_my_certs(server, &link_cert, &id_cert))
return -1;
my_digests = tor_cert_get_id_digests(id_cert);
their_digests = tor_cert_get_id_digests(conn->handshake_state->id_cert);
diff --git a/src/or/connection_or.h b/src/or/connection_or.h
index 85e68f1a3..8d9302893 100644
--- a/src/or/connection_or.h
+++ b/src/or/connection_or.h
@@ -45,7 +45,8 @@ void connection_or_close_for_error(or_connection_t *orconn, int flush);
void connection_or_report_broken_states(int severity, int domain);
-int connection_tls_start_handshake(or_connection_t *conn, int receiving);
+MOCK_DECL(int,connection_tls_start_handshake,(or_connection_t *conn,
+ int receiving));
int connection_tls_continue_handshake(or_connection_t *conn);
int connection_init_or_handshake_state(or_connection_t *conn,
diff --git a/src/or/control.c b/src/or/control.c
index cc917c46a..7034605c2 100644
--- a/src/or/control.c
+++ b/src/or/control.c
@@ -52,46 +52,13 @@
* finished authentication and is accepting commands. */
#define STATE_IS_OPEN(s) ((s) == CONTROL_CONN_STATE_OPEN)
-/* Recognized asynchronous event types. It's okay to expand this list
- * because it is used both as a list of v0 event types, and as indices
- * into the bitfield to determine which controllers want which events.
- */
-#define EVENT_MIN_ 0x0001
-#define EVENT_CIRCUIT_STATUS 0x0001
-#define EVENT_STREAM_STATUS 0x0002
-#define EVENT_OR_CONN_STATUS 0x0003
-#define EVENT_BANDWIDTH_USED 0x0004
-#define EVENT_CIRCUIT_STATUS_MINOR 0x0005
-#define EVENT_NEW_DESC 0x0006
-#define EVENT_DEBUG_MSG 0x0007
-#define EVENT_INFO_MSG 0x0008
-#define EVENT_NOTICE_MSG 0x0009
-#define EVENT_WARN_MSG 0x000A
-#define EVENT_ERR_MSG 0x000B
-#define EVENT_ADDRMAP 0x000C
-// #define EVENT_AUTHDIR_NEWDESCS 0x000D
-#define EVENT_DESCCHANGED 0x000E
-// #define EVENT_NS 0x000F
-#define EVENT_STATUS_CLIENT 0x0010
-#define EVENT_STATUS_SERVER 0x0011
-#define EVENT_STATUS_GENERAL 0x0012
-#define EVENT_GUARD 0x0013
-#define EVENT_STREAM_BANDWIDTH_USED 0x0014
-#define EVENT_CLIENTS_SEEN 0x0015
-#define EVENT_NEWCONSENSUS 0x0016
-#define EVENT_BUILDTIMEOUT_SET 0x0017
-#define EVENT_SIGNAL 0x0018
-#define EVENT_CONF_CHANGED 0x0019
-#define EVENT_MAX_ 0x0019
-/* If EVENT_MAX_ ever hits 0x0020, we need to make the mask wider. */
-
/** Bitfield: The bit 1&lt;&lt;e is set if <b>any</b> open control
* connection is interested in events of type <b>e</b>. We use this
* so that we can decide to skip generating event messages that nobody
* has interest in without having to walk over the global connection
* list to find out.
**/
-typedef uint32_t event_mask_t;
+typedef uint64_t event_mask_t;
/** An event mask of all the events that any controller is interested in
* receiving. */
@@ -103,7 +70,7 @@ static int disable_log_messages = 0;
/** Macro: true if any control connection is interested in events of type
* <b>e</b>. */
#define EVENT_IS_INTERESTING(e) \
- (global_event_mask & (1<<(e)))
+ (!! (global_event_mask & (((uint64_t)1)<<(e))))
/** If we're using cookie-type authentication, how long should our cookies be?
*/
@@ -115,7 +82,7 @@ static int authentication_cookie_is_set = 0;
/** If authentication_cookie_is_set, a secret cookie that we've stored to disk
* and which we're using to authenticate controllers. (If the controller can
* read it off disk, it has permission to connect.) */
-static char authentication_cookie[AUTHENTICATION_COOKIE_LEN];
+static uint8_t *authentication_cookie = NULL;
#define SAFECOOKIE_SERVER_TO_CONTROLLER_CONSTANT \
"Tor safe cookie authentication server-to-controller hash"
@@ -130,15 +97,6 @@ static char authentication_cookie[AUTHENTICATION_COOKIE_LEN];
* of this so we can respond to getinfo status/bootstrap-phase queries. */
static char last_sent_bootstrap_message[BOOTSTRAP_MSG_LEN];
-/** Flag for event_format_t. Indicates that we should use the one standard
- format.
- */
-#define ALL_FORMATS 1
-
-/** Bit field of flags to select how to format a controller event. Recognized
- * flag is ALL_FORMATS. */
-typedef int event_format_t;
-
static void connection_printf_to_buf(control_connection_t *conn,
const char *format, ...)
CHECK_PRINTF(2,3);
@@ -334,7 +292,7 @@ connection_write_str_to_buf(const char *s, control_connection_t *conn)
* the end. Replace all LF characters sequences with CRLF. Return the number
* of bytes in *<b>out</b>.
*/
-/* static */ size_t
+STATIC size_t
write_escaped_data(const char *data, size_t len, char **out)
{
size_t sz_out = len+8;
@@ -382,7 +340,7 @@ write_escaped_data(const char *data, size_t len, char **out)
* that appears at the start of a line, and replacing all CRLF sequences
* with LF. Return the number of
* bytes in *<b>out</b>. */
-/* static */ size_t
+STATIC size_t
read_escaped_data(const char *data, size_t len, char **out)
{
char *outp;
@@ -592,9 +550,9 @@ send_control_done(control_connection_t *conn)
*
* The EXTENDED_FORMAT and NONEXTENDED_FORMAT flags behave similarly with
* respect to the EXTENDED_EVENTS feature. */
-static void
-send_control_event_string(uint16_t event, event_format_t which,
- const char *msg)
+MOCK_IMPL(STATIC void,
+send_control_event_string,(uint16_t event, event_format_t which,
+ const char *msg))
{
smartlist_t *conns = get_connection_array();
(void)which;
@@ -958,6 +916,7 @@ static const struct control_event_t control_event_table[] = {
{ EVENT_BUILDTIMEOUT_SET, "BUILDTIMEOUT_SET" },
{ EVENT_SIGNAL, "SIGNAL" },
{ EVENT_CONF_CHANGED, "CONF_CHANGED"},
+ { EVENT_TRANSPORT_LAUNCHED, "TRANSPORT_LAUNCHED" },
{ 0, NULL },
};
@@ -1928,7 +1887,7 @@ getinfo_helper_events(control_connection_t *control_conn,
if (!strcmp(question, "circuit-status")) {
circuit_t *circ_;
smartlist_t *status = smartlist_new();
- for (circ_ = circuit_get_global_list_(); circ_; circ_ = circ_->next) {
+ TOR_LIST_FOREACH(circ_, circuit_get_global_list(), head) {
origin_circuit_t *circ;
char *circdesc;
const char *state;
@@ -4163,32 +4122,26 @@ control_event_newconsensus(const networkstatus_t *consensus)
/** Called when we compute a new circuitbuildtimeout */
int
-control_event_buildtimeout_set(const circuit_build_times_t *cbt,
- buildtimeout_set_event_t type)
+control_event_buildtimeout_set(buildtimeout_set_event_t type,
+ const char *args)
{
const char *type_string = NULL;
- double qnt;
if (!control_event_is_interesting(EVENT_BUILDTIMEOUT_SET))
return 0;
- qnt = circuit_build_times_quantile_cutoff();
-
switch (type) {
case BUILDTIMEOUT_SET_EVENT_COMPUTED:
type_string = "COMPUTED";
break;
case BUILDTIMEOUT_SET_EVENT_RESET:
type_string = "RESET";
- qnt = 1.0;
break;
case BUILDTIMEOUT_SET_EVENT_SUSPENDED:
type_string = "SUSPENDED";
- qnt = 1.0;
break;
case BUILDTIMEOUT_SET_EVENT_DISCARD:
type_string = "DISCARD";
- qnt = 1.0;
break;
case BUILDTIMEOUT_SET_EVENT_RESUME:
type_string = "RESUME";
@@ -4199,15 +4152,8 @@ control_event_buildtimeout_set(const circuit_build_times_t *cbt,
}
send_control_event(EVENT_BUILDTIMEOUT_SET, ALL_FORMATS,
- "650 BUILDTIMEOUT_SET %s TOTAL_TIMES=%lu "
- "TIMEOUT_MS=%lu XM=%lu ALPHA=%f CUTOFF_QUANTILE=%f "
- "TIMEOUT_RATE=%f CLOSE_MS=%lu CLOSE_RATE=%f\r\n",
- type_string, (unsigned long)cbt->total_build_times,
- (unsigned long)cbt->timeout_ms,
- (unsigned long)cbt->Xm, cbt->alpha, qnt,
- circuit_build_times_timeout_rate(cbt),
- (unsigned long)cbt->close_ms,
- circuit_build_times_close_rate(cbt));
+ "650 BUILDTIMEOUT_SET %s %s\r\n",
+ type_string, args);
return 0;
}
@@ -4446,44 +4392,27 @@ get_cookie_file(void)
}
}
-/** Choose a random authentication cookie and write it to disk.
- * Anybody who can read the cookie from disk will be considered
- * authorized to use the control connection. Return -1 if we can't
- * write the file, or 0 on success. */
+/* Initialize the cookie-based authentication system of the
+ * ControlPort. If <b>enabled</b> is 0, then disable the cookie
+ * authentication system. */
int
-init_cookie_authentication(int enabled)
+init_control_cookie_authentication(int enabled)
{
- char *fname;
+ char *fname = NULL;
+ int retval;
+
if (!enabled) {
authentication_cookie_is_set = 0;
return 0;
}
- /* We don't want to generate a new cookie every time we call
- * options_act(). One should be enough. */
- if (authentication_cookie_is_set)
- return 0; /* all set */
-
fname = get_cookie_file();
- crypto_rand(authentication_cookie, AUTHENTICATION_COOKIE_LEN);
- authentication_cookie_is_set = 1;
- if (write_bytes_to_file(fname, authentication_cookie,
- AUTHENTICATION_COOKIE_LEN, 1)) {
- log_warn(LD_FS,"Error writing authentication cookie to %s.",
- escaped(fname));
- tor_free(fname);
- return -1;
- }
-#ifndef _WIN32
- if (get_options()->CookieAuthFileGroupReadable) {
- if (chmod(fname, 0640)) {
- log_warn(LD_FS,"Unable to make %s group-readable.", escaped(fname));
- }
- }
-#endif
-
+ retval = init_cookie_authentication(fname, "", /* no header */
+ AUTHENTICATION_COOKIE_LEN,
+ &authentication_cookie,
+ &authentication_cookie_is_set);
tor_free(fname);
- return 0;
+ return retval;
}
/** A copy of the process specifier of Tor's owning controller, or
@@ -4699,8 +4628,8 @@ control_event_bootstrap(bootstrap_status_t status, int progress)
* that indicates a problem. <b>warn</b> gives a hint as to why, and
* <b>reason</b> provides an "or_conn_end_reason" tag.
*/
-void
-control_event_bootstrap_problem(const char *warn, int reason)
+MOCK_IMPL(void,
+control_event_bootstrap_problem, (const char *warn, int reason))
{
int status = bootstrap_percent;
const char *tag, *summary;
@@ -4767,3 +4696,35 @@ control_event_clients_seen(const char *controller_str)
"650 CLIENTS_SEEN %s\r\n", controller_str);
}
+/** A new pluggable transport called <b>transport_name</b> was
+ * launched on <b>addr</b>:<b>port</b>. <b>mode</b> is either
+ * "server" or "client" depending on the mode of the pluggable
+ * transport.
+ * "650" SP "TRANSPORT_LAUNCHED" SP Mode SP Name SP Address SP Port
+ */
+void
+control_event_transport_launched(const char *mode, const char *transport_name,
+ tor_addr_t *addr, uint16_t port)
+{
+ send_control_event(EVENT_TRANSPORT_LAUNCHED, ALL_FORMATS,
+ "650 TRANSPORT_LAUNCHED %s %s %s %u\r\n",
+ mode, transport_name, fmt_addr(addr), port);
+}
+
+/** Free any leftover allocated memory of the control.c subsystem. */
+void
+control_free_all(void)
+{
+ if (authentication_cookie) /* Free the auth cookie */
+ tor_free(authentication_cookie);
+}
+
+#ifdef TOR_UNIT_TESTS
+/* For testing: change the value of global_event_mask */
+void
+control_testing_set_global_event_mask(uint64_t mask)
+{
+ global_event_mask = mask;
+}
+#endif
+
diff --git a/src/or/control.h b/src/or/control.h
index 61062da2c..099782a6d 100644
--- a/src/or/control.h
+++ b/src/or/control.h
@@ -73,11 +73,11 @@ int control_event_server_status(int severity, const char *format, ...)
int control_event_guard(const char *nickname, const char *digest,
const char *status);
int control_event_conf_changed(const smartlist_t *elements);
-int control_event_buildtimeout_set(const circuit_build_times_t *cbt,
- buildtimeout_set_event_t type);
+int control_event_buildtimeout_set(buildtimeout_set_event_t type,
+ const char *args);
int control_event_signal(uintptr_t signal);
-int init_cookie_authentication(int enabled);
+int init_control_cookie_authentication(int enabled);
smartlist_t *decode_hashed_passwords(config_line_t *passwords);
void disable_control_logging(void);
void enable_control_logging(void);
@@ -85,14 +85,72 @@ void enable_control_logging(void);
void monitor_owning_controller_process(const char *process_spec);
void control_event_bootstrap(bootstrap_status_t status, int progress);
-void control_event_bootstrap_problem(const char *warn, int reason);
+MOCK_DECL(void, control_event_bootstrap_problem,(const char *warn,
+ int reason));
void control_event_clients_seen(const char *controller_str);
+void control_event_transport_launched(const char *mode,
+ const char *transport_name,
+ tor_addr_t *addr, uint16_t port);
+
+void control_free_all(void);
#ifdef CONTROL_PRIVATE
+/* Recognized asynchronous event types. It's okay to expand this list
+ * because it is used both as a list of v0 event types, and as indices
+ * into the bitfield to determine which controllers want which events.
+ */
+#define EVENT_MIN_ 0x0001
+#define EVENT_CIRCUIT_STATUS 0x0001
+#define EVENT_STREAM_STATUS 0x0002
+#define EVENT_OR_CONN_STATUS 0x0003
+#define EVENT_BANDWIDTH_USED 0x0004
+#define EVENT_CIRCUIT_STATUS_MINOR 0x0005
+#define EVENT_NEW_DESC 0x0006
+#define EVENT_DEBUG_MSG 0x0007
+#define EVENT_INFO_MSG 0x0008
+#define EVENT_NOTICE_MSG 0x0009
+#define EVENT_WARN_MSG 0x000A
+#define EVENT_ERR_MSG 0x000B
+#define EVENT_ADDRMAP 0x000C
+/* Exposed above */
+// #define EVENT_AUTHDIR_NEWDESCS 0x000D
+#define EVENT_DESCCHANGED 0x000E
+/* Exposed above */
+// #define EVENT_NS 0x000F
+#define EVENT_STATUS_CLIENT 0x0010
+#define EVENT_STATUS_SERVER 0x0011
+#define EVENT_STATUS_GENERAL 0x0012
+#define EVENT_GUARD 0x0013
+#define EVENT_STREAM_BANDWIDTH_USED 0x0014
+#define EVENT_CLIENTS_SEEN 0x0015
+#define EVENT_NEWCONSENSUS 0x0016
+#define EVENT_BUILDTIMEOUT_SET 0x0017
+#define EVENT_SIGNAL 0x0018
+#define EVENT_CONF_CHANGED 0x0019
+#define EVENT_TRANSPORT_LAUNCHED 0x0020
+#define EVENT_MAX_ 0x0020
+/* If EVENT_MAX_ ever hits 0x0040, we need to make the mask into a
+ * different structure. */
+
/* Used only by control.c and test.c */
-size_t write_escaped_data(const char *data, size_t len, char **out);
-size_t read_escaped_data(const char *data, size_t len, char **out);
+STATIC size_t write_escaped_data(const char *data, size_t len, char **out);
+STATIC size_t read_escaped_data(const char *data, size_t len, char **out);
+/** Flag for event_format_t. Indicates that we should use the one standard
+ format. (Other formats previous existed, and are now deprecated)
+ */
+#define ALL_FORMATS 1
+/** Bit field of flags to select how to format a controller event. Recognized
+ * flag is ALL_FORMATS. */
+typedef int event_format_t;
+
+#ifdef TOR_UNIT_TESTS
+MOCK_DECL(STATIC void,
+send_control_event_string,(uint16_t event, event_format_t which,
+ const char *msg));
+
+void control_testing_set_global_event_mask(uint64_t mask);
+#endif
#endif
#endif
diff --git a/src/or/cpuworker.c b/src/or/cpuworker.c
index 61f9faa39..ecf0d2035 100644
--- a/src/or/cpuworker.c
+++ b/src/or/cpuworker.c
@@ -19,9 +19,11 @@
#include "circuitlist.h"
#include "config.h"
#include "connection.h"
+#include "connection_or.h"
#include "cpuworker.h"
#include "main.h"
#include "onion.h"
+#include "rephist.h"
#include "router.h"
/** The maximum number of cpuworker processes we will keep around. */
@@ -683,6 +685,9 @@ assign_onionskin_to_cpuworker(connection_t *cpuworker,
return -1;
}
+ if (connection_or_digest_is_known_relay(circ->p_chan->identity_digest))
+ rep_hist_note_circuit_handshake_completed(onionskin->handshake_type);
+
should_time = should_time_request(onionskin->handshake_type);
memset(&req, 0, sizeof(req));
req.magic = CPUWORKER_REQUEST_MAGIC;
diff --git a/src/or/directory.c b/src/or/directory.c
index 88d671779..815e0abff 100644
--- a/src/or/directory.c
+++ b/src/or/directory.c
@@ -1387,7 +1387,7 @@ directory_send_command(dir_connection_t *conn,
* so it does. Return 0.
* Otherwise, return -1.
*/
-static int
+STATIC int
parse_http_url(const char *headers, char **url)
{
char *s, *start, *tmp;
@@ -1416,6 +1416,19 @@ parse_http_url(const char *headers, char **url)
}
}
+ /* Check if the header is well formed (next sequence
+ * should be HTTP/1.X\r\n). Assumes we're supporting 1.0? */
+ {
+ unsigned minor_ver;
+ char ch;
+ char *e = (char *)eat_whitespace_no_nl(s);
+ if (2 != tor_sscanf(e, "HTTP/1.%u%c", &minor_ver, &ch)) {
+ return -1;
+ }
+ if (ch != '\r')
+ return -1;
+ }
+
if (s-start < 5 || strcmpstart(start,"/tor/")) { /* need to rewrite it */
*url = tor_malloc(s - start + 5);
strlcpy(*url,"/tor", s-start+5);
@@ -2966,7 +2979,9 @@ directory_handle_command_get(dir_connection_t *conn, const char *headers,
tor_addr_t addr;
if (tor_inet_aton((TO_CONN(conn))->address, &in)) {
tor_addr_from_ipv4h(&addr, ntohl(in.s_addr));
- geoip_note_client_seen(GEOIP_CLIENT_NETWORKSTATUS, &addr, time(NULL));
+ geoip_note_client_seen(GEOIP_CLIENT_NETWORKSTATUS,
+ &addr, NULL,
+ time(NULL));
geoip_note_ns_response(GEOIP_SUCCESS);
/* Note that a request for a network status has started, so that we
* can measure the download time later on. */
diff --git a/src/or/directory.h b/src/or/directory.h
index 41f18a172..0453160f7 100644
--- a/src/or/directory.h
+++ b/src/or/directory.h
@@ -118,5 +118,10 @@ download_status_mark_impossible(download_status_t *dl)
int download_status_get_n_failures(const download_status_t *dls);
+#ifdef TOR_UNIT_TESTS
+/* Used only by directory.c and test_dir.c */
+STATIC int parse_http_url(const char *headers, char **url);
+#endif
+
#endif
diff --git a/src/or/dirserv.c b/src/or/dirserv.c
index 97fe06884..3243ac47c 100644
--- a/src/or/dirserv.c
+++ b/src/or/dirserv.c
@@ -2082,7 +2082,7 @@ static digestmap_t *mbw_cache = NULL;
/** Store a measured bandwidth cache entry when reading the measured
* bandwidths file. */
-void
+STATIC void
dirserv_cache_measured_bw(const measured_bw_line_t *parsed_line,
time_t as_of)
{
@@ -2112,7 +2112,7 @@ dirserv_cache_measured_bw(const measured_bw_line_t *parsed_line,
}
/** Clear and free the measured bandwidth cache */
-void
+STATIC void
dirserv_clear_measured_bw_cache(void)
{
if (mbw_cache) {
@@ -2123,7 +2123,7 @@ dirserv_clear_measured_bw_cache(void)
}
/** Scan the measured bandwidth cache and remove expired entries */
-void
+STATIC void
dirserv_expire_measured_bw_cache(time_t now)
{
@@ -2145,7 +2145,7 @@ dirserv_expire_measured_bw_cache(time_t now)
}
/** Get the current size of the measured bandwidth cache */
-int
+STATIC int
dirserv_get_measured_bw_cache_size(void)
{
if (mbw_cache) return digestmap_size(mbw_cache);
@@ -2155,7 +2155,7 @@ dirserv_get_measured_bw_cache_size(void)
/** Query the cache by identity digest, return value indicates whether
* we found it. The bw_out and as_of_out pointers receive the cached
* bandwidth value and the time it was cached if not NULL. */
-int
+STATIC int
dirserv_query_measured_bw_cache_kb(const char *node_id, long *bw_kb_out,
time_t *as_of_out)
{
@@ -2176,7 +2176,7 @@ dirserv_query_measured_bw_cache_kb(const char *node_id, long *bw_kb_out,
}
/** Predicate wrapper for dirserv_query_measured_bw_cache() */
-int
+STATIC int
dirserv_has_measured_bw(const char *node_id)
{
return dirserv_query_measured_bw_cache_kb(node_id, NULL, NULL);
@@ -2754,7 +2754,7 @@ clear_status_flags_on_sybil(routerstatus_t *rs)
* into a measured_bw_line_t output structure. Returns -1 on failure
* or 0 on success.
*/
-int
+STATIC int
measured_bw_line_parse(measured_bw_line_t *out, const char *orig_line)
{
char *line = tor_strdup(orig_line);
@@ -2835,7 +2835,7 @@ measured_bw_line_parse(measured_bw_line_t *out, const char *orig_line)
* of bandwidth statuses. Returns true if a line is found,
* false otherwise.
*/
-int
+STATIC int
measured_bw_line_apply(measured_bw_line_t *parsed_line,
smartlist_t *routerstatuses)
{
@@ -3168,7 +3168,7 @@ dirserv_generate_networkstatus_vote_obj(crypto_pk_t *private_key,
/** For v2 authoritative directories only: Replace the contents of
* <b>the_v2_networkstatus</b> with a newly generated network status
* object. */
-cached_dir_t *
+STATIC cached_dir_t *
generate_v2_networkstatus_opinion(void)
{
cached_dir_t *r = NULL;
diff --git a/src/or/dirserv.h b/src/or/dirserv.h
index f9d36d760..7221fc995 100644
--- a/src/or/dirserv.h
+++ b/src/or/dirserv.h
@@ -12,6 +12,8 @@
#ifndef TOR_DIRSERV_H
#define TOR_DIRSERV_H
+#include "testsupport.h"
+
/** What fraction (1 over this number) of the relay ID space do we
* (as a directory authority) launch connections to at each reachability
* test? */
@@ -119,20 +121,21 @@ cached_dir_t *new_cached_dir(char *s, time_t published);
/* Put the MAX_MEASUREMENT_AGE #define here so unit tests can see it */
#define MAX_MEASUREMENT_AGE (3*24*60*60) /* 3 days */
-int measured_bw_line_parse(measured_bw_line_t *out, const char *line);
+STATIC int measured_bw_line_parse(measured_bw_line_t *out, const char *line);
-int measured_bw_line_apply(measured_bw_line_t *parsed_line,
+STATIC int measured_bw_line_apply(measured_bw_line_t *parsed_line,
smartlist_t *routerstatuses);
-void dirserv_cache_measured_bw(const measured_bw_line_t *parsed_line,
+STATIC void dirserv_cache_measured_bw(const measured_bw_line_t *parsed_line,
time_t as_of);
-void dirserv_clear_measured_bw_cache(void);
-void dirserv_expire_measured_bw_cache(time_t now);
-int dirserv_get_measured_bw_cache_size(void);
-int dirserv_query_measured_bw_cache_kb(const char *node_id, long *bw_out,
- time_t *as_of_out);
-int dirserv_has_measured_bw(const char *node_id);
-cached_dir_t *generate_v2_networkstatus_opinion(void);
+STATIC void dirserv_clear_measured_bw_cache(void);
+STATIC void dirserv_expire_measured_bw_cache(time_t now);
+STATIC int dirserv_get_measured_bw_cache_size(void);
+STATIC int dirserv_query_measured_bw_cache_kb(const char *node_id,
+ long *bw_out,
+ time_t *as_of_out);
+STATIC int dirserv_has_measured_bw(const char *node_id);
+STATIC cached_dir_t *generate_v2_networkstatus_opinion(void);
#endif
int dirserv_read_measured_bandwidths(const char *from_file,
diff --git a/src/or/dirvote.c b/src/or/dirvote.c
index f65a26b66..12ceba854 100644
--- a/src/or/dirvote.c
+++ b/src/or/dirvote.c
@@ -60,7 +60,7 @@ static char *make_consensus_method_list(int low, int high, const char *sep);
/** Return a new string containing the string representation of the vote in
* <b>v3_ns</b>, signed with our v3 signing key <b>private_signing_key</b>.
* For v3 authorities. */
-char *
+STATIC char *
format_networkstatus_vote(crypto_pk_t *private_signing_key,
networkstatus_t *v3_ns)
{
@@ -587,7 +587,7 @@ compute_consensus_versions_list(smartlist_t *lst, int n_versioning)
/** Helper: given a list of valid networkstatus_t, return a new string
* containing the contents of the consensus network parameter set.
*/
-/* private */ char *
+STATIC char *
dirvote_compute_params(smartlist_t *votes, int method, int total_authorities)
{
int i;
diff --git a/src/or/dirvote.h b/src/or/dirvote.h
index a3e6cc0d6..3a4951a95 100644
--- a/src/or/dirvote.h
+++ b/src/or/dirvote.h
@@ -12,6 +12,8 @@
#ifndef TOR_DIRVOTE_H
#define TOR_DIRVOTE_H
+#include "testsupport.h"
+
/** Lowest allowable value for VoteSeconds. */
#define MIN_VOTE_SECONDS 2
/** Lowest allowable value for DistSeconds. */
@@ -136,9 +138,9 @@ document_signature_t *voter_get_sig_by_algorithm(
digest_algorithm_t alg);
#ifdef DIRVOTE_PRIVATE
-char *format_networkstatus_vote(crypto_pk_t *private_key,
+STATIC char *format_networkstatus_vote(crypto_pk_t *private_key,
networkstatus_t *v3_ns);
-char *dirvote_compute_params(smartlist_t *votes, int method,
+STATIC char *dirvote_compute_params(smartlist_t *votes, int method,
int total_authorities);
#endif
diff --git a/src/or/dns.c b/src/or/dns.c
index 09601e9cb..62ee4f372 100644
--- a/src/or/dns.c
+++ b/src/or/dns.c
@@ -438,8 +438,8 @@ cached_resolve_add_answer(cached_resolve_t *resolve,
if (resolve->res_status_ipv4 != RES_STATUS_INFLIGHT)
return;
- if (dns_result == DNS_ERR_NONE && answer_addr) {
- tor_assert(tor_addr_family(answer_addr) == AF_INET);
+ if (dns_result == DNS_ERR_NONE && answer_addr &&
+ tor_addr_family(answer_addr) == AF_INET) {
resolve->result_ipv4.addr_ipv4 = tor_addr_to_ipv4h(answer_addr);
resolve->res_status_ipv4 = RES_STATUS_DONE_OK;
} else {
@@ -451,8 +451,8 @@ cached_resolve_add_answer(cached_resolve_t *resolve,
if (resolve->res_status_ipv6 != RES_STATUS_INFLIGHT)
return;
- if (dns_result == DNS_ERR_NONE && answer_addr) {
- tor_assert(tor_addr_family(answer_addr) == AF_INET6);
+ if (dns_result == DNS_ERR_NONE && answer_addr &&
+ tor_addr_family(answer_addr) == AF_INET6) {
memcpy(&resolve->result_ipv6.addr_ipv6,
tor_addr_to_in6(answer_addr),
sizeof(struct in6_addr));
diff --git a/src/or/entrynodes.c b/src/or/entrynodes.c
index 70f7c878e..b66cc2b0d 100644
--- a/src/or/entrynodes.c
+++ b/src/or/entrynodes.c
@@ -419,14 +419,24 @@ add_an_entry_guard(const node_t *chosen, int reset_status, int prepend,
return node;
}
+/** Choose how many entry guards or directory guards we'll use. If
+ * <b>for_directory</b> is true, we return how many directory guards to
+ * use; else we return how many entry guards to use. */
+static int
+decide_num_guards(const or_options_t *options, int for_directory)
+{
+ if (for_directory && options->NumDirectoryGuards != 0)
+ return options->NumDirectoryGuards;
+ return options->NumEntryGuards;
+}
+
/** If the use of entry guards is configured, choose more entry guards
* until we have enough in the list. */
static void
pick_entry_guards(const or_options_t *options, int for_directory)
{
int changed = 0;
- const int num_needed = for_directory ? options->NumDirectoryGuards :
- options->NumEntryGuards;
+ const int num_needed = decide_num_guards(options, for_directory);
tor_assert(entry_guards);
@@ -966,8 +976,7 @@ choose_random_entry_impl(cpath_build_state_t *state, int for_directory,
int need_capacity = state ? state->need_capacity : 0;
int preferred_min, consider_exit_family = 0;
int need_descriptor = !for_directory;
- const int num_needed = for_directory ? options->NumDirectoryGuards :
- options->NumEntryGuards;
+ const int num_needed = decide_num_guards(options, for_directory);
if (chosen_exit) {
nodelist_add_node_and_family(exit_family, chosen_exit);
@@ -2270,6 +2279,6 @@ entry_guards_free_all(void)
clear_bridge_list();
smartlist_free(bridge_list);
bridge_list = NULL;
- circuit_build_times_free_timeouts(&circ_times);
+ circuit_build_times_free_timeouts(get_circuit_build_times_mutable());
}
diff --git a/src/or/ext_orport.c b/src/or/ext_orport.c
new file mode 100644
index 000000000..d5a0fa1ee
--- /dev/null
+++ b/src/or/ext_orport.c
@@ -0,0 +1,648 @@
+/* Copyright (c) 2012, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/**
+ * \file ext_orport.c
+ * \brief Code implementing the Extended ORPort.
+*/
+
+#define EXT_ORPORT_PRIVATE
+#include "or.h"
+#include "connection.h"
+#include "connection_or.h"
+#include "ext_orport.h"
+#include "control.h"
+#include "config.h"
+#include "util.h"
+#include "main.h"
+
+/** Allocate and return a structure capable of holding an Extended
+ * ORPort message of body length <b>len</b>. */
+ext_or_cmd_t *
+ext_or_cmd_new(uint16_t len)
+{
+ size_t size = STRUCT_OFFSET(ext_or_cmd_t, body) + len;
+ ext_or_cmd_t *cmd = tor_malloc(size);
+ cmd->len = len;
+ return cmd;
+}
+
+/** Deallocate the Extended ORPort message in <b>cmd</b>. */
+void
+ext_or_cmd_free(ext_or_cmd_t *cmd)
+{
+ tor_free(cmd);
+}
+
+/** Get an Extended ORPort message from <b>conn</b>, and place it in
+ * <b>out</b>. Return -1 on fail, 0 if we need more data, and 1 if we
+ * successfully extracted an Extended ORPort command from the
+ * buffer. */
+static int
+connection_fetch_ext_or_cmd_from_buf(connection_t *conn, ext_or_cmd_t **out)
+{
+ IF_HAS_BUFFEREVENT(conn, {
+ struct evbuffer *input = bufferevent_get_input(conn->bufev);
+ return fetch_ext_or_command_from_evbuffer(input, out);
+ }) ELSE_IF_NO_BUFFEREVENT {
+ return fetch_ext_or_command_from_buf(conn->inbuf, out);
+ }
+}
+
+/** Write an Extended ORPort message to <b>conn</b>. Use
+ * <b>command</b> as the command type, <b>bodylen</b> as the body
+ * length, and <b>body</b>, if it's present, as the body of the
+ * message. */
+STATIC int
+connection_write_ext_or_command(connection_t *conn,
+ uint16_t command,
+ const char *body,
+ size_t bodylen)
+{
+ char header[4];
+ if (bodylen > UINT16_MAX)
+ return -1;
+ set_uint16(header, htons(command));
+ set_uint16(header+2, htons(bodylen));
+ connection_write_to_buf(header, 4, conn);
+ if (bodylen) {
+ tor_assert(body);
+ connection_write_to_buf(body, bodylen, conn);
+ }
+ return 0;
+}
+
+/** Transition from an Extended ORPort which accepts Extended ORPort
+ * messages, to an Extended ORport which accepts OR traffic. */
+static void
+connection_ext_or_transition(or_connection_t *conn)
+{
+ tor_assert(conn->base_.type == CONN_TYPE_EXT_OR);
+
+ conn->base_.type = CONN_TYPE_OR;
+ TO_CONN(conn)->state = 0; // set the state to a neutral value
+ control_event_or_conn_status(conn, OR_CONN_EVENT_NEW, 0);
+ connection_tls_start_handshake(conn, 1);
+}
+
+/** Length of authentication cookie. */
+#define EXT_OR_PORT_AUTH_COOKIE_LEN 32
+/** Length of the header of the cookie file. */
+#define EXT_OR_PORT_AUTH_COOKIE_HEADER_LEN 32
+/** Static cookie file header. */
+#define EXT_OR_PORT_AUTH_COOKIE_HEADER "! Extended ORPort Auth Cookie !\x0a"
+/** Length of safe-cookie protocol hashes. */
+#define EXT_OR_PORT_AUTH_HASH_LEN DIGEST256_LEN
+/** Length of safe-cookie protocol nonces. */
+#define EXT_OR_PORT_AUTH_NONCE_LEN 32
+/** Safe-cookie protocol constants. */
+#define EXT_OR_PORT_AUTH_SERVER_TO_CLIENT_CONST \
+ "ExtORPort authentication server-to-client hash"
+#define EXT_OR_PORT_AUTH_CLIENT_TO_SERVER_CONST \
+ "ExtORPort authentication client-to-server hash"
+
+/* Code to indicate cookie authentication */
+#define EXT_OR_AUTHTYPE_SAFECOOKIE 0x01
+
+/** If true, we've set ext_or_auth_cookie to a secret code and stored
+ * it to disk. */
+STATIC int ext_or_auth_cookie_is_set = 0;
+/** If ext_or_auth_cookie_is_set, a secret cookie that we've stored to disk
+ * and which we're using to authenticate controllers. (If the controller can
+ * read it off disk, it has permission to connect.) */
+STATIC uint8_t *ext_or_auth_cookie = NULL;
+
+/** Helper: Return a newly allocated string containing a path to the
+ * file where we store our authentication cookie. */
+char *
+get_ext_or_auth_cookie_file_name(void)
+{
+ const or_options_t *options = get_options();
+ if (options->ExtORPortCookieAuthFile &&
+ strlen(options->ExtORPortCookieAuthFile)) {
+ return tor_strdup(options->ExtORPortCookieAuthFile);
+ } else {
+ return get_datadir_fname("extended_orport_auth_cookie");
+ }
+}
+
+/* Initialize the cookie-based authentication system of the
+ * Extended ORPort. If <b>is_enabled</b> is 0, then disable the cookie
+ * authentication system. */
+int
+init_ext_or_cookie_authentication(int is_enabled)
+{
+ char *fname = NULL;
+ int retval;
+
+ if (!is_enabled) {
+ ext_or_auth_cookie_is_set = 0;
+ return 0;
+ }
+
+ fname = get_ext_or_auth_cookie_file_name();
+ retval = init_cookie_authentication(fname, EXT_OR_PORT_AUTH_COOKIE_HEADER,
+ EXT_OR_PORT_AUTH_COOKIE_HEADER_LEN,
+ &ext_or_auth_cookie,
+ &ext_or_auth_cookie_is_set);
+ tor_free(fname);
+ return retval;
+}
+
+/** Read data from <b>conn</b> and see if the client sent us the
+ * authentication type that she prefers to use in this session.
+ *
+ * Return -1 if we received corrupted data or if we don't support the
+ * authentication type. Return 0 if we need more data in
+ * <b>conn</b>. Return 1 if the authentication type negotiation was
+ * successful. */
+static int
+connection_ext_or_auth_neg_auth_type(connection_t *conn)
+{
+ char authtype[1] = {0};
+
+ if (connection_get_inbuf_len(conn) < 1)
+ return 0;
+
+ if (connection_fetch_from_buf(authtype, 1, conn) < 0)
+ return -1;
+
+ log_debug(LD_GENERAL, "Client wants us to use %d auth type", authtype[0]);
+ if (authtype[0] != EXT_OR_AUTHTYPE_SAFECOOKIE) {
+ /* '1' is the only auth type supported atm */
+ return -1;
+ }
+
+ conn->state = EXT_OR_CONN_STATE_AUTH_WAIT_CLIENT_NONCE;
+ return 1;
+}
+
+/** DOCDOC */
+STATIC int
+handle_client_auth_nonce(const char *client_nonce, size_t client_nonce_len,
+ char **client_hash_out,
+ char **reply_out, size_t *reply_len_out)
+{
+ char server_hash[EXT_OR_PORT_AUTH_HASH_LEN] = {0};
+ char server_nonce[EXT_OR_PORT_AUTH_NONCE_LEN] = {0};
+ char *reply;
+ size_t reply_len;
+
+ if (client_nonce_len != EXT_OR_PORT_AUTH_NONCE_LEN)
+ return -1;
+
+ /* Get our nonce */
+ if (crypto_rand(server_nonce, EXT_OR_PORT_AUTH_NONCE_LEN) < 0)
+ return -1;
+
+ { /* set up macs */
+ size_t hmac_s_msg_len = strlen(EXT_OR_PORT_AUTH_SERVER_TO_CLIENT_CONST) +
+ 2*EXT_OR_PORT_AUTH_NONCE_LEN;
+ size_t hmac_c_msg_len = strlen(EXT_OR_PORT_AUTH_CLIENT_TO_SERVER_CONST) +
+ 2*EXT_OR_PORT_AUTH_NONCE_LEN;
+
+ char *hmac_s_msg = tor_malloc_zero(hmac_s_msg_len);
+ char *hmac_c_msg = tor_malloc_zero(hmac_c_msg_len);
+ char *correct_client_hash = tor_malloc_zero(EXT_OR_PORT_AUTH_HASH_LEN);
+
+ memcpy(hmac_s_msg,
+ EXT_OR_PORT_AUTH_SERVER_TO_CLIENT_CONST,
+ strlen(EXT_OR_PORT_AUTH_SERVER_TO_CLIENT_CONST));
+ memcpy(hmac_s_msg + strlen(EXT_OR_PORT_AUTH_SERVER_TO_CLIENT_CONST),
+ client_nonce, EXT_OR_PORT_AUTH_NONCE_LEN);
+ memcpy(hmac_s_msg + strlen(EXT_OR_PORT_AUTH_SERVER_TO_CLIENT_CONST) +
+ EXT_OR_PORT_AUTH_NONCE_LEN,
+ server_nonce, EXT_OR_PORT_AUTH_NONCE_LEN);
+
+ memcpy(hmac_c_msg,
+ EXT_OR_PORT_AUTH_CLIENT_TO_SERVER_CONST,
+ strlen(EXT_OR_PORT_AUTH_CLIENT_TO_SERVER_CONST));
+ memcpy(hmac_c_msg + strlen(EXT_OR_PORT_AUTH_CLIENT_TO_SERVER_CONST),
+ client_nonce, EXT_OR_PORT_AUTH_NONCE_LEN);
+ memcpy(hmac_c_msg + strlen(EXT_OR_PORT_AUTH_CLIENT_TO_SERVER_CONST) +
+ EXT_OR_PORT_AUTH_NONCE_LEN,
+ server_nonce, EXT_OR_PORT_AUTH_NONCE_LEN);
+
+ crypto_hmac_sha256(server_hash,
+ (char*)ext_or_auth_cookie,
+ EXT_OR_PORT_AUTH_COOKIE_LEN,
+ hmac_s_msg,
+ hmac_s_msg_len);
+
+ crypto_hmac_sha256(correct_client_hash,
+ (char*)ext_or_auth_cookie,
+ EXT_OR_PORT_AUTH_COOKIE_LEN,
+ hmac_c_msg,
+ hmac_c_msg_len);
+
+ /* Store the client hash we generated. We will need to compare it
+ with the hash sent by the client. */
+ *client_hash_out = correct_client_hash;
+
+ memwipe(hmac_s_msg, 0, hmac_s_msg_len);
+ memwipe(hmac_c_msg, 0, hmac_c_msg_len);
+
+ tor_free(hmac_s_msg);
+ tor_free(hmac_c_msg);
+ }
+
+ { /* debug logging */ /* XXX disable this codepath if not logging on debug?*/
+ char server_hash_encoded[(2*EXT_OR_PORT_AUTH_HASH_LEN) + 1];
+ char server_nonce_encoded[(2*EXT_OR_PORT_AUTH_NONCE_LEN) + 1];
+ char client_nonce_encoded[(2*EXT_OR_PORT_AUTH_NONCE_LEN) + 1];
+
+ base16_encode(server_hash_encoded, sizeof(server_hash_encoded),
+ server_hash, sizeof(server_hash));
+ base16_encode(server_nonce_encoded, sizeof(server_nonce_encoded),
+ server_nonce, sizeof(server_nonce));
+ base16_encode(client_nonce_encoded, sizeof(client_nonce_encoded),
+ client_nonce, sizeof(client_nonce));
+
+ log_debug(LD_GENERAL,
+ "server_hash: '%s'\nserver_nonce: '%s'\nclient_nonce: '%s'",
+ server_hash_encoded, server_nonce_encoded, client_nonce_encoded);
+
+ memwipe(server_hash_encoded, 0, sizeof(server_hash_encoded));
+ memwipe(server_nonce_encoded, 0, sizeof(server_nonce_encoded));
+ memwipe(client_nonce_encoded, 0, sizeof(client_nonce_encoded));
+ }
+
+ { /* write reply: (server_hash, server_nonce) */
+
+ reply_len = EXT_OR_PORT_AUTH_COOKIE_LEN+EXT_OR_PORT_AUTH_NONCE_LEN;
+ reply = tor_malloc_zero(reply_len);
+ memcpy(reply, server_hash, EXT_OR_PORT_AUTH_HASH_LEN);
+ memcpy(reply + EXT_OR_PORT_AUTH_HASH_LEN, server_nonce,
+ EXT_OR_PORT_AUTH_NONCE_LEN);
+ }
+
+ *reply_out = reply;
+ *reply_len_out = reply_len;
+
+ return 0;
+}
+
+/** Read the client's nonce out of <b>conn</b>, setup the safe-cookie
+ * crypto, and then send our own hash and nonce to the client
+ *
+ * Return -1 if there was an error; return 0 if we need more data in
+ * <b>conn</b>, and return 1 if we successfully retrieved the
+ * client's nonce and sent our own. */
+static int
+connection_ext_or_auth_handle_client_nonce(connection_t *conn)
+{
+ char client_nonce[EXT_OR_PORT_AUTH_NONCE_LEN];
+ char *reply=NULL;
+ size_t reply_len=0;
+
+ if (!ext_or_auth_cookie_is_set) { /* this should not happen */
+ log_warn(LD_BUG, "Extended ORPort authentication cookie was not set. "
+ "That's weird since we should have done that on startup. "
+ "This might be a Tor bug, please file a bug report. ");
+ return -1;
+ }
+
+ if (connection_get_inbuf_len(conn) < EXT_OR_PORT_AUTH_NONCE_LEN)
+ return 0;
+
+ if (connection_fetch_from_buf(client_nonce,
+ EXT_OR_PORT_AUTH_NONCE_LEN, conn) < 0)
+ return -1;
+
+ /* We extract the ClientNonce from the received data, and use it to
+ calculate ServerHash and ServerNonce according to proposal 217.
+
+ We also calculate our own ClientHash value and save it in the
+ connection state. We validate it later against the ClientHash
+ sent by the client. */
+ if (handle_client_auth_nonce(client_nonce, sizeof(client_nonce),
+ &TO_OR_CONN(conn)->ext_or_auth_correct_client_hash,
+ &reply, &reply_len) < 0)
+ return -1;
+
+ connection_write_to_buf(reply, reply_len, conn);
+
+ memwipe(reply, 0, reply_len);
+ tor_free(reply);
+
+ log_debug(LD_GENERAL, "Got client nonce, and sent our own nonce and hash.");
+
+ conn->state = EXT_OR_CONN_STATE_AUTH_WAIT_CLIENT_HASH;
+ return 1;
+}
+
+#define connection_ext_or_auth_send_result_success(c) \
+ connection_ext_or_auth_send_result(c, 1)
+#define connection_ext_or_auth_send_result_fail(c) \
+ connection_ext_or_auth_send_result(c, 0)
+
+/** Send authentication results to <b>conn</b>. Successful results if
+ * <b>success</b> is set; failure results otherwise. */
+static void
+connection_ext_or_auth_send_result(connection_t *conn, int success)
+{
+ if (success)
+ connection_write_to_buf("\x01", 1, conn);
+ else
+ connection_write_to_buf("\x00", 1, conn);
+}
+
+/** Receive the client's hash from <b>conn</b>, validate that it's
+ * correct, and then send the authentication results to the client.
+ *
+ * Return -1 if there was an error during validation; return 0 if we
+ * need more data in <b>conn</b>, and return 1 if we successfully
+ * validated the client's hash and sent a happy authentication
+ * result. */
+static int
+connection_ext_or_auth_handle_client_hash(connection_t *conn)
+{
+ char provided_client_hash[EXT_OR_PORT_AUTH_HASH_LEN] = {0};
+
+ if (connection_get_inbuf_len(conn) < EXT_OR_PORT_AUTH_HASH_LEN)
+ return 0;
+
+ if (connection_fetch_from_buf(provided_client_hash,
+ EXT_OR_PORT_AUTH_HASH_LEN, conn) < 0)
+ return -1;
+
+ if (tor_memneq(TO_OR_CONN(conn)->ext_or_auth_correct_client_hash,
+ provided_client_hash, EXT_OR_PORT_AUTH_HASH_LEN)) {
+ log_warn(LD_GENERAL, "Incorrect client hash. Authentication failed.");
+ connection_ext_or_auth_send_result_fail(conn);
+ return -1;
+ }
+
+ log_debug(LD_GENERAL, "Got client's hash and it was legit.");
+
+ /* send positive auth result */
+ connection_ext_or_auth_send_result_success(conn);
+ conn->state = EXT_OR_CONN_STATE_OPEN;
+ return 1;
+}
+
+/** Handle data from <b>or_conn</b> received on Extended ORPort.
+ * Return -1 on error. 0 on unsufficient data. 1 on correct. */
+static int
+connection_ext_or_auth_process_inbuf(or_connection_t *or_conn)
+{
+ connection_t *conn = TO_CONN(or_conn);
+
+ /* State transitions of the Extended ORPort authentication protocol:
+
+ EXT_OR_CONN_STATE_AUTH_WAIT_AUTH_TYPE (start state) ->
+ EXT_OR_CONN_STATE_AUTH_WAIT_CLIENT_NONCE ->
+ EXT_OR_CONN_STATE_AUTH_WAIT_CLIENT_HASH ->
+ EXT_OR_CONN_STATE_OPEN
+
+ During EXT_OR_CONN_STATE_OPEN, data is handled by
+ connection_ext_or_process_inbuf().
+ */
+
+ switch (conn->state) { /* Functionify */
+ case EXT_OR_CONN_STATE_AUTH_WAIT_AUTH_TYPE:
+ return connection_ext_or_auth_neg_auth_type(conn);
+
+ case EXT_OR_CONN_STATE_AUTH_WAIT_CLIENT_NONCE:
+ return connection_ext_or_auth_handle_client_nonce(conn);
+
+ case EXT_OR_CONN_STATE_AUTH_WAIT_CLIENT_HASH:
+ return connection_ext_or_auth_handle_client_hash(conn);
+
+ default:
+ log_warn(LD_BUG, "Encountered unexpected connection state %d while trying "
+ "to process Extended ORPort authentication data.", conn->state);
+ return -1;
+ }
+}
+
+/** Extended ORPort commands (Transport-to-Bridge) */
+#define EXT_OR_CMD_TB_DONE 0x0000
+#define EXT_OR_CMD_TB_USERADDR 0x0001
+#define EXT_OR_CMD_TB_TRANSPORT 0x0002
+
+/** Extended ORPort commands (Bridge-to-Transport) */
+#define EXT_OR_CMD_BT_OKAY 0x1000
+#define EXT_OR_CMD_BT_DENY 0x1001
+#define EXT_OR_CMD_BT_CONTROL 0x1002
+
+/** Process a USERADDR command from the Extended
+ * ORPort. <b>payload</b> is a payload of size <b>len</b>.
+ *
+ * If the USERADDR command was well formed, change the address of
+ * <b>conn</b> to the address on the USERADDR command.
+ *
+ * Return 0 on success and -1 on error. */
+static int
+connection_ext_or_handle_cmd_useraddr(connection_t *conn,
+ const char *payload, uint16_t len)
+{
+ /* Copy address string. */
+ tor_addr_t addr;
+ uint16_t port;
+ char *addr_str;
+ char *address_part=NULL;
+ int res;
+ if (memchr(payload, '\0', len)) {
+ log_fn(LOG_PROTOCOL_WARN, LD_NET, "Unexpected NUL in ExtORPort UserAddr");
+ return -1;
+ }
+
+ addr_str = tor_memdup_nulterm(payload, len);
+
+ res = tor_addr_port_split(LOG_INFO, addr_str, &address_part, &port);
+ tor_free(addr_str);
+ if (res<0)
+ return -1;
+
+ res = tor_addr_parse(&addr, address_part);
+ tor_free(address_part);
+ if (res<0)
+ return -1;
+
+ { /* do some logging */
+ char *old_address = tor_dup_addr(&conn->addr);
+ char *new_address = tor_dup_addr(&addr);
+
+ log_debug(LD_NET, "Received USERADDR."
+ "We rewrite our address from '%s:%u' to '%s:%u'.",
+ safe_str(old_address), conn->port, safe_str(new_address), port);
+
+ tor_free(old_address);
+ tor_free(new_address);
+ }
+
+ /* record the address */
+ tor_addr_copy(&conn->addr, &addr);
+ conn->port = port;
+ if (conn->address) {
+ tor_free(conn->address);
+ }
+ conn->address = tor_dup_addr(&addr);
+
+ return 0;
+}
+
+/** Process a TRANSPORT command from the Extended
+ * ORPort. <b>payload</b> is a payload of size <b>len</b>.
+ *
+ * If the TRANSPORT command was well formed, register the name of the
+ * transport on <b>conn</b>.
+ *
+ * Return 0 on success and -1 on error. */
+static int
+connection_ext_or_handle_cmd_transport(or_connection_t *conn,
+ const char *payload, uint16_t len)
+{
+ char *transport_str;
+ if (memchr(payload, '\0', len)) {
+ log_fn(LOG_PROTOCOL_WARN, LD_NET, "Unexpected NUL in ExtORPort Transport");
+ return -1;
+ }
+
+ transport_str = tor_memdup_nulterm(payload, len);
+
+ /* Transport names MUST be C-identifiers. */
+ if (!string_is_C_identifier(transport_str)) {
+ tor_free(transport_str);
+ return -1;
+ }
+
+ /* If ext_or_transport is already occupied (because the PT sent two
+ * TRANSPORT commands), deallocate the old name and keep the new
+ * one */
+ if (conn->ext_or_transport)
+ tor_free(conn->ext_or_transport);
+
+ conn->ext_or_transport = transport_str;
+ return 0;
+}
+
+#define EXT_OR_CONN_STATE_IS_AUTHENTICATING(st) \
+ ((st) <= EXT_OR_CONN_STATE_AUTH_MAX)
+
+/** Process Extended ORPort messages from <b>or_conn</b>. */
+int
+connection_ext_or_process_inbuf(or_connection_t *or_conn)
+{
+ connection_t *conn = TO_CONN(or_conn);
+ ext_or_cmd_t *command;
+ int r;
+
+ /* DOCDOC Document the state machine and transitions in this function */
+
+ /* If we are still in the authentication stage, process traffic as
+ authentication data: */
+ while (EXT_OR_CONN_STATE_IS_AUTHENTICATING(conn->state)) {
+ log_debug(LD_GENERAL, "Got Extended ORPort authentication data (%u).",
+ (unsigned int) connection_get_inbuf_len(conn));
+ r = connection_ext_or_auth_process_inbuf(or_conn);
+ if (r < 0) {
+ connection_mark_for_close(conn);
+ return -1;
+ } else if (r == 0) {
+ return 0;
+ }
+ /* if r > 0, loop and process more data (if any). */
+ }
+
+ while (1) {
+ log_debug(LD_GENERAL, "Got Extended ORPort data.");
+ command = NULL;
+ r = connection_fetch_ext_or_cmd_from_buf(conn, &command);
+ if (r < 0)
+ goto err;
+ else if (r == 0)
+ return 0; /* need to wait for more data */
+
+ /* Got a command! */
+ tor_assert(command);
+
+ if (command->cmd == EXT_OR_CMD_TB_DONE) {
+ if (connection_get_inbuf_len(conn)) {
+ /* The inbuf isn't empty; the client is misbehaving. */
+ goto err;
+ }
+
+ log_debug(LD_NET, "Received DONE.");
+
+ /* If the transport proxy did not use the TRANSPORT command to
+ * specify the transport name, mark this as unknown transport. */
+ if (!or_conn->ext_or_transport) {
+ /* We write this string this way to avoid ??>, which is a C
+ * trigraph. */
+ or_conn->ext_or_transport = tor_strdup("<?" "?>");
+ }
+
+ connection_write_ext_or_command(conn, EXT_OR_CMD_BT_OKAY, NULL, 0);
+
+ /* can't transition immediately; need to flush first. */
+ conn->state = EXT_OR_CONN_STATE_FLUSHING;
+ connection_stop_reading(conn);
+ } else if (command->cmd == EXT_OR_CMD_TB_USERADDR) {
+ if (connection_ext_or_handle_cmd_useraddr(conn,
+ command->body, command->len) < 0)
+ goto err;
+ } else if (command->cmd == EXT_OR_CMD_TB_TRANSPORT) {
+ if (connection_ext_or_handle_cmd_transport(or_conn,
+ command->body, command->len) < 0)
+ goto err;
+ } else {
+ log_notice(LD_NET,"Got Extended ORPort command we don't regognize (%u).",
+ command->cmd);
+ }
+
+ ext_or_cmd_free(command);
+ }
+
+ return 0;
+
+ err:
+ ext_or_cmd_free(command);
+ connection_mark_for_close(conn);
+ return -1;
+}
+
+/** <b>conn</b> finished flushing Extended ORPort messages to the
+ * network, and is now ready to accept OR traffic. This function
+ * does the transition. */
+int
+connection_ext_or_finished_flushing(or_connection_t *conn)
+{
+ if (conn->base_.state == EXT_OR_CONN_STATE_FLUSHING) {
+ connection_start_reading(TO_CONN(conn));
+ connection_ext_or_transition(conn);
+ }
+ return 0;
+}
+
+/** Initiate Extended ORPort authentication, by sending the list of
+ * supported authentication types to the client. */
+int
+connection_ext_or_start_auth(or_connection_t *or_conn)
+{
+ connection_t *conn = TO_CONN(or_conn);
+ const uint8_t authtypes[] = {
+ /* We only support authtype '1' for now. */
+ EXT_OR_AUTHTYPE_SAFECOOKIE,
+ /* Marks the end of the list. */
+ 0
+ };
+
+ log_debug(LD_GENERAL,
+ "ExtORPort authentication: Sending supported authentication types");
+
+ connection_write_to_buf((const char *)authtypes, sizeof(authtypes), conn);
+ conn->state = EXT_OR_CONN_STATE_AUTH_WAIT_AUTH_TYPE;
+
+ return 0;
+}
+
+/** Free any leftover allocated memory of the ext_orport.c subsystem. */
+void
+ext_orport_free_all(void)
+{
+ if (ext_or_auth_cookie) /* Free the auth cookie */
+ tor_free(ext_or_auth_cookie);
+}
+
diff --git a/src/or/ext_orport.h b/src/or/ext_orport.h
new file mode 100644
index 000000000..ce45e5f41
--- /dev/null
+++ b/src/or/ext_orport.h
@@ -0,0 +1,42 @@
+/* Copyright (c) 2001 Matej Pfajfar.
+ * Copyright (c) 2001-2004, Roger Dingledine.
+ * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
+ * Copyright (c) 2007-2013, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#ifndef EXT_ORPORT_H
+#define EXT_ORPORT_H
+
+int connection_ext_or_start_auth(or_connection_t *or_conn);
+
+ext_or_cmd_t *ext_or_cmd_new(uint16_t len);
+void ext_or_cmd_free(ext_or_cmd_t *cmd);
+void connection_or_set_ext_or_identifier(or_connection_t *conn);
+void connection_or_remove_from_ext_or_id_map(or_connection_t *conn);
+void connection_or_clear_ext_or_id_map(void);
+or_connection_t *connection_or_get_by_ext_or_id(const char *id);
+
+int connection_ext_or_finished_flushing(or_connection_t *conn);
+int connection_ext_or_process_inbuf(or_connection_t *or_conn);
+
+int init_ext_or_cookie_authentication(int is_enabled);
+char *get_ext_or_auth_cookie_file_name(void);
+void ext_orport_free_all(void);
+
+#ifdef EXT_ORPORT_PRIVATE
+STATIC int connection_write_ext_or_command(connection_t *conn,
+ uint16_t command,
+ const char *body,
+ size_t bodylen);
+STATIC int handle_client_auth_nonce(const char *client_nonce,
+ size_t client_nonce_len,
+ char **client_hash_out,
+ char **reply_out, size_t *reply_len_out);
+#ifdef TOR_UNIT_TESTS
+extern uint8_t *ext_or_auth_cookie;
+extern int ext_or_auth_cookie_is_set;
+#endif
+#endif
+
+#endif
+
diff --git a/src/or/geoip.c b/src/or/geoip.c
index d6e8ee0d0..dc4730c81 100644
--- a/src/or/geoip.c
+++ b/src/or/geoip.c
@@ -120,7 +120,7 @@ geoip_add_entry(const tor_addr_t *low, const tor_addr_t *high,
/** Add an entry to the GeoIP table indicated by <b>family</b>,
* parsing it from <b>line</b>. The format is as for geoip_load_file(). */
-/*private*/ int
+STATIC int
geoip_parse_entry(const char *line, sa_family_t family)
{
tor_addr_t low_addr, high_addr;
@@ -363,7 +363,7 @@ geoip_load_file(sa_family_t family, const char *filename)
* be less than geoip_get_n_countries(). To decode it, call
* geoip_get_country_name().
*/
-int
+STATIC int
geoip_get_country_by_ipv4(uint32_t ipaddr)
{
geoip_ipv4_entry_t *ent;
@@ -379,7 +379,7 @@ geoip_get_country_by_ipv4(uint32_t ipaddr)
* 0 for the 'unknown country'. The return value will always be less than
* geoip_get_n_countries(). To decode it, call geoip_get_country_name().
*/
-int
+STATIC int
geoip_get_country_by_ipv6(const struct in6_addr *addr)
{
geoip_ipv6_entry_t *ent;
@@ -461,6 +461,10 @@ geoip_db_digest(sa_family_t family)
typedef struct clientmap_entry_t {
HT_ENTRY(clientmap_entry_t) node;
tor_addr_t addr;
+ /* Name of pluggable transport used by this client. NULL if no
+ pluggable transport was used. */
+ char *transport_name;
+
/** Time when we last saw this IP address, in MINUTES since the epoch.
*
* (This will run out of space around 4011 CE. If Tor is still in use around
@@ -482,12 +486,18 @@ static HT_HEAD(clientmap, clientmap_entry_t) client_history =
static INLINE unsigned
clientmap_entry_hash(const clientmap_entry_t *a)
{
- return ht_improve_hash(tor_addr_hash(&a->addr));
+ unsigned h = tor_addr_hash(&a->addr);
+ if (a->transport_name)
+ h += ht_string_hash(a->transport_name);
+ return ht_improve_hash(h);
}
/** Hashtable helper: compare two clientmap_entry_t values for equality. */
static INLINE int
clientmap_entries_eq(const clientmap_entry_t *a, const clientmap_entry_t *b)
{
+ if (strcmp_opt(a->transport_name, b->transport_name))
+ return 0;
+
return !tor_addr_compare(&a->addr, &b->addr, CMP_EXACT) &&
a->action == b->action;
}
@@ -497,6 +507,17 @@ HT_PROTOTYPE(clientmap, clientmap_entry_t, node, clientmap_entry_hash,
HT_GENERATE(clientmap, clientmap_entry_t, node, clientmap_entry_hash,
clientmap_entries_eq, 0.6, malloc, realloc, free);
+/** Free all storage held by <b>ent</b>. */
+static void
+clientmap_entry_free(clientmap_entry_t *ent)
+{
+ if (!ent)
+ return;
+
+ tor_free(ent->transport_name);
+ tor_free(ent);
+}
+
/** Clear history of connecting clients used by entry and bridge stats. */
static void
client_history_clear(void)
@@ -507,7 +528,7 @@ client_history_clear(void)
if ((*ent)->action == GEOIP_CLIENT_CONNECT) {
this = *ent;
next = HT_NEXT_RMV(clientmap, &client_history, ent);
- tor_free(this);
+ clientmap_entry_free(this);
} else {
next = HT_NEXT(clientmap, &client_history, ent);
}
@@ -519,10 +540,14 @@ client_history_clear(void)
* configured accordingly. */
void
geoip_note_client_seen(geoip_client_action_t action,
- const tor_addr_t *addr, time_t now)
+ const tor_addr_t *addr,
+ const char *transport_name,
+ time_t now)
{
const or_options_t *options = get_options();
clientmap_entry_t lookup, *ent;
+ memset(&lookup, 0, sizeof(clientmap_entry_t));
+
if (action == GEOIP_CLIENT_CONNECT) {
/* Only remember statistics as entry guard or as bridge. */
if (!options->EntryStatistics &&
@@ -534,12 +559,20 @@ geoip_note_client_seen(geoip_client_action_t action,
return;
}
+ log_debug(LD_GENERAL, "Seen client from '%s' with transport '%s'.",
+ safe_str_client(fmt_addr((addr))),
+ transport_name ? transport_name : "<no transport>");
+
tor_addr_copy(&lookup.addr, addr);
lookup.action = (int)action;
+ lookup.transport_name = (char*) transport_name;
ent = HT_FIND(clientmap, &client_history, &lookup);
+
if (! ent) {
ent = tor_malloc_zero(sizeof(clientmap_entry_t));
tor_addr_copy(&ent->addr, addr);
+ if (transport_name)
+ ent->transport_name = tor_strdup(transport_name);
ent->action = (int)action;
HT_INSERT(clientmap, &client_history, ent);
}
@@ -566,7 +599,7 @@ remove_old_client_helper_(struct clientmap_entry_t *ent, void *_cutoff)
{
time_t cutoff = *(time_t*)_cutoff / 60;
if (ent->last_seen_in_minutes < cutoff) {
- tor_free(ent);
+ clientmap_entry_free(ent);
return 1;
} else {
return 0;
@@ -769,6 +802,106 @@ geoip_change_dirreq_state(uint64_t dirreq_id, dirreq_type_t type,
}
}
+/** Return the bridge-ip-transports string that should be inserted in
+ * our extra-info descriptor. Return NULL if the bridge-ip-transports
+ * line should be empty. */
+char *
+geoip_get_transport_history(void)
+{
+ unsigned granularity = IP_GRANULARITY;
+ /** String hash table <name of transport> -> <number of users>. */
+ strmap_t *transport_counts = strmap_new();
+
+ /** Smartlist that contains copies of the names of the transports
+ that have been used. */
+ smartlist_t *transports_used = smartlist_new();
+
+ /* Special string to signify that no transport was used for this
+ connection. Pluggable transport names can't have symbols in their
+ names, so this string will never collide with a real transport. */
+ static const char* no_transport_str = "<OR>";
+
+ clientmap_entry_t **ent;
+ const char *transport_name = NULL;
+ smartlist_t *string_chunks = smartlist_new();
+ char *the_string = NULL;
+
+ /* If we haven't seen any clients yet, return NULL. */
+ if (HT_EMPTY(&client_history))
+ goto done;
+
+ /** We do the following steps to form the transport history string:
+ * a) Foreach client that uses a pluggable transport, we increase the
+ * times that transport was used by one. If the client did not use
+ * a transport, we increase the number of times someone connected
+ * without obfuscation.
+ * b) Foreach transport we observed, we write its transport history
+ * string and push it to string_chunks. So, for example, if we've
+ * seen 665 obfs2 clients, we write "obfs2=665".
+ * c) We concatenate string_chunks to form the final string.
+ */
+
+ log_debug(LD_GENERAL,"Starting iteration for transport history. %d clients.",
+ HT_SIZE(&client_history));
+
+ /* Loop through all clients. */
+ HT_FOREACH(ent, clientmap, &client_history) {
+ uintptr_t val;
+ void *ptr;
+ transport_name = (*ent)->transport_name;
+ if (!transport_name)
+ transport_name = no_transport_str;
+
+ /* Increase the count for this transport name. */
+ ptr = strmap_get(transport_counts, transport_name);
+ val = (uintptr_t)ptr;
+ val++;
+ ptr = (void*)val;
+ strmap_set(transport_counts, transport_name, ptr);
+
+ /* If it's the first time we see this transport, note it. */
+ if (val == 1)
+ smartlist_add(transports_used, tor_strdup(transport_name));
+
+ log_debug(LD_GENERAL, "Client from '%s' with transport '%s'. "
+ "I've now seen %d clients.",
+ safe_str_client(fmt_addr(&(*ent)->addr)),
+ transport_name ? transport_name : "<no transport>",
+ (int)val);
+ }
+
+ /* Sort the transport names (helps with unit testing). */
+ smartlist_sort_strings(transports_used);
+
+ /* Loop through all seen transports. */
+ SMARTLIST_FOREACH_BEGIN(transports_used, const char *, transport_name) {
+ void *transport_count_ptr = strmap_get(transport_counts, transport_name);
+ uintptr_t transport_count = (uintptr_t) transport_count_ptr;
+
+ log_debug(LD_GENERAL, "We got "U64_FORMAT" clients with transport '%s'.",
+ U64_PRINTF_ARG((uint64_t)transport_count), transport_name);
+
+ smartlist_add_asprintf(string_chunks, "%s="U64_FORMAT,
+ transport_name,
+ U64_PRINTF_ARG(round_uint64_to_next_multiple_of(
+ (uint64_t)transport_count,
+ granularity)));
+ } SMARTLIST_FOREACH_END(transport_name);
+
+ the_string = smartlist_join_strings(string_chunks, ",", 0, NULL);
+
+ log_debug(LD_GENERAL, "Final bridge-ip-transports string: '%s'", the_string);
+
+ done:
+ strmap_free(transport_counts, NULL);
+ SMARTLIST_FOREACH(transports_used, char *, s, tor_free(s));
+ smartlist_free(transports_used);
+ SMARTLIST_FOREACH(string_chunks, char *, s, tor_free(s));
+ smartlist_free(string_chunks);
+
+ return the_string;
+}
+
/** Return a newly allocated comma-separated string containing statistics
* on network status downloads. The string contains the number of completed
* requests, timeouts, and still running requests as well as the download
@@ -1037,7 +1170,7 @@ geoip_reset_dirreq_stats(time_t now)
if ((*ent)->action == GEOIP_CLIENT_NETWORKSTATUS) {
this = *ent;
next = HT_NEXT_RMV(clientmap, &client_history, ent);
- tor_free(this);
+ clientmap_entry_free(this);
} else {
next = HT_NEXT(clientmap, &client_history, ent);
}
@@ -1189,6 +1322,8 @@ validate_bridge_stats(const char *stats_str, time_t now)
const char *BRIDGE_STATS_END = "bridge-stats-end ";
const char *BRIDGE_IPS = "bridge-ips ";
const char *BRIDGE_IPS_EMPTY_LINE = "bridge-ips\n";
+ const char *BRIDGE_TRANSPORTS = "bridge-ip-transports ";
+ const char *BRIDGE_TRANSPORTS_EMPTY_LINE = "bridge-ip-transports\n";
const char *tmp;
time_t stats_end_time;
int seconds;
@@ -1223,6 +1358,15 @@ validate_bridge_stats(const char *stats_str, time_t now)
return 0;
}
+ /* Parse: "bridge-ip-transports PT=N,PT=N,..." */
+ tmp = find_str_at_start_of_line(stats_str, BRIDGE_TRANSPORTS);
+ if (!tmp) {
+ /* Look if there is an empty "bridge-ip-transports" line */
+ tmp = find_str_at_start_of_line(stats_str, BRIDGE_TRANSPORTS_EMPTY_LINE);
+ if (!tmp)
+ return 0;
+ }
+
return 1;
}
@@ -1236,7 +1380,8 @@ static char *bridge_stats_extrainfo = NULL;
char *
geoip_format_bridge_stats(time_t now)
{
- char *out = NULL, *country_data = NULL, *ipver_data = NULL;
+ char *out = NULL;
+ char *country_data = NULL, *ipver_data = NULL, *transport_data = NULL;
long duration = now - start_of_bridge_stats_interval;
char written[ISO_TIME_LEN+1];
@@ -1247,16 +1392,20 @@ geoip_format_bridge_stats(time_t now)
format_iso_time(written, now);
geoip_get_client_history(GEOIP_CLIENT_CONNECT, &country_data, &ipver_data);
+ transport_data = geoip_get_transport_history();
tor_asprintf(&out,
"bridge-stats-end %s (%ld s)\n"
"bridge-ips %s\n"
- "bridge-ip-versions %s\n",
+ "bridge-ip-versions %s\n"
+ "bridge-ip-transports %s\n",
written, duration,
country_data ? country_data : "",
- ipver_data ? ipver_data : "");
+ ipver_data ? ipver_data : "",
+ transport_data ? transport_data : "");
tor_free(country_data);
tor_free(ipver_data);
+ tor_free(transport_data);
return out;
}
@@ -1515,7 +1664,7 @@ geoip_free_all(void)
for (ent = HT_START(clientmap, &client_history); ent != NULL; ent = next) {
this = *ent;
next = HT_NEXT_RMV(clientmap, &client_history, ent);
- tor_free(this);
+ clientmap_entry_free(this);
}
HT_CLEAR(clientmap, &client_history);
}
@@ -1530,5 +1679,6 @@ geoip_free_all(void)
}
clear_geoip_db();
+ tor_free(bridge_stats_extrainfo);
}
diff --git a/src/or/geoip.h b/src/or/geoip.h
index ebefee5f4..b9b53c300 100644
--- a/src/or/geoip.h
+++ b/src/or/geoip.h
@@ -12,10 +12,12 @@
#ifndef TOR_GEOIP_H
#define TOR_GEOIP_H
+#include "testsupport.h"
+
#ifdef GEOIP_PRIVATE
-int geoip_parse_entry(const char *line, sa_family_t family);
-int geoip_get_country_by_ipv4(uint32_t ipaddr);
-int geoip_get_country_by_ipv6(const struct in6_addr *addr);
+STATIC int geoip_parse_entry(const char *line, sa_family_t family);
+STATIC int geoip_get_country_by_ipv4(uint32_t ipaddr);
+STATIC int geoip_get_country_by_ipv6(const struct in6_addr *addr);
#endif
int should_record_bridge_info(const or_options_t *options);
int geoip_load_file(sa_family_t family, const char *filename);
@@ -27,10 +29,12 @@ const char *geoip_db_digest(sa_family_t family);
country_t geoip_get_country(const char *countrycode);
void geoip_note_client_seen(geoip_client_action_t action,
- const tor_addr_t *addr, time_t now);
+ const tor_addr_t *addr, const char *transport_name,
+ time_t now);
void geoip_remove_old_clients(time_t cutoff);
void geoip_note_ns_response(geoip_ns_response_t response);
+char *geoip_get_transport_history(void);
int geoip_get_client_history(geoip_client_action_t action,
char **country_str, char **ipver_str);
char *geoip_get_request_history(void);
diff --git a/src/or/hibernate.c b/src/or/hibernate.c
index a41257133..607dec8cd 100644
--- a/src/or/hibernate.c
+++ b/src/or/hibernate.c
@@ -255,6 +255,13 @@ accounting_get_interval_length(void)
return (int)(interval_end_time - interval_start_time);
}
+/** Return the time at which the current accounting interval will end. */
+time_t
+accounting_get_end_time(void)
+{
+ return interval_end_time;
+}
+
/** Called from main.c to tell us that <b>seconds</b> seconds have
* passed, <b>n_read</b> bytes have been read, and <b>n_written</b>
* bytes have been written. */
@@ -1010,6 +1017,7 @@ getinfo_helper_accounting(control_connection_t *conn,
return 0;
}
+#ifdef TOR_UNIT_TESTS
/**
* Manually change the hibernation state. Private; used only by the unit
* tests.
@@ -1019,4 +1027,5 @@ hibernate_set_state_for_testing_(hibernate_state_t newstate)
{
hibernate_state = newstate;
}
+#endif
diff --git a/src/or/hibernate.h b/src/or/hibernate.h
index d2d6989e1..4f7331ce8 100644
--- a/src/or/hibernate.h
+++ b/src/or/hibernate.h
@@ -15,6 +15,7 @@
int accounting_parse_options(const or_options_t *options, int validate_only);
int accounting_is_enabled(const or_options_t *options);
int accounting_get_interval_length(void);
+time_t accounting_get_end_time(void);
void configure_accounting(time_t now);
void accounting_run_housekeeping(time_t now);
void accounting_add_bytes(size_t n_read, size_t n_written, int seconds);
@@ -45,8 +46,10 @@ typedef enum {
HIBERNATE_STATE_INITIAL=5
} hibernate_state_t;
+#ifdef TOR_UNIT_TESTS
void hibernate_set_state_for_testing_(hibernate_state_t newstate);
#endif
+#endif
#endif
diff --git a/src/or/include.am b/src/or/include.am
index 65dbeff53..8922e0397 100644
--- a/src/or/include.am
+++ b/src/or/include.am
@@ -1,5 +1,13 @@
bin_PROGRAMS+= src/or/tor
-noinst_LIBRARIES+= src/or/libtor.a
+noinst_LIBRARIES += \
+ src/or/libtor.a
+if UNITTESTS_ENABLED
+noinst_LIBRARIES += \
+ src/or/libtor-testing.a
+endif
+if COVERAGE_ENABLED
+noinst_PROGRAMS+= src/or/tor-cov
+endif
if BUILD_NT_SERVICES
tor_platform_source=src/or/ntmain.c
@@ -21,7 +29,7 @@ else
onion_ntor_source=
endif
-src_or_libtor_a_SOURCES = \
+LIBTOR_A_SOURCES = \
src/or/addressmap.c \
src/or/buffers.c \
src/or/channel.c \
@@ -48,6 +56,7 @@ src_or_libtor_a_SOURCES = \
src/or/fp_pair.c \
src/or/geoip.c \
src/or/entrynodes.c \
+ src/or/ext_orport.c \
src/or/hibernate.c \
src/or/main.c \
src/or/microdesc.c \
@@ -77,6 +86,9 @@ src_or_libtor_a_SOURCES = \
$(onion_ntor_source) \
src/or/config_codedigest.c
+src_or_libtor_a_SOURCES = $(LIBTOR_A_SOURCES)
+src_or_libtor_testing_a_SOURCES = $(LIBTOR_A_SOURCES)
+
#libtor_a_LIBADD = ../common/libor.a ../common/libor-crypto.a \
# ../common/libor-event.a
@@ -90,6 +102,9 @@ AM_CPPFLAGS += -DSHARE_DATADIR="\"$(datadir)\"" \
-DLOCALSTATEDIR="\"$(localstatedir)\"" \
-DBINDIR="\"$(bindir)\""
+src_or_libtor_testing_a_CPPFLAGS = -DTOR_UNIT_TESTS $(AM_CPPFLAGS)
+src_or_libtor_testing_a_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS)
+
# -L flags need to go in LDFLAGS. -l flags need to go in LDADD.
# This seems to matter nowhere but on windows, but I assure you that it
# matters a lot there, and is quite hard to debug if you forget to do it.
@@ -102,6 +117,18 @@ src_or_tor_LDADD = src/or/libtor.a src/common/libor.a \
@TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ @TOR_OPENSSL_LIBS@ \
@TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@
+if COVERAGE_ENABLED
+src_or_tor_cov_SOURCES = src/or/tor_main.c
+src_or_tor_cov_CPPFLAGS = -DTOR_UNIT_TESTS $(AM_CPPFLAGS)
+src_or_tor_cov_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS)
+src_or_tor_cov_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ @TOR_LDFLAGS_libevent@
+src_or_tor_cov_LDADD = src/or/libtor-testing.a src/common/libor-testing.a \
+ src/common/libor-crypto-testing.a $(LIBDONNA) \
+ src/common/libor-event-testing.a \
+ @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ @TOR_OPENSSL_LIBS@ \
+ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@
+endif
+
ORHEADERS = \
src/or/addressmap.h \
src/or/buffers.h \
@@ -127,6 +154,7 @@ ORHEADERS = \
src/or/dns.h \
src/or/dnsserv.h \
src/or/eventdns_tor.h \
+ src/or/ext_orport.h \
src/or/fp_pair.h \
src/or/geoip.h \
src/or/entrynodes.h \
diff --git a/src/or/main.c b/src/or/main.c
index 01f6b5c75..fa112437f 100644
--- a/src/or/main.c
+++ b/src/or/main.c
@@ -52,6 +52,7 @@
#include "routerparse.h"
#include "statefile.h"
#include "status.h"
+#include "ext_orport.h"
#ifdef USE_DMALLOC
#include <dmalloc.h>
#include <openssl/crypto.h>
@@ -413,6 +414,19 @@ connection_unlink(connection_t *conn)
connection_free(conn);
}
+/** Initialize the global connection list, closeable connection list,
+ * and active connection list. */
+STATIC void
+init_connection_lists(void)
+{
+ if (!connection_array)
+ connection_array = smartlist_new();
+ if (!closeable_connection_lst)
+ closeable_connection_lst = smartlist_new();
+ if (!active_linked_connection_lst)
+ active_linked_connection_lst = smartlist_new();
+}
+
/** Schedule <b>conn</b> to be closed. **/
void
add_connection_to_closeable_list(connection_t *conn)
@@ -506,8 +520,8 @@ connection_is_reading(connection_t *conn)
}
/** Tell the main loop to stop notifying <b>conn</b> of any read events. */
-void
-connection_stop_reading(connection_t *conn)
+MOCK_IMPL(void,
+connection_stop_reading,(connection_t *conn))
{
tor_assert(conn);
@@ -531,8 +545,8 @@ connection_stop_reading(connection_t *conn)
}
/** Tell the main loop to start notifying <b>conn</b> of any read events. */
-void
-connection_start_reading(connection_t *conn)
+MOCK_IMPL(void,
+connection_start_reading,(connection_t *conn))
{
tor_assert(conn);
@@ -571,8 +585,8 @@ connection_is_writing(connection_t *conn)
}
/** Tell the main loop to stop notifying <b>conn</b> of any write events. */
-void
-connection_stop_writing(connection_t *conn)
+MOCK_IMPL(void,
+connection_stop_writing,(connection_t *conn))
{
tor_assert(conn);
@@ -597,8 +611,8 @@ connection_stop_writing(connection_t *conn)
}
/** Tell the main loop to start notifying <b>conn</b> of any write events. */
-void
-connection_start_writing(connection_t *conn)
+MOCK_IMPL(void,
+connection_start_writing,(connection_t *conn))
{
tor_assert(conn);
@@ -686,7 +700,7 @@ connection_stop_reading_from_linked_conn(connection_t *conn)
}
/** Close all connections that have been scheduled to get closed. */
-static void
+STATIC void
close_closeable_connections(void)
{
int i;
@@ -1355,6 +1369,11 @@ run_scheduled_events(time_t now)
next_time_to_write_stats_files = next_write;
}
time_to_write_stats_files = next_time_to_write_stats_files;
+
+ /* Also commandeer this opportunity to log how our circuit handshake
+ * stats have been doing. */
+ if (public_server_mode(options))
+ rep_hist_log_circuit_handshake_stats(now);
}
/* 1h. Check whether we should write bridge statistics to disk.
@@ -1875,7 +1894,7 @@ do_hup(void)
}
/** Tor main loop. */
-/* static */ int
+int
do_main_loop(void)
{
int loop_result;
@@ -2302,18 +2321,13 @@ handle_signals(int is_parent)
/** Main entry point for the Tor command-line client.
*/
-/* static */ int
+int
tor_init(int argc, char *argv[])
{
char buf[256];
int i, quiet = 0;
time_of_process_start = time(NULL);
- if (!connection_array)
- connection_array = smartlist_new();
- if (!closeable_connection_lst)
- closeable_connection_lst = smartlist_new();
- if (!active_linked_connection_lst)
- active_linked_connection_lst = smartlist_new();
+ init_connection_lists();
/* Have the log set up with our application name. */
tor_snprintf(buf, sizeof(buf), "Tor %s", get_version());
log_set_application_name(buf);
@@ -2502,6 +2516,8 @@ tor_free_all(int postfork)
memarea_clear_freelist();
nodelist_free_all();
microdesc_free_all();
+ ext_orport_free_all();
+ control_free_all();
if (!postfork) {
config_free_all();
or_state_free_all();
@@ -2568,7 +2584,7 @@ tor_cleanup(void)
}
/** Read/create keys as needed, and echo our fingerprint to stdout. */
-/* static */ int
+static int
do_list_fingerprint(void)
{
char buf[FINGERPRINT_LEN+1];
@@ -2598,7 +2614,7 @@ do_list_fingerprint(void)
/** Entry point for password hashing: take the desired password from
* the command line, and print its salted hash to stdout. **/
-/* static */ void
+static void
do_hash_password(void)
{
diff --git a/src/or/main.h b/src/or/main.h
index 338449b6a..df302ffa7 100644
--- a/src/or/main.h
+++ b/src/or/main.h
@@ -36,12 +36,12 @@ typedef enum watchable_events {
} watchable_events_t;
void connection_watch_events(connection_t *conn, watchable_events_t events);
int connection_is_reading(connection_t *conn);
-void connection_stop_reading(connection_t *conn);
-void connection_start_reading(connection_t *conn);
+MOCK_DECL(void,connection_stop_reading,(connection_t *conn));
+MOCK_DECL(void,connection_start_reading,(connection_t *conn));
int connection_is_writing(connection_t *conn);
-void connection_stop_writing(connection_t *conn);
-void connection_start_writing(connection_t *conn);
+MOCK_DECL(void,connection_stop_writing,(connection_t *conn));
+MOCK_DECL(void,connection_start_writing,(connection_t *conn));
void connection_stop_reading_from_linked_conn(connection_t *conn);
@@ -66,11 +66,12 @@ void tor_free_all(int postfork);
int tor_main(int argc, char *argv[]);
-#ifdef MAIN_PRIVATE
int do_main_loop(void);
-int do_list_fingerprint(void);
-void do_hash_password(void);
int tor_init(int argc, char **argv);
+
+#ifdef MAIN_PRIVATE
+STATIC void init_connection_lists(void);
+STATIC void close_closeable_connections(void);
#endif
#endif
diff --git a/src/or/microdesc.c b/src/or/microdesc.c
index 8c763c672..f6dd6b611 100644
--- a/src/or/microdesc.c
+++ b/src/or/microdesc.c
@@ -213,7 +213,6 @@ microdescs_add_list_to_cache(microdesc_cache_t *cache,
if (fd < 0) {
log_warn(LD_DIR, "Couldn't append to journal in %s: %s",
cache->journal_fname, strerror(errno));
- return NULL;
}
}
@@ -238,11 +237,11 @@ microdescs_add_list_to_cache(microdesc_cache_t *cache,
if (size < 0) {
/* we already warned in dump_microdescriptor */
abort_writing_to_file(open_file);
- smartlist_clear(added);
- return added;
+ fd = -1;
+ } else {
+ md->saved_location = SAVED_IN_JOURNAL;
+ cache->journal_len += size;
}
- md->saved_location = SAVED_IN_JOURNAL;
- cache->journal_len += size;
} else {
md->saved_location = where;
}
diff --git a/src/or/networkstatus.c b/src/or/networkstatus.c
index 3f995a9f6..c950731bb 100644
--- a/src/or/networkstatus.c
+++ b/src/or/networkstatus.c
@@ -1231,7 +1231,7 @@ update_consensus_networkstatus_downloads(time_t now)
}
if (time_to_download_next_consensus[i] > now)
- return; /* Wait until the current consensus is older. */
+ continue; /* Wait until the current consensus is older. */
resource = networkstatus_get_flavor_name(i);
@@ -1822,7 +1822,8 @@ networkstatus_set_current_consensus(const char *consensus,
* current consensus really alter our view of any OR's rate limits? */
connection_or_update_token_buckets(get_connection_array(), options);
- circuit_build_times_new_consensus_params(&circ_times, current_consensus);
+ circuit_build_times_new_consensus_params(get_circuit_build_times_mutable(),
+ current_consensus);
}
if (directory_caches_dir_info(options)) {
diff --git a/src/or/ntmain.c b/src/or/ntmain.c
index 8b67b8682..2fa074d0b 100644
--- a/src/or/ntmain.c
+++ b/src/or/ntmain.c
@@ -3,7 +3,6 @@
* Copyright (c) 2007-2013, The Tor Project, Inc. */
/* See LICENSE for licensing information */
-#define MAIN_PRIVATE
#include "or.h"
#include "config.h"
#include "main.h"
diff --git a/src/or/onion.c b/src/or/onion.c
index d4a65022f..3e1d63d4e 100644
--- a/src/or/onion.c
+++ b/src/or/onion.c
@@ -14,6 +14,7 @@
#include "circuitlist.h"
#include "config.h"
#include "cpuworker.h"
+#include "networkstatus.h"
#include "onion.h"
#include "onion_fast.h"
#include "onion_ntor.h"
@@ -21,13 +22,13 @@
#include "relay.h"
#include "rephist.h"
#include "router.h"
-#include "tor_queue.h"
/** Type for a linked list of circuits that are waiting for a free CPU worker
* to process a waiting onion handshake. */
typedef struct onion_queue_t {
TOR_TAILQ_ENTRY(onion_queue_t) next;
or_circuit_t *circ;
+ uint16_t handshake_type;
create_cell_t *onionskin;
time_t when_added;
} onion_queue_t;
@@ -35,13 +36,19 @@ typedef struct onion_queue_t {
/** 5 seconds on the onion queue til we just send back a destroy */
#define ONIONQUEUE_WAIT_CUTOFF 5
-/** Queue of circuits waiting for CPU workers, or NULL if the list is empty.*/
-TOR_TAILQ_HEAD(onion_queue_head_t, onion_queue_t) ol_list =
- TOR_TAILQ_HEAD_INITIALIZER(ol_list);
+/** Array of queues of circuits waiting for CPU workers. An element is NULL
+ * if that queue is empty.*/
+TOR_TAILQ_HEAD(onion_queue_head_t, onion_queue_t)
+ ol_list[MAX_ONION_HANDSHAKE_TYPE+1] = {
+ TOR_TAILQ_HEAD_INITIALIZER(ol_list[0]), /* tap */
+ TOR_TAILQ_HEAD_INITIALIZER(ol_list[1]), /* fast */
+ TOR_TAILQ_HEAD_INITIALIZER(ol_list[2]), /* ntor */
+};
-/** Number of entries of each type currently in ol_list. */
+/** Number of entries of each type currently in each element of ol_list[]. */
static int ol_entries[MAX_ONION_HANDSHAKE_TYPE+1];
+static int num_ntors_per_tap(void);
static void onion_queue_entry_remove(onion_queue_t *victim);
/* XXXX024 Check lengths vs MAX_ONIONSKIN_{CHALLENGE,REPLY}_LEN.
@@ -51,7 +58,7 @@ static void onion_queue_entry_remove(onion_queue_t *victim);
* MAX_ONIONSKIN_CHALLENGE/REPLY_LEN." Also, make sure that we can pass
* over-large values via EXTEND2/EXTENDED2, for future-compatibility.*/
-/** Return true iff we have room to queue another oninoskin of type
+/** Return true iff we have room to queue another onionskin of type
* <b>type</b>. */
static int
have_room_for_onionskin(uint16_t type)
@@ -59,23 +66,51 @@ have_room_for_onionskin(uint16_t type)
const or_options_t *options = get_options();
int num_cpus;
uint64_t tap_usec, ntor_usec;
+ uint64_t ntor_during_tap_usec, tap_during_ntor_usec;
+
/* If we've got fewer than 50 entries, we always have room for one more. */
- if (ol_entries[ONION_HANDSHAKE_TYPE_TAP] +
- ol_entries[ONION_HANDSHAKE_TYPE_NTOR] < 50)
+ if (ol_entries[type] < 50)
return 1;
num_cpus = get_num_cpus(options);
/* Compute how many microseconds we'd expect to need to clear all
- * onionskins in the current queue. */
+ * onionskins in various combinations of the queues. */
+
+ /* How long would it take to process all the TAP cells in the queue? */
tap_usec = estimated_usec_for_onionskins(
ol_entries[ONION_HANDSHAKE_TYPE_TAP],
ONION_HANDSHAKE_TYPE_TAP) / num_cpus;
+
+ /* How long would it take to process all the NTor cells in the queue? */
ntor_usec = estimated_usec_for_onionskins(
ol_entries[ONION_HANDSHAKE_TYPE_NTOR],
ONION_HANDSHAKE_TYPE_NTOR) / num_cpus;
+
+ /* How long would it take to process the tap cells that we expect to
+ * process while draining the ntor queue? */
+ tap_during_ntor_usec = estimated_usec_for_onionskins(
+ MIN(ol_entries[ONION_HANDSHAKE_TYPE_TAP],
+ ol_entries[ONION_HANDSHAKE_TYPE_NTOR] / num_ntors_per_tap()),
+ ONION_HANDSHAKE_TYPE_TAP) / num_cpus;
+
+ /* How long would it take to process the ntor cells that we expect to
+ * process while draining the tap queue? */
+ ntor_during_tap_usec = estimated_usec_for_onionskins(
+ MIN(ol_entries[ONION_HANDSHAKE_TYPE_NTOR],
+ ol_entries[ONION_HANDSHAKE_TYPE_TAP] * num_ntors_per_tap()),
+ ONION_HANDSHAKE_TYPE_NTOR) / num_cpus;
+
/* See whether that exceeds MaxOnionQueueDelay. If so, we can't queue
* this. */
- if ((tap_usec + ntor_usec) / 1000 > (uint64_t)options->MaxOnionQueueDelay)
+ if (type == ONION_HANDSHAKE_TYPE_NTOR &&
+ (ntor_usec + tap_during_ntor_usec) / 1000 >
+ (uint64_t)options->MaxOnionQueueDelay)
+ return 0;
+
+ if (type == ONION_HANDSHAKE_TYPE_TAP &&
+ (tap_usec + ntor_during_tap_usec) / 1000 >
+ (uint64_t)options->MaxOnionQueueDelay)
return 0;
+
#ifdef CURVE25519_ENABLED
/* If we support the ntor handshake, then don't let TAP handshakes use
* more than 2/3 of the space on the queue. */
@@ -98,8 +133,15 @@ onion_pending_add(or_circuit_t *circ, create_cell_t *onionskin)
onion_queue_t *tmp;
time_t now = time(NULL);
+ if (onionskin->handshake_type > MAX_ONION_HANDSHAKE_TYPE) {
+ log_warn(LD_BUG, "Handshake %d out of range! Dropping.",
+ onionskin->handshake_type);
+ return -1;
+ }
+
tmp = tor_malloc_zero(sizeof(onion_queue_t));
tmp->circ = circ;
+ tmp->handshake_type = onionskin->handshake_type;
tmp->onionskin = onionskin;
tmp->when_added = now;
@@ -108,7 +150,8 @@ onion_pending_add(or_circuit_t *circ, create_cell_t *onionskin)
static ratelim_t last_warned =
RATELIM_INIT(WARN_TOO_MANY_CIRC_CREATIONS_INTERVAL);
char *m;
- if ((m = rate_limit_log(&last_warned, approx_time()))) {
+ if (onionskin->handshake_type == ONION_HANDSHAKE_TYPE_NTOR &&
+ (m = rate_limit_log(&last_warned, approx_time()))) {
log_warn(LD_GENERAL,
"Your computer is too slow to handle this many circuit "
"creation requests! Please consider using the "
@@ -121,12 +164,17 @@ onion_pending_add(or_circuit_t *circ, create_cell_t *onionskin)
}
++ol_entries[onionskin->handshake_type];
+ log_info(LD_OR, "New create (%s). Queues now ntor=%d and tap=%d.",
+ onionskin->handshake_type == ONION_HANDSHAKE_TYPE_NTOR ? "ntor" : "tap",
+ ol_entries[ONION_HANDSHAKE_TYPE_NTOR],
+ ol_entries[ONION_HANDSHAKE_TYPE_TAP]);
+
circ->onionqueue_entry = tmp;
- TOR_TAILQ_INSERT_TAIL(&ol_list, tmp, next);
+ TOR_TAILQ_INSERT_TAIL(&ol_list[onionskin->handshake_type], tmp, next);
/* cull elderly requests. */
while (1) {
- onion_queue_t *head = TOR_TAILQ_FIRST(&ol_list);
+ onion_queue_t *head = TOR_TAILQ_FIRST(&ol_list[onionskin->handshake_type]);
if (now - head->when_added < (time_t)ONIONQUEUE_WAIT_CUTOFF)
break;
@@ -140,24 +188,88 @@ onion_pending_add(or_circuit_t *circ, create_cell_t *onionskin)
return 0;
}
-/** Remove the first item from ol_list and return it, or return
- * NULL if the list is empty.
+/** Return a fairness parameter, to prefer processing NTOR style
+ * handshakes but still slowly drain the TAP queue so we don't starve
+ * it entirely. */
+static int
+num_ntors_per_tap(void)
+{
+#define DEFAULT_NUM_NTORS_PER_TAP 10
+#define MIN_NUM_NTORS_PER_TAP 1
+#define MAX_NUM_NTORS_PER_TAP 100000
+
+ return networkstatus_get_param(NULL, "NumNTorsPerTAP",
+ DEFAULT_NUM_NTORS_PER_TAP,
+ MIN_NUM_NTORS_PER_TAP,
+ MAX_NUM_NTORS_PER_TAP);
+}
+
+/** Choose which onion queue we'll pull from next. If one is empty choose
+ * the other; if they both have elements, load balance across them but
+ * favoring NTOR. */
+static uint16_t
+decide_next_handshake_type(void)
+{
+ /* The number of times we've chosen ntor lately when both were available. */
+ static int recently_chosen_ntors = 0;
+
+ if (!ol_entries[ONION_HANDSHAKE_TYPE_NTOR])
+ return ONION_HANDSHAKE_TYPE_TAP; /* no ntors? try tap */
+
+ if (!ol_entries[ONION_HANDSHAKE_TYPE_TAP]) {
+
+ /* Nick wants us to prioritize new tap requests when there aren't
+ * any in the queue and we've processed k ntor cells since the last
+ * tap cell. This strategy is maybe a good idea, since it starves tap
+ * less in the case where tap is rare, or maybe a poor idea, since it
+ * makes the new tap cell unfairly jump in front of ntor cells that
+ * got here first. In any case this edge case will only become relevant
+ * once tap is rare. We should reevaluate whether we like this decision
+ * once tap gets more rare. */
+ if (ol_entries[ONION_HANDSHAKE_TYPE_NTOR] &&
+ recently_chosen_ntors <= num_ntors_per_tap())
+ ++recently_chosen_ntors;
+
+ return ONION_HANDSHAKE_TYPE_NTOR; /* no taps? try ntor */
+ }
+
+ /* They both have something queued. Pick ntor if we haven't done that
+ * too much lately. */
+ if (++recently_chosen_ntors <= num_ntors_per_tap()) {
+ return ONION_HANDSHAKE_TYPE_NTOR;
+ }
+
+ /* Else, it's time to let tap have its turn. */
+ recently_chosen_ntors = 0;
+ return ONION_HANDSHAKE_TYPE_TAP;
+}
+
+/** Remove the highest priority item from ol_list[] and return it, or
+ * return NULL if the lists are empty.
*/
or_circuit_t *
onion_next_task(create_cell_t **onionskin_out)
{
or_circuit_t *circ;
- onion_queue_t *head = TOR_TAILQ_FIRST(&ol_list);
+ uint16_t handshake_to_choose = decide_next_handshake_type();
+ onion_queue_t *head = TOR_TAILQ_FIRST(&ol_list[handshake_to_choose]);
if (!head)
return NULL; /* no onions pending, we're done */
tor_assert(head->circ);
- tor_assert(head->circ->p_chan); /* make sure it's still valid */
+ tor_assert(head->handshake_type <= MAX_ONION_HANDSHAKE_TYPE);
+// tor_assert(head->circ->p_chan); /* make sure it's still valid */
+/* XXX I only commented out the above line to make the unit tests
+ * more manageable. That's probably not good long-term. -RD */
circ = head->circ;
- if (head->onionskin &&
- head->onionskin->handshake_type <= MAX_ONION_HANDSHAKE_TYPE)
- --ol_entries[head->onionskin->handshake_type];
+ if (head->onionskin)
+ --ol_entries[head->handshake_type];
+ log_info(LD_OR, "Processing create (%s). Queues now ntor=%d and tap=%d.",
+ head->handshake_type == ONION_HANDSHAKE_TYPE_NTOR ? "ntor" : "tap",
+ ol_entries[ONION_HANDSHAKE_TYPE_NTOR],
+ ol_entries[ONION_HANDSHAKE_TYPE_TAP]);
+
*onionskin_out = head->onionskin;
head->onionskin = NULL; /* prevent free. */
circ->onionqueue_entry = NULL;
@@ -165,6 +277,14 @@ onion_next_task(create_cell_t **onionskin_out)
return circ;
}
+/** Return the number of <b>handshake_type</b>-style create requests pending.
+ */
+int
+onion_num_pending(uint16_t handshake_type)
+{
+ return ol_entries[handshake_type];
+}
+
/** Go through ol_list, find the onion_queue_t element which points to
* circ, remove and free that element. Leave circ itself alone.
*/
@@ -186,14 +306,20 @@ onion_pending_remove(or_circuit_t *circ)
static void
onion_queue_entry_remove(onion_queue_t *victim)
{
- TOR_TAILQ_REMOVE(&ol_list, victim, next);
+ if (victim->handshake_type > MAX_ONION_HANDSHAKE_TYPE) {
+ log_warn(LD_BUG, "Handshake %d out of range! Dropping.",
+ victim->handshake_type);
+ /* XXX leaks */
+ return;
+ }
+
+ TOR_TAILQ_REMOVE(&ol_list[victim->handshake_type], victim, next);
if (victim->circ)
victim->circ->onionqueue_entry = NULL;
- if (victim->onionskin &&
- victim->onionskin->handshake_type <= MAX_ONION_HANDSHAKE_TYPE)
- --ol_entries[victim->onionskin->handshake_type];
+ if (victim->onionskin)
+ --ol_entries[victim->handshake_type];
tor_free(victim->onionskin);
tor_free(victim);
@@ -204,8 +330,11 @@ void
clear_pending_onions(void)
{
onion_queue_t *victim;
- while ((victim = TOR_TAILQ_FIRST(&ol_list))) {
- onion_queue_entry_remove(victim);
+ int i;
+ for (i=0; i<=MAX_ONION_HANDSHAKE_TYPE; i++) {
+ while ((victim = TOR_TAILQ_FIRST(&ol_list[i]))) {
+ onion_queue_entry_remove(victim);
+ }
}
memset(ol_entries, 0, sizeof(ol_entries));
}
@@ -514,6 +643,22 @@ check_create_cell(const create_cell_t *cell, int unknown_ok)
return 0;
}
+/** Write the various parameters into the create cell. Separate from
+ * create_cell_parse() to make unit testing easier.
+ */
+void
+create_cell_init(create_cell_t *cell_out, uint8_t cell_type,
+ uint16_t handshake_type, uint16_t handshake_len,
+ const uint8_t *onionskin)
+{
+ memset(cell_out, 0, sizeof(*cell_out));
+
+ cell_out->cell_type = cell_type;
+ cell_out->handshake_type = handshake_type;
+ cell_out->handshake_len = handshake_len;
+ memcpy(cell_out->onionskin, onionskin, handshake_len);
+}
+
/** Helper: parse the CREATE2 payload at <b>p</b>, which could be up to
* <b>p_len</b> bytes long, and use it to fill the fields of
* <b>cell_out</b>. Return 0 on success and -1 on failure.
@@ -524,17 +669,21 @@ check_create_cell(const create_cell_t *cell, int unknown_ok)
static int
parse_create2_payload(create_cell_t *cell_out, const uint8_t *p, size_t p_len)
{
+ uint16_t handshake_type, handshake_len;
+
if (p_len < 4)
return -1;
- cell_out->cell_type = CELL_CREATE2;
- cell_out->handshake_type = ntohs(get_uint16(p));
- cell_out->handshake_len = ntohs(get_uint16(p+2));
- if (cell_out->handshake_len > CELL_PAYLOAD_SIZE - 4 ||
- cell_out->handshake_len > p_len - 4)
+
+ handshake_type = ntohs(get_uint16(p));
+ handshake_len = ntohs(get_uint16(p+2));
+
+ if (handshake_len > CELL_PAYLOAD_SIZE - 4 || handshake_len > p_len - 4)
return -1;
- if (cell_out->handshake_type == ONION_HANDSHAKE_TYPE_FAST)
+ if (handshake_type == ONION_HANDSHAKE_TYPE_FAST)
return -1;
- memcpy(cell_out->onionskin, p+4, cell_out->handshake_len);
+
+ create_cell_init(cell_out, CELL_CREATE2, handshake_type, handshake_len,
+ p+4);
return 0;
}
@@ -552,27 +701,19 @@ parse_create2_payload(create_cell_t *cell_out, const uint8_t *p, size_t p_len)
int
create_cell_parse(create_cell_t *cell_out, const cell_t *cell_in)
{
- memset(cell_out, 0, sizeof(*cell_out));
-
switch (cell_in->command) {
case CELL_CREATE:
- cell_out->cell_type = CELL_CREATE;
if (tor_memeq(cell_in->payload, NTOR_CREATE_MAGIC, 16)) {
- cell_out->handshake_type = ONION_HANDSHAKE_TYPE_NTOR;
- cell_out->handshake_len = NTOR_ONIONSKIN_LEN;
- memcpy(cell_out->onionskin, cell_in->payload+16, NTOR_ONIONSKIN_LEN);
+ create_cell_init(cell_out, CELL_CREATE, ONION_HANDSHAKE_TYPE_NTOR,
+ NTOR_ONIONSKIN_LEN, cell_in->payload+16);
} else {
- cell_out->handshake_type = ONION_HANDSHAKE_TYPE_TAP;
- cell_out->handshake_len = TAP_ONIONSKIN_CHALLENGE_LEN;
- memcpy(cell_out->onionskin, cell_in->payload,
- TAP_ONIONSKIN_CHALLENGE_LEN);
+ create_cell_init(cell_out, CELL_CREATE, ONION_HANDSHAKE_TYPE_TAP,
+ TAP_ONIONSKIN_CHALLENGE_LEN, cell_in->payload);
}
break;
case CELL_CREATE_FAST:
- cell_out->cell_type = CELL_CREATE_FAST;
- cell_out->handshake_type = ONION_HANDSHAKE_TYPE_FAST;
- cell_out->handshake_len = CREATE_FAST_LEN;
- memcpy(cell_out->onionskin, cell_in->payload, CREATE_FAST_LEN);
+ create_cell_init(cell_out, CELL_CREATE_FAST, ONION_HANDSHAKE_TYPE_FAST,
+ CREATE_FAST_LEN, cell_in->payload);
break;
case CELL_CREATE2:
if (parse_create2_payload(cell_out, cell_in->payload,
@@ -728,7 +869,7 @@ extend_cell_parse(extend_cell_t *cell_out, const uint8_t command,
cell_out->cell_type = RELAY_COMMAND_EXTEND2;
++payload;
/* Parse the specifiers. We'll only take the first IPv4 and first IPv6
- * addres, and the node ID, and ignore everything else */
+ * address, and the node ID, and ignore everything else */
for (i = 0; i < n_specs; ++i) {
if (eop - payload < 2)
return -1;
diff --git a/src/or/onion.h b/src/or/onion.h
index db4c999c9..d62f032b8 100644
--- a/src/or/onion.h
+++ b/src/or/onion.h
@@ -15,6 +15,7 @@
struct create_cell_t;
int onion_pending_add(or_circuit_t *circ, struct create_cell_t *onionskin);
or_circuit_t *onion_next_task(struct create_cell_t **onionskin_out);
+int onion_num_pending(uint16_t handshake_type);
void onion_pending_remove(or_circuit_t *circ);
void clear_pending_onions(void);
@@ -99,6 +100,9 @@ typedef struct extended_cell_t {
created_cell_t created_cell;
} extended_cell_t;
+void create_cell_init(create_cell_t *cell_out, uint8_t cell_type,
+ uint16_t handshake_type, uint16_t handshake_len,
+ const uint8_t *onionskin);
int create_cell_parse(create_cell_t *cell_out, const cell_t *cell_in);
int created_cell_parse(created_cell_t *cell_out, const cell_t *cell_in);
int extend_cell_parse(extend_cell_t *cell_out, const uint8_t command,
diff --git a/src/or/onion_fast.c b/src/or/onion_fast.c
index aa034a8bd..8e778dbc6 100644
--- a/src/or/onion_fast.c
+++ b/src/or/onion_fast.c
@@ -22,7 +22,7 @@ fast_handshake_state_free(fast_handshake_state_t *victim)
tor_free(victim);
}
-/** Create the state needed to perform a CREATE_FAST hasnshake. Return 0
+/** Create the state needed to perform a CREATE_FAST handshake. Return 0
* on success, -1 on failure. */
int
fast_onionskin_create(fast_handshake_state_t **handshake_state_out,
diff --git a/src/or/or.h b/src/or/or.h
index 568958d61..922ae4cb9 100644
--- a/src/or/or.h
+++ b/src/or/or.h
@@ -99,6 +99,7 @@
#include "ht.h"
#include "replaycache.h"
#include "crypto_curve25519.h"
+#include "tor_queue.h"
/* These signals are defined to help handle_control_signal work.
*/
@@ -227,8 +228,14 @@ typedef enum {
#define CONN_TYPE_AP_NATD_LISTENER 14
/** Type for sockets listening for DNS requests. */
#define CONN_TYPE_AP_DNS_LISTENER 15
-#define CONN_TYPE_MAX_ 15
-/* !!!! If CONN_TYPE_MAX_ is ever over 15, we must grow the type field in
+
+/** Type for connections from the Extended ORPort. */
+#define CONN_TYPE_EXT_OR 16
+/** Type for sockets listening for Extended ORPort connections. */
+#define CONN_TYPE_EXT_OR_LISTENER 17
+
+#define CONN_TYPE_MAX_ 17
+/* !!!! If _CONN_TYPE_MAX is ever over 31, we must grow the type field in
* connection_t. */
/* Proxy client types */
@@ -308,6 +315,25 @@ typedef enum {
#define OR_CONN_STATE_OPEN 8
#define OR_CONN_STATE_MAX_ 8
+/** States of the Extended ORPort protocol. Be careful before changing
+ * the numbers: they matter. */
+#define EXT_OR_CONN_STATE_MIN_ 1
+/** Extended ORPort authentication is waiting for the authentication
+ * type selected by the client. */
+#define EXT_OR_CONN_STATE_AUTH_WAIT_AUTH_TYPE 1
+/** Extended ORPort authentication is waiting for the client nonce. */
+#define EXT_OR_CONN_STATE_AUTH_WAIT_CLIENT_NONCE 2
+/** Extended ORPort authentication is waiting for the client hash. */
+#define EXT_OR_CONN_STATE_AUTH_WAIT_CLIENT_HASH 3
+#define EXT_OR_CONN_STATE_AUTH_MAX 3
+/** Authentication finished and the Extended ORPort is now accepting
+ * traffic. */
+#define EXT_OR_CONN_STATE_OPEN 4
+/** Extended ORPort is flushing its last messages and preparing to
+ * start accepting OR connections. */
+#define EXT_OR_CONN_STATE_FLUSHING 5
+#define EXT_OR_CONN_STATE_MAX_ 5
+
#define EXIT_CONN_STATE_MIN_ 1
/** State for an exit connection: waiting for response from DNS farm. */
#define EXIT_CONN_STATE_RESOLVING 1
@@ -1081,9 +1107,17 @@ typedef struct var_cell_t {
uint8_t payload[FLEXIBLE_ARRAY_MEMBER];
} var_cell_t;
+/** A parsed Extended ORPort message. */
+typedef struct ext_or_cmd_t {
+ uint16_t cmd; /** Command type */
+ uint16_t len; /** Body length */
+ char body[FLEXIBLE_ARRAY_MEMBER]; /** Message body */
+} ext_or_cmd_t;
+
/** A cell as packed for writing to the network. */
typedef struct packed_cell_t {
- struct packed_cell_t *next; /**< Next cell queued on this circuit. */
+ /** Next cell queued on this circuit. */
+ TOR_SIMPLEQ_ENTRY(packed_cell_t) next;
char body[CELL_MAX_NETWORK_SIZE]; /**< Cell as packed for network. */
} packed_cell_t;
@@ -1105,8 +1139,8 @@ typedef struct insertion_time_queue_t {
/** A queue of cells on a circuit, waiting to be added to the
* or_connection_t's outbuf. */
typedef struct cell_queue_t {
- packed_cell_t *head; /**< The first cell, or NULL if the queue is empty. */
- packed_cell_t *tail; /**< The last cell, or NULL if the queue is empty. */
+ /** Linked list of packed_cell_t*/
+ TOR_SIMPLEQ_HEAD(cell_simpleq, packed_cell_t) head;
int n; /**< The number of cells in the queue. */
insertion_time_queue_t *insertion_times; /**< Insertion times of cells. */
} cell_queue_t;
@@ -1161,7 +1195,7 @@ typedef struct connection_t {
* *_CONNECTION_MAGIC. */
uint8_t state; /**< Current state of this connection. */
- unsigned int type:4; /**< What kind of connection is this? */
+ unsigned int type:5; /**< What kind of connection is this? */
unsigned int purpose:5; /**< Only used for DIR and EXIT types currently. */
/* The next fields are all one-bit booleans. Some are only applicable to
@@ -1365,6 +1399,9 @@ typedef struct or_handshake_state_t {
/* True iff we've received valid authentication to some identity. */
unsigned int authenticated : 1;
+ /* True iff we have sent a netinfo cell */
+ unsigned int sent_netinfo : 1;
+
/** True iff we should feed outgoing cells into digest_sent and
* digest_received respectively.
*
@@ -1403,6 +1440,9 @@ typedef struct or_handshake_state_t {
/**@}*/
} or_handshake_state_t;
+/** Length of Extended ORPort connection identifier. */
+#define EXT_OR_CONN_ID_LEN DIGEST_LEN /* 20 */
+
/** Subtype of connection_t for an "OR connection" -- that is, one that speaks
* cells over TLS. */
typedef struct or_connection_t {
@@ -1411,6 +1451,20 @@ typedef struct or_connection_t {
/** Hash of the public RSA key for the other side's identity key, or zeroes
* if the other side hasn't shown us a valid identity key. */
char identity_digest[DIGEST_LEN];
+
+ /** Extended ORPort connection identifier. */
+ char *ext_or_conn_id;
+ /** This is the ClientHash value we expect to receive from the
+ * client during the Extended ORPort authentication protocol. We
+ * compute it upon receiving the ClientNoce from the client, and we
+ * compare it with the acual ClientHash value sent by the
+ * client. */
+ char *ext_or_auth_correct_client_hash;
+ /** String carrying the name of the pluggable transport
+ * (e.g. "obfs2") that is obfuscating this connection. If no
+ * pluggable transports are used, it's NULL. */
+ char *ext_or_transport;
+
char *nickname; /**< Nickname of OR on other side (if any). */
tor_tls_t *tls; /**< TLS connection state. */
@@ -2853,7 +2907,8 @@ typedef struct circuit_t {
/** Unique ID for measuring tunneled network status requests. */
uint64_t dirreq_id;
- struct circuit_t *next; /**< Next circuit in linked list of all circuits. */
+ /** Next circuit in linked list of all circuits (global_circuitlist). */
+ TOR_LIST_ENTRY(circuit_t) head;
/** Next circuit in the doubly-linked ring of circuits waiting to add
* cells to n_conn. NULL if we have no cells pending, or if we're not
@@ -3426,6 +3481,8 @@ typedef struct {
char *User; /**< Name of user to run Tor as. */
char *Group; /**< Name of group to run Tor as. */
config_line_t *ORPort_lines; /**< Ports to listen on for OR connections. */
+ /** Ports to listen on for extended OR connections. */
+ config_line_t *ExtORPort_lines;
/** Ports to listen on for SOCKS connections. */
config_line_t *SocksPort_lines;
/** Ports to listen on for transparent pf/netfilter connections. */
@@ -3461,6 +3518,7 @@ typedef struct {
unsigned int ControlPort_set : 1;
unsigned int DirPort_set : 1;
unsigned int DNSPort_set : 1;
+ unsigned int ExtORPort_set : 1;
/**@}*/
int AssumeReachable; /**< Whether to publish our descriptor regardless. */
@@ -3500,6 +3558,9 @@ typedef struct {
/** List of TCP/IP addresses that transports should listen at. */
config_line_t *ServerTransportListenAddr;
+ /** List of options that must be passed to pluggable transports. */
+ config_line_t *ServerTransportOptions;
+
int BridgeRelay; /**< Boolean: are we acting as a bridge relay? We make
* this explicit so we can change how we behave in the
* future. */
@@ -3737,7 +3798,10 @@ typedef struct {
int CookieAuthentication; /**< Boolean: do we enable cookie-based auth for
* the control system? */
- char *CookieAuthFile; /**< Location of a cookie authentication file. */
+ char *CookieAuthFile; /**< Filesystem location of a ControlPort
+ * authentication cookie. */
+ char *ExtORPortCookieAuthFile; /**< Filesystem location of Extended
+ * ORPort authentication cookie. */
int CookieAuthFileGroupReadable; /**< Boolean: Is the CookieAuthFile g+r? */
int LeaveStreamsUnattached; /**< Boolean: Does Tor attach new streams to
* circuits itself (0), or does it expect a controller
@@ -3779,7 +3843,8 @@ typedef struct {
int NumEntryGuards; /**< How many entry guards do we try to establish? */
int UseEntryGuardsAsDirGuards; /** Boolean: Do we try to get directory info
* from a smallish number of fixed nodes? */
- int NumDirectoryGuards; /**< How many dir guards do we try to establish? */
+ int NumDirectoryGuards; /**< How many dir guards do we try to establish?
+ * If 0, use value from NumEntryGuards. */
int RephistTrackTime; /**< How many seconds do we keep rephist info? */
int FastFirstHopPK; /**< If Tor believes it is safe, should we save a third
* of our PK time by sending CREATE_FAST cells? */
@@ -4409,30 +4474,7 @@ typedef struct {
int after_firsthop_idx;
} network_liveness_t;
-/** Structure for circuit build times history */
-typedef struct {
- /** The circular array of recorded build times in milliseconds */
- build_time_t circuit_build_times[CBT_NCIRCUITS_TO_OBSERVE];
- /** Current index in the circuit_build_times circular array */
- int build_times_idx;
- /** Total number of build times accumulated. Max CBT_NCIRCUITS_TO_OBSERVE */
- int total_build_times;
- /** Information about the state of our local network connection */
- network_liveness_t liveness;
- /** Last time we built a circuit. Used to decide to build new test circs */
- time_t last_circ_at;
- /** "Minimum" value of our pareto distribution (actually mode) */
- build_time_t Xm;
- /** alpha exponent for pareto dist. */
- double alpha;
- /** Have we computed a timeout? */
- int have_computed_timeout;
- /** The exact value for that timeout in milliseconds. Stored as a double
- * to maintain precision from calculations to and from quantile value. */
- double timeout_ms;
- /** How long we wait before actually closing the circuit. */
- double close_ms;
-} circuit_build_times_t;
+typedef struct circuit_build_times_s circuit_build_times_t;
/********************************* config.c ***************************/
diff --git a/src/or/relay.c b/src/or/relay.c
index 251d3ffa2..010dd1dbf 100644
--- a/src/or/relay.c
+++ b/src/or/relay.c
@@ -969,7 +969,7 @@ remap_event_helper(entry_connection_t *conn, const tor_addr_t *new_addr)
* <b>addr_out</b> to the address we're connected to, and <b>ttl_out</b> to
* the ttl of that address, in seconds, and return 0. On failure, return
* -1. */
-int
+STATIC int
connected_cell_parse(const relay_header_t *rh, const cell_t *cell,
tor_addr_t *addr_out, int *ttl_out)
{
@@ -2089,7 +2089,7 @@ packed_cell_free_unchecked(packed_cell_t *cell)
}
/** Allocate and return a new packed_cell_t. */
-static INLINE packed_cell_t *
+STATIC packed_cell_t *
packed_cell_new(void)
{
++total_cells_allocated;
@@ -2100,6 +2100,8 @@ packed_cell_new(void)
void
packed_cell_free(packed_cell_t *cell)
{
+ if (!cell)
+ return;
packed_cell_free_unchecked(cell);
}
@@ -2111,7 +2113,7 @@ dump_cell_pool_usage(int severity)
circuit_t *c;
int n_circs = 0;
int n_cells = 0;
- for (c = circuit_get_global_list_(); c; c = c->next) {
+ TOR_LIST_FOREACH(c, circuit_get_global_list(), head) {
n_cells += c->n_chan_cells.n;
if (!CIRCUIT_IS_ORIGIN(c))
n_cells += TO_OR_CIRCUIT(c)->p_chan_cells.n;
@@ -2129,7 +2131,6 @@ packed_cell_copy(const cell_t *cell, int wide_circ_ids)
{
packed_cell_t *c = packed_cell_new();
cell_pack(c, cell, wide_circ_ids);
- c->next = NULL;
return c;
}
@@ -2137,14 +2138,7 @@ packed_cell_copy(const cell_t *cell, int wide_circ_ids)
void
cell_queue_append(cell_queue_t *queue, packed_cell_t *cell)
{
- if (queue->tail) {
- tor_assert(!queue->tail->next);
- queue->tail->next = cell;
- } else {
- queue->head = cell;
- }
- queue->tail = cell;
- cell->next = NULL;
+ TOR_SIMPLEQ_INSERT_TAIL(&queue->head, cell, next);
++queue->n;
}
@@ -2187,18 +2181,24 @@ cell_queue_append_packed_copy(cell_queue_t *queue, const cell_t *cell,
cell_queue_append(queue, copy);
}
+/** Initialize <b>queue</b> as an empty cell queue. */
+void
+cell_queue_init(cell_queue_t *queue)
+{
+ memset(queue, 0, sizeof(cell_queue_t));
+ TOR_SIMPLEQ_INIT(&queue->head);
+}
+
/** Remove and free every cell in <b>queue</b>. */
void
cell_queue_clear(cell_queue_t *queue)
{
- packed_cell_t *cell, *next;
- cell = queue->head;
- while (cell) {
- next = cell->next;
+ packed_cell_t *cell;
+ while ((cell = TOR_SIMPLEQ_FIRST(&queue->head))) {
+ TOR_SIMPLEQ_REMOVE_HEAD(&queue->head, next);
packed_cell_free_unchecked(cell);
- cell = next;
}
- queue->head = queue->tail = NULL;
+ TOR_SIMPLEQ_INIT(&queue->head);
queue->n = 0;
if (queue->insertion_times) {
while (queue->insertion_times->first) {
@@ -2212,17 +2212,13 @@ cell_queue_clear(cell_queue_t *queue)
/** Extract and return the cell at the head of <b>queue</b>; return NULL if
* <b>queue</b> is empty. */
-static INLINE packed_cell_t *
+STATIC packed_cell_t *
cell_queue_pop(cell_queue_t *queue)
{
- packed_cell_t *cell = queue->head;
+ packed_cell_t *cell = TOR_SIMPLEQ_FIRST(&queue->head);
if (!cell)
return NULL;
- queue->head = cell->next;
- if (cell == queue->tail) {
- tor_assert(!queue->head);
- queue->tail = NULL;
- }
+ TOR_SIMPLEQ_REMOVE_HEAD(&queue->head, next);
--queue->n;
return cell;
}
diff --git a/src/or/relay.h b/src/or/relay.h
index 69df7024b..e1b5e381e 100644
--- a/src/or/relay.h
+++ b/src/or/relay.h
@@ -51,6 +51,7 @@ size_t packed_cell_mem_cost(void);
/* For channeltls.c */
void packed_cell_free(packed_cell_t *cell);
+void cell_queue_init(cell_queue_t *queue);
void cell_queue_clear(cell_queue_t *queue);
void cell_queue_append(cell_queue_t *queue, packed_cell_t *cell);
void cell_queue_append_packed_copy(cell_queue_t *queue, const cell_t *cell,
@@ -75,11 +76,14 @@ void circuit_clear_cell_queue(circuit_t *circ, channel_t *chan);
void stream_choice_seed_weak_rng(void);
-#ifdef RELAY_PRIVATE
int relay_crypt(circuit_t *circ, cell_t *cell, cell_direction_t cell_direction,
crypt_path_t **layer_hint, char *recognized);
-int connected_cell_parse(const relay_header_t *rh, const cell_t *cell,
+
+#ifdef RELAY_PRIVATE
+STATIC int connected_cell_parse(const relay_header_t *rh, const cell_t *cell,
tor_addr_t *addr_out, int *ttl_out);
+STATIC packed_cell_t *packed_cell_new(void);
+STATIC packed_cell_t *cell_queue_pop(cell_queue_t *queue);
#endif
#endif
diff --git a/src/or/rendclient.c b/src/or/rendclient.c
index 7115bf208..8b8c0e505 100644
--- a/src/or/rendclient.c
+++ b/src/or/rendclient.c
@@ -358,7 +358,7 @@ rend_client_close_other_intros(const char *onion_address)
{
circuit_t *c;
/* abort parallel intro circs, if any */
- for (c = circuit_get_global_list_(); c; c = c->next) {
+ TOR_LIST_FOREACH(c, circuit_get_global_list(), head) {
if ((c->purpose == CIRCUIT_PURPOSE_C_INTRODUCING ||
c->purpose == CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT) &&
!c->marked_for_close && CIRCUIT_IS_ORIGIN(c)) {
diff --git a/src/or/rendservice.c b/src/or/rendservice.c
index a8f63ddf6..730e47f5c 100644
--- a/src/or/rendservice.c
+++ b/src/or/rendservice.c
@@ -543,7 +543,7 @@ rend_config_services(const or_options_t *options, int validate_only)
/* XXXX it would be nicer if we had a nicer abstraction to use here,
* so we could just iterate over the list of services to close, but
* once again, this isn't critical-path code. */
- for (circ = circuit_get_global_list_(); circ; circ = circ->next) {
+ TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) {
if (!circ->marked_for_close &&
circ->state == CIRCUIT_STATE_OPEN &&
(circ->purpose == CIRCUIT_PURPOSE_S_ESTABLISH_INTRO ||
@@ -1207,7 +1207,7 @@ rend_service_introduce(origin_circuit_t *circuit, const uint8_t *request,
/* check for replay of PK-encrypted portion. */
replay = replaycache_add_test_and_elapsed(
intro_point->accepted_intro_rsa_parts,
- parsed_req->ciphertext, (int)parsed_req->ciphertext_len,
+ parsed_req->ciphertext, parsed_req->ciphertext_len,
&elapsed);
if (replay) {
@@ -1898,8 +1898,8 @@ rend_service_parse_intro_for_v3(
}
}
- /* Check that we actually have everything up to the timestamp */
- if (plaintext_len < (size_t)(ts_offset)) {
+ /* Check that we actually have everything up through the timestamp */
+ if (plaintext_len < (size_t)(ts_offset)+4) {
if (err_msg_out) {
tor_asprintf(err_msg_out,
"truncated plaintext of encrypted parted of "
@@ -1923,12 +1923,6 @@ rend_service_parse_intro_for_v3(
}
/*
- * Apparently we don't use the timestamp any more, but might as well copy
- * over just in case we ever care about it.
- */
- intro->u.v3.timestamp = ntohl(get_uint32(buf + ts_offset));
-
- /*
* From here on, the format is as in v2, so we call the v2 parser with
* adjusted buffer and length. We are 4 + ts_offset octets in, but the
* v2 parser expects to skip over a version byte at the start, so we
@@ -2381,7 +2375,7 @@ count_established_intro_points(const char *query)
{
int num_ipos = 0;
circuit_t *circ;
- for (circ = circuit_get_global_list_(); circ; circ = circ->next) {
+ TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) {
if (!circ->marked_for_close &&
circ->state == CIRCUIT_STATE_OPEN &&
(circ->purpose == CIRCUIT_PURPOSE_S_ESTABLISH_INTRO ||
diff --git a/src/or/rendservice.h b/src/or/rendservice.h
index ff31ba6ed..caf88a3d6 100644
--- a/src/or/rendservice.h
+++ b/src/or/rendservice.h
@@ -56,8 +56,6 @@ struct rend_intro_cell_s {
uint16_t auth_len;
/* Auth data */
uint8_t *auth_data;
- /* timestamp */
- uint32_t timestamp;
/* Rendezvous point's IP address/port, identity digest and onion key */
extend_info_t *extend_info;
} v3;
diff --git a/src/or/rephist.c b/src/or/rephist.c
index c84322a67..13404badf 100644
--- a/src/or/rephist.c
+++ b/src/or/rephist.c
@@ -2599,7 +2599,7 @@ rep_hist_buffer_stats_write(time_t now)
goto done; /* Not ready to write */
/* Add open circuits to the history. */
- for (circ = circuit_get_global_list_(); circ; circ = circ->next) {
+ TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) {
rep_hist_buffer_stats_add_circ(circ, now);
}
@@ -2987,6 +2987,47 @@ rep_hist_conn_stats_write(time_t now)
return start_of_conn_stats_interval + WRITE_STATS_INTERVAL;
}
+/** Internal statistics to track how many requests of each type of
+ * handshake we've received, and how many we've completed. Useful for
+ * seeing trends in cpu load.
+ * @{ */
+static int onion_handshakes_requested[MAX_ONION_HANDSHAKE_TYPE+1] = {0};
+static int onion_handshakes_completed[MAX_ONION_HANDSHAKE_TYPE+1] = {0};
+/**@}*/
+
+/** A new onionskin (using the <b>type</b> handshake) has arrived. */
+void
+rep_hist_note_circuit_handshake_requested(uint16_t type)
+{
+ if (type <= MAX_ONION_HANDSHAKE_TYPE)
+ onion_handshakes_requested[type]++;
+}
+
+/** We've sent an onionskin (using the <b>type</b> handshake) to a
+ * cpuworker. */
+void
+rep_hist_note_circuit_handshake_completed(uint16_t type)
+{
+ if (type <= MAX_ONION_HANDSHAKE_TYPE)
+ onion_handshakes_completed[type]++;
+}
+
+/** Log our onionskin statistics since the last time we were called. */
+void
+rep_hist_log_circuit_handshake_stats(time_t now)
+{
+ (void)now;
+ /* XXX024 maybe quiet this log message before 0.2.4 goes stable for real */
+ log_notice(LD_HIST, "Circuit handshake stats since last time: "
+ "%d/%d TAP, %d/%d NTor.",
+ onion_handshakes_completed[ONION_HANDSHAKE_TYPE_TAP],
+ onion_handshakes_requested[ONION_HANDSHAKE_TYPE_TAP],
+ onion_handshakes_completed[ONION_HANDSHAKE_TYPE_NTOR],
+ onion_handshakes_requested[ONION_HANDSHAKE_TYPE_NTOR]);
+ memset(onion_handshakes_completed, 0, sizeof(onion_handshakes_completed));
+ memset(onion_handshakes_requested, 0, sizeof(onion_handshakes_requested));
+}
+
/** Free all storage held by the OR/link history caches, by the
* bandwidth history arrays, by the port history, or by statistics . */
void
diff --git a/src/or/rephist.h b/src/or/rephist.h
index 811cd8d45..de824749b 100644
--- a/src/or/rephist.h
+++ b/src/or/rephist.h
@@ -64,8 +64,6 @@ int rep_hist_circbuilding_dormant(time_t now);
void note_crypto_pk_op(pk_op_t operation);
void dump_pk_ops(int severity);
-void rep_hist_free_all(void);
-
void rep_hist_exit_stats_init(time_t now);
void rep_hist_reset_exit_stats(time_t now);
void rep_hist_exit_stats_term(void);
@@ -98,5 +96,11 @@ char *rep_hist_format_conn_stats(time_t now);
time_t rep_hist_conn_stats_write(time_t now);
void rep_hist_conn_stats_term(void);
+void rep_hist_note_circuit_handshake_requested(uint16_t type);
+void rep_hist_note_circuit_handshake_completed(uint16_t type);
+void rep_hist_log_circuit_handshake_stats(time_t now);
+
+void rep_hist_free_all(void);
+
#endif
diff --git a/src/or/replaycache.c b/src/or/replaycache.c
index 59b98489b..90f87c12d 100644
--- a/src/or/replaycache.c
+++ b/src/or/replaycache.c
@@ -63,9 +63,9 @@ replaycache_new(time_t horizon, time_t interval)
/** See documentation for replaycache_add_and_test()
*/
-int
+STATIC int
replaycache_add_and_test_internal(
- time_t present, replaycache_t *r, const void *data, int len,
+ time_t present, replaycache_t *r, const void *data, size_t len,
time_t *elapsed)
{
int rv = 0;
@@ -73,7 +73,7 @@ replaycache_add_and_test_internal(
time_t *access_time;
/* sanity check */
- if (present <= 0 || !r || !data || len <= 0) {
+ if (present <= 0 || !r || !data || len == 0) {
log_info(LD_BUG, "replaycache_add_and_test_internal() called with stupid"
" parameters; please fix this.");
goto done;
@@ -127,14 +127,13 @@ replaycache_add_and_test_internal(
/** See documentation for replaycache_scrub_if_needed()
*/
-void
+STATIC void
replaycache_scrub_if_needed_internal(time_t present, replaycache_t *r)
{
digestmap_iter_t *itr = NULL;
const char *digest;
void *valp;
time_t *access_time;
- char scrub_this;
/* sanity check */
if (!r || !(r->digests_seen)) {
@@ -152,20 +151,10 @@ replaycache_scrub_if_needed_internal(time_t present, replaycache_t *r)
/* okay, scrub time */
itr = digestmap_iter_init(r->digests_seen);
while (!digestmap_iter_done(itr)) {
- scrub_this = 0;
digestmap_iter_get(itr, &digest, &valp);
access_time = (time_t *)valp;
- if (access_time) {
- /* aged out yet? */
- if (*access_time < present - r->horizon) scrub_this = 1;
- } else {
- /* Buh? Get rid of it, anyway */
- log_info(LD_BUG, "replaycache_scrub_if_needed_internal() saw a NULL"
- " entry in the digestmap.");
- scrub_this = 1;
- }
-
- if (scrub_this) {
+ /* aged out yet? */
+ if (*access_time < present - r->horizon) {
/* Advance the iterator and remove this one */
itr = digestmap_iter_next_rmv(r->digests_seen, itr);
/* Free the value removed */
@@ -187,7 +176,7 @@ replaycache_scrub_if_needed_internal(time_t present, replaycache_t *r)
*/
int
-replaycache_add_and_test(replaycache_t *r, const void *data, int len)
+replaycache_add_and_test(replaycache_t *r, const void *data, size_t len)
{
return replaycache_add_and_test_internal(time(NULL), r, data, len, NULL);
}
@@ -198,7 +187,7 @@ replaycache_add_and_test(replaycache_t *r, const void *data, int len)
int
replaycache_add_test_and_elapsed(
- replaycache_t *r, const void *data, int len, time_t *elapsed)
+ replaycache_t *r, const void *data, size_t len, time_t *elapsed)
{
return replaycache_add_and_test_internal(time(NULL), r, data, len, elapsed);
}
diff --git a/src/or/replaycache.h b/src/or/replaycache.h
index de20cab62..cd713fe89 100644
--- a/src/or/replaycache.h
+++ b/src/or/replaycache.h
@@ -45,10 +45,10 @@ replaycache_t * replaycache_new(time_t horizon, time_t interval);
* testing. For everything else, use the wrappers below instead.
*/
-int replaycache_add_and_test_internal(
- time_t present, replaycache_t *r, const void *data, int len,
+STATIC int replaycache_add_and_test_internal(
+ time_t present, replaycache_t *r, const void *data, size_t len,
time_t *elapsed);
-void replaycache_scrub_if_needed_internal(
+STATIC void replaycache_scrub_if_needed_internal(
time_t present, replaycache_t *r);
#endif /* REPLAYCACHE_PRIVATE */
@@ -57,9 +57,9 @@ void replaycache_scrub_if_needed_internal(
* replaycache_t methods
*/
-int replaycache_add_and_test(replaycache_t *r, const void *data, int len);
+int replaycache_add_and_test(replaycache_t *r, const void *data, size_t len);
int replaycache_add_test_and_elapsed(
- replaycache_t *r, const void *data, int len, time_t *elapsed);
+ replaycache_t *r, const void *data, size_t len, time_t *elapsed);
void replaycache_scrub_if_needed(replaycache_t *r);
#endif
diff --git a/src/or/router.c b/src/or/router.c
index 6069da8f0..1063eda04 100644
--- a/src/or/router.c
+++ b/src/or/router.c
@@ -2249,7 +2249,7 @@ router_guess_address_from_dir_headers(uint32_t *guess)
* string describing the version of Tor and the operating system we're
* currently running on.
*/
-void
+STATIC void
get_platform_str(char *platform, size_t len)
{
tor_snprintf(platform, len, "Tor %s on %s",
diff --git a/src/or/router.h b/src/or/router.h
index 60095d087..1079ec78c 100644
--- a/src/or/router.h
+++ b/src/or/router.h
@@ -12,6 +12,8 @@
#ifndef TOR_ROUTER_H
#define TOR_ROUTER_H
+#include "testsupport.h"
+
crypto_pk_t *get_onion_key(void);
time_t get_onion_key_set_at(void);
void set_server_identity_key(crypto_pk_t *k);
@@ -146,7 +148,7 @@ smartlist_t *router_get_all_orports(const routerinfo_t *ri);
#ifdef ROUTER_PRIVATE
/* Used only by router.c and test.c */
-void get_platform_str(char *platform, size_t len);
+STATIC void get_platform_str(char *platform, size_t len);
#endif
#endif
diff --git a/src/or/routerlist.c b/src/or/routerlist.c
index 465aaedb1..2b894277c 100644
--- a/src/or/routerlist.c
+++ b/src/or/routerlist.c
@@ -1801,7 +1801,7 @@ router_get_advertised_bandwidth_capped(const routerinfo_t *router)
* doubles, convert them to uint64_t, and try to scale them linearly so as to
* much of the range of uint64_t. If <b>total_out</b> is provided, set it to
* the sum of all elements in the array _before_ scaling. */
-/* private */ void
+STATIC void
scale_array_elements_to_u64(u64_dbl_t *entries, int n_entries,
uint64_t *total_out)
{
@@ -1844,7 +1844,7 @@ gt_i64_timei(uint64_t a, uint64_t b)
* value, and return the index of that element. If all elements are 0, choose
* an index at random. Return -1 on error.
*/
-/* private */ int
+STATIC int
choose_array_element_by_weight(const u64_dbl_t *entries, int n_entries)
{
int i, i_chosen=-1, n_chosen=0;
diff --git a/src/or/routerlist.h b/src/or/routerlist.h
index ce0f0f2e3..0162297ca 100644
--- a/src/or/routerlist.h
+++ b/src/or/routerlist.h
@@ -11,6 +11,8 @@
#ifndef TOR_ROUTERLIST_H
#define TOR_ROUTERLIST_H
+#include "testsupport.h"
+
int get_n_authorities(dirinfo_type_t type);
int trusted_dirs_reload_certs(void);
@@ -206,9 +208,10 @@ typedef union u64_dbl_t {
double dbl;
} u64_dbl_t;
-int choose_array_element_by_weight(const u64_dbl_t *entries, int n_entries);
-void scale_array_elements_to_u64(u64_dbl_t *entries, int n_entries,
- uint64_t *total_out);
+STATIC int choose_array_element_by_weight(const u64_dbl_t *entries,
+ int n_entries);
+STATIC void scale_array_elements_to_u64(u64_dbl_t *entries, int n_entries,
+ uint64_t *total_out);
#endif
#endif
diff --git a/src/or/statefile.c b/src/or/statefile.c
index bcb7b0741..db9091ca2 100644
--- a/src/or/statefile.c
+++ b/src/or/statefile.c
@@ -4,6 +4,7 @@
* Copyright (c) 2007-2013, The Tor Project, Inc. */
/* See LICENSE for licensing information */
+#define STATEFILE_PRIVATE
#include "or.h"
#include "circuitstats.h"
#include "config.h"
@@ -117,8 +118,8 @@ static const config_format_t state_format = {
static or_state_t *global_state = NULL;
/** Return the persistent state struct for this Tor. */
-or_state_t *
-get_or_state(void)
+MOCK_IMPL(or_state_t *,
+get_or_state, (void))
{
tor_assert(global_state);
return global_state;
@@ -237,7 +238,8 @@ or_state_set(or_state_t *new_state)
tor_free(err);
ret = -1;
}
- if (circuit_build_times_parse_state(&circ_times, global_state) < 0) {
+ if (circuit_build_times_parse_state(
+ get_circuit_build_times_mutable(),global_state) < 0) {
ret = -1;
}
return ret;
@@ -404,7 +406,7 @@ or_state_save(time_t now)
* to avoid redundant writes. */
entry_guards_update_state(global_state);
rep_hist_update_state(global_state);
- circuit_build_times_update_state(&circ_times, global_state);
+ circuit_build_times_update_state(get_circuit_build_times(), global_state);
if (accounting_is_enabled(get_options()))
accounting_run_housekeeping(now);
@@ -449,7 +451,7 @@ or_state_save(time_t now)
/** Return the config line for transport <b>transport</b> in the current state.
* Return NULL if there is no config line for <b>transport</b>. */
-static config_line_t *
+STATIC config_line_t *
get_transport_in_state_by_name(const char *transport)
{
or_state_t *or_state = get_or_state();
diff --git a/src/or/statefile.h b/src/or/statefile.h
index dcdee6c60..c1413ff95 100644
--- a/src/or/statefile.h
+++ b/src/or/statefile.h
@@ -7,7 +7,7 @@
#ifndef TOR_STATEFILE_H
#define TOR_STATEFILE_H
-or_state_t *get_or_state(void);
+MOCK_DECL(or_state_t *,get_or_state,(void));
int did_last_state_file_write_fail(void);
int or_state_save(time_t now);
@@ -18,5 +18,9 @@ int or_state_load(void);
int or_state_loaded(void);
void or_state_free_all(void);
+#ifdef STATEFILE_PRIVATE
+STATIC config_line_t *get_transport_in_state_by_name(const char *transport);
+#endif
+
#endif
diff --git a/src/or/status.c b/src/or/status.c
index d239e6ee7..6e2206e5e 100644
--- a/src/or/status.c
+++ b/src/or/status.c
@@ -15,6 +15,9 @@
#include "circuitlist.h"
#include "main.h"
#include "hibernate.h"
+#include "statefile.h"
+
+static void log_accounting(const time_t now, const or_options_t *options);
/** Return the total number of circuits. */
static int
@@ -23,7 +26,7 @@ count_circuits(void)
circuit_t *circ;
int nr=0;
- for (circ = circuit_get_global_list_(); circ; circ = circ->next)
+ TOR_LIST_FOREACH(circ, circuit_get_global_list(), head)
nr++;
return nr;
@@ -111,6 +114,10 @@ log_heartbeat(time_t now)
uptime, count_circuits(),bw_sent,bw_rcvd,
hibernating?" We are currently hibernating.":"");
+ if (server_mode(options) && accounting_is_enabled(options) && !hibernating) {
+ log_accounting(now, options);
+ }
+
if (stats_n_data_cells_packaged && !hibernating)
log_notice(LD_HEARTBEAT, "Average packaged cell fullness: %2.3f%%",
100*(U64_TO_DBL(stats_n_data_bytes_packaged) /
@@ -128,3 +135,27 @@ log_heartbeat(time_t now)
return 0;
}
+static void
+log_accounting(const time_t now, const or_options_t *options)
+{
+ or_state_t *state = get_or_state();
+ char *acc_rcvd = bytes_to_usage(state->AccountingBytesReadInInterval);
+ char *acc_sent = bytes_to_usage(state->AccountingBytesWrittenInInterval);
+ char *acc_max = bytes_to_usage(options->AccountingMax);
+ time_t interval_end = accounting_get_end_time();
+ char end_buf[ISO_TIME_LEN + 1];
+ char *remaining = NULL;
+ format_local_iso_time(end_buf, interval_end);
+ remaining = secs_to_uptime(interval_end - now);
+
+ log_notice(LD_HEARTBEAT, "Heartbeat: Accounting enabled. "
+ "Sent: %s / %s, Received: %s / %s. The "
+ "current accounting interval ends on %s, in %s.",
+ acc_sent, acc_max, acc_rcvd, acc_max, end_buf, remaining);
+
+ tor_free(acc_rcvd);
+ tor_free(acc_sent);
+ tor_free(acc_max);
+ tor_free(remaining);
+}
+
diff --git a/src/or/transports.c b/src/or/transports.c
index 0afba24ea..f9499eb6d 100644
--- a/src/or/transports.c
+++ b/src/or/transports.c
@@ -96,18 +96,16 @@
#include "router.h"
#include "statefile.h"
#include "entrynodes.h"
+#include "connection_or.h"
+#include "ext_orport.h"
+#include "control.h"
static process_environment_t *
create_managed_proxy_environment(const managed_proxy_t *mp);
static INLINE int proxy_configuration_finished(const managed_proxy_t *mp);
-static void managed_proxy_destroy(managed_proxy_t *mp,
- int also_terminate_process);
-
static void handle_finished_proxy(managed_proxy_t *mp);
-static void configure_proxy(managed_proxy_t *mp);
-
static void parse_method_error(const char *line, int is_server_method);
#define parse_server_method_error(l) parse_method_error(l, 1)
#define parse_client_method_error(l) parse_method_error(l, 0)
@@ -137,7 +135,8 @@ static smartlist_t *transport_list = NULL;
SOCKS version <b>socks_ver</b>. */
static transport_t *
transport_new(const tor_addr_t *addr, uint16_t port,
- const char *name, int socks_ver)
+ const char *name, int socks_ver,
+ const char *extra_info_args)
{
transport_t *t = tor_malloc_zero(sizeof(transport_t));
@@ -145,6 +144,8 @@ transport_new(const tor_addr_t *addr, uint16_t port,
t->port = port;
t->name = tor_strdup(name);
t->socks_version = socks_ver;
+ if (extra_info_args)
+ t->extra_info_args = tor_strdup(extra_info_args);
return t;
}
@@ -157,6 +158,7 @@ transport_free(transport_t *transport)
return;
tor_free(transport->name);
+ tor_free(transport->extra_info_args);
tor_free(transport);
}
@@ -324,7 +326,7 @@ int
transport_add_from_config(const tor_addr_t *addr, uint16_t port,
const char *name, int socks_ver)
{
- transport_t *t = transport_new(addr, port, name, socks_ver);
+ transport_t *t = transport_new(addr, port, name, socks_ver, NULL);
int r = transport_add(t);
@@ -573,10 +575,8 @@ pt_configure_remaining_proxies(void)
/* If the proxy is not fully configured, try to configure it
futher. */
if (!proxy_configuration_finished(mp))
- configure_proxy(mp);
-
- if (proxy_configuration_finished(mp))
- at_least_a_proxy_config_finished = 1;
+ if (configure_proxy(mp) == 1)
+ at_least_a_proxy_config_finished = 1;
} SMARTLIST_FOREACH_END(mp);
@@ -588,10 +588,14 @@ pt_configure_remaining_proxies(void)
mark_my_descriptor_dirty("configured managed proxies");
}
-/** Attempt to continue configuring managed proxy <b>mp</b>. */
-static void
+/** Attempt to continue configuring managed proxy <b>mp</b>.
+ * Return 1 if the transport configuration finished, and return 0
+ * otherwise (if we still have more configuring to do for this
+ * proxy). */
+STATIC int
configure_proxy(managed_proxy_t *mp)
{
+ int configuration_finished = 0;
smartlist_t *proxy_output = NULL;
enum stream_status stream_status = 0;
@@ -601,7 +605,7 @@ configure_proxy(managed_proxy_t *mp)
mp->conf_state = PT_PROTO_FAILED_LAUNCH;
handle_finished_proxy(mp);
}
- return;
+ return 0;
}
tor_assert(mp->conf_state != PT_PROTO_INFANT);
@@ -633,13 +637,17 @@ configure_proxy(managed_proxy_t *mp)
done:
/* if the proxy finished configuring, exit the loop. */
- if (proxy_configuration_finished(mp))
+ if (proxy_configuration_finished(mp)) {
handle_finished_proxy(mp);
+ configuration_finished = 1;
+ }
if (proxy_output) {
SMARTLIST_FOREACH(proxy_output, char *, cp, tor_free(cp));
smartlist_free(proxy_output);
}
+
+ return configuration_finished;
}
/** Register server managed proxy <b>mp</b> transports to state */
@@ -652,6 +660,7 @@ register_server_proxy(const managed_proxy_t *mp)
save_transport_to_state(t->name, &t->addr, t->port);
log_notice(LD_GENERAL, "Registered server transport '%s' at '%s'",
t->name, fmt_addrport(&t->addr, t->port));
+ control_event_transport_launched("server", t->name, &t->addr, t->port);
} SMARTLIST_FOREACH_END(t);
}
@@ -674,9 +683,11 @@ register_client_proxy(const managed_proxy_t *mp)
break;
case 0:
log_info(LD_GENERAL, "Successfully registered transport %s", t->name);
+ control_event_transport_launched("client", t->name, &t->addr, t->port);
break;
case 1:
log_info(LD_GENERAL, "Successfully registered transport %s", t->name);
+ control_event_transport_launched("client", t->name, &t->addr, t->port);
transport_free(transport_tmp);
break;
}
@@ -694,7 +705,7 @@ register_proxy(const managed_proxy_t *mp)
}
/** Free memory allocated by managed proxy <b>mp</b>. */
-static void
+STATIC void
managed_proxy_destroy(managed_proxy_t *mp,
int also_terminate_process)
{
@@ -708,7 +719,8 @@ managed_proxy_destroy(managed_proxy_t *mp,
smartlist_free(mp->transports_to_launch);
/* remove it from the list of managed proxies */
- smartlist_remove(managed_proxy_list, mp);
+ if (managed_proxy_list)
+ smartlist_remove(managed_proxy_list, mp);
/* free the argv */
free_execve_args(mp->argv);
@@ -745,7 +757,6 @@ handle_finished_proxy(managed_proxy_t *mp)
}
unconfigured_proxies_n--;
- tor_assert(unconfigured_proxies_n >= 0);
}
/** Return true if the configuration of the managed proxy <b>mp</b> is
@@ -776,7 +787,7 @@ handle_methods_done(const managed_proxy_t *mp)
/** Handle a configuration protocol <b>line</b> received from a
* managed proxy <b>mp</b>. */
-void
+STATIC void
handle_proxy_line(const char *line, managed_proxy_t *mp)
{
log_info(LD_GENERAL, "Got a line from managed proxy '%s': (%s)",
@@ -877,7 +888,7 @@ handle_proxy_line(const char *line, managed_proxy_t *mp)
}
/** Parses an ENV-ERROR <b>line</b> and warns the user accordingly. */
-void
+STATIC void
parse_env_error(const char *line)
{
/* (Length of the protocol string) plus (a space) and (the first char of
@@ -893,7 +904,7 @@ parse_env_error(const char *line)
/** Handles a VERSION <b>line</b>. Updates the configuration protocol
* version in <b>mp</b>. */
-int
+STATIC int
parse_version(const char *line, managed_proxy_t *mp)
{
if (strlen(line) < (strlen(PROTO_NEG_SUCCESS) + 2)) {
@@ -934,14 +945,14 @@ parse_method_error(const char *line, int is_server)
/** Parses an SMETHOD <b>line</b> and if well-formed it registers the
* new transport in <b>mp</b>. */
-int
+STATIC int
parse_smethod_line(const char *line, managed_proxy_t *mp)
{
int r;
smartlist_t *items = NULL;
char *method_name=NULL;
-
+ char *args_string=NULL;
char *addrport=NULL;
tor_addr_t tor_addr;
char *address=NULL;
@@ -958,6 +969,9 @@ parse_smethod_line(const char *line, managed_proxy_t *mp)
goto err;
}
+ /* Example of legit SMETHOD line:
+ SMETHOD obfs2 0.0.0.0:25612 ARGS:secret=supersekrit,key=superkey */
+
tor_assert(!strcmp(smartlist_get(items,0),PROTO_SMETHOD));
method_name = smartlist_get(items,1);
@@ -985,7 +999,19 @@ parse_smethod_line(const char *line, managed_proxy_t *mp)
goto err;
}
- transport = transport_new(&tor_addr, port, method_name, PROXY_NONE);
+ if (smartlist_len(items) > 3) {
+ /* Seems like there are also some [options] in the SMETHOD line.
+ Let's see if we can parse them. */
+ char *options_string = smartlist_get(items, 3);
+ log_debug(LD_CONFIG, "Got options_string: %s", options_string);
+ if (!strcmpstart(options_string, "ARGS:")) {
+ args_string = options_string+strlen("ARGS:");
+ log_debug(LD_CONFIG, "Got ARGS: %s", args_string);
+ }
+ }
+
+ transport = transport_new(&tor_addr, port, method_name,
+ PROXY_NONE, args_string);
if (!transport)
goto err;
@@ -1011,7 +1037,7 @@ parse_smethod_line(const char *line, managed_proxy_t *mp)
/** Parses a CMETHOD <b>line</b>, and if well-formed it registers
* the new transport in <b>mp</b>. */
-int
+STATIC int
parse_cmethod_line(const char *line, managed_proxy_t *mp)
{
int r;
@@ -1077,7 +1103,7 @@ parse_cmethod_line(const char *line, managed_proxy_t *mp)
goto err;
}
- transport = transport_new(&tor_addr, port, method_name, socks_ver);
+ transport = transport_new(&tor_addr, port, method_name, socks_ver, NULL);
if (!transport)
goto err;
@@ -1100,6 +1126,50 @@ parse_cmethod_line(const char *line, managed_proxy_t *mp)
return r;
}
+/** Return a newly allocated string that tor should place in
+ * TOR_PT_SERVER_TRANSPORT_OPTIONS while configuring the server
+ * manged proxy in <b>mp</b>. Return NULL if no such options are found. */
+STATIC char *
+get_transport_options_for_server_proxy(const managed_proxy_t *mp)
+{
+ char *options_string = NULL;
+ smartlist_t *string_sl = smartlist_new();
+
+ tor_assert(mp->is_server);
+
+ /** Loop over the transports of the proxy. If we have options for
+ any of them, format them appropriately and place them in our
+ smartlist. Finally, join our smartlist to get the final
+ string. */
+ SMARTLIST_FOREACH_BEGIN(mp->transports_to_launch, const char *, transport) {
+ smartlist_t *options_tmp_sl = NULL;
+ options_tmp_sl = get_options_for_server_transport(transport);
+ if (!options_tmp_sl)
+ continue;
+
+ /** Loop over the options of this transport, escape them, and
+ place them in the smartlist. */
+ SMARTLIST_FOREACH_BEGIN(options_tmp_sl, const char *, options) {
+ char *escaped_opts = tor_escape_str_for_pt_args(options, ":;\\");
+ smartlist_add_asprintf(string_sl, "%s:%s",
+ transport, escaped_opts);
+ tor_free(escaped_opts);
+ } SMARTLIST_FOREACH_END(options);
+
+ SMARTLIST_FOREACH(options_tmp_sl, char *, c, tor_free(c));
+ smartlist_free(options_tmp_sl);
+ } SMARTLIST_FOREACH_END(transport);
+
+ if (smartlist_len(string_sl)) {
+ options_string = smartlist_join_strings(string_sl, ";", 0, NULL);
+ }
+
+ SMARTLIST_FOREACH(string_sl, char *, t, tor_free(t));
+ smartlist_free(string_sl);
+
+ return options_string;
+}
+
/** Return the string that tor should place in TOR_PT_SERVER_BINDADDR
* while configuring the server managed proxy in <b>mp</b>. The
* string is stored in the heap, and it's the the responsibility of
@@ -1134,6 +1204,8 @@ get_bindaddr_for_server_proxy(const managed_proxy_t *mp)
static process_environment_t *
create_managed_proxy_environment(const managed_proxy_t *mp)
{
+ const or_options_t *options = get_options();
+
/* Environment variables to be added to or set in mp's environment. */
smartlist_t *envs = smartlist_new();
/* XXXX The next time someone touches this code, shorten the name of
@@ -1181,13 +1253,39 @@ create_managed_proxy_environment(const managed_proxy_t *mp)
tor_free(bindaddr_tmp);
}
+ {
+ char *server_transport_options =
+ get_transport_options_for_server_proxy(mp);
+ if (server_transport_options) {
+ smartlist_add_asprintf(envs, "TOR_PT_SERVER_TRANSPORT_OPTIONS=%s",
+ server_transport_options);
+ tor_free(server_transport_options);
+ }
+ }
+
/* XXX024 Remove the '=' here once versions of obfsproxy which
* assert that this env var exists are sufficiently dead.
*
* (If we remove this line entirely, some joker will stick this
* variable in Tor's environment and crash PTs that try to parse
* it even when not run in server mode.) */
- smartlist_add(envs, tor_strdup("TOR_PT_EXTENDED_SERVER_PORT="));
+
+ if (options->ExtORPort_lines) {
+ char *ext_or_addrport_tmp =
+ get_first_listener_addrport_string(CONN_TYPE_EXT_OR_LISTENER);
+ char *cookie_file_loc = get_ext_or_auth_cookie_file_name();
+
+ smartlist_add_asprintf(envs, "TOR_PT_EXTENDED_SERVER_PORT=%s",
+ ext_or_addrport_tmp);
+ smartlist_add_asprintf(envs, "TOR_PT_AUTH_COOKIE_FILE=%s",
+ cookie_file_loc);
+
+ tor_free(ext_or_addrport_tmp);
+ tor_free(cookie_file_loc);
+
+ } else {
+ smartlist_add_asprintf(envs, "TOR_PT_EXTENDED_SERVER_PORT=");
+ }
}
SMARTLIST_FOREACH_BEGIN(envs, const char *, env_var) {
@@ -1211,7 +1309,7 @@ create_managed_proxy_environment(const managed_proxy_t *mp)
* <b>proxy_argv</b>.
*
* Requires that proxy_argv have at least one element. */
-static managed_proxy_t *
+STATIC managed_proxy_t *
managed_proxy_create(const smartlist_t *transport_list,
char **proxy_argv, int is_server)
{
@@ -1385,6 +1483,8 @@ pt_get_extra_info_descriptor_string(void)
tor_assert(mp->transports);
SMARTLIST_FOREACH_BEGIN(mp->transports, const transport_t *, t) {
+ char *transport_args = NULL;
+
/* If the transport proxy returned "0.0.0.0" as its address, and
* we know our external IP address, use it. Otherwise, use the
* returned address. */
@@ -1400,9 +1500,16 @@ pt_get_extra_info_descriptor_string(void)
addrport = fmt_addrport(&t->addr, t->port);
}
+ /* If this transport has any arguments with it, prepend a space
+ to them so that we can add them to the transport line. */
+ if (t->extra_info_args)
+ tor_asprintf(&transport_args, " %s", t->extra_info_args);
+
smartlist_add_asprintf(string_chunks,
- "transport %s %s",
- t->name, addrport);
+ "transport %s %s%s",
+ t->name, addrport,
+ transport_args ? transport_args : "");
+ tor_free(transport_args);
} SMARTLIST_FOREACH_END(t);
} SMARTLIST_FOREACH_END(mp);
@@ -1440,7 +1547,7 @@ pt_stringify_socks_args(const smartlist_t *socks_args)
SMARTLIST_FOREACH_BEGIN(socks_args, const char *, s) {
/* Escape ';' and '\'. */
- escaped_string = tor_escape_str_for_socks_arg(s);
+ escaped_string = tor_escape_str_for_pt_args(s, ";\\");
if (!escaped_string)
goto done;
diff --git a/src/or/transports.h b/src/or/transports.h
index 4a5498cb5..7b524f207 100644
--- a/src/or/transports.h
+++ b/src/or/transports.h
@@ -25,6 +25,9 @@ typedef struct transport_t {
/** Boolean: We are re-parsing our transport list, and we are going to remove
* this one if we don't find it in the list of configured transports. */
unsigned marked_for_removal : 1;
+ /** Arguments for this transport that must be written to the
+ extra-info descriptor. */
+ char *extra_info_args;
} transport_t;
void mark_transport_list(void);
@@ -104,12 +107,21 @@ typedef struct {
smartlist_t *transports;
} managed_proxy_t;
-int parse_cmethod_line(const char *line, managed_proxy_t *mp);
-int parse_smethod_line(const char *line, managed_proxy_t *mp);
+STATIC int parse_cmethod_line(const char *line, managed_proxy_t *mp);
+STATIC int parse_smethod_line(const char *line, managed_proxy_t *mp);
-int parse_version(const char *line, managed_proxy_t *mp);
-void parse_env_error(const char *line);
-void handle_proxy_line(const char *line, managed_proxy_t *mp);
+STATIC int parse_version(const char *line, managed_proxy_t *mp);
+STATIC void parse_env_error(const char *line);
+STATIC void handle_proxy_line(const char *line, managed_proxy_t *mp);
+STATIC char *get_transport_options_for_server_proxy(const managed_proxy_t *mp);
+
+STATIC void managed_proxy_destroy(managed_proxy_t *mp,
+ int also_terminate_process);
+
+STATIC managed_proxy_t *managed_proxy_create(const smartlist_t *transport_list,
+ char **proxy_argv, int is_server);
+
+STATIC int configure_proxy(managed_proxy_t *mp);
#endif
diff --git a/src/test/bench.c b/src/test/bench.c
index 97a7909fc..ca01d3c3e 100644
--- a/src/test/bench.c
+++ b/src/test/bench.c
@@ -15,7 +15,6 @@ const char tor_git_revision[] = "";
#include "orconfig.h"
#define RELAY_PRIVATE
-#define CONFIG_PRIVATE
#include "or.h"
#include "onion_tap.h"
diff --git a/src/test/include.am b/src/test/include.am
index 112d1a79d..e3f2795f2 100644
--- a/src/test/include.am
+++ b/src/test/include.am
@@ -1,11 +1,15 @@
TESTS+= src/test/test
-noinst_PROGRAMS+= src/test/test src/test/test-child src/test/bench
+noinst_PROGRAMS+= src/test/bench
+if UNITTESTS_ENABLED
+noinst_PROGRAMS+= src/test/test src/test/test-child
+endif
src_test_AM_CPPFLAGS = -DSHARE_DATADIR="\"$(datadir)\"" \
-DLOCALSTATEDIR="\"$(localstatedir)\"" \
-DBINDIR="\"$(bindir)\"" \
- -I"$(top_srcdir)/src/or" -I"$(top_srcdir)/src/ext"
+ -I"$(top_srcdir)/src/or" -I"$(top_srcdir)/src/ext" \
+ -DTOR_UNIT_TESTS
# -L flags need to go in LDFLAGS. -l flags need to go in LDADD.
# This seems to matter nowhere but on Windows, but I assure you that it
@@ -14,19 +18,28 @@ src_test_AM_CPPFLAGS = -DSHARE_DATADIR="\"$(datadir)\"" \
src_test_test_SOURCES = \
src/test/test.c \
src/test/test_addr.c \
+ src/test/test_buffers.c \
src/test/test_cell_formats.c \
+ src/test/test_circuitlist.c \
+ src/test/test_circuitmux.c \
src/test/test_containers.c \
src/test/test_crypto.c \
+ src/test/test_cell_queue.c \
src/test/test_data.c \
src/test/test_dir.c \
+ src/test/test_extorport.c \
src/test/test_introduce.c \
src/test/test_microdesc.c \
+ src/test/test_options.c \
src/test/test_pt.c \
src/test/test_replay.c \
+ src/test/test_socks.c \
src/test/test_util.c \
src/test/test_config.c \
src/ext/tinytest.c
+src_test_test_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS)
+
src_test_test_CPPFLAGS= $(src_test_AM_CPPFLAGS)
src_test_bench_SOURCES = \
@@ -36,9 +49,9 @@ src_test_bench_CPPFLAGS= $(src_test_AM_CPPFLAGS)
src_test_test_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ \
@TOR_LDFLAGS_libevent@
-src_test_test_LDADD = src/or/libtor.a src/common/libor.a \
- src/common/libor-crypto.a $(LIBDONNA) \
- src/common/libor-event.a \
+src_test_test_LDADD = src/or/libtor-testing.a src/common/libor-testing.a \
+ src/common/libor-crypto-testing.a $(LIBDONNA) \
+ src/common/libor-event-testing.a \
@TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ \
@TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@
diff --git a/src/test/test.c b/src/test/test.c
index a9cf899a0..6b45acf40 100644
--- a/src/test/test.c
+++ b/src/test/test.c
@@ -28,8 +28,6 @@ const char tor_git_revision[] = "";
/* These macros pull in declarations for some functions and structures that
* are typically file-private. */
-#define BUFFERS_PRIVATE
-#define CONFIG_PRIVATE
#define GEOIP_PRIVATE
#define ROUTER_PRIVATE
#define CIRCUITSTATS_PRIVATE
@@ -44,6 +42,7 @@ double fabs(double x);
#include "or.h"
#include "buffers.h"
+#include "circuitlist.h"
#include "circuitstats.h"
#include "config.h"
#include "connection_edge.h"
@@ -53,6 +52,8 @@ double fabs(double x);
#include "torgzip.h"
#include "mempool.h"
#include "memarea.h"
+#include "onion.h"
+#include "onion_ntor.h"
#include "onion_tap.h"
#include "policies.h"
#include "rephist.h"
@@ -216,622 +217,6 @@ free_pregenerated_keys(void)
}
}
-typedef struct socks_test_data_t {
- socks_request_t *req;
- buf_t *buf;
-} socks_test_data_t;
-
-static void *
-socks_test_setup(const struct testcase_t *testcase)
-{
- socks_test_data_t *data = tor_malloc(sizeof(socks_test_data_t));
- (void)testcase;
- data->buf = buf_new_with_capacity(256);
- data->req = socks_request_new();
- config_register_addressmaps(get_options());
- return data;
-}
-static int
-socks_test_cleanup(const struct testcase_t *testcase, void *ptr)
-{
- socks_test_data_t *data = ptr;
- (void)testcase;
- buf_free(data->buf);
- socks_request_free(data->req);
- tor_free(data);
- return 1;
-}
-
-const struct testcase_setup_t socks_setup = {
- socks_test_setup, socks_test_cleanup
-};
-
-#define SOCKS_TEST_INIT() \
- socks_test_data_t *testdata = ptr; \
- buf_t *buf = testdata->buf; \
- socks_request_t *socks = testdata->req;
-#define ADD_DATA(buf, s) \
- write_to_buf(s, sizeof(s)-1, buf)
-
-static void
-socks_request_clear(socks_request_t *socks)
-{
- tor_free(socks->username);
- tor_free(socks->password);
- memset(socks, 0, sizeof(socks_request_t));
-}
-
-/** Perform unsupported SOCKS 4 commands */
-static void
-test_socks_4_unsupported_commands(void *ptr)
-{
- SOCKS_TEST_INIT();
-
- /* SOCKS 4 Send BIND [02] to IP address 2.2.2.2:4369 */
- ADD_DATA(buf, "\x04\x02\x11\x11\x02\x02\x02\x02\x00");
- test_assert(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
- get_options()->SafeSocks) == -1);
- test_eq(4, socks->socks_version);
- test_eq(0, socks->replylen); /* XXX: shouldn't tor reply? */
-
- done:
- ;
-}
-
-/** Perform supported SOCKS 4 commands */
-static void
-test_socks_4_supported_commands(void *ptr)
-{
- SOCKS_TEST_INIT();
-
- test_eq(0, buf_datalen(buf));
-
- /* SOCKS 4 Send CONNECT [01] to IP address 2.2.2.2:4370 */
- ADD_DATA(buf, "\x04\x01\x11\x12\x02\x02\x02\x03\x00");
- test_assert(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
- get_options()->SafeSocks) == 1);
- test_eq(4, socks->socks_version);
- test_eq(0, socks->replylen); /* XXX: shouldn't tor reply? */
- test_eq(SOCKS_COMMAND_CONNECT, socks->command);
- test_streq("2.2.2.3", socks->address);
- test_eq(4370, socks->port);
- test_assert(socks->got_auth == 0);
- test_assert(! socks->username);
-
- test_eq(0, buf_datalen(buf));
- socks_request_clear(socks);
-
- /* SOCKS 4 Send CONNECT [01] to IP address 2.2.2.2:4369 with userid*/
- ADD_DATA(buf, "\x04\x01\x11\x12\x02\x02\x02\x04me\x00");
- test_assert(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
- get_options()->SafeSocks) == 1);
- test_eq(4, socks->socks_version);
- test_eq(0, socks->replylen); /* XXX: shouldn't tor reply? */
- test_eq(SOCKS_COMMAND_CONNECT, socks->command);
- test_streq("2.2.2.4", socks->address);
- test_eq(4370, socks->port);
- test_assert(socks->got_auth == 1);
- test_assert(socks->username);
- test_eq(2, socks->usernamelen);
- test_memeq("me", socks->username, 2);
-
- test_eq(0, buf_datalen(buf));
- socks_request_clear(socks);
-
- /* SOCKS 4a Send RESOLVE [F0] request for torproject.org */
- ADD_DATA(buf, "\x04\xF0\x01\x01\x00\x00\x00\x02me\x00torproject.org\x00");
- test_assert(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
- get_options()->SafeSocks) == 1);
- test_eq(4, socks->socks_version);
- test_eq(0, socks->replylen); /* XXX: shouldn't tor reply? */
- test_streq("torproject.org", socks->address);
-
- test_eq(0, buf_datalen(buf));
-
- done:
- ;
-}
-
-/** Perform unsupported SOCKS 5 commands */
-static void
-test_socks_5_unsupported_commands(void *ptr)
-{
- SOCKS_TEST_INIT();
-
- /* SOCKS 5 Send unsupported BIND [02] command */
- ADD_DATA(buf, "\x05\x02\x00\x01");
-
- test_eq(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
- get_options()->SafeSocks), 0);
- test_eq(0, buf_datalen(buf));
- test_eq(5, socks->socks_version);
- test_eq(2, socks->replylen);
- test_eq(5, socks->reply[0]);
- test_eq(0, socks->reply[1]);
- ADD_DATA(buf, "\x05\x02\x00\x01\x02\x02\x02\x01\x01\x01");
- test_eq(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
- get_options()->SafeSocks), -1);
- /* XXX: shouldn't tor reply 'command not supported' [07]? */
-
- buf_clear(buf);
- socks_request_clear(socks);
-
- /* SOCKS 5 Send unsupported UDP_ASSOCIATE [03] command */
- ADD_DATA(buf, "\x05\x03\x00\x01\x02");
- test_eq(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
- get_options()->SafeSocks), 0);
- test_eq(5, socks->socks_version);
- test_eq(2, socks->replylen);
- test_eq(5, socks->reply[0]);
- test_eq(2, socks->reply[1]);
- ADD_DATA(buf, "\x05\x03\x00\x01\x02\x02\x02\x01\x01\x01");
- test_eq(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
- get_options()->SafeSocks), -1);
- /* XXX: shouldn't tor reply 'command not supported' [07]? */
-
- done:
- ;
-}
-
-/** Perform supported SOCKS 5 commands */
-static void
-test_socks_5_supported_commands(void *ptr)
-{
- SOCKS_TEST_INIT();
-
- /* SOCKS 5 Send CONNECT [01] to IP address 2.2.2.2:4369 */
- ADD_DATA(buf, "\x05\x01\x00");
- test_eq(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
- get_options()->SafeSocks), 0);
- test_eq(5, socks->socks_version);
- test_eq(2, socks->replylen);
- test_eq(5, socks->reply[0]);
- test_eq(0, socks->reply[1]);
-
- ADD_DATA(buf, "\x05\x01\x00\x01\x02\x02\x02\x02\x11\x11");
- test_eq(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
- get_options()->SafeSocks), 1);
- test_streq("2.2.2.2", socks->address);
- test_eq(4369, socks->port);
-
- test_eq(0, buf_datalen(buf));
- socks_request_clear(socks);
-
- /* SOCKS 5 Send CONNECT [01] to FQDN torproject.org:4369 */
- ADD_DATA(buf, "\x05\x01\x00");
- ADD_DATA(buf, "\x05\x01\x00\x03\x0Etorproject.org\x11\x11");
- test_eq(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
- get_options()->SafeSocks), 1);
-
- test_eq(5, socks->socks_version);
- test_eq(2, socks->replylen);
- test_eq(5, socks->reply[0]);
- test_eq(0, socks->reply[1]);
- test_streq("torproject.org", socks->address);
- test_eq(4369, socks->port);
-
- test_eq(0, buf_datalen(buf));
- socks_request_clear(socks);
-
- /* SOCKS 5 Send RESOLVE [F0] request for torproject.org:4369 */
- ADD_DATA(buf, "\x05\x01\x00");
- ADD_DATA(buf, "\x05\xF0\x00\x03\x0Etorproject.org\x01\x02");
- test_assert(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
- get_options()->SafeSocks) == 1);
- test_eq(5, socks->socks_version);
- test_eq(2, socks->replylen);
- test_eq(5, socks->reply[0]);
- test_eq(0, socks->reply[1]);
- test_streq("torproject.org", socks->address);
-
- test_eq(0, buf_datalen(buf));
- socks_request_clear(socks);
-
- /* SOCKS 5 Send RESOLVE_PTR [F1] for IP address 2.2.2.5 */
- ADD_DATA(buf, "\x05\x01\x00");
- ADD_DATA(buf, "\x05\xF1\x00\x01\x02\x02\x02\x05\x01\x03");
- test_assert(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
- get_options()->SafeSocks) == 1);
- test_eq(5, socks->socks_version);
- test_eq(2, socks->replylen);
- test_eq(5, socks->reply[0]);
- test_eq(0, socks->reply[1]);
- test_streq("2.2.2.5", socks->address);
-
- test_eq(0, buf_datalen(buf));
-
- done:
- ;
-}
-
-/** Perform SOCKS 5 authentication */
-static void
-test_socks_5_no_authenticate(void *ptr)
-{
- SOCKS_TEST_INIT();
-
- /*SOCKS 5 No Authentication */
- ADD_DATA(buf,"\x05\x01\x00");
- test_assert(!fetch_from_buf_socks(buf, socks,
- get_options()->TestSocks,
- get_options()->SafeSocks));
- test_eq(2, socks->replylen);
- test_eq(5, socks->reply[0]);
- test_eq(SOCKS_NO_AUTH, socks->reply[1]);
-
- test_eq(0, buf_datalen(buf));
-
- /*SOCKS 5 Send username/password anyway - pretend to be broken */
- ADD_DATA(buf,"\x01\x02\x01\x01\x02\x01\x01");
- test_assert(!fetch_from_buf_socks(buf, socks,
- get_options()->TestSocks,
- get_options()->SafeSocks));
- test_eq(5, socks->socks_version);
- test_eq(2, socks->replylen);
- test_eq(1, socks->reply[0]);
- test_eq(0, socks->reply[1]);
-
- test_eq(2, socks->usernamelen);
- test_eq(2, socks->passwordlen);
-
- test_memeq("\x01\x01", socks->username, 2);
- test_memeq("\x01\x01", socks->password, 2);
-
- done:
- ;
-}
-
-/** Perform SOCKS 5 authentication */
-static void
-test_socks_5_authenticate(void *ptr)
-{
- SOCKS_TEST_INIT();
-
- /* SOCKS 5 Negotiate username/password authentication */
- ADD_DATA(buf, "\x05\x01\x02");
-
- test_assert(!fetch_from_buf_socks(buf, socks,
- get_options()->TestSocks,
- get_options()->SafeSocks));
- test_eq(2, socks->replylen);
- test_eq(5, socks->reply[0]);
- test_eq(SOCKS_USER_PASS, socks->reply[1]);
- test_eq(5, socks->socks_version);
-
- test_eq(0, buf_datalen(buf));
-
- /* SOCKS 5 Send username/password */
- ADD_DATA(buf, "\x01\x02me\x08mypasswd");
- test_assert(!fetch_from_buf_socks(buf, socks,
- get_options()->TestSocks,
- get_options()->SafeSocks));
- test_eq(5, socks->socks_version);
- test_eq(2, socks->replylen);
- test_eq(1, socks->reply[0]);
- test_eq(0, socks->reply[1]);
-
- test_eq(2, socks->usernamelen);
- test_eq(8, socks->passwordlen);
-
- test_memeq("me", socks->username, 2);
- test_memeq("mypasswd", socks->password, 8);
-
- done:
- ;
-}
-
-/** Perform SOCKS 5 authentication and send data all in one go */
-static void
-test_socks_5_authenticate_with_data(void *ptr)
-{
- SOCKS_TEST_INIT();
-
- /* SOCKS 5 Negotiate username/password authentication */
- ADD_DATA(buf, "\x05\x01\x02");
-
- test_assert(!fetch_from_buf_socks(buf, socks,
- get_options()->TestSocks,
- get_options()->SafeSocks));
- test_eq(2, socks->replylen);
- test_eq(5, socks->reply[0]);
- test_eq(SOCKS_USER_PASS, socks->reply[1]);
- test_eq(5, socks->socks_version);
-
- test_eq(0, buf_datalen(buf));
-
- /* SOCKS 5 Send username/password */
- /* SOCKS 5 Send CONNECT [01] to IP address 2.2.2.2:4369 */
- ADD_DATA(buf, "\x01\x02me\x03you\x05\x01\x00\x01\x02\x02\x02\x02\x11\x11");
- test_assert(fetch_from_buf_socks(buf, socks,
- get_options()->TestSocks,
- get_options()->SafeSocks) == 1);
- test_eq(5, socks->socks_version);
- test_eq(2, socks->replylen);
- test_eq(1, socks->reply[0]);
- test_eq(0, socks->reply[1]);
-
- test_streq("2.2.2.2", socks->address);
- test_eq(4369, socks->port);
-
- test_eq(2, socks->usernamelen);
- test_eq(3, socks->passwordlen);
- test_memeq("me", socks->username, 2);
- test_memeq("you", socks->password, 3);
-
- done:
- ;
-}
-
-/** Perform SOCKS 5 authentication before method negotiated */
-static void
-test_socks_5_auth_before_negotiation(void *ptr)
-{
- SOCKS_TEST_INIT();
-
- /* SOCKS 5 Send username/password */
- ADD_DATA(buf, "\x01\x02me\x02me");
- test_assert(fetch_from_buf_socks(buf, socks,
- get_options()->TestSocks,
- get_options()->SafeSocks) == -1);
- test_eq(0, socks->socks_version);
- test_eq(0, socks->replylen);
- test_eq(0, socks->reply[0]);
- test_eq(0, socks->reply[1]);
-
- done:
- ;
-}
-
-static void
-test_buffer_copy(void *arg)
-{
- generic_buffer_t *buf=NULL, *buf2=NULL;
- const char *s;
- size_t len;
- char b[256];
- int i;
- (void)arg;
-
- buf = generic_buffer_new();
- tt_assert(buf);
-
- /* Copy an empty buffer. */
- tt_int_op(0, ==, generic_buffer_set_to_copy(&buf2, buf));
- tt_assert(buf2);
- tt_int_op(0, ==, generic_buffer_len(buf2));
-
- /* Now try with a short buffer. */
- s = "And now comes an act of enormous enormance!";
- len = strlen(s);
- generic_buffer_add(buf, s, len);
- tt_int_op(len, ==, generic_buffer_len(buf));
- /* Add junk to buf2 so we can test replacing.*/
- generic_buffer_add(buf2, "BLARG", 5);
- tt_int_op(0, ==, generic_buffer_set_to_copy(&buf2, buf));
- tt_int_op(len, ==, generic_buffer_len(buf2));
- generic_buffer_get(buf2, b, len);
- test_mem_op(b, ==, s, len);
- /* Now free buf2 and retry so we can test allocating */
- generic_buffer_free(buf2);
- buf2 = NULL;
- tt_int_op(0, ==, generic_buffer_set_to_copy(&buf2, buf));
- tt_int_op(len, ==, generic_buffer_len(buf2));
- generic_buffer_get(buf2, b, len);
- test_mem_op(b, ==, s, len);
- /* Clear buf for next test */
- generic_buffer_get(buf, b, len);
- tt_int_op(generic_buffer_len(buf),==,0);
-
- /* Okay, now let's try a bigger buffer. */
- s = "Quis autem vel eum iure reprehenderit qui in ea voluptate velit "
- "esse quam nihil molestiae consequatur, vel illum qui dolorem eum "
- "fugiat quo voluptas nulla pariatur?";
- len = strlen(s);
- for (i = 0; i < 256; ++i) {
- b[0]=i;
- generic_buffer_add(buf, b, 1);
- generic_buffer_add(buf, s, len);
- }
- tt_int_op(0, ==, generic_buffer_set_to_copy(&buf2, buf));
- tt_int_op(generic_buffer_len(buf2), ==, generic_buffer_len(buf));
- for (i = 0; i < 256; ++i) {
- generic_buffer_get(buf2, b, len+1);
- tt_int_op((unsigned char)b[0],==,i);
- test_mem_op(b+1, ==, s, len);
- }
-
- done:
- if (buf)
- generic_buffer_free(buf);
- if (buf2)
- generic_buffer_free(buf2);
-}
-
-/** Run unit tests for buffers.c */
-static void
-test_buffers(void)
-{
- char str[256];
- char str2[256];
-
- buf_t *buf = NULL, *buf2 = NULL;
- const char *cp;
-
- int j;
- size_t r;
-
- /****
- * buf_new
- ****/
- if (!(buf = buf_new()))
- test_fail();
-
- //test_eq(buf_capacity(buf), 4096);
- test_eq(buf_datalen(buf), 0);
-
- /****
- * General pointer frobbing
- */
- for (j=0;j<256;++j) {
- str[j] = (char)j;
- }
- write_to_buf(str, 256, buf);
- write_to_buf(str, 256, buf);
- test_eq(buf_datalen(buf), 512);
- fetch_from_buf(str2, 200, buf);
- test_memeq(str, str2, 200);
- test_eq(buf_datalen(buf), 312);
- memset(str2, 0, sizeof(str2));
-
- fetch_from_buf(str2, 256, buf);
- test_memeq(str+200, str2, 56);
- test_memeq(str, str2+56, 200);
- test_eq(buf_datalen(buf), 56);
- memset(str2, 0, sizeof(str2));
- /* Okay, now we should be 512 bytes into the 4096-byte buffer. If we add
- * another 3584 bytes, we hit the end. */
- for (j=0;j<15;++j) {
- write_to_buf(str, 256, buf);
- }
- assert_buf_ok(buf);
- test_eq(buf_datalen(buf), 3896);
- fetch_from_buf(str2, 56, buf);
- test_eq(buf_datalen(buf), 3840);
- test_memeq(str+200, str2, 56);
- for (j=0;j<15;++j) {
- memset(str2, 0, sizeof(str2));
- fetch_from_buf(str2, 256, buf);
- test_memeq(str, str2, 256);
- }
- test_eq(buf_datalen(buf), 0);
- buf_free(buf);
- buf = NULL;
-
- /* Okay, now make sure growing can work. */
- buf = buf_new_with_capacity(16);
- //test_eq(buf_capacity(buf), 16);
- write_to_buf(str+1, 255, buf);
- //test_eq(buf_capacity(buf), 256);
- fetch_from_buf(str2, 254, buf);
- test_memeq(str+1, str2, 254);
- //test_eq(buf_capacity(buf), 256);
- assert_buf_ok(buf);
- write_to_buf(str, 32, buf);
- //test_eq(buf_capacity(buf), 256);
- assert_buf_ok(buf);
- write_to_buf(str, 256, buf);
- assert_buf_ok(buf);
- //test_eq(buf_capacity(buf), 512);
- test_eq(buf_datalen(buf), 33+256);
- fetch_from_buf(str2, 33, buf);
- test_eq(*str2, str[255]);
-
- test_memeq(str2+1, str, 32);
- //test_eq(buf_capacity(buf), 512);
- test_eq(buf_datalen(buf), 256);
- fetch_from_buf(str2, 256, buf);
- test_memeq(str, str2, 256);
-
- /* now try shrinking: case 1. */
- buf_free(buf);
- buf = buf_new_with_capacity(33668);
- for (j=0;j<67;++j) {
- write_to_buf(str,255, buf);
- }
- //test_eq(buf_capacity(buf), 33668);
- test_eq(buf_datalen(buf), 17085);
- for (j=0; j < 40; ++j) {
- fetch_from_buf(str2, 255,buf);
- test_memeq(str2, str, 255);
- }
-
- /* now try shrinking: case 2. */
- buf_free(buf);
- buf = buf_new_with_capacity(33668);
- for (j=0;j<67;++j) {
- write_to_buf(str,255, buf);
- }
- for (j=0; j < 20; ++j) {
- fetch_from_buf(str2, 255,buf);
- test_memeq(str2, str, 255);
- }
- for (j=0;j<80;++j) {
- write_to_buf(str,255, buf);
- }
- //test_eq(buf_capacity(buf),33668);
- for (j=0; j < 120; ++j) {
- fetch_from_buf(str2, 255,buf);
- test_memeq(str2, str, 255);
- }
-
- /* Move from buf to buf. */
- buf_free(buf);
- buf = buf_new_with_capacity(4096);
- buf2 = buf_new_with_capacity(4096);
- for (j=0;j<100;++j)
- write_to_buf(str, 255, buf);
- test_eq(buf_datalen(buf), 25500);
- for (j=0;j<100;++j) {
- r = 10;
- move_buf_to_buf(buf2, buf, &r);
- test_eq(r, 0);
- }
- test_eq(buf_datalen(buf), 24500);
- test_eq(buf_datalen(buf2), 1000);
- for (j=0;j<3;++j) {
- fetch_from_buf(str2, 255, buf2);
- test_memeq(str2, str, 255);
- }
- r = 8192; /*big move*/
- move_buf_to_buf(buf2, buf, &r);
- test_eq(r, 0);
- r = 30000; /* incomplete move */
- move_buf_to_buf(buf2, buf, &r);
- test_eq(r, 13692);
- for (j=0;j<97;++j) {
- fetch_from_buf(str2, 255, buf2);
- test_memeq(str2, str, 255);
- }
- buf_free(buf);
- buf_free(buf2);
- buf = buf2 = NULL;
-
- buf = buf_new_with_capacity(5);
- cp = "Testing. This is a moderately long Testing string.";
- for (j = 0; cp[j]; j++)
- write_to_buf(cp+j, 1, buf);
- test_eq(0, buf_find_string_offset(buf, "Testing", 7));
- test_eq(1, buf_find_string_offset(buf, "esting", 6));
- test_eq(1, buf_find_string_offset(buf, "est", 3));
- test_eq(39, buf_find_string_offset(buf, "ing str", 7));
- test_eq(35, buf_find_string_offset(buf, "Testing str", 11));
- test_eq(32, buf_find_string_offset(buf, "ng ", 3));
- test_eq(43, buf_find_string_offset(buf, "string.", 7));
- test_eq(-1, buf_find_string_offset(buf, "shrdlu", 6));
- test_eq(-1, buf_find_string_offset(buf, "Testing thing", 13));
- test_eq(-1, buf_find_string_offset(buf, "ngx", 3));
- buf_free(buf);
- buf = NULL;
-
- /* Try adding a string too long for any freelist. */
- {
- char *cp = tor_malloc_zero(65536);
- buf = buf_new();
- write_to_buf(cp, 65536, buf);
- tor_free(cp);
-
- tt_int_op(buf_datalen(buf), ==, 65536);
- buf_free(buf);
- buf = NULL;
- }
-
- done:
- if (buf)
- buf_free(buf);
- if (buf2)
- buf_free(buf2);
-}
-
/** Run unit tests for the onion handshake code. */
static void
test_onion_handshake(void)
@@ -1020,6 +405,49 @@ test_ntor_handshake(void *arg)
}
#endif
+/** Run unit tests for the onion queues. */
+static void
+test_onion_queues(void)
+{
+ uint8_t buf1[TAP_ONIONSKIN_CHALLENGE_LEN] = {0};
+ uint8_t buf2[NTOR_ONIONSKIN_LEN] = {0};
+
+ or_circuit_t *circ1 = or_circuit_new(0, NULL);
+ or_circuit_t *circ2 = or_circuit_new(0, NULL);
+
+ create_cell_t *onionskin = NULL;
+ create_cell_t *create1 = tor_malloc_zero(sizeof(create_cell_t));
+ create_cell_t *create2 = tor_malloc_zero(sizeof(create_cell_t));
+
+ create_cell_init(create1, CELL_CREATE, ONION_HANDSHAKE_TYPE_TAP,
+ TAP_ONIONSKIN_CHALLENGE_LEN, buf1);
+ create_cell_init(create2, CELL_CREATE, ONION_HANDSHAKE_TYPE_NTOR,
+ NTOR_ONIONSKIN_LEN, buf2);
+
+ test_eq(0, onion_num_pending(ONION_HANDSHAKE_TYPE_TAP));
+ test_eq(0, onion_pending_add(circ1, create1));
+ test_eq(1, onion_num_pending(ONION_HANDSHAKE_TYPE_TAP));
+
+ test_eq(0, onion_num_pending(ONION_HANDSHAKE_TYPE_NTOR));
+ test_eq(0, onion_pending_add(circ2, create2));
+ test_eq(1, onion_num_pending(ONION_HANDSHAKE_TYPE_NTOR));
+
+ test_eq_ptr(circ2, onion_next_task(&onionskin));
+ test_eq(1, onion_num_pending(ONION_HANDSHAKE_TYPE_TAP));
+ test_eq(0, onion_num_pending(ONION_HANDSHAKE_TYPE_NTOR));
+
+ clear_pending_onions();
+ test_eq(0, onion_num_pending(ONION_HANDSHAKE_TYPE_TAP));
+ test_eq(0, onion_num_pending(ONION_HANDSHAKE_TYPE_NTOR));
+
+ done:
+ ;
+// circuit_free(circ1);
+// circuit_free(circ2);
+ /* and free create1 and create2 */
+ /* XXX leaks everything here */
+}
+
static void
test_circuit_timeout(void)
{
@@ -1621,6 +1049,34 @@ test_rend_fns(void)
tor_free(intro_points_encrypted);
}
+ /* Record odd numbered fake-IPs using ipv6, even numbered fake-IPs
+ * using ipv4. Since our fake geoip database is the same between
+ * ipv4 and ipv6, we should get the same result no matter which
+ * address family we pick for each IP. */
+#define SET_TEST_ADDRESS(i) do { \
+ if ((i) & 1) { \
+ SET_TEST_IPV6(i); \
+ tor_addr_from_in6(&addr, &in6); \
+ } else { \
+ tor_addr_from_ipv4h(&addr, (uint32_t) i); \
+ } \
+ } while (0)
+
+ /* Make sure that country ID actually works. */
+#define SET_TEST_IPV6(i) \
+ do { \
+ set_uint32(in6.s6_addr + 12, htonl((uint32_t) (i))); \
+ } while (0)
+#define CHECK_COUNTRY(country, val) do { \
+ /* test ipv4 country lookup */ \
+ test_streq(country, \
+ geoip_get_country_name(geoip_get_country_by_ipv4(val))); \
+ /* test ipv6 country lookup */ \
+ SET_TEST_IPV6(val); \
+ test_streq(country, \
+ geoip_get_country_name(geoip_get_country_by_ipv6(&in6))); \
+ } while (0)
+
/** Run unit tests for GeoIP code. */
static void
test_geoip(void)
@@ -1631,7 +1087,8 @@ test_geoip(void)
const char *bridge_stats_1 =
"bridge-stats-end 2010-08-12 13:27:30 (86400 s)\n"
"bridge-ips zz=24,xy=8\n"
- "bridge-ip-versions v4=16,v6=16\n",
+ "bridge-ip-versions v4=16,v6=16\n"
+ "bridge-ip-transports <OR>=24\n",
*dirreq_stats_1 =
"dirreq-stats-end 2010-08-12 13:27:30 (86400 s)\n"
"dirreq-v3-ips ab=8\n"
@@ -1695,21 +1152,6 @@ test_geoip(void)
test_eq(4, geoip_get_n_countries());
memset(&in6, 0, sizeof(in6));
- /* Make sure that country ID actually works. */
-#define SET_TEST_IPV6(i) \
- do { \
- set_uint32(in6.s6_addr + 12, htonl((uint32_t) (i))); \
- } while (0)
-#define CHECK_COUNTRY(country, val) do { \
- /* test ipv4 country lookup */ \
- test_streq(country, \
- geoip_get_country_name(geoip_get_country_by_ipv4(val))); \
- /* test ipv6 country lookup */ \
- SET_TEST_IPV6(val); \
- test_streq(country, \
- geoip_get_country_name(geoip_get_country_by_ipv6(&in6))); \
- } while (0)
-
CHECK_COUNTRY("??", 3);
CHECK_COUNTRY("ab", 32);
CHECK_COUNTRY("??", 5);
@@ -1722,40 +1164,25 @@ test_geoip(void)
SET_TEST_IPV6(3);
test_eq(0, geoip_get_country_by_ipv6(&in6));
-#undef CHECK_COUNTRY
-
- /* Record odd numbered fake-IPs using ipv6, even numbered fake-IPs
- * using ipv4. Since our fake geoip database is the same between
- * ipv4 and ipv6, we should get the same result no matter which
- * address family we pick for each IP. */
-#define SET_TEST_ADDRESS(i) do { \
- if ((i) & 1) { \
- SET_TEST_IPV6(i); \
- tor_addr_from_in6(&addr, &in6); \
- } else { \
- tor_addr_from_ipv4h(&addr, (uint32_t) i); \
- } \
- } while (0)
-
get_options_mutable()->BridgeRelay = 1;
get_options_mutable()->BridgeRecordUsageByCountry = 1;
/* Put 9 observations in AB... */
for (i=32; i < 40; ++i) {
SET_TEST_ADDRESS(i);
- geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, now-7200);
+ geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, NULL, now-7200);
}
SET_TEST_ADDRESS(225);
- geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, now-7200);
+ geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, NULL, now-7200);
/* and 3 observations in XY, several times. */
for (j=0; j < 10; ++j)
for (i=52; i < 55; ++i) {
SET_TEST_ADDRESS(i);
- geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, now-3600);
+ geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, NULL, now-3600);
}
/* and 17 observations in ZZ... */
for (i=110; i < 127; ++i) {
SET_TEST_ADDRESS(i);
- geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, now);
+ geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, NULL, now);
}
geoip_get_client_history(GEOIP_CLIENT_CONNECT, &s, &v);
test_assert(s);
@@ -1804,7 +1231,7 @@ test_geoip(void)
/* Start testing dirreq statistics by making sure that we don't collect
* dirreq stats without initializing them. */
SET_TEST_ADDRESS(100);
- geoip_note_client_seen(GEOIP_CLIENT_NETWORKSTATUS, &addr, now);
+ geoip_note_client_seen(GEOIP_CLIENT_NETWORKSTATUS, &addr, NULL, now);
s = geoip_format_dirreq_stats(now + 86400);
test_assert(!s);
@@ -1812,7 +1239,7 @@ test_geoip(void)
* dirreq-stats history string. */
geoip_dirreq_stats_init(now);
SET_TEST_ADDRESS(100);
- geoip_note_client_seen(GEOIP_CLIENT_NETWORKSTATUS, &addr, now);
+ geoip_note_client_seen(GEOIP_CLIENT_NETWORKSTATUS, &addr, NULL, now);
s = geoip_format_dirreq_stats(now + 86400);
test_streq(dirreq_stats_1, s);
tor_free(s);
@@ -1821,7 +1248,7 @@ test_geoip(void)
* don't generate a history string. */
geoip_dirreq_stats_term();
SET_TEST_ADDRESS(101);
- geoip_note_client_seen(GEOIP_CLIENT_NETWORKSTATUS, &addr, now);
+ geoip_note_client_seen(GEOIP_CLIENT_NETWORKSTATUS, &addr, NULL, now);
s = geoip_format_dirreq_stats(now + 86400);
test_assert(!s);
@@ -1829,7 +1256,7 @@ test_geoip(void)
* that we get an all empty history string. */
geoip_dirreq_stats_init(now);
SET_TEST_ADDRESS(100);
- geoip_note_client_seen(GEOIP_CLIENT_NETWORKSTATUS, &addr, now);
+ geoip_note_client_seen(GEOIP_CLIENT_NETWORKSTATUS, &addr, NULL, now);
geoip_reset_dirreq_stats(now);
s = geoip_format_dirreq_stats(now + 86400);
test_streq(dirreq_stats_2, s);
@@ -1856,7 +1283,7 @@ test_geoip(void)
/* Start testing entry statistics by making sure that we don't collect
* anything without initializing entry stats. */
SET_TEST_ADDRESS(100);
- geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, now);
+ geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, NULL, now);
s = geoip_format_entry_stats(now + 86400);
test_assert(!s);
@@ -1864,7 +1291,7 @@ test_geoip(void)
* entry-stats history string. */
geoip_entry_stats_init(now);
SET_TEST_ADDRESS(100);
- geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, now);
+ geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, NULL, now);
s = geoip_format_entry_stats(now + 86400);
test_streq(entry_stats_1, s);
tor_free(s);
@@ -1873,7 +1300,7 @@ test_geoip(void)
* don't generate a history string. */
geoip_entry_stats_term();
SET_TEST_ADDRESS(101);
- geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, now);
+ geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, NULL, now);
s = geoip_format_entry_stats(now + 86400);
test_assert(!s);
@@ -1881,15 +1308,12 @@ test_geoip(void)
* that we get an all empty history string. */
geoip_entry_stats_init(now);
SET_TEST_ADDRESS(100);
- geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, now);
+ geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, NULL, now);
geoip_reset_entry_stats(now);
s = geoip_format_entry_stats(now + 86400);
test_streq(entry_stats_2, s);
tor_free(s);
-#undef SET_TEST_ADDRESS
-#undef SET_TEST_IPV6
-
/* Stop collecting entry statistics. */
geoip_entry_stats_term();
get_options_mutable()->EntryStatistics = 0;
@@ -1899,6 +1323,79 @@ test_geoip(void)
tor_free(v);
}
+static void
+test_geoip_with_pt(void)
+{
+ time_t now = 1281533250; /* 2010-08-11 13:27:30 UTC */
+ char *s = NULL;
+ int i;
+ tor_addr_t addr;
+ struct in6_addr in6;
+
+ get_options_mutable()->BridgeRelay = 1;
+ get_options_mutable()->BridgeRecordUsageByCountry = 1;
+
+ /* No clients seen yet. */
+ s = geoip_get_transport_history();
+ tor_assert(!s);
+
+ /* 4 connections without a pluggable transport */
+ for (i=0; i < 4; ++i) {
+ SET_TEST_ADDRESS(i);
+ geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, NULL, now-7200);
+ }
+
+ /* 9 connections with "alpha" */
+ for (i=4; i < 13; ++i) {
+ SET_TEST_ADDRESS(i);
+ geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, "alpha", now-7200);
+ }
+
+ /* one connection with "beta" */
+ SET_TEST_ADDRESS(13);
+ geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, "beta", now-7200);
+
+ /* 14 connections with "charlie" */
+ for (i=14; i < 28; ++i) {
+ SET_TEST_ADDRESS(i);
+ geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, "charlie", now-7200);
+ }
+
+ /* 131 connections with "ddr" */
+ for (i=28; i < 159; ++i) {
+ SET_TEST_ADDRESS(i);
+ geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, "ddr", now-7200);
+ }
+
+ /* 8 connections with "entropy" */
+ for (i=159; i < 167; ++i) {
+ SET_TEST_ADDRESS(i);
+ geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, "entropy", now-7200);
+ }
+
+ /* 2 connections from the same IP with two different transports. */
+ SET_TEST_ADDRESS(++i);
+ geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, "fire", now-7200);
+ geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, "google", now-7200);
+
+ /* Test the transport history string. */
+ s = geoip_get_transport_history();
+ tor_assert(s);
+ test_streq(s, "<OR>=8,alpha=16,beta=8,charlie=16,ddr=136,"
+ "entropy=8,fire=8,google=8");
+
+ /* Stop collecting entry statistics. */
+ geoip_entry_stats_term();
+ get_options_mutable()->EntryStatistics = 0;
+
+ done:
+ tor_free(s);
+}
+
+#undef SET_TEST_ADDRESS
+#undef SET_TEST_IPV6
+#undef CHECK_COUNTRY
+
/** Run unit tests for stats code. */
static void
test_stats(void)
@@ -2089,10 +1586,9 @@ const struct testcase_setup_t legacy_setup = {
{ #name, legacy_test_helper, TT_FORK, &legacy_setup, test_ ## name }
static struct testcase_t test_array[] = {
- ENT(buffers),
- { "buffer_copy", test_buffer_copy, 0, NULL, NULL },
ENT(onion_handshake),
{ "bad_onion_handshake", test_bad_onion_handshake, 0, NULL, NULL },
+ ENT(onion_queues),
#ifdef CURVE25519_ENABLED
{ "ntor_handshake", test_ntor_handshake, 0, NULL, NULL },
#endif
@@ -2100,29 +1596,14 @@ static struct testcase_t test_array[] = {
ENT(policies),
ENT(rend_fns),
ENT(geoip),
+ FORK(geoip_with_pt),
FORK(stats),
END_OF_TESTCASES
};
-#define SOCKSENT(name) \
- { #name, test_socks_##name, TT_FORK, &socks_setup, NULL }
-
-static struct testcase_t socks_tests[] = {
- SOCKSENT(4_unsupported_commands),
- SOCKSENT(4_supported_commands),
-
- SOCKSENT(5_unsupported_commands),
- SOCKSENT(5_supported_commands),
- SOCKSENT(5_no_authenticate),
- SOCKSENT(5_auth_before_negotiation),
- SOCKSENT(5_authenticate),
- SOCKSENT(5_authenticate_with_data),
-
- END_OF_TESTCASES
-};
-
extern struct testcase_t addr_tests[];
+extern struct testcase_t buffer_tests[];
extern struct testcase_t crypto_tests[];
extern struct testcase_t container_tests[];
extern struct testcase_t util_tests[];
@@ -2133,21 +1614,33 @@ extern struct testcase_t config_tests[];
extern struct testcase_t introduce_tests[];
extern struct testcase_t replaycache_tests[];
extern struct testcase_t cell_format_tests[];
+extern struct testcase_t circuitlist_tests[];
+extern struct testcase_t circuitmux_tests[];
+extern struct testcase_t cell_queue_tests[];
+extern struct testcase_t options_tests[];
+extern struct testcase_t socks_tests[];
+extern struct testcase_t extorport_tests[];
static struct testgroup_t testgroups[] = {
{ "", test_array },
+ { "buffer/", buffer_tests },
{ "socks/", socks_tests },
{ "addr/", addr_tests },
{ "crypto/", crypto_tests },
{ "container/", container_tests },
{ "util/", util_tests },
{ "cellfmt/", cell_format_tests },
+ { "cellqueue/", cell_queue_tests },
{ "dir/", dir_tests },
{ "dir/md/", microdesc_tests },
{ "pt/", pt_tests },
{ "config/", config_tests },
{ "replaycache/", replaycache_tests },
{ "introduce/", introduce_tests },
+ { "circuitlist/", circuitlist_tests },
+ { "circuitmux/", circuitmux_tests },
+ { "options/", options_tests },
+ { "extorport/", extorport_tests },
END_OF_GROUPS
};
diff --git a/src/test/test_buffers.c b/src/test/test_buffers.c
new file mode 100644
index 000000000..a009faa0b
--- /dev/null
+++ b/src/test/test_buffers.c
@@ -0,0 +1,342 @@
+/* Copyright (c) 2001-2004, Roger Dingledine.
+ * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
+ * Copyright (c) 2007-2013, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#define BUFFERS_PRIVATE
+#include "or.h"
+#include "buffers.h"
+#include "ext_orport.h"
+#include "test.h"
+
+/** Run unit tests for buffers.c */
+static void
+test_buffers_basic(void *arg)
+{
+ char str[256];
+ char str2[256];
+
+ buf_t *buf = NULL, *buf2 = NULL;
+ const char *cp;
+
+ int j;
+ size_t r;
+ (void) arg;
+
+ /****
+ * buf_new
+ ****/
+ if (!(buf = buf_new()))
+ test_fail();
+
+ //test_eq(buf_capacity(buf), 4096);
+ test_eq(buf_datalen(buf), 0);
+
+ /****
+ * General pointer frobbing
+ */
+ for (j=0;j<256;++j) {
+ str[j] = (char)j;
+ }
+ write_to_buf(str, 256, buf);
+ write_to_buf(str, 256, buf);
+ test_eq(buf_datalen(buf), 512);
+ fetch_from_buf(str2, 200, buf);
+ test_memeq(str, str2, 200);
+ test_eq(buf_datalen(buf), 312);
+ memset(str2, 0, sizeof(str2));
+
+ fetch_from_buf(str2, 256, buf);
+ test_memeq(str+200, str2, 56);
+ test_memeq(str, str2+56, 200);
+ test_eq(buf_datalen(buf), 56);
+ memset(str2, 0, sizeof(str2));
+ /* Okay, now we should be 512 bytes into the 4096-byte buffer. If we add
+ * another 3584 bytes, we hit the end. */
+ for (j=0;j<15;++j) {
+ write_to_buf(str, 256, buf);
+ }
+ assert_buf_ok(buf);
+ test_eq(buf_datalen(buf), 3896);
+ fetch_from_buf(str2, 56, buf);
+ test_eq(buf_datalen(buf), 3840);
+ test_memeq(str+200, str2, 56);
+ for (j=0;j<15;++j) {
+ memset(str2, 0, sizeof(str2));
+ fetch_from_buf(str2, 256, buf);
+ test_memeq(str, str2, 256);
+ }
+ test_eq(buf_datalen(buf), 0);
+ buf_free(buf);
+ buf = NULL;
+
+ /* Okay, now make sure growing can work. */
+ buf = buf_new_with_capacity(16);
+ //test_eq(buf_capacity(buf), 16);
+ write_to_buf(str+1, 255, buf);
+ //test_eq(buf_capacity(buf), 256);
+ fetch_from_buf(str2, 254, buf);
+ test_memeq(str+1, str2, 254);
+ //test_eq(buf_capacity(buf), 256);
+ assert_buf_ok(buf);
+ write_to_buf(str, 32, buf);
+ //test_eq(buf_capacity(buf), 256);
+ assert_buf_ok(buf);
+ write_to_buf(str, 256, buf);
+ assert_buf_ok(buf);
+ //test_eq(buf_capacity(buf), 512);
+ test_eq(buf_datalen(buf), 33+256);
+ fetch_from_buf(str2, 33, buf);
+ test_eq(*str2, str[255]);
+
+ test_memeq(str2+1, str, 32);
+ //test_eq(buf_capacity(buf), 512);
+ test_eq(buf_datalen(buf), 256);
+ fetch_from_buf(str2, 256, buf);
+ test_memeq(str, str2, 256);
+
+ /* now try shrinking: case 1. */
+ buf_free(buf);
+ buf = buf_new_with_capacity(33668);
+ for (j=0;j<67;++j) {
+ write_to_buf(str,255, buf);
+ }
+ //test_eq(buf_capacity(buf), 33668);
+ test_eq(buf_datalen(buf), 17085);
+ for (j=0; j < 40; ++j) {
+ fetch_from_buf(str2, 255,buf);
+ test_memeq(str2, str, 255);
+ }
+
+ /* now try shrinking: case 2. */
+ buf_free(buf);
+ buf = buf_new_with_capacity(33668);
+ for (j=0;j<67;++j) {
+ write_to_buf(str,255, buf);
+ }
+ for (j=0; j < 20; ++j) {
+ fetch_from_buf(str2, 255,buf);
+ test_memeq(str2, str, 255);
+ }
+ for (j=0;j<80;++j) {
+ write_to_buf(str,255, buf);
+ }
+ //test_eq(buf_capacity(buf),33668);
+ for (j=0; j < 120; ++j) {
+ fetch_from_buf(str2, 255,buf);
+ test_memeq(str2, str, 255);
+ }
+
+ /* Move from buf to buf. */
+ buf_free(buf);
+ buf = buf_new_with_capacity(4096);
+ buf2 = buf_new_with_capacity(4096);
+ for (j=0;j<100;++j)
+ write_to_buf(str, 255, buf);
+ test_eq(buf_datalen(buf), 25500);
+ for (j=0;j<100;++j) {
+ r = 10;
+ move_buf_to_buf(buf2, buf, &r);
+ test_eq(r, 0);
+ }
+ test_eq(buf_datalen(buf), 24500);
+ test_eq(buf_datalen(buf2), 1000);
+ for (j=0;j<3;++j) {
+ fetch_from_buf(str2, 255, buf2);
+ test_memeq(str2, str, 255);
+ }
+ r = 8192; /*big move*/
+ move_buf_to_buf(buf2, buf, &r);
+ test_eq(r, 0);
+ r = 30000; /* incomplete move */
+ move_buf_to_buf(buf2, buf, &r);
+ test_eq(r, 13692);
+ for (j=0;j<97;++j) {
+ fetch_from_buf(str2, 255, buf2);
+ test_memeq(str2, str, 255);
+ }
+ buf_free(buf);
+ buf_free(buf2);
+ buf = buf2 = NULL;
+
+ buf = buf_new_with_capacity(5);
+ cp = "Testing. This is a moderately long Testing string.";
+ for (j = 0; cp[j]; j++)
+ write_to_buf(cp+j, 1, buf);
+ test_eq(0, buf_find_string_offset(buf, "Testing", 7));
+ test_eq(1, buf_find_string_offset(buf, "esting", 6));
+ test_eq(1, buf_find_string_offset(buf, "est", 3));
+ test_eq(39, buf_find_string_offset(buf, "ing str", 7));
+ test_eq(35, buf_find_string_offset(buf, "Testing str", 11));
+ test_eq(32, buf_find_string_offset(buf, "ng ", 3));
+ test_eq(43, buf_find_string_offset(buf, "string.", 7));
+ test_eq(-1, buf_find_string_offset(buf, "shrdlu", 6));
+ test_eq(-1, buf_find_string_offset(buf, "Testing thing", 13));
+ test_eq(-1, buf_find_string_offset(buf, "ngx", 3));
+ buf_free(buf);
+ buf = NULL;
+
+ /* Try adding a string too long for any freelist. */
+ {
+ char *cp = tor_malloc_zero(65536);
+ buf = buf_new();
+ write_to_buf(cp, 65536, buf);
+ tor_free(cp);
+
+ tt_int_op(buf_datalen(buf), ==, 65536);
+ buf_free(buf);
+ buf = NULL;
+ }
+
+ done:
+ if (buf)
+ buf_free(buf);
+ if (buf2)
+ buf_free(buf2);
+}
+static void
+test_buffer_copy(void *arg)
+{
+ generic_buffer_t *buf=NULL, *buf2=NULL;
+ const char *s;
+ size_t len;
+ char b[256];
+ int i;
+ (void)arg;
+
+ buf = generic_buffer_new();
+ tt_assert(buf);
+
+ /* Copy an empty buffer. */
+ tt_int_op(0, ==, generic_buffer_set_to_copy(&buf2, buf));
+ tt_assert(buf2);
+ tt_int_op(0, ==, generic_buffer_len(buf2));
+
+ /* Now try with a short buffer. */
+ s = "And now comes an act of enormous enormance!";
+ len = strlen(s);
+ generic_buffer_add(buf, s, len);
+ tt_int_op(len, ==, generic_buffer_len(buf));
+ /* Add junk to buf2 so we can test replacing.*/
+ generic_buffer_add(buf2, "BLARG", 5);
+ tt_int_op(0, ==, generic_buffer_set_to_copy(&buf2, buf));
+ tt_int_op(len, ==, generic_buffer_len(buf2));
+ generic_buffer_get(buf2, b, len);
+ test_mem_op(b, ==, s, len);
+ /* Now free buf2 and retry so we can test allocating */
+ generic_buffer_free(buf2);
+ buf2 = NULL;
+ tt_int_op(0, ==, generic_buffer_set_to_copy(&buf2, buf));
+ tt_int_op(len, ==, generic_buffer_len(buf2));
+ generic_buffer_get(buf2, b, len);
+ test_mem_op(b, ==, s, len);
+ /* Clear buf for next test */
+ generic_buffer_get(buf, b, len);
+ tt_int_op(generic_buffer_len(buf),==,0);
+
+ /* Okay, now let's try a bigger buffer. */
+ s = "Quis autem vel eum iure reprehenderit qui in ea voluptate velit "
+ "esse quam nihil molestiae consequatur, vel illum qui dolorem eum "
+ "fugiat quo voluptas nulla pariatur?";
+ len = strlen(s);
+ for (i = 0; i < 256; ++i) {
+ b[0]=i;
+ generic_buffer_add(buf, b, 1);
+ generic_buffer_add(buf, s, len);
+ }
+ tt_int_op(0, ==, generic_buffer_set_to_copy(&buf2, buf));
+ tt_int_op(generic_buffer_len(buf2), ==, generic_buffer_len(buf));
+ for (i = 0; i < 256; ++i) {
+ generic_buffer_get(buf2, b, len+1);
+ tt_int_op((unsigned char)b[0],==,i);
+ test_mem_op(b+1, ==, s, len);
+ }
+
+ done:
+ if (buf)
+ generic_buffer_free(buf);
+ if (buf2)
+ generic_buffer_free(buf2);
+}
+
+static void
+test_buffer_ext_or_cmd(void *arg)
+{
+ ext_or_cmd_t *cmd = NULL;
+ generic_buffer_t *buf = generic_buffer_new();
+ char *tmp = NULL;
+ (void) arg;
+
+ /* Empty -- should give "not there. */
+ tt_int_op(0, ==, generic_buffer_fetch_ext_or_cmd(buf, &cmd));
+ tt_ptr_op(NULL, ==, cmd);
+
+ /* Three bytes: shouldn't work. */
+ generic_buffer_add(buf, "\x00\x20\x00", 3);
+ tt_int_op(0, ==, generic_buffer_fetch_ext_or_cmd(buf, &cmd));
+ tt_ptr_op(NULL, ==, cmd);
+ tt_int_op(3, ==, generic_buffer_len(buf));
+
+ /* 0020 0000: That's a nil command. It should work. */
+ generic_buffer_add(buf, "\x00", 1);
+ tt_int_op(1, ==, generic_buffer_fetch_ext_or_cmd(buf, &cmd));
+ tt_ptr_op(NULL, !=, cmd);
+ tt_int_op(0x20, ==, cmd->cmd);
+ tt_int_op(0, ==, cmd->len);
+ tt_int_op(0, ==, generic_buffer_len(buf));
+ ext_or_cmd_free(cmd);
+ cmd = NULL;
+
+ /* Now try a length-6 command with one byte missing. */
+ generic_buffer_add(buf, "\x10\x21\x00\x06""abcde", 9);
+ tt_int_op(0, ==, generic_buffer_fetch_ext_or_cmd(buf, &cmd));
+ tt_ptr_op(NULL, ==, cmd);
+ generic_buffer_add(buf, "f", 1);
+ tt_int_op(1, ==, generic_buffer_fetch_ext_or_cmd(buf, &cmd));
+ tt_ptr_op(NULL, !=, cmd);
+ tt_int_op(0x1021, ==, cmd->cmd);
+ tt_int_op(6, ==, cmd->len);
+ test_mem_op("abcdef", ==, cmd->body, 6);
+ tt_int_op(0, ==, generic_buffer_len(buf));
+ ext_or_cmd_free(cmd);
+ cmd = NULL;
+
+ /* Now try a length-10 command with 4 extra bytes. */
+ generic_buffer_add(buf, "\xff\xff\x00\x0a"
+ "loremipsum\x10\x00\xff\xff", 18);
+ tt_int_op(1, ==, generic_buffer_fetch_ext_or_cmd(buf, &cmd));
+ tt_ptr_op(NULL, !=, cmd);
+ tt_int_op(0xffff, ==, cmd->cmd);
+ tt_int_op(10, ==, cmd->len);
+ test_mem_op("loremipsum", ==, cmd->body, 10);
+ tt_int_op(4, ==, generic_buffer_len(buf));
+ ext_or_cmd_free(cmd);
+ cmd = NULL;
+
+ /* Finally, let's try a maximum-length command. We already have the header
+ * waiting. */
+ tt_int_op(0, ==, generic_buffer_fetch_ext_or_cmd(buf, &cmd));
+ tmp = tor_malloc_zero(65535);
+ generic_buffer_add(buf, tmp, 65535);
+ tt_int_op(1, ==, generic_buffer_fetch_ext_or_cmd(buf, &cmd));
+ tt_ptr_op(NULL, !=, cmd);
+ tt_int_op(0x1000, ==, cmd->cmd);
+ tt_int_op(0xffff, ==, cmd->len);
+ test_mem_op(tmp, ==, cmd->body, 65535);
+ tt_int_op(0, ==, generic_buffer_len(buf));
+ ext_or_cmd_free(cmd);
+ cmd = NULL;
+
+ done:
+ ext_or_cmd_free(cmd);
+ generic_buffer_free(buf);
+ tor_free(tmp);
+}
+
+struct testcase_t buffer_tests[] = {
+ { "basic", test_buffers_basic, 0, NULL, NULL },
+ { "copy", test_buffer_copy, 0, NULL, NULL },
+ { "ext_or_cmd", test_buffer_ext_or_cmd, 0, NULL, NULL },
+ END_OF_TESTCASES
+};
+
diff --git a/src/test/test_cell_queue.c b/src/test/test_cell_queue.c
new file mode 100644
index 000000000..cf2d11ad5
--- /dev/null
+++ b/src/test/test_cell_queue.c
@@ -0,0 +1,146 @@
+/* Copyright (c) 2013, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#define CIRCUITLIST_PRIVATE
+#define RELAY_PRIVATE
+#include "or.h"
+#include "circuitlist.h"
+#include "relay.h"
+#include "test.h"
+
+static void
+test_cq_manip(void *arg)
+{
+ packed_cell_t *pc1=NULL, *pc2=NULL, *pc3=NULL, *pc4=NULL, *pc_tmp=NULL;
+ cell_queue_t cq;
+ cell_t cell;
+ (void) arg;
+
+ init_cell_pool();
+ cell_queue_init(&cq);
+ tt_int_op(cq.n, ==, 0);
+
+ pc1 = packed_cell_new();
+ pc2 = packed_cell_new();
+ pc3 = packed_cell_new();
+ pc4 = packed_cell_new();
+ tt_assert(pc1 && pc2 && pc3 && pc4);
+
+ tt_ptr_op(NULL, ==, cell_queue_pop(&cq));
+
+ /* Add and remove a singleton. */
+ cell_queue_append(&cq, pc1);
+ tt_int_op(cq.n, ==, 1);
+ tt_ptr_op(pc1, ==, cell_queue_pop(&cq));
+ tt_int_op(cq.n, ==, 0);
+
+ /* Add and remove four items */
+ cell_queue_append(&cq, pc4);
+ cell_queue_append(&cq, pc3);
+ cell_queue_append(&cq, pc2);
+ cell_queue_append(&cq, pc1);
+ tt_int_op(cq.n, ==, 4);
+ tt_ptr_op(pc4, ==, cell_queue_pop(&cq));
+ tt_ptr_op(pc3, ==, cell_queue_pop(&cq));
+ tt_ptr_op(pc2, ==, cell_queue_pop(&cq));
+ tt_ptr_op(pc1, ==, cell_queue_pop(&cq));
+ tt_int_op(cq.n, ==, 0);
+ tt_ptr_op(NULL, ==, cell_queue_pop(&cq));
+
+ /* Try a packed copy (wide, then narrow, which is a bit of a cheat, since a
+ * real cell queue has only one type.) */
+ memset(&cell, 0, sizeof(cell));
+ cell.circ_id = 0x12345678;
+ cell.command = 10;
+ strlcpy((char*)cell.payload, "Lorax ipsum gruvvulus thneed amet, snergelly "
+ "once-ler lerkim, sed do barbaloot tempor gluppitus ut labore et "
+ "truffula magna aliqua.",
+ sizeof(cell.payload));
+ cell_queue_append_packed_copy(&cq, &cell, 1 /*wide*/, 0 /*stats*/);
+ cell.circ_id = 0x2013;
+ cell_queue_append_packed_copy(&cq, &cell, 0 /*wide*/, 0 /*stats*/);
+ tt_int_op(cq.n, ==, 2);
+
+ pc_tmp = cell_queue_pop(&cq);
+ tt_int_op(cq.n, ==, 1);
+ tt_ptr_op(pc_tmp, !=, NULL);
+ test_mem_op(pc_tmp->body, ==, "\x12\x34\x56\x78\x0a", 5);
+ test_mem_op(pc_tmp->body+5, ==, cell.payload, sizeof(cell.payload));
+ packed_cell_free(pc_tmp);
+
+ pc_tmp = cell_queue_pop(&cq);
+ tt_int_op(cq.n, ==, 0);
+ tt_ptr_op(pc_tmp, !=, NULL);
+ test_mem_op(pc_tmp->body, ==, "\x20\x13\x0a", 3);
+ test_mem_op(pc_tmp->body+3, ==, cell.payload, sizeof(cell.payload));
+ packed_cell_free(pc_tmp);
+ pc_tmp = NULL;
+
+ tt_ptr_op(NULL, ==, cell_queue_pop(&cq));
+
+ /* Now make sure cell_queue_clear works. */
+ cell_queue_append(&cq, pc2);
+ cell_queue_append(&cq, pc1);
+ tt_int_op(cq.n, ==, 2);
+ cell_queue_clear(&cq);
+ pc2 = pc1 = NULL; /* prevent double-free */
+ tt_int_op(cq.n, ==, 0);
+
+ done:
+ packed_cell_free(pc1);
+ packed_cell_free(pc2);
+ packed_cell_free(pc3);
+ packed_cell_free(pc4);
+ packed_cell_free(pc_tmp);
+
+ cell_queue_clear(&cq);
+ free_cell_pool();
+}
+
+static void
+test_circuit_n_cells(void *arg)
+{
+ packed_cell_t *pc1=NULL, *pc2=NULL, *pc3=NULL, *pc4=NULL, *pc5=NULL;
+ origin_circuit_t *origin_c=NULL;
+ or_circuit_t *or_c=NULL;
+
+ (void)arg;
+
+ init_cell_pool();
+
+ pc1 = packed_cell_new();
+ pc2 = packed_cell_new();
+ pc3 = packed_cell_new();
+ pc4 = packed_cell_new();
+ pc5 = packed_cell_new();
+ tt_assert(pc1 && pc2 && pc3 && pc4 && pc5);
+
+ or_c = or_circuit_new(0, NULL);
+ origin_c = origin_circuit_new();
+ origin_c->base_.purpose = CIRCUIT_PURPOSE_C_GENERAL;
+
+ tt_int_op(n_cells_in_circ_queues(TO_CIRCUIT(or_c)), ==, 0);
+ cell_queue_append(&or_c->p_chan_cells, pc1);
+ tt_int_op(n_cells_in_circ_queues(TO_CIRCUIT(or_c)), ==, 1);
+ cell_queue_append(&or_c->base_.n_chan_cells, pc2);
+ cell_queue_append(&or_c->base_.n_chan_cells, pc3);
+ tt_int_op(n_cells_in_circ_queues(TO_CIRCUIT(or_c)), ==, 3);
+
+ tt_int_op(n_cells_in_circ_queues(TO_CIRCUIT(origin_c)), ==, 0);
+ cell_queue_append(&origin_c->base_.n_chan_cells, pc4);
+ cell_queue_append(&origin_c->base_.n_chan_cells, pc5);
+ tt_int_op(n_cells_in_circ_queues(TO_CIRCUIT(origin_c)), ==, 2);
+
+ done:
+ circuit_free(TO_CIRCUIT(or_c));
+ circuit_free(TO_CIRCUIT(origin_c));
+
+ free_cell_pool();
+}
+
+struct testcase_t cell_queue_tests[] = {
+ { "basic", test_cq_manip, TT_FORK, NULL, NULL, },
+ { "circ_n_cells", test_circuit_n_cells, TT_FORK, NULL, NULL },
+ END_OF_TESTCASES
+};
+
diff --git a/src/test/test_circuitlist.c b/src/test/test_circuitlist.c
new file mode 100644
index 000000000..720b40765
--- /dev/null
+++ b/src/test/test_circuitlist.c
@@ -0,0 +1,168 @@
+/* Copyright (c) 2013, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#define TOR_CHANNEL_INTERNAL_
+#define CIRCUITLIST_PRIVATE
+#include "or.h"
+#include "channel.h"
+#include "circuitlist.h"
+#include "test.h"
+
+static channel_t *
+new_fake_channel(void)
+{
+ channel_t *chan = tor_malloc_zero(sizeof(channel_t));
+ channel_init(chan);
+ return chan;
+}
+
+static struct {
+ int ncalls;
+ void *cmux;
+ void *circ;
+ cell_direction_t dir;
+} cam;
+
+static void
+circuitmux_attach_mock(circuitmux_t *cmux, circuit_t *circ,
+ cell_direction_t dir)
+{
+ ++cam.ncalls;
+ cam.cmux = cmux;
+ cam.circ = circ;
+ cam.dir = dir;
+}
+
+static struct {
+ int ncalls;
+ void *cmux;
+ void *circ;
+} cdm;
+
+static void
+circuitmux_detach_mock(circuitmux_t *cmux, circuit_t *circ)
+{
+ ++cdm.ncalls;
+ cdm.cmux = cmux;
+ cdm.circ = circ;
+}
+
+#define GOT_CMUX_ATTACH(mux_, circ_, dir_) do { \
+ tt_int_op(cam.ncalls, ==, 1); \
+ tt_ptr_op(cam.cmux, ==, (mux_)); \
+ tt_ptr_op(cam.circ, ==, (circ_)); \
+ tt_ptr_op(cam.dir, ==, (dir_)); \
+ memset(&cam, 0, sizeof(cam)); \
+ } while (0)
+
+#define GOT_CMUX_DETACH(mux_, circ_) do { \
+ tt_int_op(cdm.ncalls, ==, 1); \
+ tt_ptr_op(cdm.cmux, ==, (mux_)); \
+ tt_ptr_op(cdm.circ, ==, (circ_)); \
+ memset(&cdm, 0, sizeof(cdm)); \
+ } while (0)
+
+static void
+test_clist_maps(void *arg)
+{
+ channel_t *ch1 = new_fake_channel();
+ channel_t *ch2 = new_fake_channel();
+ channel_t *ch3 = new_fake_channel();
+ or_circuit_t *or_c1=NULL, *or_c2=NULL;
+
+ (void) arg;
+
+ MOCK(circuitmux_attach_circuit, circuitmux_attach_mock);
+ MOCK(circuitmux_detach_circuit, circuitmux_detach_mock);
+ memset(&cam, 0, sizeof(cam));
+ memset(&cdm, 0, sizeof(cdm));
+
+ ch1->cmux = (void*)0x1001;
+ ch2->cmux = (void*)0x1002;
+ ch3->cmux = (void*)0x1003;
+
+ or_c1 = or_circuit_new(100, ch2);
+ tt_assert(or_c1);
+ GOT_CMUX_ATTACH(ch2->cmux, or_c1, CELL_DIRECTION_IN);
+ tt_int_op(or_c1->p_circ_id, ==, 100);
+ tt_ptr_op(or_c1->p_chan, ==, ch2);
+
+ or_c2 = or_circuit_new(100, ch1);
+ tt_assert(or_c2);
+ GOT_CMUX_ATTACH(ch1->cmux, or_c2, CELL_DIRECTION_IN);
+ tt_int_op(or_c2->p_circ_id, ==, 100);
+ tt_ptr_op(or_c2->p_chan, ==, ch1);
+
+ circuit_set_n_circid_chan(TO_CIRCUIT(or_c1), 200, ch1);
+ GOT_CMUX_ATTACH(ch1->cmux, or_c1, CELL_DIRECTION_OUT);
+
+ circuit_set_n_circid_chan(TO_CIRCUIT(or_c2), 200, ch2);
+ GOT_CMUX_ATTACH(ch2->cmux, or_c2, CELL_DIRECTION_OUT);
+
+ tt_ptr_op(circuit_get_by_circid_channel(200, ch1), ==, TO_CIRCUIT(or_c1));
+ tt_ptr_op(circuit_get_by_circid_channel(200, ch2), ==, TO_CIRCUIT(or_c2));
+ tt_ptr_op(circuit_get_by_circid_channel(100, ch2), ==, TO_CIRCUIT(or_c1));
+ /* Try the same thing again, to test the "fast" path. */
+ tt_ptr_op(circuit_get_by_circid_channel(100, ch2), ==, TO_CIRCUIT(or_c1));
+ tt_assert(circuit_id_in_use_on_channel(100, ch2));
+ tt_assert(! circuit_id_in_use_on_channel(101, ch2));
+
+ /* Try changing the circuitid and channel of that circuit. */
+ circuit_set_p_circid_chan(or_c1, 500, ch3);
+ GOT_CMUX_DETACH(ch2->cmux, TO_CIRCUIT(or_c1));
+ GOT_CMUX_ATTACH(ch3->cmux, TO_CIRCUIT(or_c1), CELL_DIRECTION_IN);
+ tt_ptr_op(circuit_get_by_circid_channel(100, ch2), ==, NULL);
+ tt_assert(! circuit_id_in_use_on_channel(100, ch2));
+ tt_ptr_op(circuit_get_by_circid_channel(500, ch3), ==, TO_CIRCUIT(or_c1));
+
+ /* Now let's see about destroy handling. */
+ tt_assert(! circuit_id_in_use_on_channel(205, ch2));
+ tt_assert(circuit_id_in_use_on_channel(200, ch2));
+ channel_note_destroy_pending(ch2, 200);
+ channel_note_destroy_pending(ch2, 205);
+ channel_note_destroy_pending(ch1, 100);
+ tt_assert(circuit_id_in_use_on_channel(205, ch2))
+ tt_assert(circuit_id_in_use_on_channel(200, ch2));
+ tt_assert(circuit_id_in_use_on_channel(100, ch1));
+
+ tt_assert(TO_CIRCUIT(or_c2)->n_delete_pending != 0);
+ tt_ptr_op(circuit_get_by_circid_channel(200, ch2), ==, TO_CIRCUIT(or_c2));
+ tt_ptr_op(circuit_get_by_circid_channel(100, ch1), ==, TO_CIRCUIT(or_c2));
+
+ /* Okay, now free ch2 and make sure that the circuit ID is STILL not
+ * usable, because we haven't declared the destroy to be nonpending */
+ tt_int_op(cdm.ncalls, ==, 0);
+ circuit_free(TO_CIRCUIT(or_c2));
+ or_c2 = NULL; /* prevent free */
+ tt_int_op(cdm.ncalls, ==, 2);
+ memset(&cdm, 0, sizeof(cdm));
+ tt_assert(circuit_id_in_use_on_channel(200, ch2));
+ tt_assert(circuit_id_in_use_on_channel(100, ch1));
+ tt_ptr_op(circuit_get_by_circid_channel(200, ch2), ==, NULL);
+ tt_ptr_op(circuit_get_by_circid_channel(100, ch1), ==, NULL);
+
+ /* Now say that the destroy is nonpending */
+ channel_note_destroy_not_pending(ch2, 200);
+ tt_ptr_op(circuit_get_by_circid_channel(200, ch2), ==, NULL);
+ channel_note_destroy_not_pending(ch1, 100);
+ tt_ptr_op(circuit_get_by_circid_channel(100, ch1), ==, NULL);
+ tt_assert(! circuit_id_in_use_on_channel(200, ch2));
+ tt_assert(! circuit_id_in_use_on_channel(100, ch1));
+
+ done:
+ tor_free(ch1);
+ tor_free(ch2);
+ tor_free(ch3);
+ if (or_c1)
+ circuit_free(TO_CIRCUIT(or_c1));
+ if (or_c2)
+ circuit_free(TO_CIRCUIT(or_c2));
+ UNMOCK(circuitmux_attach_circuit);
+ UNMOCK(circuitmux_detach_circuit);
+}
+
+struct testcase_t circuitlist_tests[] = {
+ { "maps", test_clist_maps, TT_FORK, NULL, NULL },
+ END_OF_TESTCASES
+};
+
diff --git a/src/test/test_circuitmux.c b/src/test/test_circuitmux.c
new file mode 100644
index 000000000..0f592001c
--- /dev/null
+++ b/src/test/test_circuitmux.c
@@ -0,0 +1,84 @@
+/* Copyright (c) 2013, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#define TOR_CHANNEL_INTERNAL_
+#define CIRCUITMUX_PRIVATE
+#define RELAY_PRIVATE
+#include "or.h"
+#include "channel.h"
+#include "circuitmux.h"
+#include "relay.h"
+#include "test.h"
+
+/* XXXX duplicated function from test_circuitlist.c */
+static channel_t *
+new_fake_channel(void)
+{
+ channel_t *chan = tor_malloc_zero(sizeof(channel_t));
+ channel_init(chan);
+ return chan;
+}
+
+static int
+has_queued_writes(channel_t *c)
+{
+ (void) c;
+ return 1;
+}
+
+/** Test destroy cell queue with no interference from other queues. */
+static void
+test_cmux_destroy_cell_queue(void *arg)
+{
+ circuitmux_t *cmux = NULL;
+ channel_t *ch = NULL;
+ circuit_t *circ = NULL;
+ cell_queue_t *cq = NULL;
+ packed_cell_t *pc = NULL;
+
+ init_cell_pool();
+ (void) arg;
+
+ cmux = circuitmux_alloc();
+ tt_assert(cmux);
+ ch = new_fake_channel();
+ ch->has_queued_writes = has_queued_writes;
+ ch->wide_circ_ids = 1;
+
+ circ = circuitmux_get_first_active_circuit(cmux, &cq);
+ tt_assert(!circ);
+ tt_assert(!cq);
+
+ circuitmux_append_destroy_cell(ch, cmux, 100, 10);
+ circuitmux_append_destroy_cell(ch, cmux, 190, 6);
+ circuitmux_append_destroy_cell(ch, cmux, 30, 1);
+
+ tt_int_op(circuitmux_num_cells(cmux), ==, 3);
+
+ circ = circuitmux_get_first_active_circuit(cmux, &cq);
+ tt_assert(!circ);
+ tt_assert(cq);
+
+ tt_int_op(cq->n, ==, 3);
+
+ pc = cell_queue_pop(cq);
+ tt_assert(pc);
+ test_mem_op(pc->body, ==, "\x00\x00\x00\x64\x04\x0a\x00\x00\x00", 9);
+ packed_cell_free(pc);
+ pc = NULL;
+
+ tt_int_op(circuitmux_num_cells(cmux), ==, 2);
+
+ done:
+ circuitmux_free(cmux);
+ channel_free(ch);
+ packed_cell_free(pc);
+
+ free_cell_pool();
+}
+
+struct testcase_t circuitmux_tests[] = {
+ { "destroy_cell_queue", test_cmux_destroy_cell_queue, TT_FORK, NULL, NULL },
+ END_OF_TESTCASES
+};
+
diff --git a/src/test/test_config.c b/src/test/test_config.c
index 4e9e13e47..6a285db6e 100644
--- a/src/test/test_config.c
+++ b/src/test/test_config.c
@@ -4,6 +4,8 @@
/* See LICENSE for licensing information */
#include "orconfig.h"
+
+#define CONFIG_PRIVATE
#include "or.h"
#include "addressmap.h"
#include "config.h"
@@ -438,14 +440,124 @@ test_config_parse_bridge_line(void *arg)
"aa=b");
}
+static void
+test_config_parse_transport_options_line(void *arg)
+{
+ smartlist_t *options_sl = NULL, *sl_tmp = NULL;
+
+ (void) arg;
+
+ { /* too small line */
+ options_sl = get_options_from_transport_options_line("valley", NULL);
+ test_assert(!options_sl);
+ }
+
+ { /* no k=v values */
+ options_sl = get_options_from_transport_options_line("hit it!", NULL);
+ test_assert(!options_sl);
+ }
+
+ { /* correct line, but wrong transport specified */
+ options_sl =
+ get_options_from_transport_options_line("trebuchet k=v", "rook");
+ test_assert(!options_sl);
+ }
+
+ { /* correct -- no transport specified */
+ sl_tmp = smartlist_new();
+ smartlist_add_asprintf(sl_tmp, "ladi=dadi");
+ smartlist_add_asprintf(sl_tmp, "weliketo=party");
+
+ options_sl =
+ get_options_from_transport_options_line("rook ladi=dadi weliketo=party",
+ NULL);
+ test_assert(options_sl);
+ test_assert(smartlist_strings_eq(options_sl, sl_tmp));
+
+ SMARTLIST_FOREACH(sl_tmp, char *, s, tor_free(s));
+ smartlist_free(sl_tmp);
+ sl_tmp = NULL;
+ SMARTLIST_FOREACH(options_sl, char *, s, tor_free(s));
+ smartlist_free(options_sl);
+ options_sl = NULL;
+ }
+
+ { /* correct -- correct transport specified */
+ sl_tmp = smartlist_new();
+ smartlist_add_asprintf(sl_tmp, "ladi=dadi");
+ smartlist_add_asprintf(sl_tmp, "weliketo=party");
+
+ options_sl =
+ get_options_from_transport_options_line("rook ladi=dadi weliketo=party",
+ "rook");
+ test_assert(options_sl);
+ test_assert(smartlist_strings_eq(options_sl, sl_tmp));
+ SMARTLIST_FOREACH(sl_tmp, char *, s, tor_free(s));
+ smartlist_free(sl_tmp);
+ sl_tmp = NULL;
+ SMARTLIST_FOREACH(options_sl, char *, s, tor_free(s));
+ smartlist_free(options_sl);
+ options_sl = NULL;
+ }
+
+ done:
+ if (options_sl) {
+ SMARTLIST_FOREACH(options_sl, char *, s, tor_free(s));
+ smartlist_free(options_sl);
+ }
+ if (sl_tmp) {
+ SMARTLIST_FOREACH(sl_tmp, char *, s, tor_free(s));
+ smartlist_free(sl_tmp);
+ }
+}
+
+// Tests if an options with MyFamily fingerprints missing '$' normalises
+// them correctly and also ensure it also works with multiple fingerprints
+static void
+test_config_fix_my_family(void *arg)
+{
+ char *err = NULL;
+ const char *family = "$1111111111111111111111111111111111111111, "
+ "1111111111111111111111111111111111111112, "
+ "$1111111111111111111111111111111111111113";
+
+ or_options_t* options = options_new();
+ or_options_t* defaults = options_new();
+ (void) arg;
+
+ options_init(options);
+ options_init(defaults);
+ options->MyFamily = tor_strdup(family);
+
+ options_validate(NULL, options, defaults, 0, &err) ;
+
+ if (err != NULL) {
+ TT_FAIL(("options_validate failed: %s", err));
+ }
+
+ test_streq(options->MyFamily, "$1111111111111111111111111111111111111111, "
+ "$1111111111111111111111111111111111111112, "
+ "$1111111111111111111111111111111111111113");
+
+ done:
+ if (err != NULL) {
+ tor_free(err);
+ }
+
+ or_options_free(options);
+ or_options_free(defaults);
+}
+
#define CONFIG_TEST(name, flags) \
{ #name, test_config_ ## name, flags, NULL, NULL }
struct testcase_t config_tests[] = {
CONFIG_TEST(addressmap, 0),
CONFIG_TEST(parse_bridge_line, 0),
+ CONFIG_TEST(parse_transport_options_line, 0),
CONFIG_TEST(check_or_create_data_subdir, TT_FORK),
CONFIG_TEST(write_to_data_subdir, TT_FORK),
+ CONFIG_TEST(fix_my_family, 0),
END_OF_TESTCASES
};
diff --git a/src/test/test_containers.c b/src/test/test_containers.c
index 005e102e2..6858fa485 100644
--- a/src/test/test_containers.c
+++ b/src/test/test_containers.c
@@ -469,6 +469,51 @@ test_container_smartlist_join(void)
tor_free(joined);
}
+static void
+test_container_smartlist_ints_eq(void *arg)
+{
+ smartlist_t *sl1 = NULL, *sl2 = NULL;
+ int x;
+ (void)arg;
+
+ tt_assert(smartlist_ints_eq(NULL, NULL));
+
+ sl1 = smartlist_new();
+ tt_assert(!smartlist_ints_eq(sl1, NULL));
+ tt_assert(!smartlist_ints_eq(NULL, sl1));
+
+ sl2 = smartlist_new();
+ tt_assert(smartlist_ints_eq(sl1, sl2));
+
+ x = 5;
+ smartlist_add(sl1, tor_memdup(&x, sizeof(int)));
+ smartlist_add(sl2, tor_memdup(&x, sizeof(int)));
+ x = 90;
+ smartlist_add(sl1, tor_memdup(&x, sizeof(int)));
+ smartlist_add(sl2, tor_memdup(&x, sizeof(int)));
+ tt_assert(smartlist_ints_eq(sl1, sl2));
+
+ x = -50;
+ smartlist_add(sl1, tor_memdup(&x, sizeof(int)));
+ tt_assert(! smartlist_ints_eq(sl1, sl2));
+ tt_assert(! smartlist_ints_eq(sl2, sl1));
+ smartlist_add(sl2, tor_memdup(&x, sizeof(int)));
+ tt_assert(smartlist_ints_eq(sl1, sl2));
+
+ *(int*)smartlist_get(sl1, 1) = 101010;
+ tt_assert(! smartlist_ints_eq(sl2, sl1));
+ *(int*)smartlist_get(sl2, 1) = 101010;
+ tt_assert(smartlist_ints_eq(sl1, sl2));
+
+ done:
+ if (sl1)
+ SMARTLIST_FOREACH(sl1, int *, ip, tor_free(ip));
+ if (sl2)
+ SMARTLIST_FOREACH(sl2, int *, ip, tor_free(ip));
+ smartlist_free(sl1);
+ smartlist_free(sl2);
+}
+
/** Run unit tests for bitarray code */
static void
test_container_bitarray(void)
@@ -784,7 +829,7 @@ test_container_order_functions(void)
}
static void
-test_di_map(void *arg)
+test_container_di_map(void *arg)
{
di_digest256_map_t *map = NULL;
const uint8_t key1[] = "In view of the fact that it was ";
@@ -912,18 +957,22 @@ test_container_fp_pair_map(void)
#define CONTAINER_LEGACY(name) \
{ #name, legacy_test_helper, 0, &legacy_setup, test_container_ ## name }
+#define CONTAINER(name, flags) \
+ { #name, test_container_ ## name, (flags), NULL, NULL }
+
struct testcase_t container_tests[] = {
CONTAINER_LEGACY(smartlist_basic),
CONTAINER_LEGACY(smartlist_strings),
CONTAINER_LEGACY(smartlist_overlap),
CONTAINER_LEGACY(smartlist_digests),
CONTAINER_LEGACY(smartlist_join),
+ CONTAINER(smartlist_ints_eq, 0),
CONTAINER_LEGACY(bitarray),
CONTAINER_LEGACY(digestset),
CONTAINER_LEGACY(strmap),
CONTAINER_LEGACY(pqueue),
CONTAINER_LEGACY(order_functions),
- { "di_map", test_di_map, 0, NULL, NULL },
+ CONTAINER(di_map, 0),
CONTAINER_LEGACY(fp_pair_map),
END_OF_TESTCASES
};
diff --git a/src/test/test_crypto.c b/src/test/test_crypto.c
index f391cce6e..9dc43b1d2 100644
--- a/src/test/test_crypto.c
+++ b/src/test/test_crypto.c
@@ -4,7 +4,6 @@
/* See LICENSE for licensing information */
#include "orconfig.h"
-#define CRYPTO_PRIVATE
#define CRYPTO_CURVE25519_PRIVATE
#include "or.h"
#include "test.h"
@@ -632,7 +631,7 @@ test_crypto_formats(void)
data1 = tor_strdup("ABCD1234ABCD56780000ABCD1234ABCD56780000");
test_eq(strlen(data1), 40);
data2 = tor_malloc(FINGERPRINT_LEN+1);
- add_spaces_to_fp(data2, FINGERPRINT_LEN+1, data1);
+ crypto_add_spaces_to_fp(data2, FINGERPRINT_LEN+1, data1);
test_streq(data2, "ABCD 1234 ABCD 5678 0000 ABCD 1234 ABCD 5678 0000");
tor_free(data1);
tor_free(data2);
diff --git a/src/test/test_dir.c b/src/test/test_dir.c
index 6c2915d09..a82ccb086 100644
--- a/src/test/test_dir.c
+++ b/src/test/test_dir.c
@@ -214,8 +214,10 @@ test_dir_formats(void)
strlcat(buf2, "signing-key\n", sizeof(buf2));
strlcat(buf2, pk1_str, sizeof(buf2));
strlcat(buf2, "hidden-service-dir\n", sizeof(buf2));
+#ifdef CURVE25519_ENABLED
strlcat(buf2, "ntor-onion-key "
"skyinAnvardNostarsNomoonNowindormistsorsnow=\n", sizeof(buf2));
+#endif
strlcat(buf2, "accept *:80\nreject 18.0.0.0/8:24\n", sizeof(buf2));
strlcat(buf2, "router-signature\n", sizeof(buf2));
@@ -235,9 +237,11 @@ test_dir_formats(void)
test_eq(rp2->bandwidthrate, r2->bandwidthrate);
test_eq(rp2->bandwidthburst, r2->bandwidthburst);
test_eq(rp2->bandwidthcapacity, r2->bandwidthcapacity);
+#ifdef CURVE25519_ENABLED
test_memeq(rp2->onion_curve25519_pkey->public_key,
r2->onion_curve25519_pkey->public_key,
CURVE25519_PUBKEY_LEN);
+#endif
test_assert(crypto_pk_cmp_keys(rp2->onion_pkey, pk2) == 0);
test_assert(crypto_pk_cmp_keys(rp2->identity_pkey, pk1) == 0);
@@ -2364,6 +2368,74 @@ test_dir_fmt_control_ns(void *arg)
tor_free(s);
}
+static void
+test_dir_http_handling(void *args)
+{
+ char *url = NULL;
+ (void)args;
+
+ /* Parse http url tests: */
+ /* Good headers */
+ test_eq(parse_http_url("GET /tor/a/b/c.txt HTTP/1.1\r\n"
+ "Host: example.com\r\n"
+ "User-Agent: Mozilla/5.0 (Windows;"
+ " U; Windows NT 6.1; en-US; rv:1.9.1.5)\r\n",
+ &url), 0);
+ test_streq(url, "/tor/a/b/c.txt");
+ tor_free(url);
+
+ test_eq(parse_http_url("GET /tor/a/b/c.txt HTTP/1.0\r\n", &url), 0);
+ test_streq(url, "/tor/a/b/c.txt");
+ tor_free(url);
+
+ test_eq(parse_http_url("GET /tor/a/b/c.txt HTTP/1.600\r\n", &url), 0);
+ test_streq(url, "/tor/a/b/c.txt");
+ tor_free(url);
+
+ /* Should prepend '/tor/' to url if required */
+ test_eq(parse_http_url("GET /a/b/c.txt HTTP/1.1\r\n"
+ "Host: example.com\r\n"
+ "User-Agent: Mozilla/5.0 (Windows;"
+ " U; Windows NT 6.1; en-US; rv:1.9.1.5)\r\n",
+ &url), 0);
+ test_streq(url, "/tor/a/b/c.txt");
+ tor_free(url);
+
+ /* Bad headers -- no HTTP/1.x*/
+ test_eq(parse_http_url("GET /a/b/c.txt\r\n"
+ "Host: example.com\r\n"
+ "User-Agent: Mozilla/5.0 (Windows;"
+ " U; Windows NT 6.1; en-US; rv:1.9.1.5)\r\n",
+ &url), -1);
+ tt_assert(!url);
+
+ /* Bad headers */
+ test_eq(parse_http_url("GET /a/b/c.txt\r\n"
+ "Host: example.com\r\n"
+ "User-Agent: Mozilla/5.0 (Windows;"
+ " U; Windows NT 6.1; en-US; rv:1.9.1.5)\r\n",
+ &url), -1);
+ tt_assert(!url);
+
+ test_eq(parse_http_url("GET /tor/a/b/c.txt", &url), -1);
+ tt_assert(!url);
+
+ test_eq(parse_http_url("GET /tor/a/b/c.txt HTTP/1.1", &url), -1);
+ tt_assert(!url);
+
+ test_eq(parse_http_url("GET /tor/a/b/c.txt HTTP/1.1x\r\n", &url), -1);
+ tt_assert(!url);
+
+ test_eq(parse_http_url("GET /tor/a/b/c.txt HTTP/1.", &url), -1);
+ tt_assert(!url);
+
+ test_eq(parse_http_url("GET /tor/a/b/c.txt HTTP/1.\r", &url), -1);
+ tt_assert(!url);
+
+ done:
+ tor_free(url);
+}
+
#define DIR_LEGACY(name) \
{ #name, legacy_test_helper, TT_FORK, &legacy_setup, test_dir_ ## name }
@@ -2386,6 +2458,7 @@ struct testcase_t dir_tests[] = {
DIR_LEGACY(clip_unmeasured_bw_kb_alt),
DIR(v2_dir, TT_FORK),
DIR(fmt_control_ns, 0),
+ DIR(http_handling, 0),
END_OF_TESTCASES
};
diff --git a/src/test/test_extorport.c b/src/test/test_extorport.c
new file mode 100644
index 000000000..7e38ba57d
--- /dev/null
+++ b/src/test/test_extorport.c
@@ -0,0 +1,604 @@
+/* Copyright (c) 2013, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#define CONNECTION_PRIVATE
+#define EXT_ORPORT_PRIVATE
+#define MAIN_PRIVATE
+#include "or.h"
+#include "buffers.h"
+#include "connection.h"
+#include "connection_or.h"
+#include "config.h"
+#include "control.h"
+#include "ext_orport.h"
+#include "main.h"
+#include "test.h"
+
+/* Test connection_or_remove_from_ext_or_id_map and
+ * connection_or_set_ext_or_identifier */
+static void
+test_ext_or_id_map(void *arg)
+{
+ or_connection_t *c1 = NULL, *c2 = NULL, *c3 = NULL;
+ char *idp = NULL, *idp2 = NULL;
+ (void)arg;
+
+ /* pre-initialization */
+ tt_ptr_op(NULL, ==, connection_or_get_by_ext_or_id("xxxxxxxxxxxxxxxxxxxx"));
+
+ c1 = or_connection_new(CONN_TYPE_EXT_OR, AF_INET);
+ c2 = or_connection_new(CONN_TYPE_EXT_OR, AF_INET);
+ c3 = or_connection_new(CONN_TYPE_OR, AF_INET);
+
+ tt_ptr_op(c1->ext_or_conn_id, !=, NULL);
+ tt_ptr_op(c2->ext_or_conn_id, !=, NULL);
+ tt_ptr_op(c3->ext_or_conn_id, ==, NULL);
+
+ tt_ptr_op(c1, ==, connection_or_get_by_ext_or_id(c1->ext_or_conn_id));
+ tt_ptr_op(c2, ==, connection_or_get_by_ext_or_id(c2->ext_or_conn_id));
+ tt_ptr_op(NULL, ==, connection_or_get_by_ext_or_id("xxxxxxxxxxxxxxxxxxxx"));
+
+ idp = tor_memdup(c2->ext_or_conn_id, EXT_OR_CONN_ID_LEN);
+
+ /* Give c2 a new ID. */
+ connection_or_set_ext_or_identifier(c2);
+ test_mem_op(idp, !=, c2->ext_or_conn_id, EXT_OR_CONN_ID_LEN);
+ idp2 = tor_memdup(c2->ext_or_conn_id, EXT_OR_CONN_ID_LEN);
+ tt_assert(!tor_digest_is_zero(idp2));
+
+ tt_ptr_op(NULL, ==, connection_or_get_by_ext_or_id(idp));
+ tt_ptr_op(c2, ==, connection_or_get_by_ext_or_id(idp2));
+
+ /* Now remove it. */
+ connection_or_remove_from_ext_or_id_map(c2);
+ tt_ptr_op(NULL, ==, connection_or_get_by_ext_or_id(idp));
+ tt_ptr_op(NULL, ==, connection_or_get_by_ext_or_id(idp2));
+
+ done:
+ if (c1)
+ connection_free_(TO_CONN(c1));
+ if (c2)
+ connection_free_(TO_CONN(c2));
+ if (c3)
+ connection_free_(TO_CONN(c3));
+ tor_free(idp);
+ tor_free(idp2);
+ connection_or_clear_ext_or_id_map();
+}
+
+/* Simple connection_write_to_buf_impl_ replacement that unconditionally
+ * writes to outbuf. */
+static void
+connection_write_to_buf_impl_replacement(const char *string, size_t len,
+ connection_t *conn, int zlib)
+{
+ (void) zlib;
+
+ tor_assert(string);
+ tor_assert(conn);
+ write_to_buf(string, len, conn->outbuf);
+}
+
+static char *
+buf_get_contents(buf_t *buf, size_t *sz_out)
+{
+ char *out;
+ *sz_out = buf_datalen(buf);
+ if (*sz_out >= ULONG_MAX)
+ return NULL; /* C'mon, really? */
+ out = tor_malloc(*sz_out + 1);
+ if (fetch_from_buf(out, (unsigned long)*sz_out, buf) != 0) {
+ tor_free(out);
+ return NULL;
+ }
+ out[*sz_out] = '\0'; /* Hopefully gratuitous. */
+ return out;
+}
+
+static void
+test_ext_or_write_command(void *arg)
+{
+ or_connection_t *c1;
+ char *cp = NULL;
+ char *buf = NULL;
+ size_t sz;
+
+ (void) arg;
+ MOCK(connection_write_to_buf_impl_,
+ connection_write_to_buf_impl_replacement);
+
+ c1 = or_connection_new(CONN_TYPE_EXT_OR, AF_INET);
+ tt_assert(c1);
+
+ /* Length too long */
+ tt_int_op(connection_write_ext_or_command(TO_CONN(c1), 100, "X", 100000),
+ <, 0);
+
+ /* Empty command */
+ tt_int_op(connection_write_ext_or_command(TO_CONN(c1), 0x99, NULL, 0),
+ ==, 0);
+ cp = buf_get_contents(TO_CONN(c1)->outbuf, &sz);
+ tt_int_op(sz, ==, 4);
+ test_mem_op(cp, ==, "\x00\x99\x00\x00", 4);
+ tor_free(cp);
+
+ /* Medium command. */
+ tt_int_op(connection_write_ext_or_command(TO_CONN(c1), 0x99,
+ "Wai\0Hello", 9), ==, 0);
+ cp = buf_get_contents(TO_CONN(c1)->outbuf, &sz);
+ tt_int_op(sz, ==, 13);
+ test_mem_op(cp, ==, "\x00\x99\x00\x09Wai\x00Hello", 13);
+ tor_free(cp);
+
+ /* Long command */
+ buf = tor_malloc(65535);
+ memset(buf, 'x', 65535);
+ tt_int_op(connection_write_ext_or_command(TO_CONN(c1), 0xf00d,
+ buf, 65535), ==, 0);
+ cp = buf_get_contents(TO_CONN(c1)->outbuf, &sz);
+ tt_int_op(sz, ==, 65539);
+ test_mem_op(cp, ==, "\xf0\x0d\xff\xff", 4);
+ test_mem_op(cp+4, ==, buf, 65535);
+ tor_free(cp);
+
+ done:
+ if (c1)
+ connection_free_(TO_CONN(c1));
+ tor_free(cp);
+ tor_free(buf);
+ UNMOCK(connection_write_to_buf_impl_);
+}
+
+static int
+write_bytes_to_file_fail(const char *fname, const char *str, size_t len,
+ int bin)
+{
+ (void) fname;
+ (void) str;
+ (void) len;
+ (void) bin;
+
+ return -1;
+}
+
+static void
+test_ext_or_init_auth(void *arg)
+{
+ or_options_t *options = get_options_mutable();
+ const char *fn;
+ char *cp = NULL;
+ struct stat st;
+ char cookie0[32];
+ (void)arg;
+
+ /* Check default filename location */
+ options->DataDirectory = tor_strdup("foo");
+ cp = get_ext_or_auth_cookie_file_name();
+ tt_str_op(cp, ==, "foo"PATH_SEPARATOR"extended_orport_auth_cookie");
+ tor_free(cp);
+
+ /* Shouldn't be initialized already, or our tests will be a bit
+ * meaningless */
+ ext_or_auth_cookie = tor_malloc_zero(32);
+ test_assert(tor_mem_is_zero((char*)ext_or_auth_cookie, 32));
+
+ /* Now make sure we use a temporary file */
+ fn = get_fname("ext_cookie_file");
+ options->ExtORPortCookieAuthFile = tor_strdup(fn);
+ cp = get_ext_or_auth_cookie_file_name();
+ tt_str_op(cp, ==, fn);
+ tor_free(cp);
+
+ /* Test the initialization function with a broken
+ write_bytes_to_file(). See if the problem is handled properly. */
+ MOCK(write_bytes_to_file, write_bytes_to_file_fail);
+ tt_int_op(-1, ==, init_ext_or_cookie_authentication(1));
+ tt_int_op(ext_or_auth_cookie_is_set, ==, 0);
+ UNMOCK(write_bytes_to_file);
+
+ /* Now do the actual initialization. */
+ tt_int_op(0, ==, init_ext_or_cookie_authentication(1));
+ tt_int_op(ext_or_auth_cookie_is_set, ==, 1);
+ cp = read_file_to_str(fn, RFTS_BIN, &st);
+ tt_ptr_op(cp, !=, NULL);
+ tt_int_op(st.st_size, ==, 64);
+ test_memeq(cp, "! Extended ORPort Auth Cookie !\x0a", 32);
+ test_memeq(cp+32, ext_or_auth_cookie, 32);
+ memcpy(cookie0, ext_or_auth_cookie, 32);
+ test_assert(!tor_mem_is_zero((char*)ext_or_auth_cookie, 32));
+
+ /* Operation should be idempotent. */
+ tt_int_op(0, ==, init_ext_or_cookie_authentication(1));
+ test_memeq(cookie0, ext_or_auth_cookie, 32);
+
+ done:
+ tor_free(cp);
+ ext_orport_free_all();
+}
+
+static void
+test_ext_or_cookie_auth(void *arg)
+{
+ char *reply=NULL, *reply2=NULL, *client_hash=NULL, *client_hash2=NULL;
+ size_t reply_len=0;
+ char hmac1[32], hmac2[32];
+
+ const char client_nonce[32] =
+ "Who is the third who walks alway";
+ char server_hash_input[] =
+ "ExtORPort authentication server-to-client hash"
+ "Who is the third who walks alway"
+ "................................";
+ char client_hash_input[] =
+ "ExtORPort authentication client-to-server hash"
+ "Who is the third who walks alway"
+ "................................";
+
+ (void)arg;
+
+ tt_int_op(strlen(client_hash_input), ==, 46+32+32);
+ tt_int_op(strlen(server_hash_input), ==, 46+32+32);
+
+ ext_or_auth_cookie = tor_malloc_zero(32);
+ memcpy(ext_or_auth_cookie, "s beside you? When I count, ther", 32);
+ ext_or_auth_cookie_is_set = 1;
+
+ /* For this authentication, the client sends 32 random bytes (ClientNonce)
+ * The server replies with 32 byte ServerHash and 32 byte ServerNonce,
+ * where ServerHash is:
+ * HMAC-SHA256(CookieString,
+ * "ExtORPort authentication server-to-client hash" | ClientNonce |
+ * ServerNonce)"
+ * The client must reply with 32-byte ClientHash, which we compute as:
+ * ClientHash is computed as:
+ * HMAC-SHA256(CookieString,
+ * "ExtORPort authentication client-to-server hash" | ClientNonce |
+ * ServerNonce)
+ */
+
+ /* Wrong length */
+ tt_int_op(-1, ==,
+ handle_client_auth_nonce(client_nonce, 33, &client_hash, &reply,
+ &reply_len));
+ tt_int_op(-1, ==,
+ handle_client_auth_nonce(client_nonce, 31, &client_hash, &reply,
+ &reply_len));
+
+ /* Now let's try this for real! */
+ tt_int_op(0, ==,
+ handle_client_auth_nonce(client_nonce, 32, &client_hash, &reply,
+ &reply_len));
+ tt_int_op(reply_len, ==, 64);
+ tt_ptr_op(reply, !=, NULL);
+ tt_ptr_op(client_hash, !=, NULL);
+ /* Fill in the server nonce into the hash inputs... */
+ memcpy(server_hash_input+46+32, reply+32, 32);
+ memcpy(client_hash_input+46+32, reply+32, 32);
+ /* Check the HMACs are correct... */
+ crypto_hmac_sha256(hmac1, (char*)ext_or_auth_cookie, 32, server_hash_input,
+ 46+32+32);
+ crypto_hmac_sha256(hmac2, (char*)ext_or_auth_cookie, 32, client_hash_input,
+ 46+32+32);
+ test_memeq(hmac1, reply, 32);
+ test_memeq(hmac2, client_hash, 32);
+
+ /* Now do it again and make sure that the results are *different* */
+ tt_int_op(0, ==,
+ handle_client_auth_nonce(client_nonce, 32, &client_hash2, &reply2,
+ &reply_len));
+ test_memneq(reply2, reply, reply_len);
+ test_memneq(client_hash2, client_hash, 32);
+ /* But that this one checks out too. */
+ memcpy(server_hash_input+46+32, reply2+32, 32);
+ memcpy(client_hash_input+46+32, reply2+32, 32);
+ /* Check the HMACs are correct... */
+ crypto_hmac_sha256(hmac1, (char*)ext_or_auth_cookie, 32, server_hash_input,
+ 46+32+32);
+ crypto_hmac_sha256(hmac2, (char*)ext_or_auth_cookie, 32, client_hash_input,
+ 46+32+32);
+ test_memeq(hmac1, reply2, 32);
+ test_memeq(hmac2, client_hash2, 32);
+
+ done:
+ tor_free(reply);
+ tor_free(client_hash);
+ tor_free(reply2);
+ tor_free(client_hash2);
+}
+
+static int
+crypto_rand_return_tse_str(char *to, size_t n)
+{
+ if (n != 32) {
+ TT_FAIL(("Asked for %d bytes, not 32", (int)n));
+ return -1;
+ }
+ memcpy(to, "te road There is always another ", 32);
+ return 0;
+}
+
+static void
+test_ext_or_cookie_auth_testvec(void *arg)
+{
+ char *reply=NULL, *client_hash=NULL;
+ size_t reply_len;
+ char *mem_op_hex_tmp=NULL;
+
+ const char client_nonce[] = "But when I look ahead up the whi";
+ (void)arg;
+
+ ext_or_auth_cookie = tor_malloc_zero(32);
+ memcpy(ext_or_auth_cookie, "Gliding wrapt in a brown mantle," , 32);
+ ext_or_auth_cookie_is_set = 1;
+
+ MOCK(crypto_rand, crypto_rand_return_tse_str);
+
+ tt_int_op(0, ==,
+ handle_client_auth_nonce(client_nonce, 32, &client_hash, &reply,
+ &reply_len));
+ tt_ptr_op(reply, !=, NULL );
+ tt_ptr_op(reply_len, ==, 64);
+ test_memeq(reply+32, "te road There is always another ", 32);
+ /* HMACSHA256("Gliding wrapt in a brown mantle,"
+ * "ExtORPort authentication server-to-client hash"
+ * "But when I look ahead up the write road There is always another ");
+ */
+ test_memeq_hex(reply,
+ "ec80ed6e546d3b36fdfc22fe1315416b"
+ "029f1ade7610d910878b62eeb7403821");
+ /* HMACSHA256("Gliding wrapt in a brown mantle,"
+ * "ExtORPort authentication client-to-server hash"
+ * "But when I look ahead up the write road There is always another ");
+ * (Both values computed using Python CLI.)
+ */
+ test_memeq_hex(client_hash,
+ "ab391732dd2ed968cd40c087d1b1f25b"
+ "33b3cd77ff79bd80c2074bbf438119a2");
+
+ done:
+ UNMOCK(crypto_rand);
+ tor_free(reply);
+ tor_free(client_hash);
+ tor_free(mem_op_hex_tmp);
+}
+
+static void
+ignore_bootstrap_problem(const char *warn, int reason)
+{
+ (void)warn;
+ (void)reason;
+}
+
+static int is_reading = 1;
+static int handshake_start_called = 0;
+
+static void
+note_read_stopped(connection_t *conn)
+{
+ (void)conn;
+ is_reading=0;
+}
+static void
+note_read_started(connection_t *conn)
+{
+ (void)conn;
+ is_reading=1;
+}
+static int
+handshake_start(or_connection_t *conn, int receiving)
+{
+ if (!conn || !receiving)
+ TT_FAIL(("Bad arguments to handshake_start"));
+ handshake_start_called = 1;
+ return 0;
+}
+
+#define WRITE(s,n) \
+ do { \
+ write_to_buf((s), (n), TO_CONN(conn)->inbuf); \
+ } while (0)
+#define CONTAINS(s,n) \
+ do { \
+ tt_int_op((n), <=, sizeof(b)); \
+ tt_int_op(buf_datalen(TO_CONN(conn)->outbuf), ==, (n)); \
+ if ((n)) { \
+ fetch_from_buf(b, (n), TO_CONN(conn)->outbuf); \
+ test_memeq(b, (s), (n)); \
+ } \
+ } while (0)
+
+/* Helper: Do a successful Extended ORPort authentication handshake. */
+static void
+do_ext_or_handshake(or_connection_t *conn)
+{
+ char b[256];
+
+ tt_int_op(0, ==, connection_ext_or_start_auth(conn));
+ CONTAINS("\x01\x00", 2);
+ WRITE("\x01", 1);
+ WRITE("But when I look ahead up the whi", 32);
+ MOCK(crypto_rand, crypto_rand_return_tse_str);
+ tt_int_op(0, ==, connection_ext_or_process_inbuf(conn));
+ UNMOCK(crypto_rand);
+ tt_int_op(TO_CONN(conn)->state, ==, EXT_OR_CONN_STATE_AUTH_WAIT_CLIENT_HASH);
+ CONTAINS("\xec\x80\xed\x6e\x54\x6d\x3b\x36\xfd\xfc\x22\xfe\x13\x15\x41\x6b"
+ "\x02\x9f\x1a\xde\x76\x10\xd9\x10\x87\x8b\x62\xee\xb7\x40\x38\x21"
+ "te road There is always another ", 64);
+ /* Send the right response this time. */
+ WRITE("\xab\x39\x17\x32\xdd\x2e\xd9\x68\xcd\x40\xc0\x87\xd1\xb1\xf2\x5b"
+ "\x33\xb3\xcd\x77\xff\x79\xbd\x80\xc2\x07\x4b\xbf\x43\x81\x19\xa2",
+ 32);
+ tt_int_op(0, ==, connection_ext_or_process_inbuf(conn));
+ CONTAINS("\x01", 1);
+ tt_assert(! TO_CONN(conn)->marked_for_close);
+ tt_int_op(TO_CONN(conn)->state, ==, EXT_OR_CONN_STATE_OPEN);
+
+ done: ;
+}
+
+static void
+test_ext_or_handshake(void *arg)
+{
+ or_connection_t *conn=NULL;
+ char b[256];
+
+ (void) arg;
+ MOCK(connection_write_to_buf_impl_,
+ connection_write_to_buf_impl_replacement);
+ /* Use same authenticators as for test_ext_or_cookie_auth_testvec */
+ ext_or_auth_cookie = tor_malloc_zero(32);
+ memcpy(ext_or_auth_cookie, "Gliding wrapt in a brown mantle," , 32);
+ ext_or_auth_cookie_is_set = 1;
+
+ init_connection_lists();
+
+ conn = or_connection_new(CONN_TYPE_EXT_OR, AF_INET);
+ tt_int_op(0, ==, connection_ext_or_start_auth(conn));
+ /* The server starts by telling us about the one supported authtype. */
+ CONTAINS("\x01\x00", 2);
+ /* Say the client hasn't responded yet. */
+ tt_int_op(0, ==, connection_ext_or_process_inbuf(conn));
+ /* Let's say the client replies badly. */
+ WRITE("\x99", 1);
+ tt_int_op(-1, ==, connection_ext_or_process_inbuf(conn));
+ CONTAINS("", 0);
+ tt_assert(TO_CONN(conn)->marked_for_close);
+ close_closeable_connections();
+ conn = NULL;
+
+ /* Okay, try again. */
+ conn = or_connection_new(CONN_TYPE_EXT_OR, AF_INET);
+ tt_int_op(0, ==, connection_ext_or_start_auth(conn));
+ CONTAINS("\x01\x00", 2);
+ /* Let's say the client replies sensibly this time. "Yes, AUTHTYPE_COOKIE
+ * sounds delicious. Let's have some of that!" */
+ WRITE("\x01", 1);
+ /* Let's say that the client also sends part of a nonce. */
+ WRITE("But when I look ", 16);
+ tt_int_op(0, ==, connection_ext_or_process_inbuf(conn));
+ CONTAINS("", 0);
+ tt_int_op(TO_CONN(conn)->state, ==,
+ EXT_OR_CONN_STATE_AUTH_WAIT_CLIENT_NONCE);
+ /* Pump it again. Nothing should happen. */
+ tt_int_op(0, ==, connection_ext_or_process_inbuf(conn));
+ /* send the rest of the nonce. */
+ WRITE("ahead up the whi", 16);
+ MOCK(crypto_rand, crypto_rand_return_tse_str);
+ tt_int_op(0, ==, connection_ext_or_process_inbuf(conn));
+ UNMOCK(crypto_rand);
+ /* We should get the right reply from the server. */
+ CONTAINS("\xec\x80\xed\x6e\x54\x6d\x3b\x36\xfd\xfc\x22\xfe\x13\x15\x41\x6b"
+ "\x02\x9f\x1a\xde\x76\x10\xd9\x10\x87\x8b\x62\xee\xb7\x40\x38\x21"
+ "te road There is always another ", 64);
+ /* Send the wrong response. */
+ WRITE("not with a bang but a whimper...", 32);
+ MOCK(control_event_bootstrap_problem, ignore_bootstrap_problem);
+ tt_int_op(-1, ==, connection_ext_or_process_inbuf(conn));
+ CONTAINS("\x00", 1);
+ tt_assert(TO_CONN(conn)->marked_for_close);
+ /* XXXX Hold-open-until-flushed. */
+ close_closeable_connections();
+ conn = NULL;
+ UNMOCK(control_event_bootstrap_problem);
+
+ MOCK(connection_start_reading, note_read_started);
+ MOCK(connection_stop_reading, note_read_stopped);
+ MOCK(connection_tls_start_handshake, handshake_start);
+
+ /* Okay, this time let's succeed. */
+ conn = or_connection_new(CONN_TYPE_EXT_OR, AF_INET);
+ do_ext_or_handshake(conn);
+
+ /* Now let's run through some messages. */
+ /* First let's send some junk and make sure it's ignored. */
+ WRITE("\xff\xf0\x00\x03""ABC", 7);
+ tt_int_op(0, ==, connection_ext_or_process_inbuf(conn));
+ CONTAINS("", 0);
+ /* Now let's send a USERADDR command. */
+ WRITE("\x00\x01\x00\x0c""1.2.3.4:5678", 16);
+ tt_int_op(0, ==, connection_ext_or_process_inbuf(conn));
+ tt_int_op(TO_CONN(conn)->port, ==, 5678);
+ tt_int_op(tor_addr_to_ipv4h(&TO_CONN(conn)->addr), ==, 0x01020304);
+ /* Now let's send a TRANSPORT command. */
+ WRITE("\x00\x02\x00\x07""rfc1149", 11);
+ tt_int_op(0, ==, connection_ext_or_process_inbuf(conn));
+ tt_ptr_op(NULL, !=, conn->ext_or_transport);
+ tt_str_op("rfc1149", ==, conn->ext_or_transport);
+ tt_int_op(is_reading,==,1);
+ tt_int_op(TO_CONN(conn)->state, ==, EXT_OR_CONN_STATE_OPEN);
+ /* DONE */
+ WRITE("\x00\x00\x00\x00", 4);
+ tt_int_op(0, ==, connection_ext_or_process_inbuf(conn));
+ tt_int_op(TO_CONN(conn)->state, ==, EXT_OR_CONN_STATE_FLUSHING);
+ tt_int_op(is_reading,==,0);
+ CONTAINS("\x10\x00\x00\x00", 4);
+ tt_int_op(handshake_start_called,==,0);
+ tt_int_op(0, ==, connection_ext_or_finished_flushing(conn));
+ tt_int_op(is_reading,==,1);
+ tt_int_op(handshake_start_called,==,1);
+ tt_int_op(TO_CONN(conn)->type, ==, CONN_TYPE_OR);
+ tt_int_op(TO_CONN(conn)->state, ==, 0);
+ close_closeable_connections();
+ conn = NULL;
+
+ /* Okay, this time let's succeed the handshake but fail the USERADDR
+ command. */
+ conn = or_connection_new(CONN_TYPE_EXT_OR, AF_INET);
+ do_ext_or_handshake(conn);
+ /* USERADDR command with an extra NUL byte */
+ WRITE("\x00\x01\x00\x0d""1.2.3.4:5678\x00", 17);
+ MOCK(control_event_bootstrap_problem, ignore_bootstrap_problem);
+ tt_int_op(-1, ==, connection_ext_or_process_inbuf(conn));
+ CONTAINS("", 0);
+ tt_assert(TO_CONN(conn)->marked_for_close);
+ close_closeable_connections();
+ conn = NULL;
+ UNMOCK(control_event_bootstrap_problem);
+
+ /* Now fail the TRANSPORT command. */
+ conn = or_connection_new(CONN_TYPE_EXT_OR, AF_INET);
+ do_ext_or_handshake(conn);
+ /* TRANSPORT command with an extra NUL byte */
+ WRITE("\x00\x02\x00\x08""rfc1149\x00", 12);
+ MOCK(control_event_bootstrap_problem, ignore_bootstrap_problem);
+ tt_int_op(-1, ==, connection_ext_or_process_inbuf(conn));
+ CONTAINS("", 0);
+ tt_assert(TO_CONN(conn)->marked_for_close);
+ close_closeable_connections();
+ conn = NULL;
+ UNMOCK(control_event_bootstrap_problem);
+
+ /* Now fail the TRANSPORT command. */
+ conn = or_connection_new(CONN_TYPE_EXT_OR, AF_INET);
+ do_ext_or_handshake(conn);
+ /* TRANSPORT command with transport name with symbols (not a
+ C-identifier) */
+ WRITE("\x00\x02\x00\x07""rf*1149", 11);
+ MOCK(control_event_bootstrap_problem, ignore_bootstrap_problem);
+ tt_int_op(-1, ==, connection_ext_or_process_inbuf(conn));
+ CONTAINS("", 0);
+ tt_assert(TO_CONN(conn)->marked_for_close);
+ close_closeable_connections();
+ conn = NULL;
+ UNMOCK(control_event_bootstrap_problem);
+
+ done:
+ UNMOCK(connection_write_to_buf_impl_);
+ UNMOCK(crypto_rand);
+ if (conn)
+ connection_free_(TO_CONN(conn));
+#undef CONTAINS
+#undef WRITE
+}
+
+struct testcase_t extorport_tests[] = {
+ { "id_map", test_ext_or_id_map, TT_FORK, NULL, NULL },
+ { "write_command", test_ext_or_write_command, TT_FORK, NULL, NULL },
+ { "init_auth", test_ext_or_init_auth, TT_FORK, NULL, NULL },
+ { "cookie_auth", test_ext_or_cookie_auth, TT_FORK, NULL, NULL },
+ { "cookie_auth_testvec", test_ext_or_cookie_auth_testvec, TT_FORK,
+ NULL, NULL },
+ { "handshake", test_ext_or_handshake, TT_FORK, NULL, NULL },
+ END_OF_TESTCASES
+};
+
diff --git a/src/test/test_options.c b/src/test/test_options.c
new file mode 100644
index 000000000..737f658e2
--- /dev/null
+++ b/src/test/test_options.c
@@ -0,0 +1,170 @@
+/* Copyright (c) 2001-2004, Roger Dingledine.
+ * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
+ * Copyright (c) 2007-2013, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#define CONFIG_PRIVATE
+#include "or.h"
+#include "confparse.h"
+#include "config.h"
+#include "test.h"
+
+typedef struct {
+ int severity;
+ uint32_t domain;
+ char *msg;
+} logmsg_t;
+
+static smartlist_t *messages = NULL;
+
+static void
+log_cback(int severity, uint32_t domain, const char *msg)
+{
+ logmsg_t *x = tor_malloc(sizeof(*x));
+ x->severity = severity;
+ x->domain = domain;
+ x->msg = tor_strdup(msg);
+ if (!messages)
+ messages = smartlist_new();
+ smartlist_add(messages, x);
+}
+
+static void
+setup_log_callback(void)
+{
+ log_severity_list_t lst;
+ memset(&lst, 0, sizeof(lst));
+ lst.masks[LOG_ERR - LOG_ERR] = ~0;
+ lst.masks[LOG_WARN - LOG_ERR] = ~0;
+ lst.masks[LOG_NOTICE - LOG_ERR] = ~0;
+ add_callback_log(&lst, log_cback);
+}
+
+static char *
+dump_logs(void)
+{
+ smartlist_t *msgs;
+ char *out;
+ if (! messages)
+ return tor_strdup("");
+ msgs = smartlist_new();
+ SMARTLIST_FOREACH_BEGIN(messages, logmsg_t *, x) {
+ smartlist_add_asprintf(msgs, "[%s] %s",
+ log_level_to_string(x->severity), x->msg);
+ } SMARTLIST_FOREACH_END(x);
+ out = smartlist_join_strings(msgs, "", 0, NULL);
+ SMARTLIST_FOREACH(msgs, char *, cp, tor_free(cp));
+ smartlist_free(msgs);
+ return out;
+}
+
+static void
+clear_log_messages(void)
+{
+ if (!messages)
+ return;
+ SMARTLIST_FOREACH(messages, logmsg_t *, m,
+ { tor_free(m->msg); tor_free(m); });
+ smartlist_free(messages);
+ messages = NULL;
+}
+
+static void
+test_options_validate_impl(const char *configuration,
+ const char *expect_errmsg,
+ int expect_log_severity,
+ const char *expect_log)
+{
+ or_options_t *opt = options_new();
+ or_options_t *dflt;
+ config_line_t *cl=NULL;
+ char *msg=NULL;
+ int r;
+ opt->command = CMD_RUN_TOR;
+ options_init(opt);
+
+ dflt = config_dup(&options_format, opt);
+ clear_log_messages();
+
+ r = config_get_lines(configuration, &cl, 1);
+ tt_int_op(r, ==, 0);
+
+ r = config_assign(&options_format, opt, cl, 0, 0, &msg);
+ tt_int_op(r, ==, 0);
+
+ r = options_validate(NULL, opt, dflt, 0, &msg);
+ if (expect_errmsg && !msg) {
+ TT_DIE(("Expected error message <%s> from <%s>, but got none.",
+ expect_errmsg, configuration));
+ } else if (expect_errmsg && !strstr(msg, expect_errmsg)) {
+ TT_DIE(("Expected error message <%s> from <%s>, but got <%s>.",
+ expect_errmsg, configuration, msg));
+ } else if (!expect_errmsg && msg) {
+ TT_DIE(("Expected no error message from <%s> but got <%s>.",
+ configuration, msg));
+ }
+ tt_int_op((r == 0), ==, (msg == NULL));
+
+ if (expect_log) {
+ int found = 0;
+ if (messages) {
+ SMARTLIST_FOREACH_BEGIN(messages, logmsg_t *, m) {
+ if (m->severity == expect_log_severity &&
+ strstr(m->msg, expect_log)) {
+ found = 1;
+ break;
+ }
+ } SMARTLIST_FOREACH_END(m);
+ }
+ if (!found) {
+ tor_free(msg);
+ msg = dump_logs();
+ TT_DIE(("Expected log message [%s] %s from <%s>, but got <%s>.",
+ log_level_to_string(expect_log_severity), expect_log,
+ configuration, msg));
+ }
+ }
+
+ done:
+ config_free_lines(cl);
+ or_options_free(opt);
+ or_options_free(dflt);
+ tor_free(msg);
+ clear_log_messages();
+}
+
+#define WANT_ERR(config, msg) \
+ test_options_validate_impl((config), (msg), 0, NULL)
+#define WANT_LOG(config, severity, msg) \
+ test_options_validate_impl((config), NULL, (severity), (msg))
+#define WANT_ERR_LOG(config, msg, severity, logmsg) \
+ test_options_validate_impl((config), (msg), (severity), (logmsg))
+#define OK(config) \
+ test_options_validate_impl((config), NULL, 0, NULL)
+
+static void
+test_options_validate(void *arg)
+{
+ (void)arg;
+ setup_log_callback();
+
+ WANT_ERR("ExtORPort 500000", "Invalid ExtORPort");
+
+ WANT_ERR_LOG("ServerTransportOptions trebuchet",
+ "ServerTransportOptions did not parse",
+ LOG_WARN, "Too few arguments");
+ OK("ServerTransportOptions trebuchet sling=snappy");
+ OK("ServerTransportOptions trebuchet sling=");
+ WANT_ERR_LOG("ServerTransportOptions trebuchet slingsnappy",
+ "ServerTransportOptions did not parse",
+ LOG_WARN, "\"slingsnappy\" is not a k=v");
+
+ clear_log_messages();
+ return;
+}
+
+struct testcase_t options_tests[] = {
+ { "validate", test_options_validate, TT_FORK, NULL, NULL },
+ END_OF_TESTCASES
+};
+
diff --git a/src/test/test_pt.c b/src/test/test_pt.c
index d4cc0ae97..327792105 100644
--- a/src/test/test_pt.c
+++ b/src/test/test_pt.c
@@ -5,9 +5,17 @@
#include "orconfig.h"
#define PT_PRIVATE
+#define UTIL_PRIVATE
+#define STATEFILE_PRIVATE
+#define CONTROL_PRIVATE
#include "or.h"
+#include "config.h"
+#include "confparse.h"
+#include "control.h"
#include "transports.h"
#include "circuitbuild.h"
+#include "util.h"
+#include "statefile.h"
#include "test.h"
static void
@@ -22,6 +30,8 @@ static void
test_pt_parsing(void)
{
char line[200];
+ transport_t *transport = NULL;
+ tor_addr_t test_addr;
managed_proxy_t *mp = tor_malloc(sizeof(managed_proxy_t));
mp->conf_state = PT_PROTO_INFANT;
@@ -48,7 +58,17 @@ test_pt_parsing(void)
/* correct line */
strlcpy(line,"CMETHOD trebuchet socks5 127.0.0.1:1999",sizeof(line));
test_assert(parse_cmethod_line(line, mp) == 0);
- test_assert(smartlist_len(mp->transports));
+ test_assert(smartlist_len(mp->transports) == 1);
+ transport = smartlist_get(mp->transports, 0);
+ /* test registered address of transport */
+ tor_addr_parse(&test_addr, "127.0.0.1");
+ test_assert(tor_addr_eq(&test_addr, &transport->addr));
+ /* test registered port of transport */
+ test_assert(transport->port == 1999);
+ /* test registered SOCKS version of transport */
+ test_assert(transport->socks_version == PROXY_SOCKS5);
+ /* test registered name of transport */
+ test_streq(transport->name, "trebuchet");
reset_mp(mp);
@@ -65,11 +85,37 @@ test_pt_parsing(void)
reset_mp(mp);
/* cowwect */
- strlcpy(line,"SMETHOD trebuchy 127.0.0.1:1999",sizeof(line));
+ strlcpy(line,"SMETHOD trebuchy 127.0.0.2:2999",sizeof(line));
test_assert(parse_smethod_line(line, mp) == 0);
+ test_assert(smartlist_len(mp->transports) == 1);
+ transport = smartlist_get(mp->transports, 0);
+ /* test registered address of transport */
+ tor_addr_parse(&test_addr, "127.0.0.2");
+ test_assert(tor_addr_eq(&test_addr, &transport->addr));
+ /* test registered port of transport */
+ test_assert(transport->port == 2999);
+ /* test registered name of transport */
+ test_streq(transport->name, "trebuchy");
reset_mp(mp);
+ /* Include some arguments. Good ones. */
+ strlcpy(line,"SMETHOD trebuchet 127.0.0.1:9999 "
+ "ARGS:counterweight=3,sling=snappy",
+ sizeof(line));
+ test_assert(parse_smethod_line(line, mp) == 0);
+ tt_int_op(1, ==, smartlist_len(mp->transports));
+ {
+ const transport_t *transport = smartlist_get(mp->transports, 0);
+ tt_assert(transport);
+ tt_str_op(transport->name, ==, "trebuchet");
+ tt_int_op(transport->port, ==, 9999);
+ tt_str_op(fmt_addr(&transport->addr), ==, "127.0.0.1");
+ tt_str_op(transport->extra_info_args, ==,
+ "counterweight=3,sling=snappy");
+ }
+ reset_mp(mp);
+
/* unsupported version */
strlcpy(line,"VERSION 666",sizeof(line));
test_assert(parse_version(line, mp) < 0);
@@ -87,6 +133,58 @@ test_pt_parsing(void)
}
static void
+test_pt_get_transport_options(void *arg)
+{
+ char **execve_args;
+ smartlist_t *transport_list = smartlist_new();
+ managed_proxy_t *mp;
+ or_options_t *options = get_options_mutable();
+ char *opt_str = NULL;
+ config_line_t *cl = NULL;
+ (void)arg;
+
+ execve_args = tor_malloc(sizeof(char*)*2);
+ execve_args[0] = tor_strdup("cheeseshop");
+ execve_args[1] = NULL;
+
+ mp = managed_proxy_create(transport_list, execve_args, 1);
+ tt_ptr_op(mp, !=, NULL);
+ opt_str = get_transport_options_for_server_proxy(mp);
+ tt_ptr_op(opt_str, ==, NULL);
+
+ smartlist_add(mp->transports_to_launch, tor_strdup("gruyere"));
+ smartlist_add(mp->transports_to_launch, tor_strdup("roquefort"));
+ smartlist_add(mp->transports_to_launch, tor_strdup("stnectaire"));
+
+ tt_assert(options);
+
+ cl = tor_malloc_zero(sizeof(config_line_t));
+ cl->value = tor_strdup("gruyere melty=10 hardness=se;ven");
+ options->ServerTransportOptions = cl;
+
+ cl = tor_malloc_zero(sizeof(config_line_t));
+ cl->value = tor_strdup("stnectaire melty=4 hardness=three");
+ cl->next = options->ServerTransportOptions;
+ options->ServerTransportOptions = cl;
+
+ cl = tor_malloc_zero(sizeof(config_line_t));
+ cl->value = tor_strdup("pepperjack melty=12 hardness=five");
+ cl->next = options->ServerTransportOptions;
+ options->ServerTransportOptions = cl;
+
+ opt_str = get_transport_options_for_server_proxy(mp);
+ tt_str_op(opt_str, ==,
+ "gruyere:melty=10;gruyere:hardness=se\\;ven;"
+ "stnectaire:melty=4;stnectaire:hardness=three");
+
+ done:
+ tor_free(opt_str);
+ config_free_lines(cl);
+ managed_proxy_destroy(mp, 0);
+ smartlist_free(transport_list);
+}
+
+static void
test_pt_protocol(void)
{
char line[200];
@@ -132,12 +230,223 @@ test_pt_protocol(void)
tor_free(mp);
}
+static void
+test_pt_get_extrainfo_string(void *arg)
+{
+ managed_proxy_t *mp1 = NULL, *mp2 = NULL;
+ char **argv1, **argv2;
+ smartlist_t *t1 = smartlist_new(), *t2 = smartlist_new();
+ int r;
+ char *s = NULL;
+ (void) arg;
+
+ argv1 = tor_malloc_zero(sizeof(char*)*3);
+ argv1[0] = tor_strdup("ewige");
+ argv1[1] = tor_strdup("Blumenkraft");
+ argv1[2] = NULL;
+ argv2 = tor_malloc_zero(sizeof(char*)*4);
+ argv2[0] = tor_strdup("und");
+ argv2[1] = tor_strdup("ewige");
+ argv2[2] = tor_strdup("Schlangenkraft");
+ argv2[3] = NULL;
+
+ mp1 = managed_proxy_create(t1, argv1, 1);
+ mp2 = managed_proxy_create(t2, argv2, 1);
+
+ r = parse_smethod_line("SMETHOD hagbard 127.0.0.1:5555", mp1);
+ tt_int_op(r, ==, 0);
+ r = parse_smethod_line("SMETHOD celine 127.0.0.1:1723 ARGS:card=no-enemy",
+ mp2);
+ tt_int_op(r, ==, 0);
+
+ /* Force these proxies to look "completed" or they won't generate output. */
+ mp1->conf_state = mp2->conf_state = PT_PROTO_COMPLETED;
+
+ s = pt_get_extra_info_descriptor_string();
+ tt_assert(s);
+ tt_str_op(s, ==,
+ "transport hagbard 127.0.0.1:5555\n"
+ "transport celine 127.0.0.1:1723 card=no-enemy\n");
+
+ done:
+ /* XXXX clean up better */
+ smartlist_free(t1);
+ smartlist_free(t2);
+ tor_free(s);
+}
+
+#ifdef _WIN32
+#define STDIN_HANDLE HANDLE
+#else
+#define STDIN_HANDLE FILE
+#endif
+
+static smartlist_t *
+tor_get_lines_from_handle_replacement(STDIN_HANDLE *handle,
+ enum stream_status *stream_status_out)
+{
+ static int times_called = 0;
+ smartlist_t *retval_sl = smartlist_new();
+
+ (void) handle;
+ (void) stream_status_out;
+
+ /* Generate some dummy CMETHOD lines the first 5 times. The 6th
+ time, send 'CMETHODS DONE' to finish configuring the proxy. */
+ if (times_called++ != 5) {
+ smartlist_add_asprintf(retval_sl, "SMETHOD mock%d 127.0.0.1:555%d",
+ times_called, times_called);
+ } else {
+ smartlist_add(retval_sl, tor_strdup("SMETHODS DONE"));
+ }
+
+ return retval_sl;
+}
+
+/* NOP mock */
+static void
+tor_process_handle_destroy_replacement(process_handle_t *process_handle,
+ int also_terminate_process)
+{
+ (void) process_handle;
+ (void) also_terminate_process;
+}
+
+static or_state_t *dummy_state = NULL;
+
+static or_state_t *
+get_or_state_replacement(void)
+{
+ return dummy_state;
+}
+
+static int controlevent_n = 0;
+static uint16_t controlevent_event = 0;
+static smartlist_t *controlevent_msgs = NULL;
+
+static void
+send_control_event_string_replacement(uint16_t event, event_format_t which,
+ const char *msg)
+{
+ (void) which;
+ ++controlevent_n;
+ controlevent_event = event;
+ if (!controlevent_msgs)
+ controlevent_msgs = smartlist_new();
+ smartlist_add(controlevent_msgs, tor_strdup(msg));
+}
+
+/* Test the configure_proxy() function. */
+static void
+test_pt_configure_proxy(void *arg)
+{
+ int i, retval;
+ managed_proxy_t *mp = NULL;
+ (void) arg;
+
+ dummy_state = tor_malloc_zero(sizeof(or_state_t));
+
+ MOCK(tor_get_lines_from_handle,
+ tor_get_lines_from_handle_replacement);
+ MOCK(tor_process_handle_destroy,
+ tor_process_handle_destroy_replacement);
+ MOCK(get_or_state,
+ get_or_state_replacement);
+ MOCK(send_control_event_string,
+ send_control_event_string_replacement);
+
+ control_testing_set_global_event_mask(EVENT_TRANSPORT_LAUNCHED);
+
+ mp = tor_malloc(sizeof(managed_proxy_t));
+ mp->conf_state = PT_PROTO_ACCEPTING_METHODS;
+ mp->transports = smartlist_new();
+ mp->transports_to_launch = smartlist_new();
+ mp->process_handle = tor_malloc_zero(sizeof(process_handle_t));
+ mp->argv = tor_malloc_zero(sizeof(char*)*2);
+ mp->argv[0] = tor_strdup("<testcase>");
+ mp->is_server = 1;
+
+ /* Test the return value of configure_proxy() by calling it some
+ times while it is uninitialized and then finally finalizing its
+ configuration. */
+ for (i = 0 ; i < 5 ; i++) {
+ retval = configure_proxy(mp);
+ /* retval should be zero because proxy hasn't finished configuring yet */
+ test_assert(retval == 0);
+ /* check the number of registered transports */
+ test_assert(smartlist_len(mp->transports) == i+1);
+ /* check that the mp is still waiting for transports */
+ test_assert(mp->conf_state == PT_PROTO_ACCEPTING_METHODS);
+ }
+
+ /* this last configure_proxy() should finalize the proxy configuration. */
+ retval = configure_proxy(mp);
+ /* retval should be 1 since the proxy finished configuring */
+ test_assert(retval == 1);
+ /* check the mp state */
+ test_assert(mp->conf_state == PT_PROTO_COMPLETED);
+
+ tt_int_op(controlevent_n, ==, 5);
+ tt_int_op(controlevent_event, ==, EVENT_TRANSPORT_LAUNCHED);
+ tt_int_op(smartlist_len(controlevent_msgs), ==, 5);
+ smartlist_sort_strings(controlevent_msgs);
+ tt_str_op(smartlist_get(controlevent_msgs, 0), ==,
+ "650 TRANSPORT_LAUNCHED server mock1 127.0.0.1 5551\r\n");
+ tt_str_op(smartlist_get(controlevent_msgs, 1), ==,
+ "650 TRANSPORT_LAUNCHED server mock2 127.0.0.1 5552\r\n");
+ tt_str_op(smartlist_get(controlevent_msgs, 2), ==,
+ "650 TRANSPORT_LAUNCHED server mock3 127.0.0.1 5553\r\n");
+ tt_str_op(smartlist_get(controlevent_msgs, 3), ==,
+ "650 TRANSPORT_LAUNCHED server mock4 127.0.0.1 5554\r\n");
+ tt_str_op(smartlist_get(controlevent_msgs, 4), ==,
+ "650 TRANSPORT_LAUNCHED server mock5 127.0.0.1 5555\r\n");
+
+ { /* check that the transport info were saved properly in the tor state */
+ config_line_t *transport_in_state = NULL;
+ smartlist_t *transport_info_sl = smartlist_new();
+ char *name_of_transport = NULL;
+ char *bindaddr = NULL;
+
+ /* Get the bindaddr for "mock1" and check it against the bindaddr
+ that the mocked tor_get_lines_from_handle() generated. */
+ transport_in_state = get_transport_in_state_by_name("mock1");
+ test_assert(transport_in_state);
+ smartlist_split_string(transport_info_sl, transport_in_state->value,
+ NULL, 0, 0);
+ name_of_transport = smartlist_get(transport_info_sl, 0);
+ bindaddr = smartlist_get(transport_info_sl, 1);
+ tt_str_op(name_of_transport, ==, "mock1");
+ tt_str_op(bindaddr, ==, "127.0.0.1:5551");
+
+ SMARTLIST_FOREACH(transport_info_sl, char *, cp, tor_free(cp));
+ smartlist_free(transport_info_sl);
+ }
+
+ done:
+ tor_free(dummy_state);
+ UNMOCK(tor_get_lines_from_handle);
+ UNMOCK(tor_process_handle_destroy);
+ UNMOCK(get_or_state);
+ UNMOCK(send_control_event_string);
+ if (controlevent_msgs) {
+ SMARTLIST_FOREACH(controlevent_msgs, char *, cp, tor_free(cp));
+ smartlist_free(controlevent_msgs);
+ controlevent_msgs = NULL;
+ }
+}
+
#define PT_LEGACY(name) \
{ #name, legacy_test_helper, 0, &legacy_setup, test_pt_ ## name }
struct testcase_t pt_tests[] = {
PT_LEGACY(parsing),
PT_LEGACY(protocol),
+ { "get_transport_options", test_pt_get_transport_options, TT_FORK,
+ NULL, NULL },
+ { "get_extrainfo_string", test_pt_get_extrainfo_string, TT_FORK,
+ NULL, NULL },
+ { "configure_proxy",test_pt_configure_proxy, TT_FORK,
+ NULL, NULL },
END_OF_TESTCASES
};
diff --git a/src/test/test_replay.c b/src/test/test_replay.c
index de841ad59..b48f582f5 100644
--- a/src/test/test_replay.c
+++ b/src/test/test_replay.c
@@ -32,6 +32,40 @@ test_replaycache_alloc(void)
}
static void
+test_replaycache_badalloc(void)
+{
+ replaycache_t *r = NULL;
+
+ /* Negative horizon should fail */
+ r = replaycache_new(-600, 300);
+ test_assert(r == NULL);
+ /* Negative interval should get adjusted to zero */
+ r = replaycache_new(600, -300);
+ test_assert(r != NULL);
+ test_eq(r->scrub_interval, 0);
+ replaycache_free(r);
+ /* Negative horizon and negative interval should still fail */
+ r = replaycache_new(-600, -300);
+ test_assert(r == NULL);
+
+ done:
+ if (r) replaycache_free(r);
+
+ return;
+}
+
+static void
+test_replaycache_free_null(void)
+{
+ replaycache_free(NULL);
+ /* Assert that we're here without horrible death */
+ test_assert(1);
+
+ done:
+ return;
+}
+
+static void
test_replaycache_miss(void)
{
replaycache_t *r = NULL;
@@ -42,7 +76,13 @@ test_replaycache_miss(void)
result =
replaycache_add_and_test_internal(1200, r, test_buffer,
- (int)strlen(test_buffer), NULL);
+ strlen(test_buffer), NULL);
+ test_eq(result, 0);
+
+ /* poke the bad-parameter error case too */
+ result =
+ replaycache_add_and_test_internal(1200, NULL, test_buffer,
+ strlen(test_buffer), NULL);
test_eq(result, 0);
done:
@@ -62,12 +102,12 @@ test_replaycache_hit(void)
result =
replaycache_add_and_test_internal(1200, r, test_buffer,
- (int)strlen(test_buffer), NULL);
+ strlen(test_buffer), NULL);
test_eq(result, 0);
result =
replaycache_add_and_test_internal(1300, r, test_buffer,
- (int)strlen(test_buffer), NULL);
+ strlen(test_buffer), NULL);
test_eq(result, 1);
done:
@@ -87,17 +127,17 @@ test_replaycache_age(void)
result =
replaycache_add_and_test_internal(1200, r, test_buffer,
- (int)strlen(test_buffer), NULL);
+ strlen(test_buffer), NULL);
test_eq(result, 0);
result =
replaycache_add_and_test_internal(1300, r, test_buffer,
- (int)strlen(test_buffer), NULL);
+ strlen(test_buffer), NULL);
test_eq(result, 1);
result =
replaycache_add_and_test_internal(3000, r, test_buffer,
- (int)strlen(test_buffer), NULL);
+ strlen(test_buffer), NULL);
test_eq(result, 0);
done:
@@ -118,12 +158,12 @@ test_replaycache_elapsed(void)
result =
replaycache_add_and_test_internal(1200, r, test_buffer,
- (int)strlen(test_buffer), NULL);
+ strlen(test_buffer), NULL);
test_eq(result, 0);
result =
replaycache_add_and_test_internal(1300, r, test_buffer,
- (int)strlen(test_buffer), &elapsed);
+ strlen(test_buffer), &elapsed);
test_eq(result, 1);
test_eq(elapsed, 100);
@@ -144,18 +184,102 @@ test_replaycache_noexpire(void)
result =
replaycache_add_and_test_internal(1200, r, test_buffer,
- (int)strlen(test_buffer), NULL);
+ strlen(test_buffer), NULL);
test_eq(result, 0);
result =
replaycache_add_and_test_internal(1300, r, test_buffer,
- (int)strlen(test_buffer), NULL);
+ strlen(test_buffer), NULL);
test_eq(result, 1);
result =
replaycache_add_and_test_internal(3000, r, test_buffer,
- (int)strlen(test_buffer), NULL);
+ strlen(test_buffer), NULL);
+ test_eq(result, 1);
+
+ done:
+ if (r) replaycache_free(r);
+
+ return;
+}
+
+static void
+test_replaycache_scrub(void)
+{
+ replaycache_t *r = NULL;
+ int result;
+
+ r = replaycache_new(600, 300);
+ test_assert(r != NULL);
+
+ /* Set up like in test_replaycache_hit() */
+ result =
+ replaycache_add_and_test_internal(100, r, test_buffer,
+ strlen(test_buffer), NULL);
+ test_eq(result, 0);
+
+ result =
+ replaycache_add_and_test_internal(200, r, test_buffer,
+ strlen(test_buffer), NULL);
+ test_eq(result, 1);
+
+ /*
+ * Poke a few replaycache_scrub_if_needed_internal() error cases that
+ * can't happen through replaycache_add_and_test_internal()
+ */
+
+ /* Null cache */
+ replaycache_scrub_if_needed_internal(300, NULL);
+ /* Assert we're still here */
+ test_assert(1);
+
+ /* Make sure we hit the aging-out case too */
+ replaycache_scrub_if_needed_internal(1500, r);
+ /* Assert that we aged it */
+ test_eq(digestmap_size(r->digests_seen), 0);
+
+ done:
+ if (r) replaycache_free(r);
+
+ return;
+}
+
+static void
+test_replaycache_future(void)
+{
+ replaycache_t *r = NULL;
+ int result;
+ time_t elapsed = 0;
+
+ r = replaycache_new(600, 300);
+ test_assert(r != NULL);
+
+ /* Set up like in test_replaycache_hit() */
+ result =
+ replaycache_add_and_test_internal(100, r, test_buffer,
+ strlen(test_buffer), &elapsed);
+ test_eq(result, 0);
+ /* elapsed should still be 0, since it wasn't written */
+ test_eq(elapsed, 0);
+
+ result =
+ replaycache_add_and_test_internal(200, r, test_buffer,
+ strlen(test_buffer), &elapsed);
+ test_eq(result, 1);
+ /* elapsed should be the time since the last hit */
+ test_eq(elapsed, 100);
+
+ /*
+ * Now let's turn the clock back to get coverage on the cache entry from the
+ * future not-supposed-to-happen case.
+ */
+ result =
+ replaycache_add_and_test_internal(150, r, test_buffer,
+ strlen(test_buffer), &elapsed);
+ /* We should still get a hit */
test_eq(result, 1);
+ /* ...but it shouldn't let us see a negative elapsed time */
+ test_eq(elapsed, 0);
done:
if (r) replaycache_free(r);
@@ -163,16 +287,62 @@ test_replaycache_noexpire(void)
return;
}
+static void
+test_replaycache_realtime(void)
+{
+ replaycache_t *r = NULL;
+ /*
+ * Negative so we fail if replaycache_add_test_and_elapsed() doesn't
+ * write to elapsed.
+ */
+ time_t elapsed = -1;
+ int result;
+
+ /* Test the realtime as well as *_internal() entry points */
+ r = replaycache_new(600, 300);
+ test_assert(r != NULL);
+
+ /* This should miss */
+ result =
+ replaycache_add_and_test(r, test_buffer, strlen(test_buffer));
+ test_eq(result, 0);
+
+ /* This should hit */
+ result =
+ replaycache_add_and_test(r, test_buffer, strlen(test_buffer));
+ test_eq(result, 1);
+
+ /* This should hit and return a small elapsed time */
+ result =
+ replaycache_add_test_and_elapsed(r, test_buffer,
+ strlen(test_buffer), &elapsed);
+ test_eq(result, 1);
+ test_assert(elapsed >= 0);
+ test_assert(elapsed <= 5);
+
+ /* Scrub it to exercise that entry point too */
+ replaycache_scrub_if_needed(r);
+
+ done:
+ if (r) replaycache_free(r);
+ return;
+}
+
#define REPLAYCACHE_LEGACY(name) \
{ #name, legacy_test_helper, 0, &legacy_setup, test_replaycache_ ## name }
struct testcase_t replaycache_tests[] = {
REPLAYCACHE_LEGACY(alloc),
+ REPLAYCACHE_LEGACY(badalloc),
+ REPLAYCACHE_LEGACY(free_null),
REPLAYCACHE_LEGACY(miss),
REPLAYCACHE_LEGACY(hit),
REPLAYCACHE_LEGACY(age),
REPLAYCACHE_LEGACY(elapsed),
REPLAYCACHE_LEGACY(noexpire),
+ REPLAYCACHE_LEGACY(scrub),
+ REPLAYCACHE_LEGACY(future),
+ REPLAYCACHE_LEGACY(realtime),
END_OF_TESTCASES
};
diff --git a/src/test/test_socks.c b/src/test/test_socks.c
new file mode 100644
index 000000000..4ce61e068
--- /dev/null
+++ b/src/test/test_socks.c
@@ -0,0 +1,393 @@
+/* Copyright (c) 2001-2004, Roger Dingledine.
+ * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
+ * Copyright (c) 2007-2013, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#include "or.h"
+#include "buffers.h"
+#include "config.h"
+#include "test.h"
+
+typedef struct socks_test_data_t {
+ socks_request_t *req;
+ buf_t *buf;
+} socks_test_data_t;
+
+static void *
+socks_test_setup(const struct testcase_t *testcase)
+{
+ socks_test_data_t *data = tor_malloc(sizeof(socks_test_data_t));
+ (void)testcase;
+ data->buf = buf_new_with_capacity(256);
+ data->req = socks_request_new();
+ config_register_addressmaps(get_options());
+ return data;
+}
+static int
+socks_test_cleanup(const struct testcase_t *testcase, void *ptr)
+{
+ socks_test_data_t *data = ptr;
+ (void)testcase;
+ buf_free(data->buf);
+ socks_request_free(data->req);
+ tor_free(data);
+ return 1;
+}
+
+const struct testcase_setup_t socks_setup = {
+ socks_test_setup, socks_test_cleanup
+};
+
+#define SOCKS_TEST_INIT() \
+ socks_test_data_t *testdata = ptr; \
+ buf_t *buf = testdata->buf; \
+ socks_request_t *socks = testdata->req;
+#define ADD_DATA(buf, s) \
+ write_to_buf(s, sizeof(s)-1, buf)
+
+static void
+socks_request_clear(socks_request_t *socks)
+{
+ tor_free(socks->username);
+ tor_free(socks->password);
+ memset(socks, 0, sizeof(socks_request_t));
+}
+
+/** Perform unsupported SOCKS 4 commands */
+static void
+test_socks_4_unsupported_commands(void *ptr)
+{
+ SOCKS_TEST_INIT();
+
+ /* SOCKS 4 Send BIND [02] to IP address 2.2.2.2:4369 */
+ ADD_DATA(buf, "\x04\x02\x11\x11\x02\x02\x02\x02\x00");
+ test_assert(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
+ get_options()->SafeSocks) == -1);
+ test_eq(4, socks->socks_version);
+ test_eq(0, socks->replylen); /* XXX: shouldn't tor reply? */
+
+ done:
+ ;
+}
+
+/** Perform supported SOCKS 4 commands */
+static void
+test_socks_4_supported_commands(void *ptr)
+{
+ SOCKS_TEST_INIT();
+
+ test_eq(0, buf_datalen(buf));
+
+ /* SOCKS 4 Send CONNECT [01] to IP address 2.2.2.2:4370 */
+ ADD_DATA(buf, "\x04\x01\x11\x12\x02\x02\x02\x03\x00");
+ test_assert(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
+ get_options()->SafeSocks) == 1);
+ test_eq(4, socks->socks_version);
+ test_eq(0, socks->replylen); /* XXX: shouldn't tor reply? */
+ test_eq(SOCKS_COMMAND_CONNECT, socks->command);
+ test_streq("2.2.2.3", socks->address);
+ test_eq(4370, socks->port);
+ test_assert(socks->got_auth == 0);
+ test_assert(! socks->username);
+
+ test_eq(0, buf_datalen(buf));
+ socks_request_clear(socks);
+
+ /* SOCKS 4 Send CONNECT [01] to IP address 2.2.2.2:4369 with userid*/
+ ADD_DATA(buf, "\x04\x01\x11\x12\x02\x02\x02\x04me\x00");
+ test_assert(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
+ get_options()->SafeSocks) == 1);
+ test_eq(4, socks->socks_version);
+ test_eq(0, socks->replylen); /* XXX: shouldn't tor reply? */
+ test_eq(SOCKS_COMMAND_CONNECT, socks->command);
+ test_streq("2.2.2.4", socks->address);
+ test_eq(4370, socks->port);
+ test_assert(socks->got_auth == 1);
+ test_assert(socks->username);
+ test_eq(2, socks->usernamelen);
+ test_memeq("me", socks->username, 2);
+
+ test_eq(0, buf_datalen(buf));
+ socks_request_clear(socks);
+
+ /* SOCKS 4a Send RESOLVE [F0] request for torproject.org */
+ ADD_DATA(buf, "\x04\xF0\x01\x01\x00\x00\x00\x02me\x00torproject.org\x00");
+ test_assert(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
+ get_options()->SafeSocks) == 1);
+ test_eq(4, socks->socks_version);
+ test_eq(0, socks->replylen); /* XXX: shouldn't tor reply? */
+ test_streq("torproject.org", socks->address);
+
+ test_eq(0, buf_datalen(buf));
+
+ done:
+ ;
+}
+
+/** Perform unsupported SOCKS 5 commands */
+static void
+test_socks_5_unsupported_commands(void *ptr)
+{
+ SOCKS_TEST_INIT();
+
+ /* SOCKS 5 Send unsupported BIND [02] command */
+ ADD_DATA(buf, "\x05\x02\x00\x01");
+
+ test_eq(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
+ get_options()->SafeSocks), 0);
+ test_eq(0, buf_datalen(buf));
+ test_eq(5, socks->socks_version);
+ test_eq(2, socks->replylen);
+ test_eq(5, socks->reply[0]);
+ test_eq(0, socks->reply[1]);
+ ADD_DATA(buf, "\x05\x02\x00\x01\x02\x02\x02\x01\x01\x01");
+ test_eq(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
+ get_options()->SafeSocks), -1);
+ /* XXX: shouldn't tor reply 'command not supported' [07]? */
+
+ buf_clear(buf);
+ socks_request_clear(socks);
+
+ /* SOCKS 5 Send unsupported UDP_ASSOCIATE [03] command */
+ ADD_DATA(buf, "\x05\x03\x00\x01\x02");
+ test_eq(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
+ get_options()->SafeSocks), 0);
+ test_eq(5, socks->socks_version);
+ test_eq(2, socks->replylen);
+ test_eq(5, socks->reply[0]);
+ test_eq(2, socks->reply[1]);
+ ADD_DATA(buf, "\x05\x03\x00\x01\x02\x02\x02\x01\x01\x01");
+ test_eq(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
+ get_options()->SafeSocks), -1);
+ /* XXX: shouldn't tor reply 'command not supported' [07]? */
+
+ done:
+ ;
+}
+
+/** Perform supported SOCKS 5 commands */
+static void
+test_socks_5_supported_commands(void *ptr)
+{
+ SOCKS_TEST_INIT();
+
+ /* SOCKS 5 Send CONNECT [01] to IP address 2.2.2.2:4369 */
+ ADD_DATA(buf, "\x05\x01\x00");
+ test_eq(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
+ get_options()->SafeSocks), 0);
+ test_eq(5, socks->socks_version);
+ test_eq(2, socks->replylen);
+ test_eq(5, socks->reply[0]);
+ test_eq(0, socks->reply[1]);
+
+ ADD_DATA(buf, "\x05\x01\x00\x01\x02\x02\x02\x02\x11\x11");
+ test_eq(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
+ get_options()->SafeSocks), 1);
+ test_streq("2.2.2.2", socks->address);
+ test_eq(4369, socks->port);
+
+ test_eq(0, buf_datalen(buf));
+ socks_request_clear(socks);
+
+ /* SOCKS 5 Send CONNECT [01] to FQDN torproject.org:4369 */
+ ADD_DATA(buf, "\x05\x01\x00");
+ ADD_DATA(buf, "\x05\x01\x00\x03\x0Etorproject.org\x11\x11");
+ test_eq(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
+ get_options()->SafeSocks), 1);
+
+ test_eq(5, socks->socks_version);
+ test_eq(2, socks->replylen);
+ test_eq(5, socks->reply[0]);
+ test_eq(0, socks->reply[1]);
+ test_streq("torproject.org", socks->address);
+ test_eq(4369, socks->port);
+
+ test_eq(0, buf_datalen(buf));
+ socks_request_clear(socks);
+
+ /* SOCKS 5 Send RESOLVE [F0] request for torproject.org:4369 */
+ ADD_DATA(buf, "\x05\x01\x00");
+ ADD_DATA(buf, "\x05\xF0\x00\x03\x0Etorproject.org\x01\x02");
+ test_assert(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
+ get_options()->SafeSocks) == 1);
+ test_eq(5, socks->socks_version);
+ test_eq(2, socks->replylen);
+ test_eq(5, socks->reply[0]);
+ test_eq(0, socks->reply[1]);
+ test_streq("torproject.org", socks->address);
+
+ test_eq(0, buf_datalen(buf));
+ socks_request_clear(socks);
+
+ /* SOCKS 5 Send RESOLVE_PTR [F1] for IP address 2.2.2.5 */
+ ADD_DATA(buf, "\x05\x01\x00");
+ ADD_DATA(buf, "\x05\xF1\x00\x01\x02\x02\x02\x05\x01\x03");
+ test_assert(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
+ get_options()->SafeSocks) == 1);
+ test_eq(5, socks->socks_version);
+ test_eq(2, socks->replylen);
+ test_eq(5, socks->reply[0]);
+ test_eq(0, socks->reply[1]);
+ test_streq("2.2.2.5", socks->address);
+
+ test_eq(0, buf_datalen(buf));
+
+ done:
+ ;
+}
+
+/** Perform SOCKS 5 authentication */
+static void
+test_socks_5_no_authenticate(void *ptr)
+{
+ SOCKS_TEST_INIT();
+
+ /*SOCKS 5 No Authentication */
+ ADD_DATA(buf,"\x05\x01\x00");
+ test_assert(!fetch_from_buf_socks(buf, socks,
+ get_options()->TestSocks,
+ get_options()->SafeSocks));
+ test_eq(2, socks->replylen);
+ test_eq(5, socks->reply[0]);
+ test_eq(SOCKS_NO_AUTH, socks->reply[1]);
+
+ test_eq(0, buf_datalen(buf));
+
+ /*SOCKS 5 Send username/password anyway - pretend to be broken */
+ ADD_DATA(buf,"\x01\x02\x01\x01\x02\x01\x01");
+ test_assert(!fetch_from_buf_socks(buf, socks,
+ get_options()->TestSocks,
+ get_options()->SafeSocks));
+ test_eq(5, socks->socks_version);
+ test_eq(2, socks->replylen);
+ test_eq(1, socks->reply[0]);
+ test_eq(0, socks->reply[1]);
+
+ test_eq(2, socks->usernamelen);
+ test_eq(2, socks->passwordlen);
+
+ test_memeq("\x01\x01", socks->username, 2);
+ test_memeq("\x01\x01", socks->password, 2);
+
+ done:
+ ;
+}
+
+/** Perform SOCKS 5 authentication */
+static void
+test_socks_5_authenticate(void *ptr)
+{
+ SOCKS_TEST_INIT();
+
+ /* SOCKS 5 Negotiate username/password authentication */
+ ADD_DATA(buf, "\x05\x01\x02");
+
+ test_assert(!fetch_from_buf_socks(buf, socks,
+ get_options()->TestSocks,
+ get_options()->SafeSocks));
+ test_eq(2, socks->replylen);
+ test_eq(5, socks->reply[0]);
+ test_eq(SOCKS_USER_PASS, socks->reply[1]);
+ test_eq(5, socks->socks_version);
+
+ test_eq(0, buf_datalen(buf));
+
+ /* SOCKS 5 Send username/password */
+ ADD_DATA(buf, "\x01\x02me\x08mypasswd");
+ test_assert(!fetch_from_buf_socks(buf, socks,
+ get_options()->TestSocks,
+ get_options()->SafeSocks));
+ test_eq(5, socks->socks_version);
+ test_eq(2, socks->replylen);
+ test_eq(1, socks->reply[0]);
+ test_eq(0, socks->reply[1]);
+
+ test_eq(2, socks->usernamelen);
+ test_eq(8, socks->passwordlen);
+
+ test_memeq("me", socks->username, 2);
+ test_memeq("mypasswd", socks->password, 8);
+
+ done:
+ ;
+}
+
+/** Perform SOCKS 5 authentication and send data all in one go */
+static void
+test_socks_5_authenticate_with_data(void *ptr)
+{
+ SOCKS_TEST_INIT();
+
+ /* SOCKS 5 Negotiate username/password authentication */
+ ADD_DATA(buf, "\x05\x01\x02");
+
+ test_assert(!fetch_from_buf_socks(buf, socks,
+ get_options()->TestSocks,
+ get_options()->SafeSocks));
+ test_eq(2, socks->replylen);
+ test_eq(5, socks->reply[0]);
+ test_eq(SOCKS_USER_PASS, socks->reply[1]);
+ test_eq(5, socks->socks_version);
+
+ test_eq(0, buf_datalen(buf));
+
+ /* SOCKS 5 Send username/password */
+ /* SOCKS 5 Send CONNECT [01] to IP address 2.2.2.2:4369 */
+ ADD_DATA(buf, "\x01\x02me\x03you\x05\x01\x00\x01\x02\x02\x02\x02\x11\x11");
+ test_assert(fetch_from_buf_socks(buf, socks,
+ get_options()->TestSocks,
+ get_options()->SafeSocks) == 1);
+ test_eq(5, socks->socks_version);
+ test_eq(2, socks->replylen);
+ test_eq(1, socks->reply[0]);
+ test_eq(0, socks->reply[1]);
+
+ test_streq("2.2.2.2", socks->address);
+ test_eq(4369, socks->port);
+
+ test_eq(2, socks->usernamelen);
+ test_eq(3, socks->passwordlen);
+ test_memeq("me", socks->username, 2);
+ test_memeq("you", socks->password, 3);
+
+ done:
+ ;
+}
+
+/** Perform SOCKS 5 authentication before method negotiated */
+static void
+test_socks_5_auth_before_negotiation(void *ptr)
+{
+ SOCKS_TEST_INIT();
+
+ /* SOCKS 5 Send username/password */
+ ADD_DATA(buf, "\x01\x02me\x02me");
+ test_assert(fetch_from_buf_socks(buf, socks,
+ get_options()->TestSocks,
+ get_options()->SafeSocks) == -1);
+ test_eq(0, socks->socks_version);
+ test_eq(0, socks->replylen);
+ test_eq(0, socks->reply[0]);
+ test_eq(0, socks->reply[1]);
+
+ done:
+ ;
+}
+
+#define SOCKSENT(name) \
+ { #name, test_socks_##name, TT_FORK, &socks_setup, NULL }
+
+struct testcase_t socks_tests[] = {
+ SOCKSENT(4_unsupported_commands),
+ SOCKSENT(4_supported_commands),
+
+ SOCKSENT(5_unsupported_commands),
+ SOCKSENT(5_supported_commands),
+ SOCKSENT(5_no_authenticate),
+ SOCKSENT(5_auth_before_negotiation),
+ SOCKSENT(5_authenticate),
+ SOCKSENT(5_authenticate_with_data),
+
+ END_OF_TESTCASES
+};
+
diff --git a/src/test/test_util.c b/src/test/test_util.c
index 53626bb00..05d28d787 100644
--- a/src/test/test_util.c
+++ b/src/test/test_util.c
@@ -4,6 +4,7 @@
/* See LICENSE for licensing information */
#include "orconfig.h"
+#define COMPAT_PRIVATE
#define CONTROL_PRIVATE
#define MEMPOOL_PRIVATE
#define UTIL_PRIVATE
@@ -796,37 +797,37 @@ test_util_expand_filename(void)
}
#endif
-/** Test tor_escape_str_for_socks_arg(). */
+/** Test tor_escape_str_for_pt_args(). */
static void
test_util_escape_string_socks(void)
{
char *escaped_string = NULL;
/** Simple backslash escape. */
- escaped_string = tor_escape_str_for_socks_arg("This is a backslash: \\");
+ escaped_string = tor_escape_str_for_pt_args("This is a backslash: \\",";\\");
test_assert(escaped_string);
test_streq(escaped_string, "This is a backslash: \\\\");
tor_free(escaped_string);
/** Simple semicolon escape. */
- escaped_string = tor_escape_str_for_socks_arg("First rule: Do not use ;");
+ escaped_string = tor_escape_str_for_pt_args("First rule:Do not use ;",";\\");
test_assert(escaped_string);
- test_streq(escaped_string, "First rule: Do not use \\;");
+ test_streq(escaped_string, "First rule:Do not use \\;");
tor_free(escaped_string);
/** Empty string. */
- escaped_string = tor_escape_str_for_socks_arg("");
+ escaped_string = tor_escape_str_for_pt_args("", ";\\");
test_assert(escaped_string);
test_streq(escaped_string, "");
tor_free(escaped_string);
/** Escape all characters. */
- escaped_string = tor_escape_str_for_socks_arg(";\\;\\");
+ escaped_string = tor_escape_str_for_pt_args(";\\;\\", ";\\");
test_assert(escaped_string);
test_streq(escaped_string, "\\;\\\\\\;\\\\");
tor_free(escaped_string);
- escaped_string = tor_escape_str_for_socks_arg(";");
+ escaped_string = tor_escape_str_for_pt_args(";", ";\\");
test_assert(escaped_string);
test_streq(escaped_string, "\\;");
tor_free(escaped_string);
@@ -2281,6 +2282,7 @@ test_util_load_win_lib(void *ptr)
}
#endif
+#ifndef _WIN32
static void
clear_hex_errno(char *hex_errno)
{
@@ -2324,6 +2326,7 @@ test_util_exit_status(void *ptr)
done:
;
}
+#endif
#ifndef _WIN32
/** Check that fgets waits until a full line, and not return a partial line, on
@@ -2625,14 +2628,14 @@ test_util_spawn_background_partial_read(void *ptr)
}
/**
- * Test for format_hex_number_for_helper_exit_status()
+ * Test for format_hex_number_sigsafe()
*/
static void
test_util_format_hex_number(void *ptr)
{
int i, len;
- char buf[HEX_ERRNO_SIZE + 1];
+ char buf[33];
const struct {
const char *str;
unsigned int x;
@@ -2641,6 +2644,8 @@ test_util_format_hex_number(void *ptr)
{"1", 1},
{"273A", 0x273a},
{"FFFF", 0xffff},
+ {"7FFFFFFF", 0x7fffffff},
+ {"FFFFFFFF", 0xffffffff},
#if UINT_MAX >= 0xffffffff
{"31BC421D", 0x31bc421d},
{"FFFFFFFF", 0xffffffff},
@@ -2651,19 +2656,23 @@ test_util_format_hex_number(void *ptr)
(void)ptr;
for (i = 0; test_data[i].str != NULL; ++i) {
- len = format_hex_number_for_helper_exit_status(test_data[i].x,
- buf, HEX_ERRNO_SIZE);
+ len = format_hex_number_sigsafe(test_data[i].x, buf, sizeof(buf));
test_neq(len, 0);
- buf[len] = '\0';
+ test_eq(len, strlen(buf));
test_streq(buf, test_data[i].str);
}
+ test_eq(4, format_hex_number_sigsafe(0xffff, buf, 5));
+ test_streq(buf, "FFFF");
+ test_eq(0, format_hex_number_sigsafe(0xffff, buf, 4));
+ test_eq(0, format_hex_number_sigsafe(0, buf, 1));
+
done:
return;
}
/**
- * Test that we can properly format q Windows command line
+ * Test that we can properly format a Windows command line
*/
static void
test_util_join_win_cmdline(void *ptr)
@@ -3311,6 +3320,134 @@ test_util_strclear(void *arg)
#define UTIL_TEST(name, flags) \
{ #name, test_util_ ## name, flags, NULL, NULL }
+#ifdef FD_CLOEXEC
+#define CAN_CHECK_CLOEXEC
+static int
+fd_is_cloexec(tor_socket_t fd)
+{
+ int flags = fcntl(fd, F_GETFD, 0);
+ return (flags & FD_CLOEXEC) == FD_CLOEXEC;
+}
+#endif
+
+#ifndef _WIN32
+#define CAN_CHECK_NONBLOCK
+static int
+fd_is_nonblocking(tor_socket_t fd)
+{
+ int flags = fcntl(fd, F_GETFL, 0);
+ return (flags & O_NONBLOCK) == O_NONBLOCK;
+}
+#endif
+
+static void
+test_util_socket(void *arg)
+{
+ tor_socket_t fd1 = TOR_INVALID_SOCKET;
+ tor_socket_t fd2 = TOR_INVALID_SOCKET;
+ tor_socket_t fd3 = TOR_INVALID_SOCKET;
+ tor_socket_t fd4 = TOR_INVALID_SOCKET;
+ int n = get_n_open_sockets();
+
+ TT_BLATHER(("Starting with %d open sockets.", n));
+
+ (void)arg;
+
+ fd1 = tor_open_socket_with_extensions(AF_INET, SOCK_STREAM, 0, 0, 0);
+ fd2 = tor_open_socket_with_extensions(AF_INET, SOCK_STREAM, 0, 0, 1);
+ tt_assert(SOCKET_OK(fd1));
+ tt_assert(SOCKET_OK(fd2));
+ tt_int_op(get_n_open_sockets(), ==, n + 2);
+ //fd3 = tor_open_socket_with_extensions(AF_INET, SOCK_STREAM, 0, 1, 0);
+ //fd4 = tor_open_socket_with_extensions(AF_INET, SOCK_STREAM, 0, 1, 1);
+ fd3 = tor_open_socket(AF_INET, SOCK_STREAM, 0);
+ fd4 = tor_open_socket_nonblocking(AF_INET, SOCK_STREAM, 0);
+ tt_assert(SOCKET_OK(fd3));
+ tt_assert(SOCKET_OK(fd4));
+ tt_int_op(get_n_open_sockets(), ==, n + 4);
+
+#ifdef CAN_CHECK_CLOEXEC
+ tt_int_op(fd_is_cloexec(fd1), ==, 0);
+ tt_int_op(fd_is_cloexec(fd2), ==, 0);
+ tt_int_op(fd_is_cloexec(fd3), ==, 1);
+ tt_int_op(fd_is_cloexec(fd4), ==, 1);
+#endif
+#ifdef CAN_CHECK_NONBLOCK
+ tt_int_op(fd_is_nonblocking(fd1), ==, 0);
+ tt_int_op(fd_is_nonblocking(fd2), ==, 1);
+ tt_int_op(fd_is_nonblocking(fd3), ==, 0);
+ tt_int_op(fd_is_nonblocking(fd4), ==, 1);
+#endif
+
+ tor_close_socket(fd1);
+ tor_close_socket(fd2);
+ fd1 = fd2 = TOR_INVALID_SOCKET;
+ tt_int_op(get_n_open_sockets(), ==, n + 2);
+ tor_close_socket(fd3);
+ tor_close_socket(fd4);
+ fd3 = fd4 = TOR_INVALID_SOCKET;
+ tt_int_op(get_n_open_sockets(), ==, n);
+
+ done:
+ if (SOCKET_OK(fd1))
+ tor_close_socket(fd1);
+ if (SOCKET_OK(fd2))
+ tor_close_socket(fd2);
+ if (SOCKET_OK(fd3))
+ tor_close_socket(fd3);
+ if (SOCKET_OK(fd4))
+ tor_close_socket(fd4);
+}
+
+static void *
+socketpair_test_setup(const struct testcase_t *testcase)
+{
+ return testcase->setup_data;
+}
+static int
+socketpair_test_cleanup(const struct testcase_t *testcase, void *ptr)
+{
+ (void)testcase;
+ (void)ptr;
+ return 1;
+}
+
+static const struct testcase_setup_t socketpair_setup = {
+ socketpair_test_setup, socketpair_test_cleanup
+};
+
+/* Test for socketpair and ersatz_socketpair(). We test them both, since
+ * the latter is a tolerably good way to exersize tor_accept_socket(). */
+static void
+test_util_socketpair(void *arg)
+{
+ const int ersatz = !strcmp(arg, "1");
+ int (*const tor_socketpair_fn)(int, int, int, tor_socket_t[2]) =
+ ersatz ? tor_ersatz_socketpair : tor_socketpair;
+ int n = get_n_open_sockets();
+ tor_socket_t fds[2] = {TOR_INVALID_SOCKET, TOR_INVALID_SOCKET};
+ const int family = AF_UNIX;
+
+ tt_int_op(0, ==, tor_socketpair_fn(family, SOCK_STREAM, 0, fds));
+ tt_assert(SOCKET_OK(fds[0]));
+ tt_assert(SOCKET_OK(fds[1]));
+ tt_int_op(get_n_open_sockets(), ==, n + 2);
+#ifdef CAN_CHECK_CLOEXEC
+ tt_int_op(fd_is_cloexec(fds[0]), ==, 1);
+ tt_int_op(fd_is_cloexec(fds[1]), ==, 1);
+#endif
+#ifdef CAN_CHECK_NONBLOCK
+ tt_int_op(fd_is_nonblocking(fds[0]), ==, 0);
+ tt_int_op(fd_is_nonblocking(fds[1]), ==, 0);
+#endif
+
+ done:
+ if (SOCKET_OK(fds[0]))
+ tor_close_socket(fds[0]);
+ if (SOCKET_OK(fds[1]))
+ tor_close_socket(fds[1]);
+}
+
struct testcase_t util_tests[] = {
UTIL_LEGACY(time),
UTIL_TEST(parse_http_time, 0),
@@ -3346,8 +3483,8 @@ struct testcase_t util_tests[] = {
#ifdef _WIN32
UTIL_TEST(load_win_lib, 0),
#endif
- UTIL_TEST(exit_status, 0),
#ifndef _WIN32
+ UTIL_TEST(exit_status, 0),
UTIL_TEST(fgets_eagain, TT_SKIP),
#endif
UTIL_TEST(spawn_background_ok, 0),
@@ -3367,6 +3504,11 @@ struct testcase_t util_tests[] = {
UTIL_TEST(read_file_eof_zero_bytes, 0),
UTIL_TEST(mathlog, 0),
UTIL_TEST(weak_random, 0),
+ UTIL_TEST(socket, TT_FORK),
+ { "socketpair", test_util_socketpair, TT_FORK, &socketpair_setup,
+ (void*)"0" },
+ { "socketpair_ersatz", test_util_socketpair, TT_FORK,
+ &socketpair_setup, (void*)"1" },
END_OF_TESTCASES
};
diff --git a/src/tools/tor-checkkey.c b/src/tools/tor-checkkey.c
index a3860ca4b..d50f12ed2 100644
--- a/src/tools/tor-checkkey.c
+++ b/src/tools/tor-checkkey.c
@@ -1,8 +1,6 @@
/* Copyright (c) 2008-2013, The Tor Project, Inc. */
/* See LICENSE for licensing information */
-#define CRYPTO_PRIVATE
-
#include "orconfig.h"
#include <stdio.h>
diff --git a/src/tools/tor-gencert.c b/src/tools/tor-gencert.c
index 3809b22d4..25beb2aae 100644
--- a/src/tools/tor-gencert.c
+++ b/src/tools/tor-gencert.c
@@ -27,8 +27,6 @@
#include <assert.h>
#endif
-#define CRYPTO_PRIVATE
-
#include "compat.h"
#include "../common/util.h"
#include "../common/torlog.h"