diff options
73 files changed, 9751 insertions, 4116 deletions
@@ -79,5 +79,10 @@ doc/manuals/generated/ doc/manuals/osmomsc-usermanual.xml doc/manuals/common doc/manuals/build +doc/manuals/vty/ggsn_vty_reference.xml contrib/osmo-ggsn.spec +/debian/gtp-echo-responder-dbg/ +/debian/gtp-echo-responder/ +/debian/osmo-ggsn-doc/ +/utils/gtp-echo-responder diff --git a/Makefile.am b/Makefile.am index f431bd9..f5ec81c 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,5 +1,15 @@ ## Process this file with automake to produce Makefile.in -SUBDIRS = lib gtp ggsn sgsnemu doc contrib tests +SUBDIRS = \ + include \ + lib \ + gtp \ + ggsn \ + sgsnemu \ + doc \ + contrib \ + utils \ + tests \ + $(NULL) pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libgtp.pc @@ -20,16 +20,17 @@ GIT Repository You can clone from the official osmo-ggsn.git repository using - git clone git://git.osmocom.org/osmo-ggsn.git + git clone https://gitea.osmocom.org/cellular-infrastructure/osmo-ggsn -There is a cgit interface at http://git.osmocom.org/osmo-ggsn/ +There is a web interface at <https://gitea.osmocom.org/cellular-infrastructure/osmo-ggsn> Documentation ------------- -There currently is no other documentation other than the wiki on the -homepage. It would be great if somebody would work towards a user -manual that can become part of the osmo-gsm-manuals project. +The user manual and VTY reference are optionally built in PDF form +as part of the build process. Find pre-rendered versions here: + +https://ftp.osmocom.org/docs/osmo-ggsn/master/ Mailing List ------------ diff --git a/TODO-RELEASE b/TODO-RELEASE index dd0df1a..38ddde9 100644 --- a/TODO-RELEASE +++ b/TODO-RELEASE @@ -7,4 +7,6 @@ # If any interfaces have been added since the last public release: c:r:a + 1. # If any interfaces have been removed or changed since the last public release: c:r:0. #library what description / commit summary line -osmo-ggsn update osmo-gsm-manuals dependency to > 0.3.0 for vty_cpu_sched.adoc include +libgtp REMOVE remove GTP cause defines of reserved values +libgtpnl > 1.2.5 gtp_tunnel_set_family() +libosmocore > 1.9.0 moved in46_addr code to libosmocore diff --git a/configure.ac b/configure.ac index a1c7180..d190059 100644 --- a/configure.ac +++ b/configure.ac @@ -154,9 +154,9 @@ adl_FUNC_GETOPT_LONG AM_INIT_AUTOMAKE([foreign]) -PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 1.4.0) -PKG_CHECK_MODULES(LIBOSMOVTY, libosmovty >= 1.4.0) -PKG_CHECK_MODULES(LIBOSMOCTRL, libosmoctrl >= 1.4.0) +PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 1.9.0) +PKG_CHECK_MODULES(LIBOSMOVTY, libosmovty >= 1.9.0) +PKG_CHECK_MODULES(LIBOSMOCTRL, libosmoctrl >= 1.9.0) AC_ARG_ENABLE(sanitize, [AS_HELP_STRING( @@ -257,14 +257,18 @@ AC_CONFIG_FILES([Makefile lib/Makefile intl/Makefile po/Makefile + utils/Makefile sgsnemu/Makefile - doc/manuals/Makefile + doc/manuals/Makefile contrib/Makefile contrib/systemd/Makefile contrib/osmo-ggsn.spec tests/Makefile tests/lib/Makefile tests/gtp/Makefile + include/Makefile + include/osmocom/Makefile + include/osmocom/gtp/Makefile libgtp.pc]) AC_OUTPUT diff --git a/contrib/osmo-ggsn.spec.in b/contrib/osmo-ggsn.spec.in index 4e8b11e..8334e4b 100644 --- a/contrib/osmo-ggsn.spec.in +++ b/contrib/osmo-ggsn.spec.in @@ -29,11 +29,10 @@ BuildRequires: pkgconfig >= 0.20 %if 0%{?suse_version} BuildRequires: systemd-rpm-macros %endif -BuildRequires: pkgconfig(libgtpnl) >= 1.0.0 -BuildRequires: pkgconfig(libmnl) >= 1.0.3 -BuildRequires: pkgconfig(libosmocore) >= 1.1.0 -BuildRequires: pkgconfig(libosmoctrl) >= 1.1.0 -BuildRequires: pkgconfig(libosmovty) >= 1.1.0 +BuildRequires: pkgconfig(libgtpnl) >= 1.2.0 +BuildRequires: pkgconfig(libosmocore) >= 1.9.0 +BuildRequires: pkgconfig(libosmoctrl) >= 1.9.0 +BuildRequires: pkgconfig(libosmovty) >= 1.9.0 Obsoletes: openggsn %{?systemd_requires} @@ -62,6 +61,15 @@ libgtp implements the GPRS Tunneling Protocol between SGSN and GGSN. This subpackage contains libraries and header files for developing applications that want to make use of libgtp. +%package -n gtp-echo-responder +Summary: Small program answering GTP ECHO Request with GTP ECHO Response +License: MIT +Group: System/Libraries + +%description -n gtp-echo-responder +Small program answering GTP ECHO Request with GTP ECHO Response for both GTPCv1 +and GTPCv2. + %prep %setup -q @@ -69,6 +77,7 @@ applications that want to make use of libgtp. echo "%{version}" >.tarball-version autoreconf -fi %configure \ + --enable-gtp-linux \ --disable-static \ --docdir="%{_docdir}/%{name}" \ --with-systemdsystemunitdir=%{_unitdir} \ @@ -108,7 +117,9 @@ make %{?_smp_mflags} check || (find . -name testsuite.log -exec cat {} +) %{_mandir}/man8/sgsnemu.8%{?ext_man} %{_unitdir}/%{name}.service %dir %{_docdir}/%{name}/examples +%{_docdir}/%{name}/examples/osmo-ggsn-kernel-gtp.cfg %{_docdir}/%{name}/examples/osmo-ggsn.cfg +%{_docdir}/%{name}/examples/sgsnemu.conf %dir %{_sysconfdir}/osmocom %config(noreplace) %{_sysconfdir}/osmocom/osmo-ggsn.cfg @@ -120,4 +131,7 @@ make %{?_smp_mflags} check || (find . -name testsuite.log -exec cat {} +) %{_libdir}/libgtp.so %{_libdir}/pkgconfig/libgtp.pc +%files -n gtp-echo-responder +%{_bindir}/gtp-echo-responder + %changelog diff --git a/contrib/systemd/osmo-ggsn.service b/contrib/systemd/osmo-ggsn.service index c75325d..1a7acba 100644 --- a/contrib/systemd/osmo-ggsn.service +++ b/contrib/systemd/osmo-ggsn.service @@ -1,10 +1,13 @@ [Unit] Description=OsmoGGSN -After=networking.service +After=network-online.target +Wants=network-online.target [Service] Type=simple Restart=always +StateDirectory=osmocom +WorkingDirectory=%S/osmocom ExecStart=/usr/bin/osmo-ggsn -c /etc/osmocom/osmo-ggsn.cfg RestartSec=2 RestartPreventExitStatus=1 diff --git a/debian/changelog b/debian/changelog index 445e75c..9eb37fd 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,155 @@ +osmo-ggsn (1.11.0) unstable; urgency=medium + + [ Daniel Willmann ] + * gtp: Add net GTP cause values and a function to check for success + + -- Oliver Smith <osmith@sysmocom.de> Tue, 28 Nov 2023 13:38:29 +0100 + +osmo-ggsn (1.10.2) unstable; urgency=medium + + [ Vadim Yanitskiy ] + * Do not hard-code -g and -O2 in CFLAGS + * tests: use -no-install libtool flag to avoid ./lt-* scripts + + [ Oliver Smith ] + * doc/manuals/chapters/configuration: fix typo + * debian: set compat level to 10 + * systemd: depend on networking-online.target + * README: update documentation section + * doc: running: update kernel-gtp limitations + * lib/in46_addr: add in46a_from_gsna + + -- Pau Espin Pedrol <pespin@sysmocom.de> Tue, 12 Sep 2023 14:36:10 +0200 + +osmo-ggsn (1.10.1) unstable; urgency=medium + + [ Oliver Smith ] + * debian/libgtp6.shlibs: new file + + [ Vadim Yanitskiy ] + * lib/icmpv6.h: fix struct icmpv6_{radv_hdr,opt_prefix} + * gtp/gsn.c: fix 'No newline at end of file' + * gtp: use OSMO_ASSERT() in gtp_new() + + -- Vadim Yanitskiy <vyanitskiy@sysmocom.de> Mon, 27 Feb 2023 22:35:47 +0700 + +osmo-ggsn (1.10.0) unstable; urgency=medium + + [ Max ] + * Set working directory in systemd service file + * Ignore .deb build byproducts + * ctrl: take both address and port from vty config + + [ Pau Espin Pedrol ] + * cosmetic: gtp: Fix typo in comment + * Split gsn_t related APIs out of gtp.{c,h} + * Use rate_ctr for gsn_t available_counters + * ggsn: Introduce tdef and make it configurable over VTY + * gtp: Introduce VTY configurable GTP timer X3 + * Fix typos in comments and VTY descriptions + + [ arehbein ] + * osmo-ggsn: Transition to use of 'telnet_init_default' + + -- Pau Espin Pedrol <pespin@sysmocom.de> Tue, 07 Feb 2023 14:29:48 +0100 + +osmo-ggsn (1.9.0) unstable; urgency=medium + + [ Pau Espin Pedrol ] + * tests: in46a_test: Make coverity happy when calling in46a_from_eua + * vty: Fix cmd 'no echo-interval' doing nothing + * libgtp: Fix ggsn crash if pdp alloc array is full (PDP_MAX) + * libgtp: Define retransmit QUEUE_SIZE relative to PDP_MAX (increase) + * gtp: Use switch statement in gtp_create_pdp_ind() + * gtp: Log detection of rx duplicate + * gtp: Small log improvements in gtp_create_pdp_ind() + * gtp: Specify retrans queue name & seqnum in log lines + * gtp: Log retrans queue register&free entries + * gtp: Fix typo in comment + * pco.h: Fix typo in reference to spec + + [ Vadim Yanitskiy ] + * tests: use 'check_PROGRAMS' instead of 'noinst_PROGRAMS' + + [ Harald Welte ] + * update git URLs (git -> https; gitea) + + -- Pau Espin Pedrol <pespin@sysmocom.de> Tue, 28 Jun 2022 17:48:22 +0200 + +osmo-ggsn (1.8.0) unstable; urgency=medium + + [ Oliver Smith ] + * doc/examples/Makefile.am: add sgsnemu.conf + * doc/examples/osmo-ggsn-kernel-gtp.cfg: new file + * doc/manuals: describe GTP-U kernel module + * gitignore: add ggsn_vty_reference.xml + + [ Harald Welte ] + * Don't install osmo-ggsn-kernel-gtp.cfg to /etc/osmocom/ + * Don't install sgsnemu.conf to /etc/osmocom/ + * ggsn: Reject PDP CTX ACT for static IP addresses + * vty: Inform user that static IP addresses are not supported + + [ Pau Espin Pedrol ] + * gtp: Update teic_confirmed only on resp success + * gtp: Rework parsing logic of UpdatePdpCtxResponse + * ggsn: Improve logging on incoming DL data packets + * gtp: Improve logging of failing pdp ctx resolution from TEI/TID + * cosmetic: gtpie.c: Fix trailing whitespace + * gtp: constify pointer arg + * gtp: Support tx/rx RAN Information Relay message + * ggsn: Log tun fd write errors + * ggsn: Fix heap-use-after-free during Recovery without associated PDP + * cosmetic: configure.ac: Fix tabulation in line + * Introduce program gtp-echo-responder + * gtp_echo_responder: report invalid chars present in node-feautres cmdline arg as error + + -- Pau Espin Pedrol <pespin@sysmocom.de> Tue, 16 Nov 2021 13:49:16 +0100 + +osmo-ggsn (1.7.1) unstable; urgency=medium + + [ Harald Welte ] + * main: add --vty-ref-mode, use vty_dump_xml_ref_mode() + * manuals: generate vty reference xml at build time + + -- Pau Espin Pedrol <pespin@sysmocom.de> Tue, 23 Feb 2021 17:31:24 +0100 + +osmo-ggsn (1.7.0) unstable; urgency=medium + + [ Vadim Yanitskiy ] + * debian/control: change maintainer to the Osmocom team / mailing list + + [ Pau Espin Pedrol ] + * configure.ac: Fix trailing whitespace + * doc: Update VTY reference xml file + * Support setting rt-prio and cpu-affinity mask through VTY + * contrib/jenkins: Enable parallel make in make distcheck + * ggsn: generate coredump and exit upon SIGABRT received + * tests: Explicitly drop category from log + * tests: Replace deprecated API log_set_print_filename + + [ Keith ] + * Fix vty PDP lookups by IMSI + * Prevent Crash in show pdp-context from vty + * Minor: remove code duplication + * Use imsi_str2gtp() in sgsnemu + * sgsnemu: relax check on length of IMSI cmdline arg. + * GTP: Replace recently introduced imsi_str2gtp() + + [ Harald Welte ] + * Use OSMO_FD_* instead of deprecated BSC_FD_* + * gtp-kernel: Remove duplicate #include section + * gtp-kernel: don't #include libmnl headers + + [ Oliver Smith ] + * contrib/jenkins: don't build osmo-gsm-manuals + * configure.ac: set -std=gnu11 + * apn_start: avoid segfault if missing tun-device + * .gitignore: ignore debian/libgtp* + * deb/rpm: build with --enable-gtp-linux + + -- Pau Espin Pedrol <pespin@espeweb.net> Tue, 23 Feb 2021 13:34:39 +0100 + osmo-ggsn (1.6.0) unstable; urgency=medium [ Pau Espin Pedrol ] diff --git a/debian/compat b/debian/compat index ec63514..f599e28 100644 --- a/debian/compat +++ b/debian/compat @@ -1 +1 @@ -9 +10 diff --git a/debian/control b/debian/control index 0822773..e802d62 100644 --- a/debian/control +++ b/debian/control @@ -2,16 +2,17 @@ Source: osmo-ggsn Maintainer: Osmocom team <openbsc@lists.osmocom.org> Section: net Priority: optional -Build-Depends: debhelper (>= 9), +Build-Depends: debhelper (>= 10), autotools-dev, pkg-config, libdpkg-perl, git, dh-autoreconf, - libosmocore-dev (>= 1.4.0), - osmo-gsm-manuals-dev + libosmocore-dev (>= 1.9.0), + osmo-gsm-manuals-dev, + libgtpnl-dev (>= 1.2.0) Standards-Version: 3.9.6 -Vcs-Browser: http://git.osmocom.org/osmo-ggsn/ -Vcs-Git: git://git.osmocom.org/osmo-ggsn +Vcs-Browser: https://gitea.osmocom.org/cellular-infrastructure/osmo-ggsn +Vcs-Git: https://gitea.osmocom.org/cellular-infrastructure/osmo-ggsn Homepage: https://projects.osmocom.org/projects/openggsn Package: osmo-ggsn @@ -37,6 +38,12 @@ Description: library implementing the GTP protocol between SGSN and GGSN This library is part of OsmoGGSN and implements the GTP protocol between SGSN (Serving GPRS support node) and GGSN. +Package: gtp-echo-responder +Architecture: any +Depends: ${shlibs:Depends}, + ${misc:Depends} +Description: Small program answering GTP ECHO Request with GTP ECHO Response + Package: libgtp-dev Architecture: any Multi-Arch: same @@ -62,6 +69,15 @@ Description: Debug symbols for OsmoGGSN operators as the interface between the Internet and the rest of the mobile network infrastructure. +Package: gtp-echo-responder-dbg +Section: debug +Architecture: any +Priority: extra +Depends: ${shlibs:Depends}, ${misc:Depends}, gtp-echo-responder (= ${binary:Version}) +Multi-Arch: same +Description: Debug symbols for gtp-echo-responder + Small program answering GTP ECHO Request with GTP ECHO Response. + Package: libgtp-dbg Section: debug Architecture: any diff --git a/debian/copyright b/debian/copyright index e2a4b2d..034c84d 100644 --- a/debian/copyright +++ b/debian/copyright @@ -16,6 +16,11 @@ Files: lib/getopt.c Copyright: 1987-2001 Free Software Foundation, Inc. License: LGPL-2.1+ +Files: utils/gtp_echo_responder.c + utils/gtp_echo_responder_test.py +Copyright: 2021 sysmocom - s.f.m.c. GmbH <info@sysmocom.de> +License: MIT + Files: debian/* Copyright: 2010-2017 Harald Welte <laforge@gnumonks.org> 2016 Ruben Undheim <ruben.undheim@gmail.com> diff --git a/debian/gtp-echo-responder.install b/debian/gtp-echo-responder.install new file mode 100644 index 0000000..1d6d96f --- /dev/null +++ b/debian/gtp-echo-responder.install @@ -0,0 +1 @@ +/usr/bin/gtp-echo-responder diff --git a/debian/libgtp6.shlibs b/debian/libgtp6.shlibs new file mode 100644 index 0000000..43d45e7 --- /dev/null +++ b/debian/libgtp6.shlibs @@ -0,0 +1,2 @@ +# Most recent version of the package that added new symbols (OS#5318) +libgtp 6 libgtp6 (>= 1.8.0) diff --git a/debian/osmo-ggsn.examples b/debian/osmo-ggsn.examples index fe0136c..f9e13b1 100644 --- a/debian/osmo-ggsn.examples +++ b/debian/osmo-ggsn.examples @@ -1,2 +1,3 @@ doc/examples/osmo-ggsn.cfg +doc/examples/osmo-ggsn-kernel-gtp.cfg doc/examples/sgsnemu.conf diff --git a/debian/rules b/debian/rules index c5c7708..c11700c 100755 --- a/debian/rules +++ b/debian/rules @@ -19,7 +19,10 @@ override_dh_strip: dh_strip -plibgtp6 --dbg-package=libgtp-dbg override_dh_auto_configure: - dh_auto_configure -- --with-systemdsystemunitdir=/lib/systemd/system --enable-manuals + dh_auto_configure -- \ + --enable-gtp-linux \ + --with-systemdsystemunitdir=/lib/systemd/system \ + --enable-manuals # Don't create .pdf.gz files (barely saves space and they can't be opened directly by most pdf readers) override_dh_compress: diff --git a/doc/examples/Makefile.am b/doc/examples/Makefile.am index d0b677c..a81dd35 100644 --- a/doc/examples/Makefile.am +++ b/doc/examples/Makefile.am @@ -1,9 +1,13 @@ +OSMOCONF_FILES = \ + osmo-ggsn.cfg \ + $(NULL) + osmoconfdir = $(sysconfdir)/osmocom -osmoconf_DATA = osmo-ggsn.cfg +osmoconf_DATA = $(OSMOCONF_FILES) -EXTRA_DIST = osmo-ggsn.cfg +EXTRA_DIST = $(OSMOCONF_FILES) -CFG_FILES = find $(srcdir) -name '*.cfg*' | sed -e 's,^$(srcdir),,' +CFG_FILES = find $(srcdir) -name '*.cfg' -o -name '*.conf' | sed -e 's,^$(srcdir),,' dist-hook: for f in $$($(CFG_FILES)); do \ diff --git a/doc/examples/osmo-ggsn-kernel-gtp.cfg b/doc/examples/osmo-ggsn-kernel-gtp.cfg new file mode 100644 index 0000000..28eb207 --- /dev/null +++ b/doc/examples/osmo-ggsn-kernel-gtp.cfg @@ -0,0 +1,51 @@ +! +! OpenGGSN (0.94.1-adac) configuration saved from vty +!! +! +log stderr + logging filter all 1 + logging color 1 + logging print category 0 + logging timestamp 0 + logging level ip info + logging level tun info + logging level ggsn info + logging level sgsn notice + logging level icmp6 notice + logging level lglobal notice + logging level llapd notice + logging level linp notice + logging level lmux notice + logging level lmi notice + logging level lmib notice + logging level lsms notice + logging level lctrl notice + logging level lgtp info + logging level lstats notice + logging level lgsup notice + logging level loap notice + logging level lss7 notice + logging level lsccp notice + logging level lsua notice + logging level lm3ua notice + logging level lmgcp notice +! +stats interval 5 +! +line vty + no login +! +ggsn ggsn0 + gtp state-dir /tmp + gtp bind-ip 127.0.0.2 + apn internet + gtpu-mode kernel-gtp + tun-device tun4 + type-support v4 + ip prefix dynamic 172.16.222.0/24 + ip dns 0 8.8.8.8 + ip dns 1 8.8.4.4 + ip ifconfig 172.16.222.0/24 + no shutdown + default-apn internet + no shutdown ggsn diff --git a/doc/manuals/Makefile.am b/doc/manuals/Makefile.am index f9f47fb..cbaf41a 100644 --- a/doc/manuals/Makefile.am +++ b/doc/manuals/Makefile.am @@ -11,6 +11,12 @@ if BUILD_MANUALS include $(OSMO_GSM_MANUALS_DIR)/build/Makefile.asciidoc.inc VTY_REFERENCE = osmoggsn-vty-reference.xml + + BUILT_REFERENCE_XML = $(builddir)/vty/ggsn_vty_reference.xml + $(builddir)/vty/ggsn_vty_reference.xml: $(top_builddir)/ggsn/osmo-ggsn + mkdir -p $(builddir)/vty + $(top_builddir)/ggsn/osmo-ggsn --vty-ref-xml > $@ + include $(OSMO_GSM_MANUALS_DIR)/build/Makefile.vty-reference.inc OSMO_REPOSITORY=osmo-ggsn diff --git a/doc/manuals/chapters/configuration.adoc b/doc/manuals/chapters/configuration.adoc index c5d4283..e87e5b0 100644 --- a/doc/manuals/chapters/configuration.adoc +++ b/doc/manuals/chapters/configuration.adoc @@ -302,7 +302,7 @@ Name=apn0 <1> Address=192.168.7.1/24 <2> IPMasquerade=yes <3> ---- -<1> The netowrk device name, which must match the one in the apn0.netdev unit file above +<1> The network device name, which must match the one in the apn0.netdev unit file above <2> The local IP address configured on the device <3> Requesting systemd to configure IP masquerading for this interface. Depending on your needs, You may not want this if you have proper end-to-end routing set up, and want to have transparent diff --git a/doc/manuals/chapters/running.adoc b/doc/manuals/chapters/running.adoc index 51b8ae2..c07e309 100644 --- a/doc/manuals/chapters/running.adoc +++ b/doc/manuals/chapters/running.adoc @@ -80,3 +80,52 @@ possible to pick differing ports on the same IP address), like: ggsn ggsn0 gtp bind-ip 127.0.0.2 ---- + +=== GTP-U kernel module + +WARNING: As of writing, IPv6 support for the kernel module has not been + upstreamed yet (OS#1952). + +WARNING: As of writing, it is not possible to configure multiple APNs with + gtpu-mode kernel-gpt. This is a limitation in OsmoGGSN, not in the + kernel module (OS#6106). + +OsmoGGSN has support to use the Linux kernel GTP-U tunnel driver to accelerate +the data/user plane while still implementing the control plane (GTP-C) in +userspace in OsmoGGSN. The kernel module is included in Linux 4.7.0 and higher. +Notably the Debian GNU/Linux distribution has it enabled by default. + +In order to use this feature, make sure that your Linux kernel was configured +to support it (`CONFIG_GTP=m` or `=y`). Furthermore, `osmo-ggsn` must have been +built with `./configure` argument `--enable-gtp-linux` (which requires libgtpnl +to be installed). + +Load the kernel module with: + +---- +$ sudo modprobe gtp +---- + +Then start OsmoGGSN with a configuration file that uses `gtpu-mode kernel-gtp`. + +A full example configuration is in `osmo-ggsn-kernel-gtp.cfg`. + +---- +$ sudo osmo-ggsn -c /usr/share/doc/osmo-ggsn/examples/osmo-ggsn-kernel-gtp.cfg +---- + +.Example: APN with kernel-gtp +---- +ggsn ggsn0 + gtp state-dir /tmp + gtp bind-ip 127.0.0.2 + apn internet + gtpu-mode kernel-gtp + tun-device tun4 + type-support v4 + ip prefix dynamic 172.16.222.0/24 + ip dns 0 8.8.8.8 + ip dns 1 8.8.4.4 + ip ifconfig 172.16.222.0/24 + no shutdown +---- diff --git a/doc/manuals/vty/ggsn_vty_reference.xml b/doc/manuals/vty/ggsn_vty_reference.xml deleted file mode 100644 index bbc8471..0000000 --- a/doc/manuals/vty/ggsn_vty_reference.xml +++ /dev/null @@ -1,1639 +0,0 @@ -<vtydoc xmlns='urn:osmocom:xml:libosmocore:vty:doc:1.0'> - <node id='_common_cmds_'> - <name>Common Commands</name> - <description>These commands are available on all VTY nodes. They are listed here only once, to unclutter the VTY reference.</description> - <command id='help'> - <params> - <param name='help' doc='Description of the interactive help system' /> - </params> - </command> - <command id='list'> - <params> - <param name='list' doc='Print command list' /> - </params> - </command> - <command id='write terminal'> - <params> - <param name='write' doc='Write running configuration to memory, network, or terminal' /> - <param name='terminal' doc='Write to terminal' /> - </params> - </command> - <command id='write file [PATH]'> - <params> - <param name='write' doc='Write running configuration to memory, network, or terminal' /> - <param name='file' doc='Write to configuration file' /> - <param name='[PATH]' doc='Set file path to store the config, or replace if already exists' /> - </params> - </command> - <command id='write memory'> - <params> - <param name='write' doc='Write running configuration to memory, network, or terminal' /> - <param name='memory' doc='Write configuration to the file (same as write file)' /> - </params> - </command> - <command id='write'> - <params> - <param name='write' doc='Write running configuration to memory, network, or terminal' /> - </params> - </command> - <command id='show running-config'> - <params> - <param name='show' doc='Show running system information' /> - <param name='running-config' doc='running configuration' /> - </params> - </command> - <command id='exit'> - <params> - <param name='exit' doc='Exit current mode and down to previous mode' /> - </params> - </command> - <command id='end'> - <params> - <param name='end' doc='End current mode and change to enable mode.' /> - </params> - </command> - </node> - <node id='view'> - <name>view</name> - <command id='show version'> - <params> - <param name='show' doc='Show running system information' /> - <param name='version' doc='Displays program version' /> - </params> - </command> - <command id='show online-help'> - <params> - <param name='show' doc='Show running system information' /> - <param name='online-help' doc='Online help' /> - </params> - </command> - <command id='enable'> - <params> - <param name='enable' doc='Turn on privileged mode command' /> - </params> - </command> - <command id='terminal length <0-512>'> - <params> - <param name='terminal' doc='Set terminal line parameters' /> - <param name='length' doc='Set number of lines on a screen' /> - <param name='<0-512>' doc='Number of lines on screen (0 for no pausing)' /> - </params> - </command> - <command id='terminal no length'> - <params> - <param name='terminal' doc='Set terminal line parameters' /> - <param name='no' doc='Negate a command or set its defaults' /> - <param name='length' doc='Set number of lines on a screen' /> - </params> - </command> - <command id='who'> - <params> - <param name='who' doc='Display who is on vty' /> - </params> - </command> - <command id='show history'> - <params> - <param name='show' doc='Show running system information' /> - <param name='history' doc='Display the session command history' /> - </params> - </command> - <command id='logging enable'> - <params> - <param name='logging' doc='Configure logging' /> - <param name='enable' doc='Enables logging to this vty' /> - </params> - </command> - <command id='logging disable'> - <params> - <param name='logging' doc='Configure logging' /> - <param name='disable' doc='Disables logging to this vty' /> - </params> - </command> - <command id='logging filter all (0|1)'> - <params> - <param name='logging' doc='Configure logging' /> - <param name='filter' doc='Filter log messages' /> - <param name='all' doc='Do you want to log all messages?' /> - <param name='0' doc='Only print messages matched by other filters' /> - <param name='1' doc='Bypass filter and print all messages' /> - </params> - </command> - <command id='logging color (0|1)'> - <params> - <param name='logging' doc='Configure logging' /> - <param name='color' doc='Configure color-printing for log messages' /> - <param name='0' doc='Don't use color for printing messages' /> - <param name='1' doc='Use color for printing messages' /> - </params> - </command> - <command id='logging timestamp (0|1)'> - <params> - <param name='logging' doc='Configure logging' /> - <param name='timestamp' doc='Configure log message timestamping' /> - <param name='0' doc='Don't prefix each log message' /> - <param name='1' doc='Prefix each log message with current timestamp' /> - </params> - </command> - <command id='logging print extended-timestamp (0|1)'> - <params> - <param name='logging' doc='Configure logging' /> - <param name='print' doc='Log output settings' /> - <param name='extended-timestamp' doc='Configure log message timestamping' /> - <param name='0' doc='Don't prefix each log message' /> - <param name='1' doc='Prefix each log message with current timestamp with YYYYMMDDhhmmssnnn' /> - </params> - </command> - <command id='logging print category (0|1)'> - <params> - <param name='logging' doc='Configure logging' /> - <param name='print' doc='Log output settings' /> - <param name='category' doc='Configure log message' /> - <param name='0' doc='Don't prefix each log message' /> - <param name='1' doc='Prefix each log message with category/subsystem name' /> - </params> - </command> - <command id='logging print category-hex (0|1)'> - <params> - <param name='logging' doc='Configure logging' /> - <param name='print' doc='Log output settings' /> - <param name='category-hex' doc='Configure log message' /> - <param name='0' doc='Don't prefix each log message' /> - <param name='1' doc='Prefix each log message with category/subsystem nr in hex ('<000b>')' /> - </params> - </command> - <command id='logging print level (0|1)'> - <params> - <param name='logging' doc='Configure logging' /> - <param name='print' doc='Log output settings' /> - <param name='level' doc='Configure log message' /> - <param name='0' doc='Don't prefix each log message' /> - <param name='1' doc='Prefix each log message with the log level name' /> - </params> - </command> - <command id='logging print file (0|1|basename) [last]'> - <params> - <param name='logging' doc='Configure logging' /> - <param name='print' doc='Log output settings' /> - <param name='file' doc='Configure log message' /> - <param name='0' doc='Don't prefix each log message' /> - <param name='1' doc='Prefix each log message with the source file and line' /> - <param name='basename' doc='Prefix each log message with the source file's basename (strip leading paths) and line' /> - <param name='[last]' doc='Log source file info at the end of a log line. If omitted, log source file info just before the log text.' /> - </params> - </command> - <command id='logging set-log-mask MASK'> - <params> - <param name='logging' doc='Configure logging' /> - <param name='set-log-mask' doc='Set the logmask of this logging target' /> - <param name='MASK' doc='List of logging categories to log, e.g. 'abc:mno:xyz'. Available log categories depend on the specific application, refer to the 'logging level' command. Optionally add individual log levels like 'abc,1:mno,3:xyz,5', where the level numbers are LOGL_DEBUG=1 LOGL_INFO=3 LOGL_NOTICE=5 LOGL_ERROR=7 LOGL_FATAL=8' /> - </params> - </command> - <command id='logging level (ip|tun|ggsn|sgsn|icmp6|lglobal|llapd|linp|lmux|lmi|lmib|lsms|lctrl|lgtp|lstats|lgsup|loap|lss7|lsccp|lsua|lm3ua|lmgcp|ljibuf|lrspro) (debug|info|notice|error|fatal)'> - <params> - <param name='logging' doc='Configure logging' /> - <param name='level' doc='Set the log level for a specified category' /> - <param name='ip' doc='IP Pool and other groups' /> - <param name='tun' doc='Tunnel interface' /> - <param name='ggsn' doc='GGSN' /> - <param name='sgsn' doc='SGSN Emulator' /> - <param name='icmp6' doc='ICMPv6' /> - <param name='lglobal' doc='Library-internal global log family' /> - <param name='llapd' doc='LAPD in libosmogsm' /> - <param name='linp' doc='A-bis Intput Subsystem' /> - <param name='lmux' doc='A-bis B-Subchannel TRAU Frame Multiplex' /> - <param name='lmi' doc='A-bis Input Driver for Signalling' /> - <param name='lmib' doc='A-bis Input Driver for B-Channels (voice)' /> - <param name='lsms' doc='Layer3 Short Message Service (SMS)' /> - <param name='lctrl' doc='Control Interface' /> - <param name='lgtp' doc='GPRS GTP library' /> - <param name='lstats' doc='Statistics messages and logging' /> - <param name='lgsup' doc='Generic Subscriber Update Protocol' /> - <param name='loap' doc='Osmocom Authentication Protocol' /> - <param name='lss7' doc='libosmo-sigtran Signalling System 7' /> - <param name='lsccp' doc='libosmo-sigtran SCCP Implementation' /> - <param name='lsua' doc='libosmo-sigtran SCCP User Adaptation' /> - <param name='lm3ua' doc='libosmo-sigtran MTP3 User Adaptation' /> - <param name='lmgcp' doc='libosmo-mgcp Media Gateway Control Protocol' /> - <param name='ljibuf' doc='libosmo-netif Jitter Buffer' /> - <param name='lrspro' doc='Remote SIM protocol' /> - <param name='debug' doc='Log debug messages and higher levels' /> - <param name='info' doc='Log informational messages and higher levels' /> - <param name='notice' doc='Log noticeable messages and higher levels' /> - <param name='error' doc='Log error messages and higher levels' /> - <param name='fatal' doc='Log only fatal messages' /> - </params> - </command> - <command id='logging level set-all (debug|info|notice|error|fatal)'> - <params> - <param name='logging' doc='Configure logging' /> - <param name='level' doc='Set the log level for a specified category' /> - <param name='set-all' doc='Once-off set all categories to the given log level. There is no single command to take back these changes -- each category is set to the given level, period.' /> - <param name='debug' doc='Log debug messages and higher levels' /> - <param name='info' doc='Log informational messages and higher levels' /> - <param name='notice' doc='Log noticeable messages and higher levels' /> - <param name='error' doc='Log error messages and higher levels' /> - <param name='fatal' doc='Log only fatal messages' /> - </params> - </command> - <command id='logging level force-all (debug|info|notice|error|fatal)'> - <params> - <param name='logging' doc='Configure logging' /> - <param name='level' doc='Set the log level for a specified category' /> - <param name='force-all' doc='Globally force all logging categories to a specific level. This is released by the 'no logging level force-all' command. Note: any 'logging level <category> <level>' commands will have no visible effect after this, until the forced level is released.' /> - <param name='debug' doc='Log debug messages and higher levels' /> - <param name='info' doc='Log informational messages and higher levels' /> - <param name='notice' doc='Log noticeable messages and higher levels' /> - <param name='error' doc='Log error messages and higher levels' /> - <param name='fatal' doc='Log only fatal messages' /> - </params> - </command> - <command id='no logging level force-all'> - <params> - <param name='no' doc='Negate a command or set its defaults' /> - <param name='logging' doc='Configure logging' /> - <param name='level' doc='Set the log level for a specified category' /> - <param name='force-all' doc='Release any globally forced log level set with 'logging level force-all <level>'' /> - </params> - </command> - <command id='logp (ip|tun|ggsn|sgsn|icmp6|lglobal|llapd|linp|lmux|lmi|lmib|lsms|lctrl|lgtp|lstats|lgsup|loap|lss7|lsccp|lsua|lm3ua|lmgcp|ljibuf|lrspro) (debug|info|notice|error|fatal) .LOGMESSAGE'> - <params> - <param name='logp' doc='Print a message on all log outputs; useful for placing markers in test logs' /> - <param name='ip' doc='IP Pool and other groups' /> - <param name='tun' doc='Tunnel interface' /> - <param name='ggsn' doc='GGSN' /> - <param name='sgsn' doc='SGSN Emulator' /> - <param name='icmp6' doc='ICMPv6' /> - <param name='lglobal' doc='Library-internal global log family' /> - <param name='llapd' doc='LAPD in libosmogsm' /> - <param name='linp' doc='A-bis Intput Subsystem' /> - <param name='lmux' doc='A-bis B-Subchannel TRAU Frame Multiplex' /> - <param name='lmi' doc='A-bis Input Driver for Signalling' /> - <param name='lmib' doc='A-bis Input Driver for B-Channels (voice)' /> - <param name='lsms' doc='Layer3 Short Message Service (SMS)' /> - <param name='lctrl' doc='Control Interface' /> - <param name='lgtp' doc='GPRS GTP library' /> - <param name='lstats' doc='Statistics messages and logging' /> - <param name='lgsup' doc='Generic Subscriber Update Protocol' /> - <param name='loap' doc='Osmocom Authentication Protocol' /> - <param name='lss7' doc='libosmo-sigtran Signalling System 7' /> - <param name='lsccp' doc='libosmo-sigtran SCCP Implementation' /> - <param name='lsua' doc='libosmo-sigtran SCCP User Adaptation' /> - <param name='lm3ua' doc='libosmo-sigtran MTP3 User Adaptation' /> - <param name='lmgcp' doc='libosmo-mgcp Media Gateway Control Protocol' /> - <param name='ljibuf' doc='libosmo-netif Jitter Buffer' /> - <param name='lrspro' doc='Remote SIM protocol' /> - <param name='debug' doc='Log debug messages and higher levels' /> - <param name='info' doc='Log informational messages and higher levels' /> - <param name='notice' doc='Log noticeable messages and higher levels' /> - <param name='error' doc='Log error messages and higher levels' /> - <param name='fatal' doc='Log only fatal messages' /> - <param name='.LOGMESSAGE' doc='Arbitrary message to log on given category and log level' /> - </params> - </command> - <command id='show logging vty'> - <params> - <param name='show' doc='Show running system information' /> - <param name='logging' doc='Show current logging configuration' /> - <param name='vty' doc='Show current logging configuration for this vty' /> - </params> - </command> - <command id='show alarms'> - <params> - <param name='show' doc='Show running system information' /> - <param name='alarms' doc='Show current logging configuration' /> - </params> - </command> - <command id='show talloc-context (application|all) (full|brief|DEPTH)'> - <params> - <param name='show' doc='Show running system information' /> - <param name='talloc-context' doc='Show talloc memory hierarchy' /> - <param name='application' doc='Application's context' /> - <param name='all' doc='All contexts, if NULL-context tracking is enabled' /> - <param name='full' doc='Display a full talloc memory hierarchy' /> - <param name='brief' doc='Display a brief talloc memory hierarchy' /> - <param name='DEPTH' doc='Specify required maximal depth value' /> - </params> - </command> - <command id='show talloc-context (application|all) (full|brief|DEPTH) tree ADDRESS'> - <params> - <param name='show' doc='Show running system information' /> - <param name='talloc-context' doc='Show talloc memory hierarchy' /> - <param name='application' doc='Application's context' /> - <param name='all' doc='All contexts, if NULL-context tracking is enabled' /> - <param name='full' doc='Display a full talloc memory hierarchy' /> - <param name='brief' doc='Display a brief talloc memory hierarchy' /> - <param name='DEPTH' doc='Specify required maximal depth value' /> - <param name='tree' doc='Display only a specific memory chunk' /> - <param name='ADDRESS' doc='Chunk address (e.g. 0xdeadbeef)' /> - </params> - </command> - <command id='show talloc-context (application|all) (full|brief|DEPTH) filter REGEXP'> - <params> - <param name='show' doc='Show running system information' /> - <param name='talloc-context' doc='Show talloc memory hierarchy' /> - <param name='application' doc='Application's context' /> - <param name='all' doc='All contexts, if NULL-context tracking is enabled' /> - <param name='full' doc='Display a full talloc memory hierarchy' /> - <param name='brief' doc='Display a brief talloc memory hierarchy' /> - <param name='DEPTH' doc='Specify required maximal depth value' /> - <param name='filter' doc='Filter chunks using regular expression' /> - <param name='REGEXP' doc='Regular expression' /> - </params> - </command> - <command id='show stats'> - <params> - <param name='show' doc='Show running system information' /> - <param name='stats' doc='Show statistical values' /> - </params> - </command> - <command id='show stats level (global|peer|subscriber)'> - <params> - <param name='show' doc='Show running system information' /> - <param name='stats' doc='Show statistical values' /> - <param name='level' doc='Set the maximum group level' /> - <param name='global' doc='Show global groups only' /> - <param name='peer' doc='Show global and network peer related groups' /> - <param name='subscriber' doc='Show global, peer, and subscriber groups' /> - </params> - </command> - <command id='show asciidoc counters'> - <params> - <param name='show' doc='Show running system information' /> - <param name='asciidoc' doc='Asciidoc generation' /> - <param name='counters' doc='Generate table of all registered counters' /> - </params> - </command> - <command id='show rate-counters'> - <params> - <param name='show' doc='Show running system information' /> - <param name='rate-counters' doc='Show all rate counters' /> - </params> - </command> - <command id='show pdp-context ggsn NAME'> - <params> - <param name='show' doc='Show running system information' /> - <param name='pdp-context' doc='Show PDP Context Information' /> - <param name='ggsn' doc='Gateway GPRS Support NODE (GGSN)' /> - <param name='NAME' doc='GGSN Name' /> - </params> - </command> - <command id='show pdp-context ggsn NAME apn APN'> - <params> - <param name='show' doc='Show running system information' /> - <param name='pdp-context' doc='Show PDP Context Information' /> - <param name='ggsn' doc='Gateway GPRS Support NODE (GGSN)' /> - <param name='NAME' doc='GGSN Name' /> - <param name='apn' doc='Filter by APN' /> - <param name='APN' doc='APN name' /> - </params> - </command> - <command id='show pdp-context ggsn NAME imsi IMSI [<0-15>]'> - <params> - <param name='show' doc='Show running system information' /> - <param name='pdp-context' doc='Display information on PDP Context' /> - <param name='ggsn' doc='Gateway GPRS Support NODE (GGSN)' /> - <param name='NAME' doc='GGSN Name' /> - <param name='imsi' doc='PDP contexts for given IMSI' /> - <param name='IMSI' doc='PDP context for given NSAPI' /> - <param name='[<0-15>]' doc='(null)' /> - </params> - </command> - <command id='show pdp-context ggsn NAME ipv4 A.B.C.D'> - <params> - <param name='show' doc='Show running system information' /> - <param name='pdp-context' doc='Display information on PDP Context' /> - <param name='ggsn' doc='Gateway GPRS Support NODE (GGSN)' /> - <param name='NAME' doc='GGSN Name' /> - <param name='ipv4' doc='IPv4 address type' /> - <param name='A.B.C.D' doc='IP address' /> - </params> - </command> - <command id='show ggsn [NAME]'> - <params> - <param name='show' doc='Show running system information' /> - <param name='ggsn' doc='Display information on the GGSN' /> - <param name='[NAME]' doc='(null)' /> - </params> - </command> - <command id='show cpu-sched threads'> - <params> - <param name='show' doc='Show running system information' /> - <param name='cpu-sched' doc='Show Sched section information' /> - <param name='threads' doc='Show information about running threads)' /> - </params> - </command> - </node> - <node id='enable'> - <name>enable</name> - <command id='disable'> - <params> - <param name='disable' doc='Turn off privileged mode command' /> - </params> - </command> - <command id='configure terminal'> - <params> - <param name='configure' doc='Configuration from vty interface' /> - <param name='terminal' doc='Configuration terminal' /> - </params> - </command> - <command id='copy running-config startup-config'> - <params> - <param name='copy' doc='Copy configuration' /> - <param name='running-config' doc='Copy running config to... ' /> - <param name='startup-config' doc='Copy running config to startup config (same as write file)' /> - </params> - </command> - <command id='show startup-config'> - <params> - <param name='show' doc='Show running system information' /> - <param name='startup-config' doc='Contentes of startup configuration' /> - </params> - </command> - <command id='show version'> - <params> - <param name='show' doc='Show running system information' /> - <param name='version' doc='Displays program version' /> - </params> - </command> - <command id='show online-help'> - <params> - <param name='show' doc='Show running system information' /> - <param name='online-help' doc='Online help' /> - </params> - </command> - <command id='terminal length <0-512>'> - <params> - <param name='terminal' doc='Set terminal line parameters' /> - <param name='length' doc='Set number of lines on a screen' /> - <param name='<0-512>' doc='Number of lines on screen (0 for no pausing)' /> - </params> - </command> - <command id='terminal no length'> - <params> - <param name='terminal' doc='Set terminal line parameters' /> - <param name='no' doc='Negate a command or set its defaults' /> - <param name='length' doc='Set number of lines on a screen' /> - </params> - </command> - <command id='who'> - <params> - <param name='who' doc='Display who is on vty' /> - </params> - </command> - <command id='show history'> - <params> - <param name='show' doc='Show running system information' /> - <param name='history' doc='Display the session command history' /> - </params> - </command> - <command id='terminal monitor'> - <params> - <param name='terminal' doc='Set terminal line parameters' /> - <param name='monitor' doc='Copy debug output to the current terminal line' /> - </params> - </command> - <command id='terminal no monitor'> - <params> - <param name='terminal' doc='Set terminal line parameters' /> - <param name='no' doc='Negate a command or set its defaults' /> - <param name='monitor' doc='Copy debug output to the current terminal line' /> - </params> - </command> - <command id='logging enable'> - <params> - <param name='logging' doc='Configure logging' /> - <param name='enable' doc='Enables logging to this vty' /> - </params> - </command> - <command id='logging disable'> - <params> - <param name='logging' doc='Configure logging' /> - <param name='disable' doc='Disables logging to this vty' /> - </params> - </command> - <command id='logging filter all (0|1)'> - <params> - <param name='logging' doc='Configure logging' /> - <param name='filter' doc='Filter log messages' /> - <param name='all' doc='Do you want to log all messages?' /> - <param name='0' doc='Only print messages matched by other filters' /> - <param name='1' doc='Bypass filter and print all messages' /> - </params> - </command> - <command id='logging color (0|1)'> - <params> - <param name='logging' doc='Configure logging' /> - <param name='color' doc='Configure color-printing for log messages' /> - <param name='0' doc='Don't use color for printing messages' /> - <param name='1' doc='Use color for printing messages' /> - </params> - </command> - <command id='logging timestamp (0|1)'> - <params> - <param name='logging' doc='Configure logging' /> - <param name='timestamp' doc='Configure log message timestamping' /> - <param name='0' doc='Don't prefix each log message' /> - <param name='1' doc='Prefix each log message with current timestamp' /> - </params> - </command> - <command id='logging print extended-timestamp (0|1)'> - <params> - <param name='logging' doc='Configure logging' /> - <param name='print' doc='Log output settings' /> - <param name='extended-timestamp' doc='Configure log message timestamping' /> - <param name='0' doc='Don't prefix each log message' /> - <param name='1' doc='Prefix each log message with current timestamp with YYYYMMDDhhmmssnnn' /> - </params> - </command> - <command id='logging print category (0|1)'> - <params> - <param name='logging' doc='Configure logging' /> - <param name='print' doc='Log output settings' /> - <param name='category' doc='Configure log message' /> - <param name='0' doc='Don't prefix each log message' /> - <param name='1' doc='Prefix each log message with category/subsystem name' /> - </params> - </command> - <command id='logging print category-hex (0|1)'> - <params> - <param name='logging' doc='Configure logging' /> - <param name='print' doc='Log output settings' /> - <param name='category-hex' doc='Configure log message' /> - <param name='0' doc='Don't prefix each log message' /> - <param name='1' doc='Prefix each log message with category/subsystem nr in hex ('<000b>')' /> - </params> - </command> - <command id='logging print level (0|1)'> - <params> - <param name='logging' doc='Configure logging' /> - <param name='print' doc='Log output settings' /> - <param name='level' doc='Configure log message' /> - <param name='0' doc='Don't prefix each log message' /> - <param name='1' doc='Prefix each log message with the log level name' /> - </params> - </command> - <command id='logging print file (0|1|basename) [last]'> - <params> - <param name='logging' doc='Configure logging' /> - <param name='print' doc='Log output settings' /> - <param name='file' doc='Configure log message' /> - <param name='0' doc='Don't prefix each log message' /> - <param name='1' doc='Prefix each log message with the source file and line' /> - <param name='basename' doc='Prefix each log message with the source file's basename (strip leading paths) and line' /> - <param name='[last]' doc='Log source file info at the end of a log line. If omitted, log source file info just before the log text.' /> - </params> - </command> - <command id='logging set-log-mask MASK'> - <params> - <param name='logging' doc='Configure logging' /> - <param name='set-log-mask' doc='Set the logmask of this logging target' /> - <param name='MASK' doc='List of logging categories to log, e.g. 'abc:mno:xyz'. Available log categories depend on the specific application, refer to the 'logging level' command. Optionally add individual log levels like 'abc,1:mno,3:xyz,5', where the level numbers are LOGL_DEBUG=1 LOGL_INFO=3 LOGL_NOTICE=5 LOGL_ERROR=7 LOGL_FATAL=8' /> - </params> - </command> - <command id='logging level (ip|tun|ggsn|sgsn|icmp6|lglobal|llapd|linp|lmux|lmi|lmib|lsms|lctrl|lgtp|lstats|lgsup|loap|lss7|lsccp|lsua|lm3ua|lmgcp|ljibuf|lrspro) (debug|info|notice|error|fatal)'> - <params> - <param name='logging' doc='Configure logging' /> - <param name='level' doc='Set the log level for a specified category' /> - <param name='ip' doc='IP Pool and other groups' /> - <param name='tun' doc='Tunnel interface' /> - <param name='ggsn' doc='GGSN' /> - <param name='sgsn' doc='SGSN Emulator' /> - <param name='icmp6' doc='ICMPv6' /> - <param name='lglobal' doc='Library-internal global log family' /> - <param name='llapd' doc='LAPD in libosmogsm' /> - <param name='linp' doc='A-bis Intput Subsystem' /> - <param name='lmux' doc='A-bis B-Subchannel TRAU Frame Multiplex' /> - <param name='lmi' doc='A-bis Input Driver for Signalling' /> - <param name='lmib' doc='A-bis Input Driver for B-Channels (voice)' /> - <param name='lsms' doc='Layer3 Short Message Service (SMS)' /> - <param name='lctrl' doc='Control Interface' /> - <param name='lgtp' doc='GPRS GTP library' /> - <param name='lstats' doc='Statistics messages and logging' /> - <param name='lgsup' doc='Generic Subscriber Update Protocol' /> - <param name='loap' doc='Osmocom Authentication Protocol' /> - <param name='lss7' doc='libosmo-sigtran Signalling System 7' /> - <param name='lsccp' doc='libosmo-sigtran SCCP Implementation' /> - <param name='lsua' doc='libosmo-sigtran SCCP User Adaptation' /> - <param name='lm3ua' doc='libosmo-sigtran MTP3 User Adaptation' /> - <param name='lmgcp' doc='libosmo-mgcp Media Gateway Control Protocol' /> - <param name='ljibuf' doc='libosmo-netif Jitter Buffer' /> - <param name='lrspro' doc='Remote SIM protocol' /> - <param name='debug' doc='Log debug messages and higher levels' /> - <param name='info' doc='Log informational messages and higher levels' /> - <param name='notice' doc='Log noticeable messages and higher levels' /> - <param name='error' doc='Log error messages and higher levels' /> - <param name='fatal' doc='Log only fatal messages' /> - </params> - </command> - <command id='logging level set-all (debug|info|notice|error|fatal)'> - <params> - <param name='logging' doc='Configure logging' /> - <param name='level' doc='Set the log level for a specified category' /> - <param name='set-all' doc='Once-off set all categories to the given log level. There is no single command to take back these changes -- each category is set to the given level, period.' /> - <param name='debug' doc='Log debug messages and higher levels' /> - <param name='info' doc='Log informational messages and higher levels' /> - <param name='notice' doc='Log noticeable messages and higher levels' /> - <param name='error' doc='Log error messages and higher levels' /> - <param name='fatal' doc='Log only fatal messages' /> - </params> - </command> - <command id='logging level force-all (debug|info|notice|error|fatal)'> - <params> - <param name='logging' doc='Configure logging' /> - <param name='level' doc='Set the log level for a specified category' /> - <param name='force-all' doc='Globally force all logging categories to a specific level. This is released by the 'no logging level force-all' command. Note: any 'logging level <category> <level>' commands will have no visible effect after this, until the forced level is released.' /> - <param name='debug' doc='Log debug messages and higher levels' /> - <param name='info' doc='Log informational messages and higher levels' /> - <param name='notice' doc='Log noticeable messages and higher levels' /> - <param name='error' doc='Log error messages and higher levels' /> - <param name='fatal' doc='Log only fatal messages' /> - </params> - </command> - <command id='no logging level force-all'> - <params> - <param name='no' doc='Negate a command or set its defaults' /> - <param name='logging' doc='Configure logging' /> - <param name='level' doc='Set the log level for a specified category' /> - <param name='force-all' doc='Release any globally forced log level set with 'logging level force-all <level>'' /> - </params> - </command> - <command id='logp (ip|tun|ggsn|sgsn|icmp6|lglobal|llapd|linp|lmux|lmi|lmib|lsms|lctrl|lgtp|lstats|lgsup|loap|lss7|lsccp|lsua|lm3ua|lmgcp|ljibuf|lrspro) (debug|info|notice|error|fatal) .LOGMESSAGE'> - <params> - <param name='logp' doc='Print a message on all log outputs; useful for placing markers in test logs' /> - <param name='ip' doc='IP Pool and other groups' /> - <param name='tun' doc='Tunnel interface' /> - <param name='ggsn' doc='GGSN' /> - <param name='sgsn' doc='SGSN Emulator' /> - <param name='icmp6' doc='ICMPv6' /> - <param name='lglobal' doc='Library-internal global log family' /> - <param name='llapd' doc='LAPD in libosmogsm' /> - <param name='linp' doc='A-bis Intput Subsystem' /> - <param name='lmux' doc='A-bis B-Subchannel TRAU Frame Multiplex' /> - <param name='lmi' doc='A-bis Input Driver for Signalling' /> - <param name='lmib' doc='A-bis Input Driver for B-Channels (voice)' /> - <param name='lsms' doc='Layer3 Short Message Service (SMS)' /> - <param name='lctrl' doc='Control Interface' /> - <param name='lgtp' doc='GPRS GTP library' /> - <param name='lstats' doc='Statistics messages and logging' /> - <param name='lgsup' doc='Generic Subscriber Update Protocol' /> - <param name='loap' doc='Osmocom Authentication Protocol' /> - <param name='lss7' doc='libosmo-sigtran Signalling System 7' /> - <param name='lsccp' doc='libosmo-sigtran SCCP Implementation' /> - <param name='lsua' doc='libosmo-sigtran SCCP User Adaptation' /> - <param name='lm3ua' doc='libosmo-sigtran MTP3 User Adaptation' /> - <param name='lmgcp' doc='libosmo-mgcp Media Gateway Control Protocol' /> - <param name='ljibuf' doc='libosmo-netif Jitter Buffer' /> - <param name='lrspro' doc='Remote SIM protocol' /> - <param name='debug' doc='Log debug messages and higher levels' /> - <param name='info' doc='Log informational messages and higher levels' /> - <param name='notice' doc='Log noticeable messages and higher levels' /> - <param name='error' doc='Log error messages and higher levels' /> - <param name='fatal' doc='Log only fatal messages' /> - <param name='.LOGMESSAGE' doc='Arbitrary message to log on given category and log level' /> - </params> - </command> - <command id='show logging vty'> - <params> - <param name='show' doc='Show running system information' /> - <param name='logging' doc='Show current logging configuration' /> - <param name='vty' doc='Show current logging configuration for this vty' /> - </params> - </command> - <command id='show alarms'> - <params> - <param name='show' doc='Show running system information' /> - <param name='alarms' doc='Show current logging configuration' /> - </params> - </command> - <command id='show talloc-context (application|all) (full|brief|DEPTH)'> - <params> - <param name='show' doc='Show running system information' /> - <param name='talloc-context' doc='Show talloc memory hierarchy' /> - <param name='application' doc='Application's context' /> - <param name='all' doc='All contexts, if NULL-context tracking is enabled' /> - <param name='full' doc='Display a full talloc memory hierarchy' /> - <param name='brief' doc='Display a brief talloc memory hierarchy' /> - <param name='DEPTH' doc='Specify required maximal depth value' /> - </params> - </command> - <command id='show talloc-context (application|all) (full|brief|DEPTH) tree ADDRESS'> - <params> - <param name='show' doc='Show running system information' /> - <param name='talloc-context' doc='Show talloc memory hierarchy' /> - <param name='application' doc='Application's context' /> - <param name='all' doc='All contexts, if NULL-context tracking is enabled' /> - <param name='full' doc='Display a full talloc memory hierarchy' /> - <param name='brief' doc='Display a brief talloc memory hierarchy' /> - <param name='DEPTH' doc='Specify required maximal depth value' /> - <param name='tree' doc='Display only a specific memory chunk' /> - <param name='ADDRESS' doc='Chunk address (e.g. 0xdeadbeef)' /> - </params> - </command> - <command id='show talloc-context (application|all) (full|brief|DEPTH) filter REGEXP'> - <params> - <param name='show' doc='Show running system information' /> - <param name='talloc-context' doc='Show talloc memory hierarchy' /> - <param name='application' doc='Application's context' /> - <param name='all' doc='All contexts, if NULL-context tracking is enabled' /> - <param name='full' doc='Display a full talloc memory hierarchy' /> - <param name='brief' doc='Display a brief talloc memory hierarchy' /> - <param name='DEPTH' doc='Specify required maximal depth value' /> - <param name='filter' doc='Filter chunks using regular expression' /> - <param name='REGEXP' doc='Regular expression' /> - </params> - </command> - <command id='show stats'> - <params> - <param name='show' doc='Show running system information' /> - <param name='stats' doc='Show statistical values' /> - </params> - </command> - <command id='show stats level (global|peer|subscriber)'> - <params> - <param name='show' doc='Show running system information' /> - <param name='stats' doc='Show statistical values' /> - <param name='level' doc='Set the maximum group level' /> - <param name='global' doc='Show global groups only' /> - <param name='peer' doc='Show global and network peer related groups' /> - <param name='subscriber' doc='Show global, peer, and subscriber groups' /> - </params> - </command> - <command id='show asciidoc counters'> - <params> - <param name='show' doc='Show running system information' /> - <param name='asciidoc' doc='Asciidoc generation' /> - <param name='counters' doc='Generate table of all registered counters' /> - </params> - </command> - <command id='show rate-counters'> - <params> - <param name='show' doc='Show running system information' /> - <param name='rate-counters' doc='Show all rate counters' /> - </params> - </command> - <command id='stats report'> - <params> - <param name='stats' doc='Stats related commands' /> - <param name='report' doc='Manurally trigger reporting of stats' /> - </params> - </command> - <command id='stats reset'> - <params> - <param name='stats' doc='Stats related commands' /> - <param name='reset' doc='Reset all stats' /> - </params> - </command> - <command id='show pdp-context ggsn NAME'> - <params> - <param name='show' doc='Show running system information' /> - <param name='pdp-context' doc='Show PDP Context Information' /> - <param name='ggsn' doc='Gateway GPRS Support NODE (GGSN)' /> - <param name='NAME' doc='GGSN Name' /> - </params> - </command> - <command id='show pdp-context ggsn NAME apn APN'> - <params> - <param name='show' doc='Show running system information' /> - <param name='pdp-context' doc='Show PDP Context Information' /> - <param name='ggsn' doc='Gateway GPRS Support NODE (GGSN)' /> - <param name='NAME' doc='GGSN Name' /> - <param name='apn' doc='Filter by APN' /> - <param name='APN' doc='APN name' /> - </params> - </command> - <command id='show pdp-context ggsn NAME imsi IMSI [<0-15>]'> - <params> - <param name='show' doc='Show running system information' /> - <param name='pdp-context' doc='Display information on PDP Context' /> - <param name='ggsn' doc='Gateway GPRS Support NODE (GGSN)' /> - <param name='NAME' doc='GGSN Name' /> - <param name='imsi' doc='PDP contexts for given IMSI' /> - <param name='IMSI' doc='PDP context for given NSAPI' /> - <param name='[<0-15>]' doc='(null)' /> - </params> - </command> - <command id='show pdp-context ggsn NAME ipv4 A.B.C.D'> - <params> - <param name='show' doc='Show running system information' /> - <param name='pdp-context' doc='Display information on PDP Context' /> - <param name='ggsn' doc='Gateway GPRS Support NODE (GGSN)' /> - <param name='NAME' doc='GGSN Name' /> - <param name='ipv4' doc='IPv4 address type' /> - <param name='A.B.C.D' doc='IP address' /> - </params> - </command> - <command id='show ggsn [NAME]'> - <params> - <param name='show' doc='Show running system information' /> - <param name='ggsn' doc='Display information on the GGSN' /> - <param name='[NAME]' doc='(null)' /> - </params> - </command> - <command id='show cpu-sched threads'> - <params> - <param name='show' doc='Show running system information' /> - <param name='cpu-sched' doc='Show Sched section information' /> - <param name='threads' doc='Show information about running threads)' /> - </params> - </command> - </node> - <node id='config'> - <name>config</name> - <command id='hostname WORD'> - <params> - <param name='hostname' doc='Set system's network name' /> - <param name='WORD' doc='This system's network name' /> - </params> - </command> - <command id='no hostname [HOSTNAME]'> - <params> - <param name='no' doc='Negate a command or set its defaults' /> - <param name='hostname' doc='Reset system's network name' /> - <param name='[HOSTNAME]' doc='Host name of this router' /> - </params> - </command> - <command id='password (8|) WORD'> - <params> - <param name='password' doc='Assign the terminal connection password' /> - <param name='8' doc='Specifies a HIDDEN password will follow' /> - <param name='' doc='dummy string ' /> - <param name='WORD' doc='The HIDDEN line password string' /> - </params> - </command> - <command id='password LINE'> - <params> - <param name='password' doc='Assign the terminal connection password' /> - <param name='LINE' doc='The UNENCRYPTED (cleartext) line password' /> - </params> - </command> - <command id='enable password (8|) WORD'> - <params> - <param name='enable' doc='Modify enable password parameters' /> - <param name='password' doc='Assign the privileged level password' /> - <param name='8' doc='Specifies a HIDDEN password will follow' /> - <param name='' doc='dummy string ' /> - <param name='WORD' doc='The HIDDEN 'enable' password string' /> - </params> - </command> - <command id='enable password LINE'> - <params> - <param name='enable' doc='Modify enable password parameters' /> - <param name='password' doc='Assign the privileged level password' /> - <param name='LINE' doc='The UNENCRYPTED (cleartext) 'enable' password' /> - </params> - </command> - <command id='no enable password'> - <params> - <param name='no' doc='Negate a command or set its defaults' /> - <param name='enable' doc='Modify enable password parameters' /> - <param name='password' doc='Assign the privileged level password' /> - </params> - </command> - <command id='banner motd default'> - <params> - <param name='banner' doc='Set banner string' /> - <param name='motd' doc='Strings for motd' /> - <param name='default' doc='Default string' /> - </params> - </command> - <command id='banner motd file [FILE]'> - <params> - <param name='banner' doc='Set banner' /> - <param name='motd' doc='Banner for motd' /> - <param name='file' doc='Banner from a file' /> - <param name='[FILE]' doc='Filename' /> - </params> - </command> - <command id='no banner motd'> - <params> - <param name='no' doc='Negate a command or set its defaults' /> - <param name='banner' doc='Set banner string' /> - <param name='motd' doc='Strings for motd' /> - </params> - </command> - <command id='service terminal-length <0-512>'> - <params> - <param name='service' doc='Set up miscellaneous service' /> - <param name='terminal-length' doc='System wide terminal length configuration' /> - <param name='<0-512>' doc='Number of lines of VTY (0 means no line control)' /> - </params> - </command> - <command id='no service terminal-length [<0-512>]'> - <params> - <param name='no' doc='Negate a command or set its defaults' /> - <param name='service' doc='Set up miscellaneous service' /> - <param name='terminal-length' doc='System wide terminal length configuration' /> - <param name='[<0-512>]' doc='Number of lines of VTY (0 means no line control)' /> - </params> - </command> - <command id='line vty'> - <params> - <param name='line' doc='Configure a terminal line' /> - <param name='vty' doc='Virtual terminal' /> - </params> - </command> - <command id='service advanced-vty'> - <params> - <param name='service' doc='Set up miscellaneous service' /> - <param name='advanced-vty' doc='Enable advanced mode vty interface' /> - </params> - </command> - <command id='no service advanced-vty'> - <params> - <param name='no' doc='Negate a command or set its defaults' /> - <param name='service' doc='Set up miscellaneous service' /> - <param name='advanced-vty' doc='Enable advanced mode vty interface' /> - </params> - </command> - <command id='show history'> - <params> - <param name='show' doc='Show running system information' /> - <param name='history' doc='Display the session command history' /> - </params> - </command> - <command id='log stderr'> - <params> - <param name='log' doc='Configure logging sub-system' /> - <param name='stderr' doc='Logging via STDERR of the process' /> - </params> - </command> - <command id='no log stderr'> - <params> - <param name='no' doc='Negate a command or set its defaults' /> - <param name='log' doc='Configure logging sub-system' /> - <param name='stderr' doc='Logging via STDERR of the process' /> - </params> - </command> - <command id='log file .FILENAME'> - <params> - <param name='log' doc='Configure logging sub-system' /> - <param name='file' doc='Logging to text file' /> - <param name='.FILENAME' doc='Filename' /> - </params> - </command> - <command id='no log file .FILENAME'> - <params> - <param name='no' doc='Negate a command or set its defaults' /> - <param name='log' doc='Configure logging sub-system' /> - <param name='file' doc='Logging to text file' /> - <param name='.FILENAME' doc='Filename' /> - </params> - </command> - <command id='log alarms <2-32700>'> - <params> - <param name='log' doc='Configure logging sub-system' /> - <param name='alarms' doc='Logging alarms to osmo_strrb' /> - <param name='<2-32700>' doc='Maximum number of messages to log' /> - </params> - </command> - <command id='no log alarms'> - <params> - <param name='no' doc='Negate a command or set its defaults' /> - <param name='log' doc='Configure logging sub-system' /> - <param name='alarms' doc='Logging alarms to osmo_strrb' /> - </params> - </command> - <command id='log syslog (authpriv|cron|daemon|ftp|lpr|mail|news|user|uucp)'> - <params> - <param name='log' doc='Configure logging sub-system' /> - <param name='syslog' doc='Logging via syslog' /> - <param name='authpriv' doc='Security/authorization messages facility' /> - <param name='cron' doc='Clock daemon (cron/at) facility' /> - <param name='daemon' doc='General system daemon facility' /> - <param name='ftp' doc='Ftp daemon facility' /> - <param name='lpr' doc='Line printer facility' /> - <param name='mail' doc='Mail facility' /> - <param name='news' doc='News facility' /> - <param name='user' doc='Generic facility' /> - <param name='uucp' doc='UUCP facility' /> - </params> - </command> - <command id='log syslog local <0-7>'> - <params> - <param name='log' doc='Configure logging sub-system' /> - <param name='syslog' doc='Logging via syslog' /> - <param name='local' doc='Syslog LOCAL facility' /> - <param name='<0-7>' doc='Local facility number' /> - </params> - </command> - <command id='no log syslog'> - <params> - <param name='no' doc='Negate a command or set its defaults' /> - <param name='log' doc='Configure logging sub-system' /> - <param name='syslog' doc='Logging via syslog' /> - </params> - </command> - <command id='log gsmtap [HOSTNAME]'> - <params> - <param name='log' doc='Configure logging sub-system' /> - <param name='gsmtap' doc='Logging via GSMTAP' /> - <param name='[HOSTNAME]' doc='Host name to send the GSMTAP logging to (UDP port 4729)' /> - </params> - </command> - <command id='stats reporter statsd'> - <params> - <param name='stats' doc='Configure stats sub-system' /> - <param name='reporter' doc='Configure a stats reporter' /> - <param name='statsd' doc='Report to a STATSD server' /> - </params> - </command> - <command id='no stats reporter statsd'> - <params> - <param name='no' doc='Negate a command or set its defaults' /> - <param name='stats' doc='Configure stats sub-system' /> - <param name='reporter' doc='Configure a stats reporter' /> - <param name='statsd' doc='Report to a STATSD server' /> - </params> - </command> - <command id='stats reporter log'> - <params> - <param name='stats' doc='Configure stats sub-system' /> - <param name='reporter' doc='Configure a stats reporter' /> - <param name='log' doc='Report to the logger' /> - </params> - </command> - <command id='no stats reporter log'> - <params> - <param name='no' doc='Negate a command or set its defaults' /> - <param name='stats' doc='Configure stats sub-system' /> - <param name='reporter' doc='Configure a stats reporter' /> - <param name='log' doc='Report to the logger' /> - </params> - </command> - <command id='stats interval <0-65535>'> - <params> - <param name='stats' doc='Configure stats sub-system' /> - <param name='interval' doc='Set the reporting interval' /> - <param name='<0-65535>' doc='Interval in seconds (0 disables the reporting interval)' /> - </params> - </command> - <command id='ggsn NAME'> - <params> - <param name='ggsn' doc='Configure the Gateway GPRS Support Node' /> - <param name='NAME' doc='GGSN Name (has only local significance)' /> - </params> - </command> - <command id='no ggsn NAME'> - <params> - <param name='no' doc='Negate a command or set its defaults' /> - <param name='ggsn' doc='Remove the named Gateway GPRS Support Node' /> - <param name='NAME' doc='GGSN Name (has only local significance)' /> - </params> - </command> - <command id='ctrl'> - <params> - <param name='ctrl' doc='Configure the Control Interface' /> - </params> - </command> - <command id='cpu-sched'> - <params> - <param name='cpu-sched' doc='Configure CPU Scheduler related settings' /> - </params> - </command> - </node> - <node id='config-log'> - <name>config-log</name> - <command id='logging filter all (0|1)'> - <params> - <param name='logging' doc='Configure logging' /> - <param name='filter' doc='Filter log messages' /> - <param name='all' doc='Do you want to log all messages?' /> - <param name='0' doc='Only print messages matched by other filters' /> - <param name='1' doc='Bypass filter and print all messages' /> - </params> - </command> - <command id='logging color (0|1)'> - <params> - <param name='logging' doc='Configure logging' /> - <param name='color' doc='Configure color-printing for log messages' /> - <param name='0' doc='Don't use color for printing messages' /> - <param name='1' doc='Use color for printing messages' /> - </params> - </command> - <command id='logging timestamp (0|1)'> - <params> - <param name='logging' doc='Configure logging' /> - <param name='timestamp' doc='Configure log message timestamping' /> - <param name='0' doc='Don't prefix each log message' /> - <param name='1' doc='Prefix each log message with current timestamp' /> - </params> - </command> - <command id='logging print extended-timestamp (0|1)'> - <params> - <param name='logging' doc='Configure logging' /> - <param name='print' doc='Log output settings' /> - <param name='extended-timestamp' doc='Configure log message timestamping' /> - <param name='0' doc='Don't prefix each log message' /> - <param name='1' doc='Prefix each log message with current timestamp with YYYYMMDDhhmmssnnn' /> - </params> - </command> - <command id='logging print category (0|1)'> - <params> - <param name='logging' doc='Configure logging' /> - <param name='print' doc='Log output settings' /> - <param name='category' doc='Configure log message' /> - <param name='0' doc='Don't prefix each log message' /> - <param name='1' doc='Prefix each log message with category/subsystem name' /> - </params> - </command> - <command id='logging print category-hex (0|1)'> - <params> - <param name='logging' doc='Configure logging' /> - <param name='print' doc='Log output settings' /> - <param name='category-hex' doc='Configure log message' /> - <param name='0' doc='Don't prefix each log message' /> - <param name='1' doc='Prefix each log message with category/subsystem nr in hex ('<000b>')' /> - </params> - </command> - <command id='logging print level (0|1)'> - <params> - <param name='logging' doc='Configure logging' /> - <param name='print' doc='Log output settings' /> - <param name='level' doc='Configure log message' /> - <param name='0' doc='Don't prefix each log message' /> - <param name='1' doc='Prefix each log message with the log level name' /> - </params> - </command> - <command id='logging print file (0|1|basename) [last]'> - <params> - <param name='logging' doc='Configure logging' /> - <param name='print' doc='Log output settings' /> - <param name='file' doc='Configure log message' /> - <param name='0' doc='Don't prefix each log message' /> - <param name='1' doc='Prefix each log message with the source file and line' /> - <param name='basename' doc='Prefix each log message with the source file's basename (strip leading paths) and line' /> - <param name='[last]' doc='Log source file info at the end of a log line. If omitted, log source file info just before the log text.' /> - </params> - </command> - <command id='logging level (ip|tun|ggsn|sgsn|icmp6|lglobal|llapd|linp|lmux|lmi|lmib|lsms|lctrl|lgtp|lstats|lgsup|loap|lss7|lsccp|lsua|lm3ua|lmgcp|ljibuf|lrspro) (debug|info|notice|error|fatal)'> - <params> - <param name='logging' doc='Configure logging' /> - <param name='level' doc='Set the log level for a specified category' /> - <param name='ip' doc='IP Pool and other groups' /> - <param name='tun' doc='Tunnel interface' /> - <param name='ggsn' doc='GGSN' /> - <param name='sgsn' doc='SGSN Emulator' /> - <param name='icmp6' doc='ICMPv6' /> - <param name='lglobal' doc='Library-internal global log family' /> - <param name='llapd' doc='LAPD in libosmogsm' /> - <param name='linp' doc='A-bis Intput Subsystem' /> - <param name='lmux' doc='A-bis B-Subchannel TRAU Frame Multiplex' /> - <param name='lmi' doc='A-bis Input Driver for Signalling' /> - <param name='lmib' doc='A-bis Input Driver for B-Channels (voice)' /> - <param name='lsms' doc='Layer3 Short Message Service (SMS)' /> - <param name='lctrl' doc='Control Interface' /> - <param name='lgtp' doc='GPRS GTP library' /> - <param name='lstats' doc='Statistics messages and logging' /> - <param name='lgsup' doc='Generic Subscriber Update Protocol' /> - <param name='loap' doc='Osmocom Authentication Protocol' /> - <param name='lss7' doc='libosmo-sigtran Signalling System 7' /> - <param name='lsccp' doc='libosmo-sigtran SCCP Implementation' /> - <param name='lsua' doc='libosmo-sigtran SCCP User Adaptation' /> - <param name='lm3ua' doc='libosmo-sigtran MTP3 User Adaptation' /> - <param name='lmgcp' doc='libosmo-mgcp Media Gateway Control Protocol' /> - <param name='ljibuf' doc='libosmo-netif Jitter Buffer' /> - <param name='lrspro' doc='Remote SIM protocol' /> - <param name='debug' doc='Log debug messages and higher levels' /> - <param name='info' doc='Log informational messages and higher levels' /> - <param name='notice' doc='Log noticeable messages and higher levels' /> - <param name='error' doc='Log error messages and higher levels' /> - <param name='fatal' doc='Log only fatal messages' /> - </params> - </command> - <command id='logging level set-all (debug|info|notice|error|fatal)'> - <params> - <param name='logging' doc='Configure logging' /> - <param name='level' doc='Set the log level for a specified category' /> - <param name='set-all' doc='Once-off set all categories to the given log level. There is no single command to take back these changes -- each category is set to the given level, period.' /> - <param name='debug' doc='Log debug messages and higher levels' /> - <param name='info' doc='Log informational messages and higher levels' /> - <param name='notice' doc='Log noticeable messages and higher levels' /> - <param name='error' doc='Log error messages and higher levels' /> - <param name='fatal' doc='Log only fatal messages' /> - </params> - </command> - <command id='logging level force-all (debug|info|notice|error|fatal)'> - <params> - <param name='logging' doc='Configure logging' /> - <param name='level' doc='Set the log level for a specified category' /> - <param name='force-all' doc='Globally force all logging categories to a specific level. This is released by the 'no logging level force-all' command. Note: any 'logging level <category> <level>' commands will have no visible effect after this, until the forced level is released.' /> - <param name='debug' doc='Log debug messages and higher levels' /> - <param name='info' doc='Log informational messages and higher levels' /> - <param name='notice' doc='Log noticeable messages and higher levels' /> - <param name='error' doc='Log error messages and higher levels' /> - <param name='fatal' doc='Log only fatal messages' /> - </params> - </command> - <command id='no logging level force-all'> - <params> - <param name='no' doc='Negate a command or set its defaults' /> - <param name='logging' doc='Configure logging' /> - <param name='level' doc='Set the log level for a specified category' /> - <param name='force-all' doc='Release any globally forced log level set with 'logging level force-all <level>'' /> - </params> - </command> - </node> - <node id='config-stats'> - <name>config-stats</name> - <command id='local-ip ADDR'> - <params> - <param name='local-ip' doc='Set the IP address to which we bind locally' /> - <param name='ADDR' doc='IP Address' /> - </params> - </command> - <command id='no local-ip'> - <params> - <param name='no' doc='Negate a command or set its defaults' /> - <param name='local-ip' doc='Set the IP address to which we bind locally' /> - </params> - </command> - <command id='remote-ip ADDR'> - <params> - <param name='remote-ip' doc='Set the remote IP address to which we connect' /> - <param name='ADDR' doc='IP Address' /> - </params> - </command> - <command id='remote-port <1-65535>'> - <params> - <param name='remote-port' doc='Set the remote port to which we connect' /> - <param name='<1-65535>' doc='Remote port number' /> - </params> - </command> - <command id='mtu <100-65535>'> - <params> - <param name='mtu' doc='Set the maximum packet size' /> - <param name='<100-65535>' doc='Size in byte' /> - </params> - </command> - <command id='no mtu'> - <params> - <param name='no' doc='Negate a command or set its defaults' /> - <param name='mtu' doc='Set the maximum packet size' /> - </params> - </command> - <command id='prefix PREFIX'> - <params> - <param name='prefix' doc='Set the item name prefix' /> - <param name='PREFIX' doc='The prefix string' /> - </params> - </command> - <command id='no prefix'> - <params> - <param name='no' doc='Negate a command or set its defaults' /> - <param name='prefix' doc='Set the item name prefix' /> - </params> - </command> - <command id='level (global|peer|subscriber)'> - <params> - <param name='level' doc='Set the maximum group level' /> - <param name='global' doc='Report global groups only' /> - <param name='peer' doc='Report global and network peer related groups' /> - <param name='subscriber' doc='Report global, peer, and subscriber groups' /> - </params> - </command> - <command id='enable'> - <params> - <param name='enable' doc='Enable the reporter' /> - </params> - </command> - <command id='disable'> - <params> - <param name='disable' doc='Disable the reporter' /> - </params> - </command> - <command id='flush-period <0-65535>'> - <params> - <param name='flush-period' doc='Configure stats sub-system' /> - <param name='<0-65535>' doc='Send all stats even if they have not changed (i.e. force the flush)every N-th reporting interval. Set to 0 to disable regular flush (default).' /> - </params> - </command> - </node> - <node id='config-line'> - <name>config-line</name> - <command id='login'> - <params> - <param name='login' doc='Enable password checking' /> - </params> - </command> - <command id='no login'> - <params> - <param name='no' doc='Negate a command or set its defaults' /> - <param name='login' doc='Enable password checking' /> - </params> - </command> - <command id='bind A.B.C.D [<0-65535>]'> - <params> - <param name='bind' doc='Accept VTY telnet connections on local interface' /> - <param name='A.B.C.D' doc='Local interface IP address (default: 127.0.0.1)' /> - <param name='[<0-65535>]' doc='Local TCP port number' /> - </params> - </command> - </node> - <node id='config-ctrl'> - <name>config-ctrl</name> - <command id='bind A.B.C.D'> - <params> - <param name='bind' doc='Set bind address to listen for Control connections' /> - <param name='A.B.C.D' doc='Local IP address (default 127.0.0.1)' /> - </params> - </command> - </node> - <node id='config-cpu-sched'> - <name>config-cpu-sched</name> - <command id='policy rr <1-32>'> - <params> - <param name='policy' doc='Set the scheduling policy to use for the process' /> - <param name='rr' doc='Use the SCHED_RR real-time scheduling algorithm' /> - <param name='<1-32>' doc='Set the SCHED_RR real-time priority' /> - </params> - </command> - <command id='cpu-affinity (self|all|<0-4294967295>|THREADNAME) CPUHEXMASK [delay]'> - <params> - <param name='cpu-affinity' doc='Set CPU affinity mask on a (group of) thread(s)' /> - <param name='self' doc='Set CPU affinity mask on thread running the VTY' /> - <param name='all' doc='Set CPU affinity mask on all process' threads' /> - <param name='<0-4294967295>' doc='Set CPU affinity mask on a thread with specified PID' /> - <param name='THREADNAME' doc='Set CPU affinity mask on a thread with specified thread name' /> - <param name='CPUHEXMASK' doc='CPU affinity mask' /> - <param name='[delay]' doc='If set, delay applying the affinity mask now and let the app handle it at a later point' /> - </params> - </command> - </node> - <node id='config-ggsn'> - <name>config-ggsn</name> - <command id='description .TEXT'> - <params> - <param name='description' doc='Save human-readable description of the object' /> - <param name='.TEXT' doc='Text until the end of the line' /> - </params> - </command> - <command id='no description'> - <params> - <param name='no' doc='Negate a command or set its defaults' /> - <param name='description' doc='Remove description of the object' /> - </params> - </command> - <command id='shutdown ggsn'> - <params> - <param name='shutdown' doc='Put the GGSN in administrative shut-down' /> - <param name='ggsn' doc='Gateway GPRS Support NODE (GGSN)' /> - </params> - </command> - <command id='no shutdown ggsn'> - <params> - <param name='no' doc='Negate a command or set its defaults' /> - <param name='shutdown' doc='Gateway GPRS Support NODE (GGSN)' /> - <param name='ggsn' doc='Remove the GGSN from administrative shut-down' /> - </params> - </command> - <command id='gtp bind-ip A.B.C.D'> - <params> - <param name='gtp' doc='GTP Parameters' /> - <param name='bind-ip' doc='Set the IP address for the local GTP bind' /> - <param name='A.B.C.D' doc='IPv4 Address' /> - </params> - </command> - <command id='gtp control-ip A.B.C.D'> - <params> - <param name='gtp' doc='GTP Parameters' /> - <param name='control-ip' doc='Set the IP address states as local IP in GTP-C messages' /> - <param name='A.B.C.D' doc='IPv4 Address' /> - </params> - </command> - <command id='gtp user-ip A.B.C.D'> - <params> - <param name='gtp' doc='GTP Parameters' /> - <param name='user-ip' doc='Set the IP address states as local IP in GTP-U messages' /> - <param name='A.B.C.D' doc='IPv4 Address' /> - </params> - </command> - <command id='gtp state-dir PATH'> - <params> - <param name='gtp' doc='GTP Parameters' /> - <param name='state-dir' doc='Set the directory for the GTP State file' /> - <param name='PATH' doc='Local Directory' /> - </params> - </command> - <command id='apn NAME'> - <params> - <param name='apn' doc='APN Configuration' /> - <param name='NAME' doc='APN Name' /> - </params> - </command> - <command id='no apn NAME'> - <params> - <param name='no' doc='Negate a command or set its defaults' /> - <param name='apn' doc='Remove APN Configuration' /> - <param name='NAME' doc='APN Name' /> - </params> - </command> - <command id='default-apn NAME'> - <params> - <param name='default-apn' doc='Set a default-APN to be used if no other APN matches' /> - <param name='NAME' doc='APN Name' /> - </params> - </command> - <command id='no default-apn'> - <params> - <param name='no' doc='Negate a command or set its defaults' /> - <param name='default-apn' doc='Remove default-APN to be used if no other APN matches' /> - </params> - </command> - <command id='show sgsn'> - <params> - <param name='show' doc='Negate a command or set its defaults' /> - <param name='sgsn' doc='Gateway GPRS Support NODE (GGSN)' /> - </params> - </command> - <command id='echo-interval <1-36000>'> - <params> - <param name='echo-interval' doc='Gateway GPRS Support NODE (GGSN)' /> - <param name='<1-36000>' doc='GGSN Number' /> - </params> - </command> - <command id='no echo-interval'> - <params> - <param name='no' doc='Gateway GPRS Support NODE (GGSN)' /> - <param name='echo-interval' doc='GGSN Number' /> - </params> - </command> - </node> - <node id='config-ggsn-apn'> - <name>config-ggsn-apn</name> - <command id='description .TEXT'> - <params> - <param name='description' doc='Save human-readable description of the object' /> - <param name='.TEXT' doc='Text until the end of the line' /> - </params> - </command> - <command id='no description'> - <params> - <param name='no' doc='Negate a command or set its defaults' /> - <param name='description' doc='Remove description of the object' /> - </params> - </command> - <command id='shutdown'> - <params> - <param name='shutdown' doc='Put the APN in administrative shut-down' /> - </params> - </command> - <command id='no shutdown'> - <params> - <param name='no' doc='Negate a command or set its defaults' /> - <param name='shutdown' doc='Remove the APN from administrative shut-down' /> - </params> - </command> - <command id='gtpu-mode (tun|kernel-gtp)'> - <params> - <param name='gtpu-mode' doc='Set the Mode for this APN (tun or Linux Kernel GTP)' /> - <param name='tun' doc='GTP-U in userspace using TUN device' /> - <param name='kernel-gtp' doc='GTP-U in kernel using Linux Kernel GTP' /> - </params> - </command> - <command id='type-support (v4|v6|v4v6)'> - <params> - <param name='type-support' doc='Enable support for PDP Type' /> - <param name='v4' doc='IPv4(-only) PDP Type' /> - <param name='v6' doc='IPv6(-only) PDP Type' /> - <param name='v4v6' doc='IPv4v6 (dual-stack) PDP Type' /> - </params> - </command> - <command id='no type-support (v4|v6|v4v6)'> - <params> - <param name='no' doc='Negate a command or set its defaults' /> - <param name='type-support' doc='Disable support for PDP Type' /> - <param name='v4' doc='IPv4(-only) PDP Type' /> - <param name='v6' doc='IPv6(-only) PDP Type' /> - <param name='v4v6' doc='IPv4v6 (dual-stack) PDP Type' /> - </params> - </command> - <command id='tun-device NAME'> - <params> - <param name='tun-device' doc='Configure tun device name' /> - <param name='NAME' doc='TUN device name' /> - </params> - </command> - <command id='ipup-script PATH'> - <params> - <param name='ipup-script' doc='Configure name/path of ip-up script' /> - <param name='PATH' doc='File/Path name of ip-up script' /> - </params> - </command> - <command id='no ipup-script'> - <params> - <param name='no' doc='Negate a command or set its defaults' /> - <param name='ipup-script' doc='Disable ip-up script' /> - </params> - </command> - <command id='ipdown-script PATH'> - <params> - <param name='ipdown-script' doc='Configure name/path of ip-down script' /> - <param name='PATH' doc='File/Path name of ip-down script' /> - </params> - </command> - <command id='no ipdown-script'> - <params> - <param name='no' doc='Negate a command or set its defaults' /> - <param name='ipdown-script' doc='Disable ip-down script' /> - </params> - </command> - <command id='ip prefix (static|dynamic) A.B.C.D/M'> - <params> - <param name='ip' doc='IP information' /> - <param name='prefix' doc='Prefix (Network/Netmask)' /> - <param name='static' doc='IPv4 Adress/Prefix-Length' /> - <param name='dynamic' doc='(null)' /> - <param name='A.B.C.D/M' doc='(null)' /> - </params> - </command> - <command id='ipv6 prefix (static|dynamic) X:X::X:X/M'> - <params> - <param name='ipv6' doc='IPv6 Information' /> - <param name='prefix' doc='Prefix (Network/Netmask)' /> - <param name='static' doc='IPv6 Address/Prefix-Length' /> - <param name='dynamic' doc='(null)' /> - <param name='X:X::X:X/M' doc='(null)' /> - </params> - </command> - <command id='ip dns <0-1> A.B.C.D'> - <params> - <param name='ip' doc='IP information' /> - <param name='dns' doc='Configure DNS Server' /> - <param name='<0-1>' doc='primary/secondary DNS' /> - <param name='A.B.C.D' doc='IP address of DNS Sever' /> - </params> - </command> - <command id='ipv6 dns <0-1> X:X::X:X'> - <params> - <param name='ipv6' doc='IPv6 Information' /> - <param name='dns' doc='Configure DNS Server' /> - <param name='<0-1>' doc='primary/secondary DNS' /> - <param name='X:X::X:X' doc='IP address of DNS Sever' /> - </params> - </command> - <command id='no (ip|ipv6) dns <0-1>'> - <params> - <param name='no' doc='Negate a command or set its defaults' /> - <param name='ip' doc='IP information' /> - <param name='ipv6' doc='IPv6 Information' /> - <param name='dns' doc='Disable DNS Server' /> - <param name='<0-1>' doc='primary/secondary DNS' /> - </params> - </command> - <command id='ip ifconfig A.B.C.D/M'> - <params> - <param name='ip' doc='IP information' /> - <param name='ifconfig' doc='GGSN-based interface configuration' /> - <param name='A.B.C.D/M' doc='IPv4 Adress/Prefix-Length' /> - </params> - </command> - <command id='no ip ifconfig'> - <params> - <param name='no' doc='Negate a command or set its defaults' /> - <param name='ip' doc='IP information' /> - <param name='ifconfig' doc='GGSN-based interface configuration' /> - </params> - </command> - <command id='ipv6 ifconfig X:X::X:X/M'> - <params> - <param name='ipv6' doc='IPv6 Information' /> - <param name='ifconfig' doc='GGSN-based interface configuration' /> - <param name='X:X::X:X/M' doc='IPv6 Adress/Prefix-Length' /> - </params> - </command> - <command id='no ipv6 ifconfig'> - <params> - <param name='no' doc='Negate a command or set its defaults' /> - <param name='ipv6' doc='IPv6 Information' /> - <param name='ifconfig' doc='GGSN-based interface configuration' /> - </params> - </command> - <command id='ipv6 link-local X:X::X:X/M'> - <params> - <param name='ipv6' doc='IPv6 Information' /> - <param name='link-local' doc='GGSN-based interface configuration' /> - <param name='X:X::X:X/M' doc='IPv6 Link-local Adress/Prefix-Length' /> - </params> - </command> - <command id='no ipv6 link-local'> - <params> - <param name='no' doc='Negate a command or set its defaults' /> - <param name='ipv6' doc='IPv6 Information' /> - <param name='link-local' doc='GGSN-based interface configuration' /> - </params> - </command> - <command id='g-pdu tx-sequence-numbers'> - <params> - <param name='g-pdu' doc='G-PDU Configuration' /> - <param name='tx-sequence-numbers' doc='Enable transmission of G-PDU sequence numbers' /> - </params> - </command> - <command id='no g-pdu tx-sequence-numbers'> - <params> - <param name='no' doc='Negate a command or set its defaults' /> - <param name='g-pdu' doc='G-PDU Configuration' /> - <param name='tx-sequence-numbers' doc='Disable transmission of G-PDU sequence numbers' /> - </params> - </command> - </node> -</vtydoc> diff --git a/ggsn/Makefile.am b/ggsn/Makefile.am index eea7c6e..ad6b2b2 100644 --- a/ggsn/Makefile.am +++ b/ggsn/Makefile.am @@ -2,7 +2,16 @@ bin_PROGRAMS = osmo-ggsn AM_LDFLAGS = @EXEC_LDFLAGS@ -AM_CFLAGS = -O2 -D_GNU_SOURCE -fno-builtin -Wall -DSBINDIR='"$(sbindir)"' -ggdb $(LIBOSMOCORE_CFLAGS) $(LIBOSMOCTRL_CFLAGS) $(LIBOSMOVTY_CFLAGS) +AM_CFLAGS = \ + -D_GNU_SOURCE \ + -fno-builtin \ + -Wall \ + -DSBINDIR='"$(sbindir)"' \ + -I$(top_srcdir)/include \ + $(LIBOSMOCORE_CFLAGS) \ + $(LIBOSMOCTRL_CFLAGS) \ + $(LIBOSMOVTY_CFLAGS) \ + $(NULL) osmo_ggsn_LDADD = @EXEC_LDADD@ -lgtp -L../gtp ../lib/libmisc.a $(LIBOSMOCORE_LIBS) $(LIBOSMOCTRL_LIBS) $(LIBOSMOVTY_LIBS) diff --git a/ggsn/ggsn.c b/ggsn/ggsn.c index 267637d..76ed1d2 100644 --- a/ggsn/ggsn.c +++ b/ggsn/ggsn.c @@ -43,20 +43,22 @@ #include <netinet/ip6.h> #include <osmocom/core/timer.h> +#include <osmocom/core/in46_addr.h> #include <osmocom/ctrl/control_if.h> #include <osmocom/gsm/apn.h> +#include <osmocom/gtp/pdp.h> +#include <osmocom/gtp/gtp.h> + #include "../lib/tun.h" #include "../lib/ippool.h" #include "../lib/syserr.h" -#include "../lib/in46_addr.h" #include "../lib/gtp-kernel.h" #include "../lib/util.h" -#include "../gtp/pdp.h" -#include "../gtp/gtp.h" #include "../lib/icmpv6.h" #include "pco.h" #include "ggsn.h" +#include "../gtp/gtp_internal.h" static int ggsn_tun_fd_cb(struct osmo_fd *fd, unsigned int what); static int cb_tun_ind(struct tun_t *tun, void *pack, unsigned len); @@ -193,7 +195,7 @@ int apn_start(struct apn_ctx *apn) } LOGPAPN(LOGL_INFO, apn, "Opened TUN device %s\n", apn->tun.tun->devname); - /* Register with libosmcoore */ + /* Register with libosmocore */ osmo_fd_setup(&apn->tun.fd, apn->tun.tun->fd, OSMO_FD_READ, ggsn_tun_fd_cb, apn, 0); osmo_fd_register(&apn->tun.fd); @@ -202,11 +204,6 @@ int apn_start(struct apn_ctx *apn) break; case APN_GTPU_MODE_KERNEL_GTP: LOGPAPN(LOGL_INFO, apn, "Opening Kernel GTP device %s\n", apn->tun.cfg.dev_name); - if (apn->cfg.apn_type_mask & (APN_TYPE_IPv6|APN_TYPE_IPv4v6)) { - LOGPAPN(LOGL_ERROR, apn, "Kernel GTP currently supports only IPv4\n"); - apn_stop(apn); - return -1; - } if (gsn == NULL) { /* skip bringing up the APN now if the GSN is not initialized yet. * This happens during initial load of the config file, as the @@ -467,9 +464,13 @@ int create_context_ind(struct pdp_t *pdp) return 0; } - /* FIXME: we manually force all context requests to dynamic here! */ - if (pdp->eua.l > 2) - pdp->eua.l = 2; + /* FIXME: implement context request for static IP addresses! */ + if (pdp->eua.l > 2) { + LOGPPDP(LOGL_ERROR, pdp, "Static IP addresses not supported: %s\n", + osmo_hexdump(pdp->eua.v, pdp->eua.l)); + gtp_create_context_resp(gsn, pdp, GTPCAUSE_NOT_SUPPORTED); + return 0; + } memcpy(pdp->qos_neg0, pdp->qos_req0, sizeof(pdp->qos_req0)); @@ -532,8 +533,7 @@ int create_context_ind(struct pdp_t *pdp) in46a_to_eua(addr, num_addr, &pdp->eua); - if (apn->cfg.gtpu_mode == APN_GTPU_MODE_KERNEL_GTP && apn_supports_ipv4(apn)) { - /* TODO: In IPv6, EUA doesn't contain the actual IP addr/prefix! */ + if (apn->cfg.gtpu_mode == APN_GTPU_MODE_KERNEL_GTP) { if (gtp_kernel_tunnel_add(pdp, apn->tun.cfg.dev_name) < 0) { LOGPPDP(LOGL_ERROR, pdp, "Cannot add tunnel to kernel: %s\n", strerror(errno)); gtp_create_context_resp(gsn, pdp, GTPCAUSE_SYS_FAIL); @@ -589,7 +589,7 @@ static int cb_tun_ind(struct tun_t *tun, void *pack, unsigned len) struct iphdr *iph = (struct iphdr *)pack; struct ip6_hdr *ip6h = (struct ip6_hdr *)pack; struct ippool_t *pool; - char straddr[INET6_ADDRSTRLEN]; + char straddr[2][INET6_ADDRSTRLEN]; uint8_t pref_offset; switch (iph->version) { @@ -622,17 +622,41 @@ static int cb_tun_ind(struct tun_t *tun, void *pack, unsigned len) return 0; if (ippool_getip(pool, &ipm, &dst)) { - LOGTUN(LOGL_DEBUG, tun, "Received packet for APN(%s) with no PDP contex! (%s)\n", - apn->cfg.name, - iph->version == 4 ? - inet_ntop(AF_INET, &iph->saddr, straddr, sizeof(straddr)) : - inet_ntop(AF_INET6, &ip6h->ip6_src, straddr, sizeof(straddr))); + LOGTUN(LOGL_DEBUG, tun, "APN(%s) Rx DL data packet for IP address outside " + "pool of managed addresses: %s <- %s\n", + apn->cfg.name, + iph->version == 4 ? + inet_ntop(AF_INET, &iph->daddr, straddr[0], sizeof(straddr[0])) : + inet_ntop(AF_INET6, &ip6h->ip6_dst, straddr[0], sizeof(straddr[0])), + iph->version == 4 ? + inet_ntop(AF_INET, &iph->saddr, straddr[1], sizeof(straddr[1])) : + inet_ntop(AF_INET6, &ip6h->ip6_src, straddr[1], sizeof(straddr[1]))); return 0; } - LOGTUN(LOGL_DEBUG, tun, "Received packet for APN(%s)\n", apn->cfg.name); - if (ipm->peer) /* Check if a peer protocol is defined */ - gtp_data_req(apn->ggsn->gsn, (struct pdp_t *)ipm->peer, pack, len); + if (ipm->peer) { /* Check if a peer protocol is defined */ + struct pdp_t *pdp = (struct pdp_t *)ipm->peer; + LOGTUN(LOGL_DEBUG, tun, "APN(%s) Rx DL data packet for PDP(%s:%u): %s <- %s\n", + apn->cfg.name, + imsi_gtp2str(&(pdp)->imsi), (pdp)->nsapi, + iph->version == 4 ? + inet_ntop(AF_INET, &iph->daddr, straddr[0], sizeof(straddr[0])) : + inet_ntop(AF_INET6, &ip6h->ip6_dst, straddr[0], sizeof(straddr[0])), + iph->version == 4 ? + inet_ntop(AF_INET, &iph->saddr, straddr[1], sizeof(straddr[1])) : + inet_ntop(AF_INET6, &ip6h->ip6_src, straddr[1], sizeof(straddr[1]))); + gtp_data_req(apn->ggsn->gsn, pdp, pack, len); + } else { + LOGTUN(LOGL_DEBUG, tun, "APN(%s) Rx DL data packet for IP address with no " + "associated PDP Ctx: %s <- %s\n", + apn->cfg.name, + iph->version == 4 ? + inet_ntop(AF_INET, &iph->daddr, straddr[0], sizeof(straddr[0])) : + inet_ntop(AF_INET6, &ip6h->ip6_dst, straddr[0], sizeof(straddr[0])), + iph->version == 4 ? + inet_ntop(AF_INET, &iph->saddr, straddr[1], sizeof(straddr[1])) : + inet_ntop(AF_INET6, &ip6h->ip6_src, straddr[1], sizeof(straddr[1]))); + } return 0; } @@ -794,7 +818,7 @@ int ggsn_start(struct ggsn_ctx *ggsn) LOGPGGSN(LOGL_INFO, ggsn, "Starting GGSN\n"); /* Start libgtp listener */ - if (gtp_new(&ggsn->gsn, ggsn->cfg.state_dir, &ggsn->cfg.listen_addr.v4, GTP_MODE_GGSN)) { + if (gtp_new2(&ggsn->gsn, ggsn->cfg.state_dir, &ggsn->cfg.listen_addr, GTP_MODE_GGSN)) { LOGPGGSN(LOGL_ERROR, ggsn, "Failed to create GTP: %s\n", strerror(errno)); return -1; } @@ -802,11 +826,10 @@ int ggsn_start(struct ggsn_ctx *ggsn) /* patch in different addresses to use (in case we're behind NAT, the listen * address is different from what we advertise externally) */ - if (ggsn->cfg.gtpc_addr.v4.s_addr) - ggsn->gsn->gsnc = ggsn->cfg.gtpc_addr.v4; - - if (ggsn->cfg.gtpu_addr.v4.s_addr) - ggsn->gsn->gsnu = ggsn->cfg.gtpu_addr.v4; + if (ggsn->cfg.gtpc_addr.len) + gtp_set_gsnc(ggsn->gsn, &ggsn->cfg.gtpc_addr); + if (ggsn->cfg.gtpu_addr.len) + gtp_set_gsnu(ggsn->gsn, &ggsn->cfg.gtpu_addr); /* Register File Descriptors */ osmo_fd_setup(&ggsn->gtp_fd0, ggsn->gsn->fd0, OSMO_FD_READ, ggsn_gtp_fd_cb, ggsn, 0); diff --git a/ggsn/ggsn.h b/ggsn/ggsn.h index 82984a0..5b8cc9b 100644 --- a/ggsn/ggsn.h +++ b/ggsn/ggsn.h @@ -6,13 +6,14 @@ #include <osmocom/core/linuxlist.h> #include <osmocom/core/select.h> #include <osmocom/core/timer.h> +#include <osmocom/core/tdef.h> +#include <osmocom/core/in46_addr.h> #include <osmocom/ctrl/control_if.h> +#include <osmocom/gtp/gtp.h> #include "../lib/tun.h" #include "../lib/ippool.h" #include "../lib/syserr.h" -#include "../lib/in46_addr.h" -#include "../gtp/gtp.h" #include "sgsn.h" @@ -65,9 +66,9 @@ struct apn_ctx { uint32_t apn_type_mask; /* GTP-U via TUN device or in Linux kernel */ enum apn_gtpu_mode gtpu_mode; - /* administratively shut-down (true) or not (false) */ + /* administratively shut down (true) or not (false) */ bool shutdown; - /* transmit G-PDU sequeence numbers (true) or not (false) */ + /* transmit G-PDU sequence numbers (true) or not (false) */ bool tx_gpdu_seq; } cfg; @@ -127,7 +128,7 @@ struct ggsn_ctx { char *state_dir; /* Time between Echo requests on each SGSN */ unsigned int echo_interval; - /* administratively shut-down (true) or not (false) */ + /* administratively shut down (true) or not (false) */ bool shutdown; } cfg; @@ -152,6 +153,7 @@ struct apn_ctx *ggsn_find_or_create_apn(struct ggsn_ctx *ggsn, const char *name) /* ggsn_main.c */ extern struct ctrl_handle *g_ctrlh; extern void *tall_ggsn_ctx; +extern struct osmo_tdef_group ggsn_tdef_group[]; /* ggsn.c */ extern int ggsn_start(struct ggsn_ctx *ggsn); @@ -167,6 +169,3 @@ void ggsn_close_one_pdp(struct pdp_t *pdp); LOGP(DGGSN, level, "GGSN(%s): " fmt, (ggsn)->cfg.name, ## args) #define LOGPPDP(level, pdp, fmt, args...) LOGPDPX(DGGSN, level, pdp, fmt, ## args) - -#define LOGTUN(level, tun, fmt, args...) \ - LOGP(DTUN, level, "TUN(%s): " fmt, (tun)->devname, ## args) diff --git a/ggsn/ggsn_main.c b/ggsn/ggsn_main.c index d19b359..a7c96a7 100644 --- a/ggsn/ggsn_main.c +++ b/ggsn/ggsn_main.c @@ -34,6 +34,7 @@ #include <osmocom/core/stats.h> #include <osmocom/core/rate_ctr.h> #include <osmocom/core/timer.h> +#include <osmocom/core/tdef.h> #include <osmocom/core/utils.h> #include <osmocom/ctrl/control_if.h> #include <osmocom/ctrl/control_cmd.h> @@ -60,6 +61,11 @@ struct ul255_t apn; static char *config_file = "osmo-ggsn.cfg"; +struct osmo_tdef_group ggsn_tdef_group[] = { + {.name = "gtp", .tdefs = gtp_T_defs, .desc = "GTP (libgtp) timers" }, + { } +}; + /* To exit gracefully. Used with GCC compilation flag -pg and gprof */ static void signal_handler(int s) { @@ -107,17 +113,49 @@ static void print_help() " -c --config-file filename The config file to use\n" " -V --version Print the version of OsmoGGSN\n" ); + + printf("\nVTY reference generation:\n"); + printf(" --vty-ref-mode MODE VTY reference generation mode (e.g. 'expert').\n"); + printf(" --vty-ref-xml Generate the VTY reference XML output and exit.\n"); +} + +static void handle_long_options(const char *prog_name, const int long_option) +{ + static int vty_ref_mode = VTY_REF_GEN_MODE_DEFAULT; + + switch (long_option) { + case 1: + vty_ref_mode = get_string_value(vty_ref_gen_mode_names, optarg); + if (vty_ref_mode < 0) { + fprintf(stderr, "%s: Unknown VTY reference generation " + "mode '%s'\n", prog_name, optarg); + exit(2); + } + break; + case 2: + fprintf(stderr, "Generating the VTY reference in mode '%s' (%s)\n", + get_value_string(vty_ref_gen_mode_names, vty_ref_mode), + get_value_string(vty_ref_gen_mode_desc, vty_ref_mode)); + vty_dump_xml_ref_mode(stdout, (enum vty_ref_gen_mode) vty_ref_mode); + exit(0); + default: + fprintf(stderr, "%s: error parsing cmdline options\n", prog_name); + exit(2); + } } static void handle_options(int argc, char **argv) { while (1) { int option_index = 0, c; + static int long_option = 0; static struct option long_options[] = { { "help", 0, 0, 'h' }, { "daemonize", 0, 0, 'D' }, { "config-file", 1, 0, 'c' }, { "version", 0, 0, 'V' }, + { "vty-ref-mode", 1, &long_option, 1 }, + { "vty-ref-xml", 0, &long_option, 2 }, { 0, 0, 0, 0 } }; @@ -126,6 +164,9 @@ static void handle_options(int argc, char **argv) break; switch (c) { + case 0: + handle_long_options(argv[0], long_option); + break; case 'h': print_usage(); print_help(); @@ -182,12 +223,11 @@ int main(int argc, char **argv) exit(2); } - rc = telnet_init_dynif(tall_ggsn_ctx, NULL, vty_get_bind_addr(), OSMO_VTY_PORT_GGSN); + rc = telnet_init_default(tall_ggsn_ctx, NULL, OSMO_VTY_PORT_GGSN); if (rc < 0) exit(1); - g_ctrlh = ctrl_interface_setup_dynip(NULL, ctrl_vty_get_bind_addr(), - OSMO_CTRL_PORT_GGSN, NULL); + g_ctrlh = ctrl_interface_setup(NULL, OSMO_CTRL_PORT_GGSN, NULL); if (!g_ctrlh) { LOGP(DGGSN, LOGL_ERROR, "Failed to create CTRL interface.\n"); exit(1); diff --git a/ggsn/ggsn_vty.c b/ggsn/ggsn_vty.c index 71d8ff6..f70daf1 100644 --- a/ggsn/ggsn_vty.c +++ b/ggsn/ggsn_vty.c @@ -33,14 +33,16 @@ #include <osmocom/vty/command.h> #include <osmocom/vty/vty.h> #include <osmocom/vty/misc.h> +#include <osmocom/vty/tdef_vty.h> -#include "../gtp/gtp.h" -#include "../gtp/pdp.h" +#include <osmocom/gtp/gtp.h> +#include <osmocom/gtp/pdp.h> #include "../lib/util.h" #include "ggsn.h" #include "sgsn.h" +#include "../gtp/gtp_internal.h" #define PREFIX_STR "Prefix (Network/Netmask)\n" #define IFCONFIG_STR "GGSN-based interface configuration\n" @@ -298,7 +300,7 @@ DEFUN(cfg_ggsn_no_default_apn, cfg_ggsn_no_default_apn_cmd, DEFUN(cfg_ggsn_shutdown, cfg_ggsn_shutdown_cmd, "shutdown ggsn", - "Put the GGSN in administrative shut-down\n" GGSN_STR) + "Put the GGSN in administrative shutdown\n" GGSN_STR) { struct ggsn_ctx *ggsn = (struct ggsn_ctx *) vty->index; @@ -315,7 +317,7 @@ DEFUN(cfg_ggsn_shutdown, cfg_ggsn_shutdown_cmd, DEFUN(cfg_ggsn_no_shutdown, cfg_ggsn_no_shutdown_cmd, "no shutdown ggsn", - NO_STR GGSN_STR "Remove the GGSN from administrative shut-down\n") + NO_STR GGSN_STR "Remove the GGSN from administrative shutdown\n") { struct ggsn_ctx *ggsn = (struct ggsn_ctx *) vty->index; @@ -343,7 +345,7 @@ static void show_one_sgsn(struct vty *vty, const struct sgsn_peer *sgsn, const c DEFUN(cfg_ggsn_show_sgsn, cfg_ggsn_show_sgsn_cmd, "show sgsn", - NO_STR GGSN_STR "Remove the GGSN from administrative shut-down\n") + NO_STR GGSN_STR "Remove the GGSN from administrative shutdown\n") { struct ggsn_ctx *ggsn = (struct ggsn_ctx *) vty->index; struct sgsn_peer *sgsn; @@ -389,10 +391,9 @@ DEFUN(cfg_ggsn_no_echo_interval, cfg_ggsn_no_echo_interval_cmd, NO_STR "Send an echo request to this static GGSN every interval.\n") { struct ggsn_ctx *ggsn = (struct ggsn_ctx *) vty->index; - int prev_interval = ggsn->cfg.echo_interval; struct sgsn_peer *sgsn; - if (prev_interval == ggsn->cfg.echo_interval) + if (ggsn->cfg.echo_interval == 0) return CMD_SUCCESS; ggsn->cfg.echo_interval = 0; @@ -533,9 +534,11 @@ DEFUN(cfg_apn_ip_prefix, cfg_apn_ip_prefix_cmd, struct in46_prefix *pfx; /* first update our parsed prefix */ - if (!strcmp(argv[0], "static")) + if (!strcmp(argv[0], "static")) { pfx = &apn->v4.cfg.static_prefix; - else + vty_out(vty, "%% static IP addresses currently not yet supported%s", VTY_NEWLINE); + return CMD_WARNING; + } else pfx = &apn->v4.cfg.dynamic_prefix; str2prefix(pfx, argv[1]); @@ -567,9 +570,11 @@ DEFUN(cfg_apn_ipv6_prefix, cfg_apn_ipv6_prefix_cmd, struct apn_ctx *apn = (struct apn_ctx *) vty->index; struct in46_prefix *pfx; - if (!strcmp(argv[0], "static")) + if (!strcmp(argv[0], "static")) { pfx = &apn->v6.cfg.static_prefix; - else + vty_out(vty, "%% static IP addresses currently not yet supported%s", VTY_NEWLINE); + return CMD_WARNING; + } else pfx = &apn->v6.cfg.dynamic_prefix; str2prefix(pfx, argv[1]); return CMD_SUCCESS; @@ -677,7 +682,7 @@ DEFUN(cfg_apn_no_gpdu_seq, cfg_apn_no_gpdu_seq_cmd, DEFUN(cfg_apn_shutdown, cfg_apn_shutdown_cmd, "shutdown", - "Put the APN in administrative shut-down\n") + "Put the APN in administrative shutdown\n") { struct apn_ctx *apn = (struct apn_ctx *) vty->index; @@ -694,7 +699,7 @@ DEFUN(cfg_apn_shutdown, cfg_apn_shutdown_cmd, DEFUN(cfg_apn_no_shutdown, cfg_apn_no_shutdown_cmd, "no shutdown", - NO_STR "Remove the APN from administrative shut-down\n") + NO_STR "Remove the APN from administrative shutdown\n") { struct apn_ctx *apn = (struct apn_ctx *) vty->index; @@ -792,6 +797,7 @@ static int config_write_ggsn(struct vty *vty) vty_out(vty, " gtp control-ip %s%s", in46a_ntoa(&ggsn->cfg.gtpc_addr), VTY_NEWLINE); if (ggsn->cfg.gtpu_addr.v4.s_addr) vty_out(vty, " gtp user-ip %s%s", in46a_ntoa(&ggsn->cfg.gtpu_addr), VTY_NEWLINE); + osmo_tdef_vty_groups_write(vty, " "); llist_for_each_entry(apn, &ggsn->apn_list, list) config_write_apn(vty, apn); if (ggsn->cfg.default_apn) @@ -809,10 +815,7 @@ static const char *print_gsnaddr(const struct ul16_t *in) { struct in46_addr in46; - in46.len = in->l; - OSMO_ASSERT(in->l <= sizeof(in46.v6)); - memcpy(&in46.v6, in->v, in->l); - + in46a_from_gsna(in, &in46); return in46a_ntoa(&in46); } @@ -1110,6 +1113,8 @@ int ggsn_vty_init(void) install_element(GGSN_NODE, &cfg_ggsn_echo_interval_cmd); install_element(GGSN_NODE, &cfg_ggsn_no_echo_interval_cmd); + osmo_tdef_vty_groups_init(GGSN_NODE, ggsn_tdef_group); + install_node(&apn_node, NULL); install_element(APN_NODE, &cfg_description_cmd); install_element(APN_NODE, &cfg_no_description_cmd); @@ -110,6 +110,7 @@ ret_broken: osmo_hexdump_nospc((const uint8_t *)pco_in, pco_in->length)); } +/* Handle IP Control Protocol, RFC 1332, extensions in RFC 1877 */ static void process_pco_element_ipcp(const struct pco_element *pco_elem, struct msgb *resp, const struct apn_ctx *apn, struct pdp_t *pdp) { @@ -2,9 +2,9 @@ #include <stdint.h> -#include "../gtp/pdp.h" +#include <osmocom/gtp/pdp.h> -/* 3GPP TS 24.008 10.6.5.3 */ +/* 3GPP TS 24.008 10.5.6.3 */ enum pco_protocols { PCO_P_LCP = 0xC021, PCO_P_PAP = 0xC023, @@ -42,12 +42,11 @@ struct pco_element { uint8_t data[0]; } __attribute__((packed)); - -/* RFC 1332 */ +/* RFC 1332 IP Control Protocol options, extensions in RFC 1877 */ enum ipcp_options { - IPCP_OPT_IPADDR = 3, - IPCP_OPT_PRIMARY_DNS = 129, - IPCP_OPT_SECONDARY_DNS = 131, + IPCP_OPT_IPADDR = 3, /* RFC 1332 3.3 */ + IPCP_OPT_PRIMARY_DNS = 129, /* RFC 1877 1.1 */ + IPCP_OPT_SECONDARY_DNS = 131, /* RFC 1877 1.2 */ }; struct ipcp_option_hdr { diff --git a/ggsn/sgsn.c b/ggsn/sgsn.c index 8360439..b324fd7 100644 --- a/ggsn/sgsn.c +++ b/ggsn/sgsn.c @@ -1,6 +1,6 @@ #include "sgsn.h" #include "ggsn.h" - +#include "../gtp/gtp_internal.h" static bool sgsn_peer_attempt_free(struct sgsn_peer *sgsn) { @@ -116,6 +116,7 @@ static unsigned int sgsn_peer_drop_all_pdp_except(struct sgsn_peer *sgsn, struct { unsigned int num = 0; char buf[INET_ADDRSTRLEN]; + unsigned int count = llist_count(&sgsn->pdp_list); inet_ntop(AF_INET, &sgsn->addr, buf, sizeof(buf)); @@ -125,10 +126,17 @@ static unsigned int sgsn_peer_drop_all_pdp_except(struct sgsn_peer *sgsn, struct continue; ggsn_close_one_pdp(pdp->lib); num++; + if (num == count) { + /* Note: if except is NULL, all pdp contexts are freed and sgsn + * is most probably already freed at this point. + * As a result, last access to sgsn->pdp_list before exiting + * loop would access already freed memory. Avoid it by exiting + * the loop without the last check, and make sure sgsn is not + * accessed after this loop. */ + break; + } } - /* Note: if except is NULL, all pdp contexts are freed and sgsn is - already freed at this point */ LOGP(DGGSN, LOGL_INFO, "SGSN(%s) Dropped %u PDP contexts\n", buf, num); return num; diff --git a/ggsn/sgsn.h b/ggsn/sgsn.h index d2c3c0c..3bc94e3 100644 --- a/ggsn/sgsn.h +++ b/ggsn/sgsn.h @@ -8,7 +8,7 @@ #include <osmocom/core/linuxlist.h> #include <osmocom/core/timer.h> -#include "../gtp/pdp.h" +#include <osmocom/gtp/pdp.h> struct ggsn_ctx; struct pdp_priv_t; diff --git a/gtp/Makefile.am b/gtp/Makefile.am index a392277..32f1414 100644 --- a/gtp/Makefile.am +++ b/gtp/Makefile.am @@ -2,14 +2,34 @@ # Please read chapter "Library interface versions" of the libtool documentation # before making any modifications: https://www.gnu.org/software/libtool/manual/html_node/Versioning.html # If major=current-age is increased, remember to update the dh_strip line in debian/rules! -LIBVERSION=6:0:0 +LIBVERSION=9:1:3 lib_LTLIBRARIES = libgtp.la -include_HEADERS = gtp.h pdp.h gtpie.h +AM_CFLAGS = \ + -fno-builtin \ + -Wall \ + -DSBINDIR='"$(sbindir)"' \ + -I$(top_srcdir)/include \ + $(LIBOSMOCORE_CFLAGS) \ + $(NULL) -AM_CFLAGS = -O2 -fno-builtin -Wall -DSBINDIR='"$(sbindir)"' -ggdb $(LIBOSMOCORE_CFLAGS) +libgtp_la_SOURCES = \ + gsn.c \ + gsn.h \ + gsn_internal.h \ + gtp.c \ + gtp.h \ + gtp_internal.h \ + gtpie.c \ + gtpie.h \ + lookupa.c \ + lookupa.h \ + pdp.c \ + pdp.h \ + queue.c \ + queue.h \ + $(NULL) -libgtp_la_SOURCES = gtp.c gtp.h gtpie.c gtpie.h pdp.c pdp.h lookupa.c lookupa.h queue.c queue.h libgtp_la_LDFLAGS = -version-info $(LIBVERSION) -no-undefined libgtp_la_LIBADD = $(LIBOSMOCORE_LIBS) diff --git a/gtp/gsn.c b/gtp/gsn.c new file mode 100644 index 0000000..3cdb61e --- /dev/null +++ b/gtp/gsn.c @@ -0,0 +1,667 @@ +/* + * OsmoGGSN - Gateway GPRS Support Node + * Copyright (C) 2002, 2003, 2004 Mondru AB. + * Copyright (C) 2010-2011, 2016-2017 Harald Welte <laforge@gnumonks.org> + * Copyright (C) 2015-2017 sysmocom - s.f.m.c. GmbH + * + * The contents of this file may be used under the terms of the GNU + * General Public License Version 2, provided that the above copyright + * notice and this permission notice is included in all copies or + * substantial portions of the software. + * + */ + +/* + * gtp.c: Contains all GTP functionality. Should be able to handle multiple + * tunnels in the same program. + * + * TODO: + * - Do we need to handle fragmentation? + */ + +#ifdef __linux__ +#define _GNU_SOURCE 1 +#endif + +#include <osmocom/core/logging.h> +#include <osmocom/core/utils.h> +#include <osmocom/core/stats.h> +#include <osmocom/core/rate_ctr.h> + +#if defined(__FreeBSD__) +#include <sys/endian.h> +#endif + +#include "../config.h" +#ifdef HAVE_STDINT_H +#include <stdint.h> +#endif + +#include <stdio.h> +#include <stdarg.h> +#include <stdlib.h> +#include <sys/time.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <arpa/inet.h> +#include <sys/stat.h> +#include <time.h> +#include <unistd.h> +#include <string.h> +#include <errno.h> +#include <fcntl.h> +#include <inttypes.h> + +#include <arpa/inet.h> + +/* #include <stdint.h> ISO C99 types */ + +#include <osmocom/gtp/pdp.h> +#include <osmocom/gtp/gtp.h> +#include <osmocom/gtp/gtpie.h> + +#include "queue.h" +#include "gsn_internal.h" + +/* Error reporting functions */ + +#define LOGP_WITH_ADDR(ss, level, addr, fmt, args...) \ + LOGP(ss, level, "addr(%s:%d) " fmt, \ + inet_ntoa((addr).sin_addr), htons((addr).sin_port), \ + ##args) + +static const struct rate_ctr_desc gsn_ctr_description[] = { + [GSN_CTR_ERR_SOCKET] = { "err:socket", "Socket error" }, + [GSN_CTR_ERR_READFROM] = { "err:readfrom", "readfrom() errors" }, + [GSN_CTR_ERR_SENDTO] = { "err:sendto", "sendto() errors" }, + [GSN_CTR_ERR_QUEUEFULL] = { "err:queuefull", "Failed to queue message because queue is full" }, + [GSN_CTR_ERR_SEQ] = { "err:seq", "Sequence number out of range" }, + [GSN_CTR_ERR_ADDRESS] = { "err:address", "GSN address conversion failed" }, + [GSN_CTR_ERR_UNKNOWN_PDP] = { "err:unknown_pdp", "Failed looking up PDP context" }, + [GSN_CTR_ERR_UNEXPECTED_CAUSE] = { "err:unexpected_cause", "Unexpected cause value received" }, + [GSN_CTR_ERR_OUT_OF_PDP] = { "err:out_of_pdp", "Out of storage for PDP contexts" }, + [GSN_CTR_PKT_EMPTY] = { "pkt:empty", "Empty packet received" }, + [GSN_CTR_PKT_UNSUP] = { "pkt:unsupported", "Unsupported GTP version received" }, + [GSN_CTR_PKT_TOOSHORT] = { "pkt:too_short", "Packet too short received" }, + [GSN_CTR_PKT_UNKNOWN] = { "pkt:unknown", "Unknown packet type received" }, + [GSN_CTR_PKT_UNEXPECT] = { "pkt:unexpected", "Unexpected packet type received" }, + [GSN_CTR_PKT_DUPLICATE] = { "pkt:duplicate", "Duplicate or unsolicited packet received" }, + [GSN_CTR_PKT_MISSING] = { "pkt:missing", "Missing IE in packet received" }, + [GSN_CTR_PKT_INCORRECT] = { "pkt:incorrect", "Incorrect IE in packet received" }, + [GSN_CTR_PKT_INVALID] = { "pkt:invalid", "Invalid format in packet received" }, +}; + +static const struct rate_ctr_group_desc gsn_ctrg_desc = { + "gsn", + "GSN Statistics", + OSMO_STATS_CLASS_PEER, + ARRAY_SIZE(gsn_ctr_description), + gsn_ctr_description, +}; +static unsigned int gsn_ctr_next_idx = 0; + +/* Global timer definitions for GTP operation, provided for convenience. To make these user configurable, it is convenient to add + * gtp_gsn_tdefs as one of your program's osmo_tdef_group entries and call osmo_tdef_vty_init(). */ +struct osmo_tdef gtp_T_defs[] = { + { .T = GTP_GSN_TIMER_T3_RESPONSE, .default_val = 5, .unit = OSMO_TDEF_S, + .desc = "Timer T3-RESPONSE holds the maximum wait time for a response of a request message" + }, + { .T = GTP_GSN_TIMER_N3_REQUESTS, .default_val = 3, .unit = OSMO_TDEF_CUSTOM, + .desc = "Counter N3-REQUESTS holds the maximum number of attempts made by GTP to send a request message" + }, + { .T = GTP_GSN_TIMER_T3_HOLD_RESPONSE, .default_val = 5 * 3 /* (GTP_GSN_TIMER_T3_RESPONSE * GTP_GSN_TIMER_N3_REQUESTS) */, .unit = OSMO_TDEF_S, + .desc = "Time a GTP respoonse message is kept cached to re-transmit it when a duplicate request is received. Value is generally equal to (T3-RESPONSE * N3-REQUESTS) set at the peer" + }, + {} +}; + +static void *gsn_ctx = NULL; + +static __attribute__((constructor)) void on_dso_load_init_ctx(void) +{ + gsn_ctx = talloc_named_const(NULL, 1, "libgtp gsn.c"); +} + +/* API Functions */ + +/* Deprecated, use gtp_pdp_newpdp() instead */ +int gtp_newpdp(struct gsn_t *gsn, struct pdp_t **pdp, + uint64_t imsi, uint8_t nsapi) +{ + int rc; + rc = gtp_pdp_newpdp(gsn, pdp, imsi, nsapi, NULL); + return rc; +} + +int gtp_freepdp(struct gsn_t *gsn, struct pdp_t *pdp) +{ + if (gsn->cb_delete_context) + gsn->cb_delete_context(pdp); + return pdp_freepdp(pdp); +} + +/* Free pdp and all its secondary PDP contexts. Must be called on the primary PDP context. */ +int gtp_freepdp_teardown(struct gsn_t *gsn, struct pdp_t *pdp) +{ + int n; + struct pdp_t *secondary_pdp; + OSMO_ASSERT(!pdp->secondary); + + for (n = 0; n < PDP_MAXNSAPI; n++) { + if (pdp->secondary_tei[n]) { + if (gtp_pdp_getgtp1(gsn, &secondary_pdp, + pdp->secondary_tei[n])) { + LOGP(DLGTP, LOGL_ERROR, + "Unknown secondary PDP context\n"); + continue; + } + if (pdp != secondary_pdp) { + gtp_freepdp(gsn, secondary_pdp); + } + } + } + + return gtp_freepdp(gsn, pdp); +} + +/* gtp_gpdu */ + +extern int gtp_fd(struct gsn_t *gsn) +{ + return gsn->fd0; +} + +int gtp_set_cb_unsup_ind(struct gsn_t *gsn, + int (*cb) (struct sockaddr_in * peer)) +{ + gsn->cb_unsup_ind = cb; + return 0; +} + +int gtp_set_cb_extheader_ind(struct gsn_t *gsn, + int (*cb) (struct sockaddr_in * peer)) +{ + gsn->cb_extheader_ind = cb; + return 0; +} + +int gtp_set_cb_ran_info_relay_ind(struct gsn_t *gsn, + int (*cb) (struct sockaddr_in * peer, union gtpie_member **ie)) +{ + gsn->cb_ran_info_relay_ind = cb; + return 0; +} + +/* API: Initialise delete context callback */ +/* Called whenever a pdp context is deleted for any reason */ +int gtp_set_cb_delete_context(struct gsn_t *gsn, int (*cb) (struct pdp_t * pdp)) +{ + gsn->cb_delete_context = cb; + return 0; +} + +int gtp_set_cb_conf(struct gsn_t *gsn, + int (*cb) (int type, int cause, + struct pdp_t * pdp, void *cbp)) +{ + gsn->cb_conf = cb; + return 0; +} + +int gtp_set_cb_recovery(struct gsn_t *gsn, + int (*cb) (struct sockaddr_in * peer, uint8_t recovery)) +{ + gsn->cb_recovery = cb; + return 0; +} + +/* cb_recovery() + * pdp may be NULL if Recovery IE was received from a message independent + * of any PDP ctx (such as Echo Response), or because pdp ctx is unknown to the + * local setup. In case pdp is known, caller may want to keep that pdp alive to + * handle subsequent msg cb as this specific pdp ctx is still valid according to + * specs. + */ +int gtp_set_cb_recovery2(struct gsn_t *gsn, + int (*cb_recovery2) (struct sockaddr_in * peer, struct pdp_t * pdp, uint8_t recovery)) +{ + gsn->cb_recovery2 = cb_recovery2; + return 0; +} + +/* cb_recovery() + * pdp may be NULL if Recovery IE was received from a message independent + * of any PDP ctx (such as Echo Response), or because pdp ctx is unknown to the + * local setup. In case pdp is known, caller may want to keep that pdp alive to + * handle subsequent msg cb as this specific pdp ctx is still valid according to + * specs. + */ +int gtp_set_cb_recovery3(struct gsn_t *gsn, + int (*cb_recovery3) (struct gsn_t *gsn, struct sockaddr_in *peer, + struct pdp_t *pdp, uint8_t recovery)) +{ + gsn->cb_recovery3 = cb_recovery3; + return 0; +} + +int gtp_set_cb_data_ind(struct gsn_t *gsn, + int (*cb_data_ind) (struct pdp_t * pdp, + void *pack, unsigned len)) +{ + gsn->cb_data_ind = cb_data_ind; + return 0; +} + +static int queue_timer_retrans(struct gsn_t *gsn) +{ + /* Retransmit any outstanding packets */ + /* Remove from queue if maxretrans exceeded */ + time_t now; + struct qmsg_t *qmsg; + unsigned int t3_response, n3_requests; + + now = time(NULL); + t3_response = osmo_tdef_get(gsn->tdef, GTP_GSN_TIMER_T3_RESPONSE, OSMO_TDEF_S, -1); + n3_requests = osmo_tdef_get(gsn->tdef, GTP_GSN_TIMER_N3_REQUESTS, OSMO_TDEF_CUSTOM, -1); + + /* get first element in queue, as long as the timeout of that + * element has expired */ + while ((!queue_getfirst(gsn->queue_req, &qmsg)) && + (qmsg->timeout <= now)) { + if (qmsg->retrans > n3_requests) { /* Too many retrans */ + LOGP(DLGTP, LOGL_NOTICE, "Retransmit req queue timeout of seq %" PRIu16 "\n", + qmsg->seq); + if (gsn->cb_conf) + gsn->cb_conf(qmsg->type, EOF, NULL, qmsg->cbp); + queue_freemsg(gsn->queue_req, qmsg); + } else { + LOGP(DLGTP, LOGL_INFO, "Retransmit (%d) of seq %" PRIu16 "\n", + qmsg->retrans, qmsg->seq); + if (sendto(qmsg->fd, &qmsg->p, qmsg->l, 0, + (struct sockaddr *)&qmsg->peer, + sizeof(struct sockaddr_in)) < 0) { + rate_ctr_inc2(gsn->ctrg, GSN_CTR_ERR_SENDTO); + LOGP(DLGTP, LOGL_ERROR, + "Sendto(fd0=%d, msg=%lx, len=%d) failed: Error = %s\n", + gsn->fd0, (unsigned long)&qmsg->p, + qmsg->l, strerror(errno)); + } + queue_back(gsn->queue_req, qmsg); + qmsg->timeout = now + t3_response; + qmsg->retrans++; + } + } + + /* Also clean up reply timeouts */ + while ((!queue_getfirst(gsn->queue_resp, &qmsg)) && + (qmsg->timeout < now)) { + LOGP(DLGTP, LOGL_DEBUG, "Retransmit resp queue seq %" + PRIu16 " expired, removing from queue\n", qmsg->seq); + queue_freemsg(gsn->queue_resp, qmsg); + } + + return 0; +} + +static int queue_timer_retranstimeout(struct gsn_t *gsn, struct timeval *timeout) +{ + time_t now, later, diff; + struct qmsg_t *qmsg; + timeout->tv_usec = 0; + + if (queue_getfirst(gsn->queue_req, &qmsg)) { + timeout->tv_sec = 10; + } else { + now = time(NULL); + later = qmsg->timeout; + timeout->tv_sec = later - now; + if (timeout->tv_sec < 0) + timeout->tv_sec = 0; /* No negative allowed */ + if (timeout->tv_sec > 10) + timeout->tv_sec = 10; /* Max sleep for 10 sec */ + } + + if (queue_getfirst(gsn->queue_resp, &qmsg)) { + /* already set by queue_req, do nothing */ + } else { /* trigger faster if earlier timeout exists in queue_resp */ + now = time(NULL); + later = qmsg->timeout; + diff = later - now; + if (diff < 0) + diff = 0; + if (diff < timeout->tv_sec) + timeout->tv_sec = diff; + } + + return 0; +} + +void gtp_queue_timer_start(struct gsn_t *gsn) +{ + struct timeval next; + + /* Retrieve next retransmission as timeval */ + queue_timer_retranstimeout(gsn, &next); + + /* re-schedule the timer */ + osmo_timer_schedule(&gsn->queue_timer, next.tv_sec, next.tv_usec/1000); +} + +/* timer callback for libgtp retransmission and ping */ +static void queue_timer_cb(void *data) +{ + struct gsn_t *gsn = data; + + /* do all the retransmissions as needed */ + queue_timer_retrans(gsn); + + gtp_queue_timer_start(gsn); +} + + +/** + * @brief clear the request and response queue. Useful for debugging to reset "some" state. + * @param gsn The GGSN instance + */ +void gtp_clear_queues(struct gsn_t *gsn) +{ + struct qmsg_t *qmsg; + + LOGP(DLGTP, LOGL_INFO, "Clearing req & resp retransmit queues\n"); + while (!queue_getfirst(gsn->queue_req, &qmsg)) { + queue_freemsg(gsn->queue_req, qmsg); + } + + while (!queue_getfirst(gsn->queue_resp, &qmsg)) { + queue_freemsg(gsn->queue_resp, qmsg); + } +} + +/* Perform restoration and recovery error handling as described in 29.060 */ +static void log_restart(struct gsn_t *gsn) +{ + FILE *f; + int i, rc; + int counter = 0; + char *filename; + + filename = talloc_asprintf(NULL, "%s/%s", gsn->statedir, RESTART_FILE); + OSMO_ASSERT(filename); + + /* We try to open file. On failure we will later try to create file */ + if (!(f = fopen(filename, "r"))) { + LOGP(DLGTP, LOGL_NOTICE, + "State information file (%s) not found. Creating new file.\n", + filename); + } else { + rc = fscanf(f, "%d", &counter); + if (rc != 1) { + LOGP(DLGTP, LOGL_ERROR, + "fscanf failed to read counter value\n"); + goto close_file; + } + if (fclose(f)) { + LOGP(DLGTP, LOGL_ERROR, + "fclose failed: Error = %s\n", strerror(errno)); + } + } + + gsn->restart_counter = (unsigned char)counter; + gsn->restart_counter++; + + /* Keep the umask closely wrapped around our fopen() call in case the + * log outputs cause file creation. */ + i = umask(022); + f = fopen(filename, "w"); + umask(i); + if (!f) { + LOGP(DLGTP, LOGL_ERROR, + "fopen(path=%s, mode=%s) failed: Error = %s\n", filename, + "w", strerror(errno)); + goto free_filename; + } + + fprintf(f, "%d\n", gsn->restart_counter); +close_file: + if (fclose(f)) + LOGP(DLGTP, LOGL_ERROR, + "fclose failed: Error = %s\n", strerror(errno)); +free_filename: + talloc_free(filename); +} + +static int create_and_bind_socket(const char *name, struct gsn_t *gsn, int *fd, const struct in46_addr *listen, + int port) +{ + int family = in46a_to_af(listen); + int type = SOCK_DGRAM; + int protocol = 0; + struct sockaddr addr = {0}; + struct sockaddr_in *addr4 = (struct sockaddr_in *)&addr; + struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&addr; + *fd = socket(family, type, protocol); + if (*fd < 0) { + rate_ctr_inc2(gsn->ctrg, GSN_CTR_ERR_SOCKET); + LOGP(DLGTP, LOGL_ERROR, + "%s socket(domain=%d, type=%d, protocol=%d) failed: Error = %s\n", + name, family, type, protocol, strerror(errno)); + return -errno; + } + switch (family) { + case AF_INET: + addr4->sin_family = AF_INET; + addr4->sin_addr = listen->v4; + addr4->sin_port = htons(port); +#if defined(__FreeBSD__) || defined(__APPLE__) + addr4->sin_len = sizeof(struct addr); +#endif + break; + case AF_INET6: + addr6->sin6_family = AF_INET6; + addr6->sin6_addr = listen->v6; + addr6->sin6_port = htons(port); +#if defined(__FreeBSD__) || defined(__APPLE__) + addr6->sin6_len = sizeof(struct addr); +#endif + break; + default: + OSMO_ASSERT(false); + break; + } + if (bind(*fd, &addr, sizeof(addr)) < 0) { + rate_ctr_inc2(gsn->ctrg, GSN_CTR_ERR_SOCKET); + LOGP(DLGTP, LOGL_ERROR, + "%s bind(fd=%d, addr=(%s:%d)) failed: Error = %s\n", + name, *fd, in46a_ntoa(listen), port, strerror(errno)); + return -errno; + } + return 0; +} + +int gtp_new2(struct gsn_t **gsn, char *statedir, struct in46_addr *listen, int mode) +{ + struct gsn_internal *internal; + + LOGP(DLGTP, LOGL_NOTICE, "GTP: gtp_newgsn() started at %s\n", in46a_ntoa(listen)); + + *gsn = talloc_zero(gsn_ctx, struct gsn_t); + + internal = talloc_zero(*gsn, struct gsn_internal); + (*gsn)->internal = internal; + + (*gsn)->statedir = statedir; + log_restart(*gsn); + + /* Initialise sequence number */ + (*gsn)->seq_next = (*gsn)->restart_counter * 1024; + + /* Initialize timers: */ + (*gsn)->tdef = gtp_T_defs; + /* Small hack to properly reset tdef for old clients not using the tdef_group: */ + OSMO_ASSERT(gtp_T_defs[0].default_val != 0); + if (gtp_T_defs[0].val == 0) + osmo_tdefs_reset((*gsn)->tdef); + + + /* Initialise request retransmit queue */ + queue_new(&(*gsn)->queue_req); + queue_new(&(*gsn)->queue_resp); + + /* Initialise pdp table */ + pdp_init(*gsn); + + /* Initialize internal queue timer */ + osmo_timer_setup(&(*gsn)->queue_timer, queue_timer_cb, *gsn); + + /* Initialize counter group: */ + (*gsn)->ctrg = rate_ctr_group_alloc(NULL, &gsn_ctrg_desc, gsn_ctr_next_idx++); + + /* Initialise call back functions */ + (*gsn)->cb_create_context_ind = 0; + (*gsn)->cb_delete_context = 0; + (*gsn)->cb_unsup_ind = 0; + (*gsn)->cb_conf = 0; + (*gsn)->cb_data_ind = 0; + + /* Store function parameters */ + /* Same IP for user traffic and signalling */ + gtp_set_gsnc(*gsn, listen); + gtp_set_gsnu(*gsn, listen); + (*gsn)->mode = mode; + + (*gsn)->fd0 = -1; + (*gsn)->fd1c = -1; + (*gsn)->fd1u = -1; + + /* Create GTP version 0 socket */ + if (create_and_bind_socket("GTPv0", *gsn, &(*gsn)->fd0, listen, GTP0_PORT) < 0) + goto error; + /* Create GTP version 1 control plane socket */ + if (create_and_bind_socket("GTPv1 control plane", *gsn, &(*gsn)->fd1c, listen, GTP1C_PORT) < 0) + goto error; + /* Create GTP version 1 user plane socket */ + if (create_and_bind_socket("GTPv1 user plane", *gsn, &(*gsn)->fd1u, listen, GTP1U_PORT) < 0) + goto error; + + /* Start internal queue timer */ + gtp_queue_timer_start(*gsn); + + return 0; +error: + gtp_free(*gsn); + *gsn = NULL; + return -1; +} + +/* IPv4 only, use gtp_new2 to support IPv6 too. */ +int gtp_new(struct gsn_t **gsn, char *statedir, struct in_addr *listen, int mode) +{ + struct in46_addr i46a = {0}; + + i46a.len = sizeof(struct in_addr); + i46a.v4 = *listen; + + return gtp_new2(gsn, statedir, &i46a, mode); +} + +void gtp_get_gsnc(const struct gsn_t *gsn, struct in46_addr *dest) +{ + struct gsn_internal *internal = gsn->internal; + + if (internal->gsnc_is_v6) { + dest->len = sizeof(struct in6_addr); + dest->v6 = internal->gsnc6; + } else { + dest->len = sizeof(struct in_addr); + dest->v4 = gsn->gsnc; + } +} + +void gtp_get_gsnu(const struct gsn_t *gsn, struct in46_addr *dest) +{ + struct gsn_internal *internal = gsn->internal; + + if (internal->gsnu_is_v6) { + dest->len = sizeof(struct in6_addr); + dest->v6 = internal->gsnu6; + } else { + dest->len = sizeof(struct in_addr); + dest->v4 = gsn->gsnu; + } +} + +void gtp_set_gsnc(struct gsn_t *gsn, const struct in46_addr *addr) +{ + struct gsn_internal *internal = gsn->internal; + + if (in46a_to_af(addr) == AF_INET6) { + gsn->gsnc = (struct in_addr){0}; + internal->gsnc6 = addr->v6; + internal->gsnc_is_v6 = true; + + } else { + gsn->gsnc = addr->v4; + internal->gsnc6 = (struct in6_addr){0}; + internal->gsnc_is_v6 = false; + } +} + +void gtp_set_gsnu(struct gsn_t *gsn, const struct in46_addr *addr) +{ + struct gsn_internal *internal = gsn->internal; + + if (in46a_to_af(addr) == AF_INET6) { + gsn->gsnu = (struct in_addr){0}; + internal->gsnu6 = addr->v6; + internal->gsnu_is_v6 = true; + + } else { + gsn->gsnu = addr->v4; + internal->gsnu6 = (struct in6_addr){0}; + internal->gsnu_is_v6 = false; + } +} + +int gtp_free(struct gsn_t *gsn) +{ + + /* Cleanup internal queue timer */ + osmo_timer_del(&gsn->queue_timer); + + /* Clean up retransmit queues */ + queue_free(gsn->queue_req); + queue_free(gsn->queue_resp); + + close(gsn->fd0); + close(gsn->fd1c); + close(gsn->fd1u); + + rate_ctr_group_free(gsn->ctrg); + + talloc_free(gsn); + return 0; +} + +/* API: Register create context indication callback */ +int gtp_set_cb_create_context_ind(struct gsn_t *gsn, + int (*cb_create_context_ind) (struct pdp_t * + pdp)) +{ + gsn->cb_create_context_ind = cb_create_context_ind; + return 0; +} + +int gtp_retrans(struct gsn_t *gsn) +{ + /* dummy API, deprecated. */ + return 0; +} + +int gtp_retranstimeout(struct gsn_t *gsn, struct timeval *timeout) +{ + timeout->tv_sec = 24*60*60; + timeout->tv_usec = 0; + /* dummy API, deprecated. Return a huge timer to do nothing */ + return 0; +} diff --git a/gtp/gsn_internal.h b/gtp/gsn_internal.h new file mode 100644 index 0000000..dbf8991 --- /dev/null +++ b/gtp/gsn_internal.h @@ -0,0 +1,14 @@ +#pragma once +#include <osmocom/core/in46_addr.h> + +void gtp_queue_timer_start(struct gsn_t *gsn); + +struct gsn_internal { + /* IP address of this gsn for signalling */ + bool gsnc_is_v6; + struct in6_addr gsnc6; + + /* IP address of this gsn for user traffic */ + bool gsnu_is_v6; + struct in6_addr gsnu6; +}; @@ -55,15 +55,13 @@ /* #include <stdint.h> ISO C99 types */ -#include "pdp.h" -#include "gtp.h" -#include "gtpie.h" -#include "queue.h" - -/* According to section 14.2 of 3GPP TS 29.006 version 6.9.0 */ -#define N3_REQUESTS 5 +#include <osmocom/gtp/pdp.h> +#include <osmocom/gtp/gtp.h> +#include <osmocom/gtp/gtpie.h> -#define T3_REQUEST 3 +#include "queue.h" +#include "gsn_internal.h" +#include "gtp_internal.h" /* Error reporting functions */ @@ -131,86 +129,7 @@ const struct value_string gtp_type_names[] = { { 0, NULL } }; -/* Deprecated, use gtp_pdp_newpdp() instead */ -int gtp_newpdp(struct gsn_t *gsn, struct pdp_t **pdp, - uint64_t imsi, uint8_t nsapi) -{ - int rc; - rc = gtp_pdp_newpdp(gsn, pdp, imsi, nsapi, NULL); - return rc; -} - -int gtp_freepdp(struct gsn_t *gsn, struct pdp_t *pdp) -{ - if (gsn->cb_delete_context) - gsn->cb_delete_context(pdp); - return pdp_freepdp(pdp); -} - -/* Free pdp and all its secondary PDP contexts. Must be called on the primary PDP context. */ -int gtp_freepdp_teardown(struct gsn_t *gsn, struct pdp_t *pdp) -{ - int n; - struct pdp_t *secondary_pdp; - OSMO_ASSERT(!pdp->secondary); - - for (n = 0; n < PDP_MAXNSAPI; n++) { - if (pdp->secondary_tei[n]) { - if (gtp_pdp_getgtp1(gsn, &secondary_pdp, - pdp->secondary_tei[n])) { - LOGP(DLGTP, LOGL_ERROR, - "Unknown secondary PDP context\n"); - continue; - } - if (pdp != secondary_pdp) { - gtp_freepdp(gsn, secondary_pdp); - } - } - } - - return gtp_freepdp(gsn, pdp); -} - -/* gtp_gpdu */ - -extern int gtp_fd(struct gsn_t *gsn) -{ - return gsn->fd0; -} - -/* gtp_decaps */ -/* gtp_retrans */ -/* gtp_retranstimeout */ - -int gtp_set_cb_unsup_ind(struct gsn_t *gsn, - int (*cb) (struct sockaddr_in * peer)) -{ - gsn->cb_unsup_ind = cb; - return 0; -} - -int gtp_set_cb_extheader_ind(struct gsn_t *gsn, - int (*cb) (struct sockaddr_in * peer)) -{ - gsn->cb_extheader_ind = cb; - return 0; -} - -/* API: Initialise delete context callback */ -/* Called whenever a pdp context is deleted for any reason */ -int gtp_set_cb_delete_context(struct gsn_t *gsn, int (*cb) (struct pdp_t * pdp)) -{ - gsn->cb_delete_context = cb; - return 0; -} -int gtp_set_cb_conf(struct gsn_t *gsn, - int (*cb) (int type, int cause, - struct pdp_t * pdp, void *cbp)) -{ - gsn->cb_conf = cb; - return 0; -} static void emit_cb_recovery(struct gsn_t *gsn, struct sockaddr_in * peer, struct pdp_t * pdp, uint8_t recovery) @@ -223,50 +142,6 @@ static void emit_cb_recovery(struct gsn_t *gsn, struct sockaddr_in * peer, gsn->cb_recovery3(gsn, peer, pdp, recovery); } -int gtp_set_cb_recovery(struct gsn_t *gsn, - int (*cb) (struct sockaddr_in * peer, uint8_t recovery)) -{ - gsn->cb_recovery = cb; - return 0; -} - -/* cb_recovery() - * pdp may be NULL if Recovery IE was received from a message independent - * of any PDP ctx (such as Echo Response), or because pdp ctx is unknown to the - * local setup. In case pdp is known, caller may want to keep that pdp alive to - * handle subsequent msg cb as this specific pdp ctx is still valid according to - * specs. - */ -int gtp_set_cb_recovery2(struct gsn_t *gsn, - int (*cb_recovery2) (struct sockaddr_in * peer, struct pdp_t * pdp, uint8_t recovery)) -{ - gsn->cb_recovery2 = cb_recovery2; - return 0; -} - -/* cb_recovery() - * pdp may be NULL if Recovery IE was received from a message independent - * of any PDP ctx (such as Echo Response), or because pdp ctx is unknown to the - * local setup. In case pdp is known, caller may want to keep that pdp alive to - * handle subsequent msg cb as this specific pdp ctx is still valid according to - * specs. - */ -int gtp_set_cb_recovery3(struct gsn_t *gsn, - int (*cb_recovery3) (struct gsn_t *gsn, struct sockaddr_in *peer, - struct pdp_t *pdp, uint8_t recovery)) -{ - gsn->cb_recovery3 = cb_recovery3; - return 0; -} - -int gtp_set_cb_data_ind(struct gsn_t *gsn, - int (*cb_data_ind) (struct pdp_t * pdp, - void *pack, unsigned len)) -{ - gsn->cb_data_ind = cb_data_ind; - return 0; -} - /** * get_default_gtp() * Generate a GPRS Tunneling Protocol signalling packet header, depending @@ -386,109 +261,6 @@ static uint32_t get_tei(void *pack) } } -static int queue_timer_retrans(struct gsn_t *gsn) -{ - /* Retransmit any outstanding packets */ - /* Remove from queue if maxretrans exceeded */ - time_t now; - struct qmsg_t *qmsg; - now = time(NULL); - /*printf("Retrans: New beginning %d\n", (int) now); */ - - /* get first element in queue, as long as the timeout of that - * element has expired */ - while ((!queue_getfirst(gsn->queue_req, &qmsg)) && - (qmsg->timeout <= now)) { - /*printf("Retrans timeout found: %d\n", (int) time(NULL)); */ - if (qmsg->retrans > N3_REQUESTS) { /* To many retrans */ - LOGP(DLGTP, LOGL_NOTICE, "Timeout of seq %" PRIu16 "\n", - qmsg->seq); - if (gsn->cb_conf) - gsn->cb_conf(qmsg->type, EOF, NULL, qmsg->cbp); - queue_freemsg(gsn->queue_req, qmsg); - } else { - LOGP(DLGTP, LOGL_INFO, "Retransmit (%d) of seq %" PRIu16 "\n", - qmsg->retrans, qmsg->seq); - if (sendto(qmsg->fd, &qmsg->p, qmsg->l, 0, - (struct sockaddr *)&qmsg->peer, - sizeof(struct sockaddr_in)) < 0) { - gsn->err_sendto++; - LOGP(DLGTP, LOGL_ERROR, - "Sendto(fd0=%d, msg=%lx, len=%d) failed: Error = %s\n", - gsn->fd0, (unsigned long)&qmsg->p, - qmsg->l, strerror(errno)); - } - queue_back(gsn->queue_req, qmsg); - qmsg->timeout = now + T3_REQUEST; - qmsg->retrans++; - } - } - - /* Also clean up reply timeouts */ - while ((!queue_getfirst(gsn->queue_resp, &qmsg)) && - (qmsg->timeout < now)) { - /*printf("Retrans (reply) timeout found: %d\n", (int) time(NULL)); */ - queue_freemsg(gsn->queue_resp, qmsg); - } - - return 0; -} - -static int queue_timer_retranstimeout(struct gsn_t *gsn, struct timeval *timeout) -{ - time_t now, later, diff; - struct qmsg_t *qmsg; - timeout->tv_usec = 0; - - if (queue_getfirst(gsn->queue_req, &qmsg)) { - timeout->tv_sec = 10; - } else { - now = time(NULL); - later = qmsg->timeout; - timeout->tv_sec = later - now; - if (timeout->tv_sec < 0) - timeout->tv_sec = 0; /* No negative allowed */ - if (timeout->tv_sec > 10) - timeout->tv_sec = 10; /* Max sleep for 10 sec */ - } - - if (queue_getfirst(gsn->queue_resp, &qmsg)) { - /* already set by queue_req, do nothing */ - } else { /* trigger faster if earlier timeout exists in queue_resp */ - now = time(NULL); - later = qmsg->timeout; - diff = later - now; - if (diff < 0) - diff = 0; - if (diff < timeout->tv_sec) - timeout->tv_sec = diff; - } - - return 0; -} - -static void queue_timer_start(struct gsn_t *gsn) -{ - struct timeval next; - - /* Retrieve next retransmission as timeval */ - queue_timer_retranstimeout(gsn, &next); - - /* re-schedule the timer */ - osmo_timer_schedule(&gsn->queue_timer, next.tv_sec, next.tv_usec/1000); -} - -/* timer callback for libgtp retransmission and ping */ -static void queue_timer_cb(void *data) -{ - struct gsn_t *gsn = data; - - /* do all the retransmissions as needed */ - queue_timer_retrans(gsn); - - queue_timer_start(gsn); -} - /* *********************************************************** * Reliable delivery of signalling messages * @@ -537,7 +309,7 @@ static void queue_timer_cb(void *data) * * The correct solution will be to make a queue containing response messages. * This queue should be checked whenever a request is received. If the - * response is allready in the queue that response should be transmitted. + * response is already in the queue that response should be transmitted. * It should be possible to find messages in this queue on the basis of * the sequence number and peer GSN IP address (The sequense number is unique * within each path). This need to be implemented by a hash table. Furthermore @@ -614,7 +386,7 @@ static int gtp_req(struct gsn_t *gsn, uint8_t version, struct pdp_t *pdp, if (sendto(fd, packet, len, 0, (struct sockaddr *)&addr, sizeof(addr)) < 0) { - gsn->err_sendto++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_ERR_SENDTO); LOGP(DLGTP, LOGL_ERROR, "Sendto(fd=%d, msg=%lx, len=%d, dst=%s) failed: Error = %s\n", fd, (unsigned long)&packet, len, inet_ntoa(addr.sin_addr), strerror(errno)); return -1; @@ -622,13 +394,17 @@ static int gtp_req(struct gsn_t *gsn, uint8_t version, struct pdp_t *pdp, /* Use new queue structure */ if (queue_newmsg(gsn->queue_req, &qmsg, &addr, gsn->seq_next)) { - gsn->err_queuefull++; - LOGP(DLGTP, LOGL_ERROR, - "Retransmit queue is full\n"); + rate_ctr_inc2(gsn->ctrg, GSN_CTR_ERR_QUEUEFULL); + LOGP(DLGTP, LOGL_ERROR, "Retransmit req queue is full (seq=%" PRIu16 ")\n", + gsn->seq_next); } else { + unsigned int t3_response; + LOGP(DLGTP, LOGL_DEBUG, "Registering seq=%" PRIu16 + " in restransmit req queue\n", gsn->seq_next); + t3_response = osmo_tdef_get(gsn->tdef, GTP_GSN_TIMER_T3_RESPONSE, OSMO_TDEF_S, -1); memcpy(&qmsg->p, packet, sizeof(union gtp_packet)); qmsg->l = len; - qmsg->timeout = time(NULL) + T3_REQUEST; /* When to timeout */ + qmsg->timeout = time(NULL) + t3_response; /* When to timeout */ qmsg->retrans = 0; /* No retransmissions so far */ qmsg->cbp = cbp; qmsg->type = ntoh8(packet->gtp0.h.type); @@ -638,30 +414,12 @@ static int gtp_req(struct gsn_t *gsn, uint8_t version, struct pdp_t *pdp, /* Rearm timer: Retrans time for qmsg just queued may be required before an existing one (for instance a gtp echo req) */ - queue_timer_start(gsn); + gtp_queue_timer_start(gsn); } gsn->seq_next++; /* Count up this time */ return 0; } - -/** - * @brief clear the request and response queue. Useful for debugging to reset "some" state. - * @param gsn The GGSN instance - */ -void gtp_clear_queues(struct gsn_t *gsn) -{ - struct qmsg_t *qmsg; - - while (!queue_getfirst(gsn->queue_req, &qmsg)) { - queue_freemsg(gsn->queue_req, qmsg); - } - - while (!queue_getfirst(gsn->queue_resp, &qmsg)) { - queue_freemsg(gsn->queue_resp, qmsg); - } -} - /* gtp_conf * Remove signalling packet from retransmission queue. * return 0 on success, EOF if packet was not found */ @@ -682,30 +440,20 @@ static int gtp_conf(struct gsn_t *gsn, uint8_t version, struct sockaddr_in *peer return EOF; } + GTP_LOGPKG(LOGL_DEBUG, peer, packet, len, + "Freeing seq=%" PRIu16 " from retransmit req queue\n", + seq); if (queue_freemsg_seq(gsn->queue_req, peer, seq, type, cbp)) { - gsn->err_seq++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_ERR_SEQ); GTP_LOGPKG(LOGL_ERROR, peer, packet, len, - "Confirmation packet not found in queue\n"); + "Confirmation packet not found in retransmit req queue (seq=%" + PRIu16 ")\n", seq); return EOF; } return 0; } -int gtp_retrans(struct gsn_t *gsn) -{ - /* dummy API, deprecated. */ - return 0; -} - -int gtp_retranstimeout(struct gsn_t *gsn, struct timeval *timeout) -{ - timeout->tv_sec = 24*60*60; - timeout->tv_usec = 0; - /* dummy API, deprecated. Return a huge timer to do nothing */ - return 0; -} - static int gtp_resp(uint8_t version, struct gsn_t *gsn, struct pdp_t *pdp, union gtp_packet *packet, int len, struct sockaddr_in *peer, int fd, uint16_t seq, uint64_t tid) @@ -741,7 +489,7 @@ static int gtp_resp(uint8_t version, struct gsn_t *gsn, struct pdp_t *pdp, if (sendto(fd, packet, len, 0, (struct sockaddr *)peer, sizeof(struct sockaddr_in)) < 0) { - gsn->err_sendto++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_ERR_SENDTO); LOGP(DLGTP, LOGL_ERROR, "Sendto(fd=%d, msg=%lx, len=%d) failed: Error = %s\n", fd, (unsigned long)&packet, len, strerror(errno)); @@ -750,12 +498,17 @@ static int gtp_resp(uint8_t version, struct gsn_t *gsn, struct pdp_t *pdp, /* Use new queue structure */ if (queue_newmsg(gsn->queue_resp, &qmsg, peer, seq)) { - gsn->err_queuefull++; - LOGP(DLGTP, LOGL_ERROR, "Retransmit queue is full\n"); + rate_ctr_inc2(gsn->ctrg, GSN_CTR_ERR_QUEUEFULL); + LOGP(DLGTP, LOGL_ERROR, "Retransmit resp queue is full (seq=%" PRIu16 ")\n", + seq); } else { + unsigned int t3_hold_resp; + LOGP(DLGTP, LOGL_DEBUG, "Registering seq=%" PRIu16 + " in restransmit resp queue\n", seq); + t3_hold_resp = osmo_tdef_get(gsn->tdef, GTP_GSN_TIMER_T3_HOLD_RESPONSE, OSMO_TDEF_S, -1); memcpy(&qmsg->p, packet, sizeof(union gtp_packet)); qmsg->l = len; - qmsg->timeout = time(NULL) + 60; /* When to timeout */ + qmsg->timeout = time(NULL) + t3_hold_resp; /* When to timeout */ qmsg->retrans = 0; /* No retransmissions so far */ qmsg->cbp = NULL; qmsg->type = 0; @@ -766,14 +519,14 @@ static int gtp_resp(uint8_t version, struct gsn_t *gsn, struct pdp_t *pdp, /* Rearm timer: Retrans time for qmsg just queued may be required before an existing one (for instance a gtp echo req) */ - queue_timer_start(gsn); + gtp_queue_timer_start(gsn); } return 0; } static int gtp_notification(struct gsn_t *gsn, uint8_t version, union gtp_packet *packet, int len, - struct sockaddr_in *peer, int fd, uint16_t seq) + const struct sockaddr_in *peer, int fd, uint16_t seq) { uint8_t ver = GTPHDR_F_GET_VER(packet->flags); @@ -807,7 +560,7 @@ static int gtp_notification(struct gsn_t *gsn, uint8_t version, if (sendto(fd, packet, len, 0, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) < 0) { - gsn->err_sendto++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_ERR_SENDTO); LOGP(DLGTP, LOGL_ERROR, "Sendto(fd=%d, msg=%lx, len=%d) failed: Error = %s\n", fd, (unsigned long)&packet, len, strerror(errno)); @@ -820,11 +573,19 @@ static int gtp_duplicate(struct gsn_t *gsn, uint8_t version, struct sockaddr_in *peer, uint16_t seq) { struct qmsg_t *qmsg; + char buf[INET_ADDRSTRLEN]; if (queue_seqget(gsn->queue_resp, &qmsg, peer, seq)) { return EOF; /* Notfound */ } + + buf[0] = '\0'; + inet_ntop(AF_INET, &peer->sin_addr, buf, sizeof(buf)); + LOGP(DLGTP, LOGL_INFO, + "Rx duplicate seq=%" PRIu16 " from %s, retrans resp\n", seq, buf); + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_DUPLICATE); + if (fcntl(qmsg->fd, F_SETFL, 0)) { LOGP(DLGTP, LOGL_ERROR, "fnctl()\n"); return -1; @@ -832,7 +593,7 @@ static int gtp_duplicate(struct gsn_t *gsn, uint8_t version, if (sendto(qmsg->fd, &qmsg->p, qmsg->l, 0, (struct sockaddr *)peer, sizeof(struct sockaddr_in)) < 0) { - gsn->err_sendto++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_ERR_SENDTO); LOGP(DLGTP, LOGL_ERROR, "Sendto(fd=%d, msg=%lx, len=%d) failed: Error = %s\n", qmsg->fd, (unsigned long)&qmsg->p, qmsg->l, @@ -841,195 +602,6 @@ static int gtp_duplicate(struct gsn_t *gsn, uint8_t version, return 0; } -/* Perform restoration and recovery error handling as described in 29.060 */ -static void log_restart(struct gsn_t *gsn) -{ - FILE *f; - int i, rc; - int counter = 0; - char *filename; - - filename = talloc_asprintf(NULL, "%s/%s", gsn->statedir, RESTART_FILE); - OSMO_ASSERT(filename); - - /* We try to open file. On failure we will later try to create file */ - if (!(f = fopen(filename, "r"))) { - LOGP(DLGTP, LOGL_NOTICE, - "State information file (%s) not found. Creating new file.\n", - filename); - } else { - rc = fscanf(f, "%d", &counter); - if (rc != 1) { - LOGP(DLGTP, LOGL_ERROR, - "fscanf failed to read counter value\n"); - goto close_file; - } - if (fclose(f)) { - LOGP(DLGTP, LOGL_ERROR, - "fclose failed: Error = %s\n", strerror(errno)); - } - } - - gsn->restart_counter = (unsigned char)counter; - gsn->restart_counter++; - - /* Keep the umask closely wrapped around our fopen() call in case the - * log outputs cause file creation. */ - i = umask(022); - f = fopen(filename, "w"); - umask(i); - if (!f) { - LOGP(DLGTP, LOGL_ERROR, - "fopen(path=%s, mode=%s) failed: Error = %s\n", filename, - "w", strerror(errno)); - goto free_filename; - } - - fprintf(f, "%d\n", gsn->restart_counter); -close_file: - if (fclose(f)) - LOGP(DLGTP, LOGL_ERROR, - "fclose failed: Error = %s\n", strerror(errno)); -free_filename: - talloc_free(filename); -} - -int gtp_new(struct gsn_t **gsn, char *statedir, struct in_addr *listen, - int mode) -{ - struct sockaddr_in addr; - - LOGP(DLGTP, LOGL_NOTICE, "GTP: gtp_newgsn() started at %s\n", inet_ntoa(*listen)); - - *gsn = calloc(sizeof(struct gsn_t), 1); /* TODO */ - - (*gsn)->statedir = statedir; - log_restart(*gsn); - - /* Initialise sequence number */ - (*gsn)->seq_next = (*gsn)->restart_counter * 1024; - - /* Initialise request retransmit queue */ - queue_new(&(*gsn)->queue_req); - queue_new(&(*gsn)->queue_resp); - - /* Initialise pdp table */ - pdp_init(*gsn); - - /* Initialize internal queue timer */ - osmo_timer_setup(&(*gsn)->queue_timer, queue_timer_cb, *gsn); - - /* Initialise call back functions */ - (*gsn)->cb_create_context_ind = 0; - (*gsn)->cb_delete_context = 0; - (*gsn)->cb_unsup_ind = 0; - (*gsn)->cb_conf = 0; - (*gsn)->cb_data_ind = 0; - - /* Store function parameters */ - (*gsn)->gsnc = *listen; - (*gsn)->gsnu = *listen; - (*gsn)->mode = mode; - - /* Create GTP version 0 socket */ - if (((*gsn)->fd0 = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { - (*gsn)->err_socket++; - LOGP(DLGTP, LOGL_ERROR, - "GTPv0 socket(domain=%d, type=%d, protocol=%d) failed: Error = %s\n", - AF_INET, SOCK_DGRAM, 0, strerror(errno)); - return -errno; - } - - memset(&addr, 0, sizeof(addr)); - addr.sin_family = AF_INET; - addr.sin_addr = *listen; /* Same IP for user traffic and signalling */ - addr.sin_port = htons(GTP0_PORT); -#if defined(__FreeBSD__) || defined(__APPLE__) - addr.sin_len = sizeof(addr); -#endif - - if (bind((*gsn)->fd0, (struct sockaddr *)&addr, sizeof(addr)) < 0) { - (*gsn)->err_socket++; - LOGP_WITH_ADDR(DLGTP, LOGL_ERROR, addr, - "bind(fd0=%d) failed: Error = %s\n", - (*gsn)->fd0, strerror(errno)); - return -errno; - } - - /* Create GTP version 1 control plane socket */ - if (((*gsn)->fd1c = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { - (*gsn)->err_socket++; - LOGP(DLGTP, LOGL_ERROR, - "GTPv1 control plane socket(domain=%d, type=%d, protocol=%d) failed: Error = %s\n", - AF_INET, SOCK_DGRAM, 0, strerror(errno)); - return -errno; - } - - memset(&addr, 0, sizeof(addr)); - addr.sin_family = AF_INET; - addr.sin_addr = *listen; /* Same IP for user traffic and signalling */ - addr.sin_port = htons(GTP1C_PORT); -#if defined(__FreeBSD__) || defined(__APPLE__) - addr.sin_len = sizeof(addr); -#endif - - if (bind((*gsn)->fd1c, (struct sockaddr *)&addr, sizeof(addr)) < 0) { - (*gsn)->err_socket++; - LOGP_WITH_ADDR(DLGTP, LOGL_ERROR, addr, - "bind(fd1c=%d) failed: Error = %s\n", - (*gsn)->fd1c, strerror(errno)); - return -errno; - } - - /* Create GTP version 1 user plane socket */ - if (((*gsn)->fd1u = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { - (*gsn)->err_socket++; - LOGP(DLGTP, LOGL_ERROR, - "GTPv1 user plane socket(domain=%d, type=%d, protocol=%d) failed: Error = %s\n", - AF_INET, SOCK_DGRAM, 0, strerror(errno)); - return -errno; - } - - memset(&addr, 0, sizeof(addr)); - addr.sin_family = AF_INET; - addr.sin_addr = *listen; /* Same IP for user traffic and signalling */ - addr.sin_port = htons(GTP1U_PORT); -#if defined(__FreeBSD__) || defined(__APPLE__) - addr.sin_len = sizeof(addr); -#endif - - if (bind((*gsn)->fd1u, (struct sockaddr *)&addr, sizeof(addr)) < 0) { - (*gsn)->err_socket++; - LOGP_WITH_ADDR(DLGTP, LOGL_ERROR, addr, - "bind(fd1u=%d) failed: Error = %s\n", - (*gsn)->fd1u, strerror(errno)); - return -errno; - } - - /* Start internal queue timer */ - queue_timer_start(*gsn); - - return 0; -} - -int gtp_free(struct gsn_t *gsn) -{ - - /* Cleanup internal queue timer */ - osmo_timer_del(&gsn->queue_timer); - - /* Clean up retransmit queues */ - queue_free(gsn->queue_req); - queue_free(gsn->queue_resp); - - close(gsn->fd0); - close(gsn->fd1c); - close(gsn->fd1u); - - free(gsn); - return 0; -} - /* *********************************************************** * Path management messages * Messages: echo and version not supported. @@ -1109,7 +681,7 @@ int gtp_echo_conf(struct gsn_t *gsn, int version, struct sockaddr_in *peer, /* Extract information elements into a pointer array */ if (gtpie_decaps(ie, version, pack + hlen, len - hlen)) { - gsn->invalid++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_INVALID); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Invalid message format\n"); if (gsn->cb_conf) @@ -1118,7 +690,7 @@ int gtp_echo_conf(struct gsn_t *gsn, int version, struct sockaddr_in *peer, } if (gtpie_gettv1(ie, GTPIE_RECOVERY, 0, &recovery)) { - gsn->missing++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_MISSING); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Missing mandatory field\n"); if (gsn->cb_conf) @@ -1200,6 +772,57 @@ static int gtp_extheader_ind(struct gsn_t *gsn, struct sockaddr_in *peer, return 0; } +/* Handle a RAN Information Relay message */ +static int gtp_ran_info_relay_ind(struct gsn_t *gsn, int version, struct sockaddr_in *peer, + void *pack, unsigned len) +{ + union gtpie_member *ie[GTPIE_SIZE]; + + if (version != 1) { + LOGP(DLGTP, LOGL_NOTICE, + "RAN Information Relay expected only on GTPCv1: %u\n", version); + return -EINVAL; + } + + int hlen = get_hlen(pack); + + /* Decode information elements */ + if (gtpie_decaps(ie, version, pack + hlen, len - hlen)) { + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_INVALID); + GTP_LOGPKG(LOGL_ERROR, peer, pack, len, + "Invalid message format (AN Information Relay)\n"); + return -EINVAL; + } + + if (gsn->cb_ran_info_relay_ind) + gsn->cb_ran_info_relay_ind(peer, ie); + + return 0; +} + +/* Send off a RAN Information Relay message */ +int gtp_ran_info_relay_req(struct gsn_t *gsn, const struct sockaddr_in *peer, + const uint8_t *ran_container, size_t ran_container_len, + const uint8_t *rim_route_addr, size_t rim_route_addr_len, + uint8_t rim_route_addr_discr) +{ + union gtp_packet packet; + + /* GTP 1 is the highest supported protocol */ + unsigned int length = get_default_gtp(1, GTP_RAN_INFO_RELAY, &packet); + + gtpie_tlv(&packet, &length, GTP_MAX, GTPIE_RAN_T_CONTAIN, ran_container_len, + ran_container); + if (rim_route_addr) { + gtpie_tlv(&packet, &length, GTP_MAX, GTPIE_RIM_ROUT_ADDR, + rim_route_addr_len, rim_route_addr); + gtpie_tlv(&packet, &length, GTP_MAX, GTPIE_RIM_RA_DISCR, 1, + &rim_route_addr_discr); + } + + return gtp_notification(gsn, 1, &packet, length, peer, gsn->fd1c, 0); +} + /* *********************************************************** * Session management messages * Messages: create, update and delete PDP context @@ -1375,21 +998,12 @@ int gtp_create_context_resp(struct gsn_t *gsn, struct pdp_t *pdp, int cause) /* Now send off a reply to the peer */ gtp_create_pdp_resp(gsn, pdp->version, pdp, cause); - if (cause != GTPCAUSE_ACC_REQ) + if (!gtp_cause_successful(cause)) gtp_freepdp(gsn, pdp); return 0; } -/* API: Register create context indication callback */ -int gtp_set_cb_create_context_ind(struct gsn_t *gsn, - int (*cb_create_context_ind) (struct pdp_t * - pdp)) -{ - gsn->cb_create_context_ind = cb_create_context_ind; - return 0; -} - /* Send Create PDP Context Response */ int gtp_create_pdp_resp(struct gsn_t *gsn, int version, struct pdp_t *pdp, uint8_t cause) @@ -1400,7 +1014,7 @@ int gtp_create_pdp_resp(struct gsn_t *gsn, int version, struct pdp_t *pdp, gtpie_tv1(&packet, &length, GTP_MAX, GTPIE_CAUSE, cause); - if (cause == GTPCAUSE_ACC_REQ) { + if (gtp_cause_successful(cause)) { if (version == 0) gtpie_tv0(&packet, &length, GTP_MAX, GTPIE_QOS_PROFILE0, @@ -1453,6 +1067,14 @@ int gtp_create_pdp_resp(struct gsn_t *gsn, int version, struct pdp_t *pdp, pdp->fd, pdp->seq, pdp->tid); } +static void in46a_to_gsna(struct ul16_t *gsna, const struct in46_addr *src) +{ + memset(gsna, 0, sizeof(struct ul16_t)); + gsna->l = src->len; + OSMO_ASSERT(gsna->l <= sizeof(gsna->v)); + memcpy(gsna->v, &src->v6, gsna->l); +} + /* Handle Create PDP Context Request */ int gtp_create_pdp_ind(struct gsn_t *gsn, int version, struct sockaddr_in *peer, int fd, @@ -1469,6 +1091,7 @@ int gtp_create_pdp_ind(struct gsn_t *gsn, int version, int hlen = get_hlen(pack); uint8_t linked_nsapi = 0; struct pdp_t *linked_pdp = NULL; + struct in46_addr addr; if (!gtp_duplicate(gsn, version, peer, seq)) return 0; @@ -1486,7 +1109,7 @@ int gtp_create_pdp_ind(struct gsn_t *gsn, int version, /* Decode information elements */ if (gtpie_decaps(ie, version, pack + hlen, len - hlen)) { - gsn->invalid++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_INVALID); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Invalid message format\n"); if (0 == version) @@ -1496,7 +1119,8 @@ int gtp_create_pdp_ind(struct gsn_t *gsn, int version, GTPCAUSE_INVALID_MESSAGE); } - if (version == 1) { + switch (version) { + case 1: /* Linked NSAPI (conditional) */ /* If included this is the Secondary PDP Context Activation Procedure */ /* In secondary activation IMSI is not included, so the context must be */ @@ -1505,7 +1129,7 @@ int gtp_create_pdp_ind(struct gsn_t *gsn, int version, /* Find the primary PDP context */ if (gtp_pdp_getgtp1(gsn, &linked_pdp, get_tei(pack))) { - gsn->incorrect++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_INCORRECT); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Incorrect optional information field\n"); @@ -1515,7 +1139,7 @@ int gtp_create_pdp_ind(struct gsn_t *gsn, int version, /* Check that the primary PDP context matches linked nsapi */ if (linked_pdp->nsapi != linked_nsapi) { - gsn->incorrect++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_INCORRECT); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Incorrect optional information field\n"); @@ -1540,7 +1164,7 @@ int gtp_create_pdp_ind(struct gsn_t *gsn, int version, included in the message. */ if (gtpie_gettv0 (ie, GTPIE_IMSI, 0, &pdp->imsi, sizeof(pdp->imsi))) { - gsn->missing++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_MISSING); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Missing IMSI not supported\n"); return gtp_create_pdp_resp(gsn, version, pdp, @@ -1550,7 +1174,7 @@ int gtp_create_pdp_ind(struct gsn_t *gsn, int version, /* TEID (mandatory) */ if (gtpie_gettv4(ie, GTPIE_TEI_DI, 0, &pdp->teid_gn)) { - gsn->missing++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_MISSING); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Missing mandatory information field\n"); return gtp_create_pdp_resp(gsn, version, pdp, @@ -1559,7 +1183,7 @@ int gtp_create_pdp_ind(struct gsn_t *gsn, int version, /* TEIC (conditional) */ if (!linked_pdp) { /* Not Secondary PDP Context Activation Procedure */ if (gtpie_gettv4(ie, GTPIE_TEI_C, 0, &pdp->teic_gn)) { - gsn->missing++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_MISSING); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Missing mandatory information field\n"); @@ -1569,7 +1193,7 @@ int gtp_create_pdp_ind(struct gsn_t *gsn, int version, } /* NSAPI (mandatory) */ if (gtpie_gettv1(ie, GTPIE_NSAPI, 0, &pdp->nsapi)) { - gsn->missing++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_MISSING); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Missing mandatory information field\n"); return gtp_create_pdp_resp(gsn, version, pdp, @@ -1578,7 +1202,7 @@ int gtp_create_pdp_ind(struct gsn_t *gsn, int version, /* QoS (mandatory) */ if (gtpie_gettlv(ie, GTPIE_QOS_PROFILE, 0, &pdp->qos_req.l, &pdp->qos_req.v, sizeof(pdp->qos_req.v))) { - gsn->missing++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_MISSING); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Missing mandatory information field\n"); return gtp_create_pdp_resp(gsn, version, pdp, @@ -1588,37 +1212,38 @@ int gtp_create_pdp_ind(struct gsn_t *gsn, int version, if (gtpie_gettlv(ie, GTPIE_TFT, 0, &pdp->tft.l, &pdp->tft.v, sizeof(pdp->tft.v))) { } - } - /* if (version == 1) */ - if (version == 0) { + break; /* version 1 */ + + case 0: if (gtpie_gettv0(ie, GTPIE_QOS_PROFILE0, 0, pdp->qos_req0, sizeof(pdp->qos_req0))) { - gsn->missing++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_MISSING); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Missing mandatory information field\n"); return gtp_create_pdp_resp(gsn, version, pdp, GTPCAUSE_MAN_IE_MISSING); } if (gtpie_gettv2(ie, GTPIE_FL_DI, 0, &pdp->flru)) { - gsn->missing++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_MISSING); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Missing mandatory information field\n"); return gtp_create_pdp_resp(gsn, version, pdp, GTPCAUSE_MAN_IE_MISSING); } if (gtpie_gettv2(ie, GTPIE_FL_C, 0, &pdp->flrc)) { - gsn->missing++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_MISSING); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Missing mandatory information field\n"); return gtp_create_pdp_resp(gsn, version, pdp, GTPCAUSE_MAN_IE_MISSING); } + break; } /* SGSN address for signalling (mandatory) */ if (gtpie_gettlv(ie, GTPIE_GSN_ADDR, 0, &pdp->gsnrc.l, &pdp->gsnrc.v, sizeof(pdp->gsnrc.v))) { - gsn->missing++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_MISSING); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Missing mandatory information field\n"); return gtp_create_pdp_resp(gsn, version, pdp, @@ -1628,7 +1253,7 @@ int gtp_create_pdp_ind(struct gsn_t *gsn, int version, /* SGSN address for user traffic (mandatory) */ if (gtpie_gettlv(ie, GTPIE_GSN_ADDR, 1, &pdp->gsnru.l, &pdp->gsnru.v, sizeof(pdp->gsnru.v))) { - gsn->missing++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_MISSING); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Missing mandatory information field\n"); return gtp_create_pdp_resp(gsn, version, pdp, @@ -1644,7 +1269,7 @@ int gtp_create_pdp_ind(struct gsn_t *gsn, int version, /* Selection mode (conditional) */ if (gtpie_gettv0(ie, GTPIE_SELECTION_MODE, 0, &pdp->selmode, sizeof(pdp->selmode))) { - gsn->missing++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_MISSING); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Missing mandatory information field\n"); return gtp_create_pdp_resp(gsn, version, pdp, @@ -1653,7 +1278,7 @@ int gtp_create_pdp_ind(struct gsn_t *gsn, int version, /* End User Address (conditional) */ if (gtpie_gettlv(ie, GTPIE_EUA, 0, &pdp->eua.l, &pdp->eua.v, sizeof(pdp->eua.v))) { - gsn->missing++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_MISSING); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Missing mandatory information field\n"); return gtp_create_pdp_resp(gsn, version, pdp, @@ -1662,7 +1287,7 @@ int gtp_create_pdp_ind(struct gsn_t *gsn, int version, /* APN */ if (gtpie_gettlv(ie, GTPIE_APN, 0, &pdp->apn_req.l, &pdp->apn_req.v, sizeof(pdp->apn_req.v))) { - gsn->missing++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_MISSING); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Missing mandatory information field\n"); return gtp_create_pdp_resp(gsn, version, pdp, @@ -1675,7 +1300,7 @@ int gtp_create_pdp_ind(struct gsn_t *gsn, int version, /* MSISDN (conditional) */ if (gtpie_gettlv(ie, GTPIE_MSISDN, 0, &pdp->msisdn.l, &pdp->msisdn.v, sizeof(pdp->msisdn.v))) { - gsn->missing++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_MISSING); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Missing mandatory information field\n"); return gtp_create_pdp_resp(gsn, version, pdp, @@ -1684,10 +1309,11 @@ int gtp_create_pdp_ind(struct gsn_t *gsn, int version, } /* Initialize our own IP addresses */ - in_addr2gsna(&pdp->gsnlc, &gsn->gsnc); - in_addr2gsna(&pdp->gsnlu, &gsn->gsnu); + gtp_get_gsnc(gsn, &addr); + in46a_to_gsna(&pdp->gsnlc, &addr); - DEBUGP(DLGTP, "gtp_create_pdp_ind: Before gtp_pdp_tidget\n"); + gtp_get_gsnu(gsn, &addr); + in46a_to_gsna(&pdp->gsnlu, &addr); if (!gtp_pdp_getimsi(gsn, &pdp_old, pdp->imsi, pdp->nsapi)) { /* Found old pdp with same tid. Now the voodoo begins! */ @@ -1710,7 +1336,7 @@ int gtp_create_pdp_ind(struct gsn_t *gsn, int version, * QoS: MS will get originally negotiated QoS. * End user address (EUA). MS will get old EUA anyway. * Protocol configuration option (PCO): Only application can verify */ - DEBUGP(DLGTP, "gtp_create_pdp_ind: Old context found\n"); + DEBUGP(DLGTP, "gtp_create_pdp_ind: Reusing old context\n"); /* Copy remote flow label */ pdp_old->flru = pdp->flru; @@ -1751,7 +1377,16 @@ int gtp_create_pdp_ind(struct gsn_t *gsn, int version, } } - gtp_pdp_newpdp(gsn, &pdp, pdp->imsi, pdp->nsapi, pdp); + rc = gtp_pdp_newpdp(gsn, &pdp, pdp->imsi, pdp->nsapi, pdp); + if (rc != 0) { + GTP_LOGPKG(LOGL_ERROR, peer, pack, len, + "Failed creating a new PDP context, array full (%u)\n", PDP_MAX); + /* &pdp in gtp_pdp_newpdp is untouched if it failed: */ + rc = gtp_create_pdp_resp(gsn, version, pdp, GTPCAUSE_NO_MEMORY); + /* Don't pass it to emit_cb_recovery, since allocation failed and it was already rejected: */ + pdp = NULL; + goto recover_ret; + } /* Callback function to validate login */ if (gsn->cb_create_context_ind != 0) @@ -1762,6 +1397,8 @@ int gtp_create_pdp_ind(struct gsn_t *gsn, int version, rc = gtp_create_pdp_resp(gsn, version, pdp, GTPCAUSE_NOT_SUPPORTED); } + +recover_ret: if (recovery_recvd) emit_cb_recovery(gsn, peer, pdp, recovery); return rc; @@ -1784,7 +1421,7 @@ int gtp_create_pdp_conf(struct gsn_t *gsn, int version, /* Find the context in question */ if (gtp_pdp_getgtp1(gsn, &pdp, get_tei(pack))) { - gsn->err_unknownpdp++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_ERR_UNKNOWN_PDP); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Unknown PDP context: %u\n", get_tei(pack)); if (gsn->cb_conf) @@ -1792,12 +1429,9 @@ int gtp_create_pdp_conf(struct gsn_t *gsn, int version, return EOF; } - /* Register that we have received a valid teic from GGSN */ - pdp->teic_confirmed = 1; - /* Decode information elements */ if (gtpie_decaps(ie, version, pack + hlen, len - hlen)) { - gsn->invalid++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_INVALID); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Invalid message format\n"); if (gsn->cb_conf) @@ -1807,7 +1441,7 @@ int gtp_create_pdp_conf(struct gsn_t *gsn, int version, /* Extract cause value (mandatory) */ if (gtpie_gettv1(ie, GTPIE_CAUSE, 0, &cause)) { - gsn->missing++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_MISSING); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Missing mandatory information field\n"); if (gsn->cb_conf) @@ -1826,13 +1460,13 @@ int gtp_create_pdp_conf(struct gsn_t *gsn, int version, } /* Check all conditional information elements */ - if (GTPCAUSE_ACC_REQ == cause) { + if (gtp_cause_successful(cause)) { if (version == 0) { if (gtpie_gettv0(ie, GTPIE_QOS_PROFILE0, 0, &pdp->qos_neg0, sizeof(pdp->qos_neg0))) { - gsn->missing++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_MISSING); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Missing conditional information field\n"); @@ -1843,7 +1477,7 @@ int gtp_create_pdp_conf(struct gsn_t *gsn, int version, } if (gtpie_gettv1(ie, GTPIE_REORDER, 0, &pdp->reorder)) { - gsn->missing++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_MISSING); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Missing conditional information field\n"); @@ -1854,7 +1488,7 @@ int gtp_create_pdp_conf(struct gsn_t *gsn, int version, if (version == 0) { if (gtpie_gettv2(ie, GTPIE_FL_DI, 0, &pdp->flru)) { - gsn->missing++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_MISSING); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Missing conditional information field\n"); @@ -1864,7 +1498,7 @@ int gtp_create_pdp_conf(struct gsn_t *gsn, int version, } if (gtpie_gettv2(ie, GTPIE_FL_C, 0, &pdp->flrc)) { - gsn->missing++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_MISSING); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Missing conditional information field\n"); @@ -1876,7 +1510,7 @@ int gtp_create_pdp_conf(struct gsn_t *gsn, int version, if (version == 1) { if (gtpie_gettv4(ie, GTPIE_TEI_DI, 0, &pdp->teid_gn)) { - gsn->missing++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_MISSING); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Missing conditional information field\n"); @@ -1886,7 +1520,7 @@ int gtp_create_pdp_conf(struct gsn_t *gsn, int version, } if (gtpie_gettv4(ie, GTPIE_TEI_C, 0, &pdp->teic_gn)) { - gsn->missing++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_MISSING); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Missing conditional information field\n"); @@ -1894,10 +1528,12 @@ int gtp_create_pdp_conf(struct gsn_t *gsn, int version, gsn->cb_conf(type, EOF, pdp, cbp); return EOF; } + /* Register that we have received a valid teic from GGSN */ + pdp->teic_confirmed = 1; } if (gtpie_gettv4(ie, GTPIE_CHARGING_ID, 0, &pdp->cid)) { - gsn->missing++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_MISSING); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Missing conditional information field\n"); @@ -1907,7 +1543,7 @@ int gtp_create_pdp_conf(struct gsn_t *gsn, int version, if (gtpie_gettlv(ie, GTPIE_EUA, 0, &pdp->eua.l, &pdp->eua.v, sizeof(pdp->eua.v))) { - gsn->missing++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_MISSING); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Missing conditional information field\n"); @@ -1918,7 +1554,7 @@ int gtp_create_pdp_conf(struct gsn_t *gsn, int version, if (gtpie_gettlv(ie, GTPIE_GSN_ADDR, 0, &pdp->gsnrc.l, &pdp->gsnrc.v, sizeof(pdp->gsnrc.v))) { - gsn->missing++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_MISSING); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Missing conditional information field\n"); @@ -1929,7 +1565,7 @@ int gtp_create_pdp_conf(struct gsn_t *gsn, int version, if (gtpie_gettlv(ie, GTPIE_GSN_ADDR, 1, &pdp->gsnru.l, &pdp->gsnru.v, sizeof(pdp->gsnru.v))) { - gsn->missing++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_MISSING); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Missing conditional information field\n"); @@ -1942,7 +1578,7 @@ int gtp_create_pdp_conf(struct gsn_t *gsn, int version, if (gtpie_gettlv (ie, GTPIE_QOS_PROFILE, 0, &pdp->qos_neg.l, &pdp->qos_neg.v, sizeof(pdp->qos_neg.v))) { - gsn->missing++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_MISSING); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Missing conditional information field\n"); @@ -2046,7 +1682,7 @@ static int gtp_update_pdp_resp(struct gsn_t *gsn, uint8_t version, gtpie_tv1(&packet, &length, GTP_MAX, GTPIE_CAUSE, cause); - if (cause == GTPCAUSE_ACC_REQ) { + if (gtp_cause_successful(cause)) { if (version == 0) gtpie_tv0(&packet, &length, GTP_MAX, GTPIE_QOS_PROFILE0, @@ -2118,7 +1754,7 @@ static int gtp_update_pdp_ind(struct gsn_t *gsn, uint8_t version, /* Decode information elements */ if (gtpie_decaps(ie, version, pack + hlen, len - hlen)) { - gsn->invalid++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_INVALID); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Invalid message format\n"); if (0 == version) @@ -2136,9 +1772,10 @@ static int gtp_update_pdp_ind(struct gsn_t *gsn, uint8_t version, if (version == 0) { /* Find the context in question */ if (gtp_pdp_tidget(gsn, &pdp, get_tid(pack))) { - gsn->err_unknownpdp++; - GTP_LOGPKG(LOGL_ERROR, peer, pack, - len, "Unknown PDP context\n"); + rate_ctr_inc2(gsn->ctrg, GSN_CTR_ERR_UNKNOWN_PDP); + GTP_LOGPKG(LOGL_ERROR, peer, pack, len, + "Unknown PDP context: TID=0x%" PRIx64 "\n", + get_tid(pack)); return gtp_update_pdp_resp(gsn, version, peer, fd, pack, len, NULL, GTPCAUSE_NON_EXIST); @@ -2149,7 +1786,7 @@ static int gtp_update_pdp_ind(struct gsn_t *gsn, uint8_t version, } else if (version == 1) { /* NSAPI (mandatory) */ if (gtpie_gettv1(ie, GTPIE_NSAPI, 0, &nsapi)) { - gsn->missing++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_MISSING); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Missing mandatory information field\n"); return gtp_update_pdp_resp(gsn, version, peer, fd, pack, @@ -2161,10 +1798,10 @@ static int gtp_update_pdp_ind(struct gsn_t *gsn, uint8_t version, if (gtpie_gettv0(ie, GTPIE_IMSI, 0, &imsi, sizeof(imsi))) { /* Find the context in question */ if (gtp_pdp_getgtp1(gsn, &pdp, get_tei(pack))) { - gsn->err_unknownpdp++; - GTP_LOGPKG(LOGL_ERROR, peer, - pack, len, "Unknown PDP context: %u\n", - get_tei(pack)); + rate_ctr_inc2(gsn->ctrg, GSN_CTR_ERR_UNKNOWN_PDP); + GTP_LOGPKG(LOGL_ERROR, peer, pack, len, + "Unknown PDP context: TEI=0x%" PRIx32 "\n", + get_tei(pack)); return gtp_update_pdp_resp(gsn, version, peer, fd, pack, len, NULL, GTPCAUSE_NON_EXIST); @@ -2172,9 +1809,10 @@ static int gtp_update_pdp_ind(struct gsn_t *gsn, uint8_t version, } else { /* Find the context in question */ if (gtp_pdp_getimsi(gsn, &pdp, imsi, nsapi)) { - gsn->err_unknownpdp++; - GTP_LOGPKG(LOGL_ERROR, peer, - pack, len, "Unknown PDP context\n"); + rate_ctr_inc2(gsn->ctrg, GSN_CTR_ERR_UNKNOWN_PDP); + GTP_LOGPKG(LOGL_ERROR, peer, pack, len, + "Unknown PDP context: IMSI=0x%" PRIx64 + " NSAPI=%" PRIu8 "\n", imsi, nsapi); return gtp_update_pdp_resp(gsn, version, peer, fd, pack, len, NULL, GTPCAUSE_NON_EXIST); @@ -2191,7 +1829,7 @@ static int gtp_update_pdp_ind(struct gsn_t *gsn, uint8_t version, if (version == 0) { if (gtpie_gettv0(ie, GTPIE_QOS_PROFILE0, 0, pdp->qos_req0, sizeof(pdp->qos_req0))) { - gsn->missing++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_MISSING); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Missing mandatory information field\n"); memcpy(pdp, &pdp_backup, sizeof(pdp_backup)); @@ -2208,7 +1846,7 @@ static int gtp_update_pdp_ind(struct gsn_t *gsn, uint8_t version, if (version == 0) { if (gtpie_gettv2(ie, GTPIE_FL_DI, 0, &pdp->flru)) { - gsn->missing++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_MISSING); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Missing mandatory information field\n"); memcpy(pdp, &pdp_backup, sizeof(pdp_backup)); @@ -2218,7 +1856,7 @@ static int gtp_update_pdp_ind(struct gsn_t *gsn, uint8_t version, } if (gtpie_gettv2(ie, GTPIE_FL_C, 0, &pdp->flrc)) { - gsn->missing++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_MISSING); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Missing mandatory information field\n"); memcpy(pdp, &pdp_backup, sizeof(pdp_backup)); @@ -2231,7 +1869,7 @@ static int gtp_update_pdp_ind(struct gsn_t *gsn, uint8_t version, if (version == 1) { /* TEID (mandatory) */ if (gtpie_gettv4(ie, GTPIE_TEI_DI, 0, &pdp->teid_gn)) { - gsn->missing++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_MISSING); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Missing mandatory information field\n"); memcpy(pdp, &pdp_backup, sizeof(pdp_backup)); @@ -2248,7 +1886,7 @@ static int gtp_update_pdp_ind(struct gsn_t *gsn, uint8_t version, /* NSAPI (mandatory) */ if (gtpie_gettv1(ie, GTPIE_NSAPI, 0, &pdp->nsapi)) { - gsn->missing++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_MISSING); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Missing mandatory information field\n"); memcpy(pdp, &pdp_backup, sizeof(pdp_backup)); @@ -2264,7 +1902,7 @@ static int gtp_update_pdp_ind(struct gsn_t *gsn, uint8_t version, /* End User Address (conditional) TODO: GGSN Initiated if (gtpie_gettlv(ie, GTPIE_EUA, 0, &pdp->eua.l, &pdp->eua.v, sizeof(pdp->eua.v))) { - gsn->missing++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_MISSING); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Missing mandatory information field"); memcpy(pdp, &pdp_backup, sizeof(pdp_backup)); @@ -2276,7 +1914,7 @@ static int gtp_update_pdp_ind(struct gsn_t *gsn, uint8_t version, /* It is weird that this is mandatory when TEIC is conditional */ if (gtpie_gettlv(ie, GTPIE_GSN_ADDR, 0, &pdp->gsnrc.l, &pdp->gsnrc.v, sizeof(pdp->gsnrc.v))) { - gsn->missing++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_MISSING); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Missing mandatory information field\n"); memcpy(pdp, &pdp_backup, sizeof(pdp_backup)); @@ -2287,7 +1925,7 @@ static int gtp_update_pdp_ind(struct gsn_t *gsn, uint8_t version, /* SGSN address for user traffic (mandatory) */ if (gtpie_gettlv(ie, GTPIE_GSN_ADDR, 1, &pdp->gsnru.l, &pdp->gsnru.v, sizeof(pdp->gsnru.v))) { - gsn->missing++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_MISSING); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Missing mandatory information field\n"); memcpy(pdp, &pdp_backup, sizeof(pdp_backup)); @@ -2299,7 +1937,7 @@ static int gtp_update_pdp_ind(struct gsn_t *gsn, uint8_t version, /* QoS (mandatory) */ if (gtpie_gettlv(ie, GTPIE_QOS_PROFILE, 0, &pdp->qos_req.l, &pdp->qos_req.v, sizeof(pdp->qos_req.v))) { - gsn->missing++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_MISSING); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Missing mandatory information field\n"); memcpy(pdp, &pdp_backup, sizeof(pdp_backup)); @@ -2325,50 +1963,56 @@ static int gtp_update_pdp_ind(struct gsn_t *gsn, uint8_t version, static int gtp_update_pdp_conf(struct gsn_t *gsn, uint8_t version, struct sockaddr_in *peer, void *pack, unsigned len) { - struct pdp_t *pdp; + struct pdp_t *pdp = NULL; union gtpie_member *ie[GTPIE_SIZE]; - uint8_t cause, recovery; + uint8_t cause = EOF; + uint8_t recovery; + int rc = 0; void *cbp = NULL; uint8_t type = 0; + bool trigger_recovery = false; int hlen = get_hlen(pack); /* Remove packet from queue */ if (gtp_conf(gsn, 0, peer, pack, len, &type, &cbp)) return EOF; - /* Find the context in question */ - if (gtp_pdp_getgtp1(gsn, &pdp, get_tei(pack))) { - gsn->err_unknownpdp++; - GTP_LOGPKG(LOGL_ERROR, peer, pack, len, - "Unknown PDP context: %u\n", get_tei(pack)); - pdp = NULL; - goto err_out; - } - - /* Register that we have received a valid teic from GGSN */ - pdp->teic_confirmed = 1; - /* Decode information elements */ if (gtpie_decaps(ie, version, pack + hlen, len - hlen)) { - gsn->invalid++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_INVALID); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Invalid message format\n"); goto err_out; } + /* Extract recovery (optional) */ + if (!gtpie_gettv1(ie, GTPIE_RECOVERY, 0, &recovery)) + trigger_recovery = true; + /* Extract cause value (mandatory) */ if (gtpie_gettv1(ie, GTPIE_CAUSE, 0, &cause)) { goto err_missing; } - /* Extract recovery (optional) */ - if (!gtpie_gettv1(ie, GTPIE_RECOVERY, 0, &recovery)) { - emit_cb_recovery(gsn, peer, pdp, recovery); + /* 3GPP TS 29.060 sec 8.2: "Receiving node shall send back to the source + * of the message, a response with the appropriate cause value (either + * "Non-existent" or "Context not found"). The Tunnel Endpoint + * Identifier used in the response message shall be set to all zeroes." + * Hence, TEID=0 in this scenario, it makes no sense to infer PDP ctx + * from it. User is responsible to infer it from cbp */ + if (cause != GTPCAUSE_NON_EXIST && cause != GTPCAUSE_CONTEXT_NOT_FOUND) { + /* Find the context in question */ + if (gtp_pdp_getgtp1(gsn, &pdp, get_tei(pack))) { + rate_ctr_inc2(gsn->ctrg, GSN_CTR_ERR_UNKNOWN_PDP); + GTP_LOGPKG(LOGL_ERROR, peer, pack, len, + "Unknown PDP context: TEI=0x%" PRIx32 "\n", get_tei(pack)); + goto err_out; + } } /* Check all conditional information elements */ /* TODO: This does not handle GGSN-initiated update responses */ - if (GTPCAUSE_ACC_REQ == cause) { + if (gtp_cause_successful(cause)) { if (version == 0) { if (gtpie_gettv0(ie, GTPIE_QOS_PROFILE0, 0, &pdp->qos_neg0, @@ -2393,6 +2037,8 @@ static int gtp_update_pdp_conf(struct gsn_t *gsn, uint8_t version, if (gtpie_gettv4(ie, GTPIE_TEI_C, 0, &pdp->teic_gn)) { goto err_missing; } + /* Register that we have received a valid teic from GGSN */ + pdp->teic_confirmed = 1; } if (gtpie_gettv4(ie, GTPIE_CHARGING_ID, 0, &pdp->cid)) { @@ -2418,18 +2064,20 @@ static int gtp_update_pdp_conf(struct gsn_t *gsn, uint8_t version, } } +generic_ret: + if (trigger_recovery) + emit_cb_recovery(gsn, peer, pdp, recovery); if (gsn->cb_conf) gsn->cb_conf(type, cause, pdp, cbp); - return 0; /* Succes */ + return rc; /* Succes */ err_missing: - gsn->missing++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_MISSING); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Missing information field\n"); err_out: - if (gsn->cb_conf) - gsn->cb_conf(type, EOF, pdp, cbp); - return EOF; + rc = EOF; + goto generic_ret; } /* API: Deprecated. Send Delete PDP Context Request And free pdp ctx. */ @@ -2490,7 +2138,7 @@ int gtp_delete_context_req2(struct gsn_t *gsn, struct pdp_t *pdp, void *cbp, int count; if (gsna2in_addr(&addr, &pdp->gsnrc)) { - gsn->err_address++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_ERR_ADDRESS); LOGP(DLGTP, LOGL_ERROR, "GSN address (len=%u) conversion failed\n", pdp->gsnrc.l); return EOF; } @@ -2539,7 +2187,7 @@ int gtp_delete_pdp_resp(struct gsn_t *gsn, int version, gtp_resp(version, gsn, pdp, &packet, length, peer, fd, get_seq(pack), get_tid(pack)); - if (cause == GTPCAUSE_ACC_REQ) { + if (gtp_cause_successful(cause)) { if ((teardown) || (version == 0)) { /* Remove all contexts */ gtp_freepdp_teardown(gsn, linked_pdp); } else { @@ -2565,7 +2213,6 @@ int gtp_delete_pdp_resp(struct gsn_t *gsn, int version, } } } - /* if (cause == GTPCAUSE_ACC_REQ) */ return 0; } @@ -2592,9 +2239,9 @@ int gtp_delete_pdp_ind(struct gsn_t *gsn, int version, /* Find the linked context in question */ if (gtp_pdp_getgtp1(gsn, &linked_pdp, get_tei(pack))) { - gsn->err_unknownpdp++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_ERR_UNKNOWN_PDP); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, - "Unknown PDP context: %u\n", get_tei(pack)); + "Unknown PDP context: TEI=0x%" PRIx32 "\n", get_tei(pack)); return gtp_delete_pdp_resp(gsn, version, peer, fd, pack, len, NULL, NULL, GTPCAUSE_NON_EXIST, teardown); @@ -2606,7 +2253,7 @@ int gtp_delete_pdp_ind(struct gsn_t *gsn, int version, /* Decode information elements */ if (gtpie_decaps(ie, version, pack + hlen, len - hlen)) { - gsn->invalid++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_INVALID); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Invalid message format\n"); if (0 == version) @@ -2621,9 +2268,9 @@ int gtp_delete_pdp_ind(struct gsn_t *gsn, int version, if (version == 1) { /* NSAPI (mandatory) */ if (gtpie_gettv1(ie, GTPIE_NSAPI, 0, &nsapi)) { - gsn->missing++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_MISSING); GTP_LOGPKG(LOGL_ERROR, peer, pack, - len, "Missing mandatory information field\n"); + len, "Missing mandatory information field\n"); return gtp_delete_pdp_resp(gsn, version, peer, fd, pack, len, NULL, NULL, GTPCAUSE_MAN_IE_MISSING, @@ -2632,9 +2279,10 @@ int gtp_delete_pdp_ind(struct gsn_t *gsn, int version, /* Find the context in question */ if (gtp_pdp_getgtp1(gsn, &pdp, linked_pdp->secondary_tei[nsapi & 0x0f])) { - gsn->err_unknownpdp++; - GTP_LOGPKG(LOGL_ERROR, peer, pack, - len, "Unknown PDP context\n"); + rate_ctr_inc2(gsn->ctrg, GSN_CTR_ERR_UNKNOWN_PDP); + GTP_LOGPKG(LOGL_ERROR, peer, pack, len, + "Unknown PDP context: Secondary TEI=0x%" PRIx32 "\n", + linked_pdp->secondary_tei[nsapi & 0x0f]); return gtp_delete_pdp_resp(gsn, version, peer, fd, pack, len, NULL, NULL, GTPCAUSE_NON_EXIST, @@ -2685,10 +2333,11 @@ int gtp_delete_pdp_conf(struct gsn_t *gsn, int version, /* Find the context in question. It may not be available if gtp_delete_context_req * was used and as a result the PDP ctx was already freed */ if (gtp_pdp_getgtp1(gsn, &pdp, get_tei(pack))) { - gsn->err_unknownpdp++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_ERR_UNKNOWN_PDP); GTP_LOGPKG(LOGL_NOTICE, peer, pack, len, - "Unknown PDP context: %u (expected if gtp_delete_context_req is used or pdp ctx was freed manually before response)\n", - get_tei(pack)); + "Unknown PDP context: TEI=0x%" PRIx32 " (expected if " + "gtp_delete_context_req is used or pdp ctx was freed " + "manually before response)\n", get_tei(pack)); if (gsn->cb_conf) gsn->cb_conf(type, EOF, NULL, cbp); return EOF; @@ -2696,7 +2345,7 @@ int gtp_delete_pdp_conf(struct gsn_t *gsn, int version, /* Decode information elements */ if (gtpie_decaps(ie, version, pack + hlen, len - hlen)) { - gsn->invalid++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_INVALID); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Invalid message format\n"); if (gsn->cb_conf) @@ -2706,7 +2355,7 @@ int gtp_delete_pdp_conf(struct gsn_t *gsn, int version, /* Extract cause value (mandatory) */ if (gtpie_gettv1(ie, GTPIE_CAUSE, 0, &cause)) { - gsn->missing++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_MISSING); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Missing mandatory information field\n"); if (gsn->cb_conf) @@ -2715,8 +2364,8 @@ int gtp_delete_pdp_conf(struct gsn_t *gsn, int version, } /* Check the cause value (again) */ - if ((GTPCAUSE_ACC_REQ != cause) && (GTPCAUSE_NON_EXIST != cause)) { - gsn->err_cause++; + if (!gtp_cause_successful(cause) && (GTPCAUSE_NON_EXIST != cause)) { + rate_ctr_inc2(gsn->ctrg, GSN_CTR_ERR_UNEXPECTED_CAUSE); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Unexpected cause value received: %d\n", cause); if (gsn->cb_conf) @@ -2763,9 +2412,10 @@ static int gtp_error_ind_conf(struct gsn_t *gsn, uint8_t version, /* Find the context in question */ if (version == 0) { if (gtp_pdp_tidget(gsn, &pdp, get_tid(pack))) { - gsn->err_unknownpdp++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_ERR_UNKNOWN_PDP); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, - "Unknown PDP context\n"); + "Unknown PDP context: TID=0x%" PRIx64 "\n", + get_tid(pack)); return EOF; } } else if (version == 1) { @@ -2775,22 +2425,24 @@ static int gtp_error_ind_conf(struct gsn_t *gsn, uint8_t version, /* Decode information elements */ if (gtpie_decaps(ie, version, pack + hlen, len - hlen)) { - gsn->invalid++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_INVALID); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Invalid message format\n"); return EOF; } if (gtpie_gettv4(ie, GTPIE_TEI_DI, 0, &teid_gn)) { - gsn->missing++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_MISSING); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Missing mandatory information field\n"); return EOF; } if (gtp_pdp_getgtp1_peer_d(gsn, &pdp, peer, teid_gn)) { - gsn->err_unknownpdp++; - GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Unknown PDP context\n"); + rate_ctr_inc2(gsn->ctrg, GSN_CTR_ERR_UNKNOWN_PDP); + GTP_LOGPKG(LOGL_ERROR, peer, pack, len, + "Unknown PDP context: Peer TEID=0x%" PRIx32 "\n", + teid_gn); return EOF; } } else { @@ -2821,22 +2473,22 @@ static int gtp_gpdu_ind(struct gsn_t *gsn, uint8_t version, switch (version) { case 0: - if (gtp_pdp_getgtp0(gsn, &pdp, - ntoh16(((union gtp_packet *)pack)->gtp0.h.flow))) { - gsn->err_unknownpdp++; - GTP_LOGPKG(LOGL_ERROR, peer, pack, - len, "Unknown PDP context, GTPv0\n"); + if (gtp_pdp_getgtp0(gsn, &pdp, get_tei(pack))) { + rate_ctr_inc2(gsn->ctrg, GSN_CTR_ERR_UNKNOWN_PDP); + GTP_LOGPKG(LOGL_ERROR, peer, pack, len, + "Unknown PDP context: TEI=0x%" PRIx32 "\n", + get_tei(pack)); return gtp_error_ind_resp(gsn, version, peer, fd, pack, len); } hlen = GTP0_HEADER_SIZE; break; case 1: - if (gtp_pdp_getgtp1(gsn, &pdp, - ntoh32(((union gtp_packet *)pack)->gtp1l.h.tei))) { - gsn->err_unknownpdp++; - GTP_LOGPKG(LOGL_ERROR, peer, pack, - len, "Unknown PDP context, GTPv1\n"); + if (gtp_pdp_getgtp1(gsn, &pdp, get_tei(pack))) { + rate_ctr_inc2(gsn->ctrg, GSN_CTR_ERR_UNKNOWN_PDP); + GTP_LOGPKG(LOGL_ERROR, peer, pack, len, + "Unknown PDP context: TEI=0x%" PRIx32 "\n", + get_tei(pack)); return gtp_error_ind_resp(gsn, version, peer, fd, pack, len); } @@ -2855,7 +2507,7 @@ static int gtp_gpdu_ind(struct gsn_t *gsn, uint8_t version, /* If the GPDU was not from the peer GSN tell him to delete context */ if (memcmp(&peer->sin_addr, pdp->gsnru.v, pdp->gsnru.l)) { /* TODO Range? */ - gsn->err_unknownpdp++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_ERR_UNKNOWN_PDP); GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Unknown GSN peer %s\n", inet_ntoa(peer->sin_addr)); return gtp_error_ind_resp(gsn, version, peer, fd, pack, len); } @@ -2897,7 +2549,7 @@ int gtp_decaps0(struct gsn_t *gsn) (struct sockaddr *)&peer, &peerlen)) < 0) { if (errno == EAGAIN) return 0; - gsn->err_readfrom++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_ERR_READFROM); LOGP(DLGTP, LOGL_ERROR, "recvfrom(fd0=%d, buffer=%lx, len=%zu) failed: status = %d error = %s\n", gsn->fd0, (unsigned long)buffer, sizeof(buffer), @@ -2907,7 +2559,7 @@ int gtp_decaps0(struct gsn_t *gsn) /* Need at least 1 byte in order to check version */ if (status < (1)) { - gsn->empty++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_EMPTY); GTP_LOGPKG(LOGL_ERROR, &peer, buffer, status, "Discarding packet - too small\n"); continue; @@ -2923,7 +2575,7 @@ int gtp_decaps0(struct gsn_t *gsn) /* only support version 0, implying that this is the only version */ /* supported on this port */ if (version > 0) { - gsn->unsup++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_UNSUP); GTP_LOGPKG(LOGL_ERROR, &peer, buffer, status, "Unsupported GTP version %"PRIu8"\n", version); gtp_unsup_req(gsn, 0, &peer, gsn->fd0, buffer, status); /* 29.60: 11.1.1 */ @@ -2932,7 +2584,7 @@ int gtp_decaps0(struct gsn_t *gsn) /* Check length of gtp0 packet */ if (status < GTP0_HEADER_SIZE) { - gsn->tooshort++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_TOOSHORT); GTP_LOGPKG(LOGL_ERROR, &peer, buffer, status, "GTP0 packet too short\n"); continue; /* Silently discard 29.60: 11.1.2 */ @@ -2940,7 +2592,7 @@ int gtp_decaps0(struct gsn_t *gsn) /* Check packet length field versus length of packet */ if (status != (ntoh16(pheader->length) + GTP0_HEADER_SIZE)) { - gsn->tooshort++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_TOOSHORT); GTP_LOGPKG(LOGL_ERROR, &peer, buffer, status, "GTP packet length field does not match actual length\n"); @@ -2950,7 +2602,7 @@ int gtp_decaps0(struct gsn_t *gsn) if ((gsn->mode == GTP_MODE_GGSN) && ((pheader->type == GTP_CREATE_PDP_RSP) || (pheader->type == GTP_UPDATE_PDP_RSP))) { - gsn->unexpect++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_UNEXPECT); GTP_LOGPKG(LOGL_ERROR, &peer, buffer, status, "Unexpected GTPv0 Signalling Message '%s'\n", @@ -2961,7 +2613,7 @@ int gtp_decaps0(struct gsn_t *gsn) if ((gsn->mode == GTP_MODE_SGSN) && ((pheader->type == GTP_CREATE_PDP_REQ) || (pheader->type == GTP_UPDATE_PDP_REQ))) { - gsn->unexpect++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_UNEXPECT); GTP_LOGPKG(LOGL_ERROR, &peer, buffer, status, "Unexpected GTPv0 Signalling Message '%s'\n", @@ -3010,7 +2662,7 @@ int gtp_decaps0(struct gsn_t *gsn) gtp_gpdu_ind(gsn, version, &peer, fd, buffer, status); break; default: - gsn->unknown++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_UNKNOWN); GTP_LOGPKG(LOGL_ERROR, &peer, buffer, status, "Unknown GTP message type received: %d\n", pheader->type); @@ -3044,7 +2696,7 @@ int gtp_decaps1c(struct gsn_t *gsn) (struct sockaddr *)&peer, &peerlen)) < 0) { if (errno == EAGAIN) return 0; - gsn->err_readfrom++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_ERR_READFROM); LOGP(DLGTP, LOGL_ERROR, "recvfrom(fd=%d, buffer=%lx, len=%zu) failed: status = %d error = %s\n", fd, (unsigned long)buffer, sizeof(buffer), @@ -3054,7 +2706,7 @@ int gtp_decaps1c(struct gsn_t *gsn) /* Need at least 1 byte in order to check version */ if (status < (1)) { - gsn->empty++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_EMPTY); GTP_LOGPKG(LOGL_ERROR, &peer, buffer, status, "Discarding packet - too small\n"); continue; @@ -3066,7 +2718,7 @@ int gtp_decaps1c(struct gsn_t *gsn) /* Version must be no larger than GTP 1 */ if (version > 1) { - gsn->unsup++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_UNSUP); GTP_LOGPKG(LOGL_ERROR, &peer, buffer, status, "Unsupported GTP version %"PRIu8"\n", version); gtp_unsup_req(gsn, version, &peer, fd, buffer, status); @@ -3079,7 +2731,7 @@ int gtp_decaps1c(struct gsn_t *gsn) /* GTP 1 messages. If GTP 0 message is received we silently discard */ /* the message */ if (version < 1) { - gsn->unsup++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_UNSUP); GTP_LOGPKG(LOGL_ERROR, &peer, buffer, status, "Unsupported GTP version %"PRIu8"\n", version); continue; @@ -3087,7 +2739,7 @@ int gtp_decaps1c(struct gsn_t *gsn) /* Check packet flag field */ if (((pheader->flags & 0xf7) != 0x32)) { - gsn->unsup++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_UNSUP); GTP_LOGPKG(LOGL_ERROR, &peer, buffer, status, "Unsupported packet flags: 0x%02x\n", pheader->flags); continue; @@ -3095,7 +2747,7 @@ int gtp_decaps1c(struct gsn_t *gsn) /* Check length of packet */ if (status < GTP1_HEADER_SIZE_LONG) { - gsn->tooshort++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_TOOSHORT); GTP_LOGPKG(LOGL_ERROR, &peer, buffer, status, "GTP packet too short\n"); continue; /* Silently discard 29.60: 11.1.2 */ @@ -3104,7 +2756,7 @@ int gtp_decaps1c(struct gsn_t *gsn) /* Check packet length field versus length of packet */ if (status != (ntoh16(pheader->length) + GTP1_HEADER_SIZE_SHORT)) { - gsn->tooshort++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_TOOSHORT); GTP_LOGPKG(LOGL_ERROR, &peer, buffer, status, "GTP packet length field does not match actual length\n"); @@ -3115,7 +2767,7 @@ int gtp_decaps1c(struct gsn_t *gsn) /* TODO: We really should cycle through the headers and determine */ /* if any have the comprehension required flag set */ if (((pheader->flags & GTP1HDR_F_EXT) != 0x00)) { - gsn->unsup++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_UNSUP); GTP_LOGPKG(LOGL_ERROR, &peer, buffer, status, "Unsupported extension header\n"); gtp_extheader_req(gsn, version, &peer, fd, buffer, @@ -3127,7 +2779,7 @@ int gtp_decaps1c(struct gsn_t *gsn) if ((gsn->mode == GTP_MODE_GGSN) && ((pheader->type == GTP_CREATE_PDP_RSP) || (pheader->type == GTP_UPDATE_PDP_RSP))) { - gsn->unexpect++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_UNEXPECT); GTP_LOGPKG(LOGL_ERROR, &peer, buffer, status, "Unexpected GTPv1 Signalling Message '%s'\n", @@ -3138,7 +2790,7 @@ int gtp_decaps1c(struct gsn_t *gsn) if ((gsn->mode == GTP_MODE_SGSN) && ((pheader->type == GTP_CREATE_PDP_REQ) || (pheader->type == GTP_UPDATE_PDP_REQ))) { - gsn->unexpect++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_UNEXPECT); GTP_LOGPKG(LOGL_ERROR, &peer, buffer, status, "Unexpected GTPv1 Signalling Message '%s'\n", @@ -3186,8 +2838,11 @@ int gtp_decaps1c(struct gsn_t *gsn) case GTP_ERROR: gtp_error_ind_conf(gsn, version, &peer, buffer, status); break; + case GTP_RAN_INFO_RELAY: + gtp_ran_info_relay_ind(gsn, version, &peer, buffer, status); + break; default: - gsn->unknown++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_UNKNOWN); GTP_LOGPKG(LOGL_ERROR, &peer, buffer, status, "Unknown GTP message type received: %u\n", pheader->type); @@ -3221,7 +2876,7 @@ int gtp_decaps1u(struct gsn_t *gsn) (struct sockaddr *)&peer, &peerlen)) < 0) { if (errno == EAGAIN) return 0; - gsn->err_readfrom++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_ERR_READFROM); LOGP(DLGTP, LOGL_ERROR, "recvfrom(fd1u=%d, buffer=%lx, len=%zu) failed: status = %d error = %s\n", gsn->fd1u, (unsigned long)buffer, @@ -3232,7 +2887,7 @@ int gtp_decaps1u(struct gsn_t *gsn) /* Need at least 1 byte in order to check version */ if (status < (1)) { - gsn->empty++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_EMPTY); GTP_LOGPKG(LOGL_ERROR, &peer, buffer, status, "Discarding packet - too small\n"); continue; @@ -3244,7 +2899,7 @@ int gtp_decaps1u(struct gsn_t *gsn) /* Version must be no larger than GTP 1 */ if (version > 1) { - gsn->unsup++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_UNSUP); GTP_LOGPKG(LOGL_ERROR, &peer, buffer, status, "Unsupported GTP version %"PRIu8"\n", version); gtp_unsup_req(gsn, 1, &peer, gsn->fd1c, buffer, status); /*29.60: 11.1.1 */ @@ -3256,7 +2911,7 @@ int gtp_decaps1u(struct gsn_t *gsn) /* GTP 1 messages. If GTP 0 message is received we silently discard */ /* the message */ if (version < 1) { - gsn->unsup++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_UNSUP); GTP_LOGPKG(LOGL_ERROR, &peer, buffer, status, "Unsupported GTP version %"PRIu8"\n", version); continue; @@ -3264,7 +2919,7 @@ int gtp_decaps1u(struct gsn_t *gsn) /* Check packet flag field (allow both with and without sequence number) */ if (((pheader->flags & 0xf5) != 0x30)) { - gsn->unsup++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_UNSUP); GTP_LOGPKG(LOGL_ERROR, &peer, buffer, status, "Unsupported packet flags 0x%02x\n", pheader->flags); continue; @@ -3272,7 +2927,7 @@ int gtp_decaps1u(struct gsn_t *gsn) /* Check length of packet */ if (status < GTP1_HEADER_SIZE_SHORT) { - gsn->tooshort++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_TOOSHORT); GTP_LOGPKG(LOGL_ERROR, &peer, buffer, status, "GTP packet too short\n"); continue; /* Silently discard 29.60: 11.1.2 */ @@ -3281,7 +2936,7 @@ int gtp_decaps1u(struct gsn_t *gsn) /* Check packet length field versus length of packet */ if (status != (ntoh16(pheader->length) + GTP1_HEADER_SIZE_SHORT)) { - gsn->tooshort++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_TOOSHORT); GTP_LOGPKG(LOGL_ERROR, &peer, buffer, status, "GTP packet length field does not match actual length\n"); @@ -3292,7 +2947,7 @@ int gtp_decaps1u(struct gsn_t *gsn) /* TODO: We really should cycle through the headers and determine */ /* if any have the comprehension required flag set */ if (((pheader->flags & GTP1HDR_F_EXT) != 0x00)) { - gsn->unsup++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_UNSUP); GTP_LOGPKG(LOGL_ERROR, &peer, buffer, status, "Unsupported extension header\n"); gtp_extheader_req(gsn, version, &peer, fd, buffer, @@ -3319,7 +2974,7 @@ int gtp_decaps1u(struct gsn_t *gsn) gtp_gpdu_ind(gsn, version, &peer, fd, buffer, status); break; default: - gsn->unknown++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_PKT_UNKNOWN); GTP_LOGPKG(LOGL_ERROR, &peer, buffer, status, "Unknown GTP message type received: %u\n", pheader->type); @@ -3400,7 +3055,7 @@ int gtp_data_req(struct gsn_t *gsn, struct pdp_t *pdp, void *pack, unsigned len) } if (sendmsg(fd, &msgh, 0) < 0) { - gsn->err_sendto++; + rate_ctr_inc2(gsn->ctrg, GSN_CTR_ERR_SENDTO); LOGP(DLGTP, LOGL_ERROR, "sendmsg(fd=%d, msg=%lx, len=%d) failed: Error = %s\n", fd, (unsigned long)&packet, GTP0_HEADER_SIZE + len, diff --git a/gtp/gtp_internal.h b/gtp/gtp_internal.h new file mode 100644 index 0000000..826ea59 --- /dev/null +++ b/gtp/gtp_internal.h @@ -0,0 +1,52 @@ +#pragma once + +int gtp_echo_resp(struct gsn_t *gsn, int version, + struct sockaddr_in *peer, int fd, + void *pack, unsigned len); +int gtp_echo_ind(struct gsn_t *gsn, int version, + struct sockaddr_in *peer, int fd, + void *pack, unsigned len); +int gtp_echo_conf(struct gsn_t *gsn, int version, + struct sockaddr_in *peer, void *pack, unsigned len); + +int gtp_unsup_req(struct gsn_t *gsn, int version, + struct sockaddr_in *peer, + int fd, void *pack, unsigned len); +int gtp_unsup_ind(struct gsn_t *gsn, struct sockaddr_in *peer, + void *pack, unsigned len); + +int gtp_create_pdp_resp(struct gsn_t *gsn, int version, + struct pdp_t *pdp, uint8_t cause); + +int gtp_create_pdp_ind(struct gsn_t *gsn, int version, + struct sockaddr_in *peer, int fd, + void *pack, unsigned len); + +int gtp_create_pdp_conf(struct gsn_t *gsn, int version, + struct sockaddr_in *peer, + void *pack, unsigned len); + +int gtp_update_pdp_req(struct gsn_t *gsn, int version, void *cbp, + struct in_addr *inetaddr, struct pdp_t *pdp); + +int gtp_delete_pdp_req(struct gsn_t *gsn, int version, void *cbp, + struct pdp_t *pdp); + +int gtp_delete_pdp_resp(struct gsn_t *gsn, int version, + struct sockaddr_in *peer, int fd, + void *pack, unsigned len, + struct pdp_t *pdp, struct pdp_t *linked_pdp, + uint8_t cause, int teardown); + +int gtp_delete_pdp_ind(struct gsn_t *gsn, int version, + struct sockaddr_in *peer, int fd, + void *pack, unsigned len); + +int gtp_delete_pdp_conf(struct gsn_t *gsn, int version, + struct sockaddr_in *peer, + void *pack, unsigned len); + +int ipv42eua(struct ul66_t *eua, struct in_addr *src); +int eua2ipv4(struct in_addr *dst, struct ul66_t *eua); +int in_addr2gsna(struct ul16_t *gsna, struct in_addr *src); +uint64_t gtp_imsi_str2gtp(const char *str); diff --git a/gtp/gtpie.c b/gtp/gtpie.c index fa21ab2..e413d11 100644 --- a/gtp/gtpie.c +++ b/gtp/gtpie.c @@ -1,17 +1,17 @@ -/* +/* * OsmoGGSN - Gateway GPRS Support Node * Copyright (C) 2002 Mondru AB. - * + * * The contents of this file may be used under the terms of the GNU * General Public License Version 2, provided that the above copyright * notice and this permission notice is included in all copies or * substantial portions of the software. - * + * */ /* - * gtpie.c: Contains functions to encapsulate and decapsulate GTP - * information elements + * gtpie.c: Contains functions to encapsulate and decapsulate GTP + * information elements * * * Encapsulation diff --git a/gtp/queue.h b/gtp/queue.h index 9b0367b..9f62482 100644 --- a/gtp/queue.h +++ b/gtp/queue.h @@ -23,7 +23,7 @@ #define QUEUE_DEBUG 0 /* Print debug information */ -#define QUEUE_SIZE 1024 /* Size of retransmission queue */ +#define QUEUE_SIZE (PDP_MAX*2) /* Size of retransmission queue */ #define QUEUE_HASH_SIZE 65536 /* Size of hash table (2^16) */ struct qmsg_t { /* Holder for queued packets */ diff --git a/include/Makefile.am b/include/Makefile.am new file mode 100644 index 0000000..d5db322 --- /dev/null +++ b/include/Makefile.am @@ -0,0 +1,12 @@ +SUBDIRS = \ + osmocom \ + $(NULL) + +# Legacy headers files outside of osmocom/gtp dir. These files are stubs that +# include the files from the proper paths. +include_HEADERS = \ + gsn.h \ + gtp.h \ + gtpie.h \ + pdp.h \ + $(NULL) diff --git a/include/gsn.h b/include/gsn.h new file mode 100644 index 0000000..ef8ba54 --- /dev/null +++ b/include/gsn.h @@ -0,0 +1,2 @@ +#pragma once +#include <osmocom/gtp/gsn.h> diff --git a/include/gtp.h b/include/gtp.h new file mode 100644 index 0000000..8d07b57 --- /dev/null +++ b/include/gtp.h @@ -0,0 +1,2 @@ +#pragma once +#include <osmocom/gtp/gtp.h> diff --git a/include/gtpie.h b/include/gtpie.h new file mode 100644 index 0000000..e69d3fd --- /dev/null +++ b/include/gtpie.h @@ -0,0 +1,2 @@ +#pragma once +#include <osmocom/gtp/gtpie.h> diff --git a/include/osmocom/Makefile.am b/include/osmocom/Makefile.am new file mode 100644 index 0000000..2a96bba --- /dev/null +++ b/include/osmocom/Makefile.am @@ -0,0 +1,3 @@ +SUBDIRS = \ + gtp \ + $(NULL) diff --git a/include/osmocom/gtp/Makefile.am b/include/osmocom/gtp/Makefile.am new file mode 100644 index 0000000..db696e5 --- /dev/null +++ b/include/osmocom/gtp/Makefile.am @@ -0,0 +1,8 @@ +libgtp_HEADERS = \ + gsn.h \ + gtp.h \ + gtpie.h \ + pdp.h \ + $(NULL) + +libgtpdir = $(includedir)/osmocom/gtp diff --git a/include/osmocom/gtp/gsn.h b/include/osmocom/gtp/gsn.h new file mode 100644 index 0000000..2db4fd4 --- /dev/null +++ b/include/osmocom/gtp/gsn.h @@ -0,0 +1,189 @@ +/* + * OsmoGGSN - Gateway GPRS Support Node + * Copyright (C) 2002, 2003, 2004 Mondru AB. + * + * The contents of this file may be used under the terms of the GNU + * General Public License Version 2, provided that the above copyright + * notice and this permission notice is included in all copies or + * substantial portions of the software. + * + */ + +#ifndef _GSN_H +#define _GSN_H + +#include <osmocom/core/utils.h> +#include <osmocom/core/defs.h> +#include <osmocom/core/timer.h> +#include <osmocom/core/tdef.h> +#include <osmocom/core/rate_ctr.h> +#include <osmocom/core/in46_addr.h> + +#include "pdp.h" + +#define GTP_MODE_GGSN 1 +#define GTP_MODE_SGSN 2 + +#define RESTART_FILE "gsn_restart" + +extern struct osmo_tdef gtp_T_defs[]; + +/* *********************************************************** + * Information storage for each gsn instance + * + * Normally each instance of the application corresponds to + * one instance of a gsn. + * + * In order to avoid global variables in the application, and + * also in order to allow several instances of a gsn in the same + * application this struct is provided in order to store all + * relevant information related to the gsn. + * + * Note that this does not include information storage for ' + * each pdp context. This is stored in another struct. + *************************************************************/ + +enum gsn_rate_ctr_keys { + GSN_CTR_ERR_SOCKET, + GSN_CTR_ERR_READFROM, /* Number of readfrom errors */ + GSN_CTR_ERR_SENDTO, /* Number of sendto errors */ + GSN_CTR_ERR_QUEUEFULL, /* Number of times queue was full */ + GSN_CTR_ERR_SEQ, /* Number of seq out of range */ + GSN_CTR_ERR_ADDRESS, /* GSN address conversion failed */ + GSN_CTR_ERR_UNKNOWN_PDP, /* GSN address conversion failed */ + GSN_CTR_ERR_UNEXPECTED_CAUSE, /* Unexpected cause value received */ + GSN_CTR_ERR_OUT_OF_PDP, /* Out of storage for PDP contexts */ + GSN_CTR_PKT_EMPTY, /* Number of empty packets */ + GSN_CTR_PKT_UNSUP, /* Number of unsupported version 29.60 11.1.1 */ + GSN_CTR_PKT_TOOSHORT, /* Number of too short headers 29.60 11.1.2 */ + GSN_CTR_PKT_UNKNOWN, /* Number of unknown messages 29.60 11.1.3 */ + GSN_CTR_PKT_UNEXPECT, /* Number of unexpected messages 29.60 11.1.4 */ + GSN_CTR_PKT_DUPLICATE, /* Number of duplicate or unsolicited replies */ + GSN_CTR_PKT_MISSING, /* Number of missing information field messages */ + GSN_CTR_PKT_INCORRECT, /* Number of incorrect information field messages */ + GSN_CTR_PKT_INVALID, /* Number of invalid message format messages */ +}; + +/* 3GPP TS 29.006 14.1, 14,2 */ +enum gtp_gsn_timers { + GTP_GSN_TIMER_T3_RESPONSE = 3, + GTP_GSN_TIMER_N3_REQUESTS = 1003, + GTP_GSN_TIMER_T3_HOLD_RESPONSE = -3, +}; + +struct gsn_t { + /* Parameters related to the network interface */ + + int fd0; /* GTP0 file descriptor */ + int fd1c; /* GTP1 control plane file descriptor */ + int fd1u; /* GTP0 user plane file descriptor */ + int mode; /* Mode of operation: GGSN or SGSN */ + + /* If you access gsnc and gsnu directly, only IPv4 is supported. Use + * gtp_new2(), gtp_get_gsnc(), gtp_get_gsnu() to support IPv6 too. */ + struct in_addr gsnc; /* IP address of this gsn for signalling */ + struct in_addr gsnu; /* IP address of this gsn for user traffic */ + + /* Parameters related to signalling messages */ + uint16_t seq_next; /* Next sequence number to use */ + int seq_first; /* First packet in queue (oldest timeout) */ + int seq_last; /* Last packet in queue (youngest timeout) */ + + unsigned char restart_counter; /* Increment on restart. Stored on disk */ + char *statedir; /* Disk location for permanent storage */ + void *priv; /* used by libgtp users to attach their own state) */ + struct queue_t *queue_req; /* Request queue */ + struct queue_t *queue_resp; /* Response queue */ + + struct pdp_t pdpa[PDP_MAX]; /* PDP storage */ + struct pdp_t *hashtid[PDP_MAX]; /* Hash table for IMSI + NSAPI */ + + struct osmo_timer_list queue_timer; /* internal queue_{req,resp} timer */ + + /* Call back functions */ + int (*cb_delete_context) (struct pdp_t *); + int (*cb_create_context_ind) (struct pdp_t *); + int (*cb_unsup_ind) (struct sockaddr_in * peer); + int (*cb_extheader_ind) (struct sockaddr_in * peer); + int (*cb_ran_info_relay_ind) (struct sockaddr_in *peer, union gtpie_member **ie); + int (*cb_conf) (int type, int cause, struct pdp_t * pdp, void *cbp); + int (*cb_data_ind) (struct pdp_t * pdp, void *pack, unsigned len); + int (*cb_recovery) (struct sockaddr_in * peer, uint8_t recovery); + int (*cb_recovery2) (struct sockaddr_in * peer, struct pdp_t * pdp, uint8_t recovery); + int (*cb_recovery3) (struct gsn_t *gsn, struct sockaddr_in *peer, struct pdp_t *pdp, uint8_t recovery); + + /* Counters */ + struct rate_ctr_group *ctrg; + + /* Timers: */ + struct osmo_tdef *tdef; + + void *internal; +}; + +/* External API functions */ + +extern int gtp_new(struct gsn_t **gsn, char *statedir, struct in_addr *listen, int mode); +extern int gtp_new2(struct gsn_t **gsn, char *statedir, struct in46_addr *listen, int mode); + +extern void gtp_get_gsnc(const struct gsn_t *gsn, struct in46_addr *dest); +extern void gtp_get_gsnu(const struct gsn_t *gsn, struct in46_addr *dest); +extern void gtp_set_gsnu(struct gsn_t *gsn, const struct in46_addr *addr); +extern void gtp_set_gsnc(struct gsn_t *gsn, const struct in46_addr *addr); + +extern int gtp_free(struct gsn_t *gsn); + +extern int gtp_newpdp(struct gsn_t *gsn, struct pdp_t **pdp, + uint64_t imsi, uint8_t nsapi) OSMO_DEPRECATED("Use gtp_pdp_newpdp() instead"); +extern int gtp_freepdp(struct gsn_t *gsn, struct pdp_t *pdp); +extern int gtp_freepdp_teardown(struct gsn_t *gsn, struct pdp_t *pdp); + +extern int gtp_create_context_req(struct gsn_t *gsn, struct pdp_t *pdp, + void *cbp); + +extern int gtp_set_cb_create_context_ind(struct gsn_t *gsn, + int (*cb_create_context_ind) (struct + pdp_t * + pdp)); +extern int gtp_set_cb_data_ind(struct gsn_t *gsn, + int (*cb_data_ind) (struct pdp_t * pdp, + void *pack, unsigned len)); +extern int gtp_set_cb_delete_context(struct gsn_t *gsn, + int (*cb_delete_context) (struct pdp_t * + pdp)); +/*extern int gtp_set_cb_create_context(struct gsn_t *gsn, + int (*cb_create_context) (struct pdp_t* pdp)); */ + +extern int gtp_set_cb_unsup_ind(struct gsn_t *gsn, + int (*cb) (struct sockaddr_in * peer)); + +extern int gtp_set_cb_extheader_ind(struct gsn_t *gsn, + int (*cb) (struct sockaddr_in * peer)); + +extern int gtp_set_cb_ran_info_relay_ind(struct gsn_t *gsn, + int (*cb) (struct sockaddr_in * peer, union gtpie_member **ie)); + +extern int gtp_set_cb_conf(struct gsn_t *gsn, + int (*cb) (int type, int cause, struct pdp_t * pdp, + void *cbp)); + +int gtp_set_cb_recovery(struct gsn_t *gsn, + int (*cb) (struct sockaddr_in * peer, + uint8_t recovery)) + OSMO_DEPRECATED("Use gtp_set_cb_recovery2() instead, to obtain pdp ctx originating the recovery"); +int gtp_set_cb_recovery2(struct gsn_t *gsn, + int (*cb) (struct sockaddr_in * peer, + struct pdp_t * pdp, + uint8_t recovery)) + OSMO_DEPRECATED("Use gtp_set_cb_recovery3() instead, to obtain gsn handling the recovery"); +int gtp_set_cb_recovery3(struct gsn_t *gsn, + int (*cb) (struct gsn_t * gsn, struct sockaddr_in * peer, + struct pdp_t * pdp, + uint8_t recovery)); +void gtp_clear_queues(struct gsn_t *gsn); +extern int gtp_fd(struct gsn_t *gsn); + +extern int gtp_retrans(struct gsn_t *gsn) OSMO_DEPRECATED("This API is a no-op, libgtp already does the job internally"); +extern int gtp_retranstimeout(struct gsn_t *gsn, struct timeval *timeout) OSMO_DEPRECATED("This API is a no-op and will return a 1 day timeout"); + +#endif /* !_GSN_H */ diff --git a/gtp/gtp.h b/include/osmocom/gtp/gtp.h index 45eb285..e3c66c9 100644 --- a/gtp/gtp.h +++ b/include/osmocom/gtp/gtp.h @@ -13,13 +13,10 @@ #define _GTP_H #include <osmocom/core/utils.h> -#include <osmocom/core/defs.h> -#include <osmocom/core/timer.h> +#include "gtpie.h" #include "pdp.h" - -#define GTP_MODE_GGSN 1 -#define GTP_MODE_SGSN 2 +#include "gsn.h" #define GTP0_PORT 3386 #define GTP1C_PORT 2123 @@ -31,12 +28,10 @@ #define GTP1_HEADER_SIZE_SHORT 8 #define GTP1_HEADER_SIZE_LONG 12 +#define NAMESIZE 1024 #define SYSLOG_PRINTSIZE 255 #define ERRMSG_SIZE 255 -#define RESTART_FILE "gsn_restart" -#define NAMESIZE 1024 - /* GTP version 1 extension header type definitions. */ #define GTP_EXT_PDCP_PDU 0xC0 /* PDCP PDU Number */ @@ -58,7 +53,7 @@ #define GTP_UPDATE_PDP_RSP 19 /* Update PDP Context Response */ #define GTP_DELETE_PDP_REQ 20 /* Delete PDP Context Request */ #define GTP_DELETE_PDP_RSP 21 /* Delete PDP Context Response */ - /* 22-25 For future use. *//* In version GTP 1 anonomous PDP context */ +/* 22-25 For future use. *//* In version GTP 1 anonomous PDP context */ #define GTP_ERROR 26 /* Error Indication */ #define GTP_PDU_NOT_REQ 27 /* PDU Notification Request */ #define GTP_PDU_NOT_RSP 28 /* PDU Notification Response */ @@ -85,6 +80,7 @@ #define GTP_FWD_SRNS 58 /* Forward SRNS Context */ #define GTP_FWD_RELOC_ACK 59 /* Forward Relocation Complete Acknowledge */ #define GTP_FWD_SRNS_ACK 60 /* Forward SRNS Context Acknowledge */ +#define GTP_RAN_INFO_RELAY 70 /* RAN Information Relay */ /* 61-239 For future use. */ #define GTP_DATA_TRAN_REQ 240 /* Data Record Transfer Request */ #define GTP_DATA_TRAN_RSP 241 /* Data Record Transfer Response */ @@ -103,19 +99,21 @@ static inline const char *gtp_type_name(uint8_t val) #define GTPCAUSE_NO_ID_NEEDED 3 /* No identity needed */ #define GTPCAUSE_MS_REFUSES_X 4 /* MS refuses */ #define GTPCAUSE_MS_NOT_RESP_X 5 /* MS is not GPRS responding */ -#define GTPCAUSE_006 6 /* For future use 6-48 */ -#define GTPCAUSE_049 49 /* Cause values reserved for GPRS charging protocol use (See GTP' in GSM 12.15) 49-63 */ -#define GTPCAUSE_064 64 /* For future use 64-127 */ +/* 6-48 For future use */ +/* 49-63 Cause values reserved for GPRS charging protocol use (See GTP' in GSM 12.15) */ +/* 64-127 For future use */ #define GTPCAUSE_ACC_REQ 128 /* Request accepted */ -#define GTPCAUSE_129 129 /* For future use 129-176 */ -#define GTPCAUSE_177 177 /* Cause values reserved for GPRS charging protocol use (See GTP' In GSM 12.15) 177-191 */ +#define GTPCAUSE_NEW_PDP_NET_PREF 129 /* New PDP type due to network preference */ +#define GTPCAUSE_NEW_PDP_ADDR_BEAR 130 /* New PDP type due to single address bearer only */ +/* 131-176 For future use */ +/* 177-191 Cause values reserved for GPRS charging protocol use (See GTP' In GSM 12.15) */ #define GTPCAUSE_NON_EXIST 192 /* Non-existent */ #define GTPCAUSE_INVALID_MESSAGE 193 /* Invalid message format */ #define GTPCAUSE_IMSI_NOT_KNOWN 194 /* IMSI not known */ #define GTPCAUSE_MS_DETACHED 195 /* MS is GPRS detached */ #define GTPCAUSE_MS_NOT_RESP 196 /* MS is not GPRS responding */ #define GTPCAUSE_MS_REFUSES 197 /* MS refuses */ -#define GTPCAUSE_198 198 /* For future use */ +/* 198 For future use */ #define GTPCAUSE_NO_RESOURCES 199 /* No resources available */ #define GTPCAUSE_NOT_SUPPORTED 200 /* Service not supported */ #define GTPCAUSE_MAN_IE_INCORRECT 201 /* Mandatory IE incorrect */ @@ -138,8 +136,15 @@ static inline const char *gtp_type_name(uint8_t val) #define GTPCAUSE_SYN_ERR_FILTER 218 /* Syntactic errors in packet filter(s) */ #define GTPCAUSE_MISSING_APN 219 /* Missing or unknown APN */ #define GTPCAUSE_UNKNOWN_PDP 220 /* Unknown PDP address or PDP type */ -#define GTPCAUSE_221 221 /* For Future Use 221-240 */ -#define GTPCAUSE_241 241 /* Cause Values Reserved For Gprs Charging Protocol Use (See Gtp' In Gsm 12.15) 241-255 */ +/* 221-240 For future use */ +/* 241-255 Cause Values Reserved For Gprs Charging Protocol Use (See Gtp' In Gsm 12.15) */ + +static inline bool gtp_cause_successful(uint8_t cause) +{ + return cause == GTPCAUSE_ACC_REQ || + cause == GTPCAUSE_NEW_PDP_NET_PREF || + cause == GTPCAUSE_NEW_PDP_ADDR_BEAR; +} struct ul66_t; struct ul16_t; @@ -230,104 +235,13 @@ union gtp_packet { struct gtp1_packet_long gtp1l; } __attribute__ ((packed)); -/* *********************************************************** - * Information storage for each gsn instance - * - * Normally each instance of the application corresponds to - * one instance of a gsn. - * - * In order to avoid global variables in the application, and - * also in order to allow several instances of a gsn in the same - * application this struct is provided in order to store all - * relevant information related to the gsn. - * - * Note that this does not include information storage for ' - * each pdp context. This is stored in another struct. - *************************************************************/ - -struct gsn_t { - /* Parameters related to the network interface */ - - int fd0; /* GTP0 file descriptor */ - int fd1c; /* GTP1 control plane file descriptor */ - int fd1u; /* GTP0 user plane file descriptor */ - int mode; /* Mode of operation: GGSN or SGSN */ - struct in_addr gsnc; /* IP address of this gsn for signalling */ - struct in_addr gsnu; /* IP address of this gsn for user traffic */ - - /* Parameters related to signalling messages */ - uint16_t seq_next; /* Next sequence number to use */ - int seq_first; /* First packet in queue (oldest timeout) */ - int seq_last; /* Last packet in queue (youngest timeout) */ - - unsigned char restart_counter; /* Increment on restart. Stored on disk */ - char *statedir; /* Disk location for permanent storage */ - void *priv; /* used by libgtp users to attach their own state) */ - struct queue_t *queue_req; /* Request queue */ - struct queue_t *queue_resp; /* Response queue */ - - struct pdp_t pdpa[PDP_MAX]; /* PDP storage */ - struct pdp_t *hashtid[PDP_MAX]; /* Hash table for IMSI + NSAPI */ - - struct osmo_timer_list queue_timer; /* internal queue_{req,resp} timer */ - - /* Call back functions */ - int (*cb_delete_context) (struct pdp_t *); - int (*cb_create_context_ind) (struct pdp_t *); - int (*cb_unsup_ind) (struct sockaddr_in * peer); - int (*cb_extheader_ind) (struct sockaddr_in * peer); - int (*cb_conf) (int type, int cause, struct pdp_t * pdp, void *cbp); - int (*cb_data_ind) (struct pdp_t * pdp, void *pack, unsigned len); - int (*cb_recovery) (struct sockaddr_in * peer, uint8_t recovery); - int (*cb_recovery2) (struct sockaddr_in * peer, struct pdp_t * pdp, uint8_t recovery); - int (*cb_recovery3) (struct gsn_t *gsn, struct sockaddr_in *peer, struct pdp_t *pdp, uint8_t recovery); - - /* Counters */ - - uint64_t err_socket; /* Number of socket errors */ - uint64_t err_readfrom; /* Number of readfrom errors */ - uint64_t err_sendto; /* Number of sendto errors */ - uint64_t err_memcpy; /* Number of memcpy */ - uint64_t err_queuefull; /* Number of times queue was full */ - uint64_t err_seq; /* Number of seq out of range */ - uint64_t err_address; /* GSN address conversion failed */ - uint64_t err_unknownpdp; /* GSN address conversion failed */ - uint64_t err_unknowntid; /* Application supplied unknown imsi+nsapi */ - uint64_t err_cause; /* Unexpected cause value received */ - uint64_t err_outofpdp; /* Out of storage for PDP contexts */ - - uint64_t empty; /* Number of empty packets */ - uint64_t unsup; /* Number of unsupported version 29.60 11.1.1 */ - uint64_t tooshort; /* Number of too short headers 29.60 11.1.2 */ - uint64_t unknown; /* Number of unknown messages 29.60 11.1.3 */ - uint64_t unexpect; /* Number of unexpected messages 29.60 11.1.4 */ - uint64_t duplicate; /* Number of duplicate or unsolicited replies */ - uint64_t missing; /* Number of missing information field messages */ - uint64_t incorrect; /* Number of incorrect information field messages */ - uint64_t invalid; /* Number of invalid message format messages */ -}; - /* External API functions */ extern const char *gtp_version(); -extern int gtp_new(struct gsn_t **gsn, char *statedir, struct in_addr *listen, - int mode); - -extern int gtp_free(struct gsn_t *gsn); - -extern int gtp_newpdp(struct gsn_t *gsn, struct pdp_t **pdp, - uint64_t imsi, uint8_t nsapi) OSMO_DEPRECATED("Use gtp_pdp_newpdp() instead"); -extern int gtp_freepdp(struct gsn_t *gsn, struct pdp_t *pdp); -extern int gtp_freepdp_teardown(struct gsn_t *gsn, struct pdp_t *pdp); extern int gtp_create_context_req(struct gsn_t *gsn, struct pdp_t *pdp, void *cbp); -extern int gtp_set_cb_create_context_ind(struct gsn_t *gsn, - int (*cb_create_context_ind) (struct - pdp_t * - pdp)); - extern int gtp_create_context_resp(struct gsn_t *gsn, struct pdp_t *pdp, int cause); @@ -343,104 +257,20 @@ extern int gtp_delete_context_req2(struct gsn_t *gsn, struct pdp_t *pdp, extern int gtp_data_req(struct gsn_t *gsn, struct pdp_t *pdp, void *pack, unsigned len); -extern int gtp_set_cb_data_ind(struct gsn_t *gsn, - int (*cb_data_ind) (struct pdp_t * pdp, - void *pack, unsigned len)); +extern int gtp_ran_info_relay_req(struct gsn_t *gsn, const struct sockaddr_in *peer, + const uint8_t *ran_container, size_t ran_container_len, + const uint8_t *rim_route_addr, size_t rim_route_addr_len, + uint8_t rim_route_addr_discr); -extern int gtp_fd(struct gsn_t *gsn); extern int gtp_decaps0(struct gsn_t *gsn); extern int gtp_decaps1c(struct gsn_t *gsn); extern int gtp_decaps1u(struct gsn_t *gsn); -extern int gtp_retrans(struct gsn_t *gsn) OSMO_DEPRECATED("This API is a no-op, libgtp already does the job internally"); -extern int gtp_retranstimeout(struct gsn_t *gsn, struct timeval *timeout) OSMO_DEPRECATED("This API is a no-op and will return a 1 day timeout"); - -extern int gtp_set_cb_delete_context(struct gsn_t *gsn, - int (*cb_delete_context) (struct pdp_t * - pdp)); -/*extern int gtp_set_cb_create_context(struct gsn_t *gsn, - int (*cb_create_context) (struct pdp_t* pdp)); */ - -extern int gtp_set_cb_unsup_ind(struct gsn_t *gsn, - int (*cb) (struct sockaddr_in * peer)); - -extern int gtp_set_cb_extheader_ind(struct gsn_t *gsn, - int (*cb) (struct sockaddr_in * peer)); - -extern int gtp_set_cb_conf(struct gsn_t *gsn, - int (*cb) (int type, int cause, struct pdp_t * pdp, - void *cbp)); - -int gtp_set_cb_recovery(struct gsn_t *gsn, - int (*cb) (struct sockaddr_in * peer, - uint8_t recovery)) - OSMO_DEPRECATED("Use gtp_set_cb_recovery2() instead, to obtain pdp ctx originating the recovery"); -int gtp_set_cb_recovery2(struct gsn_t *gsn, - int (*cb) (struct sockaddr_in * peer, - struct pdp_t * pdp, - uint8_t recovery)) - OSMO_DEPRECATED("Use gtp_set_cb_recovery3() instead, to obtain gsn handling the recovery");; -int gtp_set_cb_recovery3(struct gsn_t *gsn, - int (*cb) (struct gsn_t * gsn, struct sockaddr_in * peer, - struct pdp_t * pdp, - uint8_t recovery)); - -void gtp_clear_queues(struct gsn_t *gsn); - -/* Internal functions (not part of the API */ extern int gtp_echo_req(struct gsn_t *gsn, int version, void *cbp, struct in_addr *inetaddrs); -extern int gtp_echo_resp(struct gsn_t *gsn, int version, - struct sockaddr_in *peer, int fd, - void *pack, unsigned len); -extern int gtp_echo_ind(struct gsn_t *gsn, int version, - struct sockaddr_in *peer, int fd, - void *pack, unsigned len); -extern int gtp_echo_conf(struct gsn_t *gsn, int version, - struct sockaddr_in *peer, void *pack, unsigned len); - -extern int gtp_unsup_req(struct gsn_t *gsn, int version, - struct sockaddr_in *peer, - int fd, void *pack, unsigned len); -extern int gtp_unsup_ind(struct gsn_t *gsn, struct sockaddr_in *peer, - void *pack, unsigned len); - -extern int gtp_create_pdp_resp(struct gsn_t *gsn, int version, - struct pdp_t *pdp, uint8_t cause); - -extern int gtp_create_pdp_ind(struct gsn_t *gsn, int version, - struct sockaddr_in *peer, int fd, - void *pack, unsigned len); - -extern int gtp_create_pdp_conf(struct gsn_t *gsn, int version, - struct sockaddr_in *peer, - void *pack, unsigned len); - -extern int gtp_update_pdp_req(struct gsn_t *gsn, int version, void *cbp, - struct in_addr *inetaddr, struct pdp_t *pdp); -extern int gtp_delete_pdp_req(struct gsn_t *gsn, int version, void *cbp, - struct pdp_t *pdp); - -extern int gtp_delete_pdp_resp(struct gsn_t *gsn, int version, - struct sockaddr_in *peer, int fd, - void *pack, unsigned len, - struct pdp_t *pdp, struct pdp_t *linked_pdp, - uint8_t cause, int teardown); - -extern int gtp_delete_pdp_ind(struct gsn_t *gsn, int version, - struct sockaddr_in *peer, int fd, - void *pack, unsigned len); - -extern int gtp_delete_pdp_conf(struct gsn_t *gsn, int version, - struct sockaddr_in *peer, - void *pack, unsigned len); - -extern int ipv42eua(struct ul66_t *eua, struct in_addr *src); -extern int eua2ipv4(struct in_addr *dst, struct ul66_t *eua); extern int gsna2in_addr(struct in_addr *dst, struct ul16_t *gsna); -extern int in_addr2gsna(struct ul16_t *gsna, struct in_addr *src); + extern const char *imsi_gtp2str(const uint64_t *imsi); -extern uint64_t gtp_imsi_str2gtp(const char *str); #endif /* !_GTP_H */ diff --git a/gtp/gtpie.h b/include/osmocom/gtp/gtpie.h index b6fea6e..b6fea6e 100644 --- a/gtp/gtpie.h +++ b/include/osmocom/gtp/gtpie.h diff --git a/gtp/pdp.h b/include/osmocom/gtp/pdp.h index 4dcdde4..4dcdde4 100644 --- a/gtp/pdp.h +++ b/include/osmocom/gtp/pdp.h diff --git a/include/pdp.h b/include/pdp.h new file mode 100644 index 0000000..304dee5 --- /dev/null +++ b/include/pdp.h @@ -0,0 +1,2 @@ +#pragma once +#include <osmocom/gtp/pdp.h> diff --git a/lib/Makefile.am b/lib/Makefile.am index 5bd9443..c24b63f 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -1,10 +1,40 @@ noinst_LIBRARIES = libmisc.a -noinst_HEADERS = gnugetopt.h ippool.h lookup.h syserr.h tun.h in46_addr.h netdev.h gtp-kernel.h netns.h util.h icmpv6.h checksum.h +noinst_HEADERS = \ + checksum.h \ + gnugetopt.h \ + gtp-kernel.h \ + icmpv6.h \ + ippool.h \ + lookup.h \ + netdev.h \ + netns.h \ + syserr.h \ + tun.h \ + util.h \ + $(NULL) -AM_CFLAGS = -O2 -fno-builtin -Wall -DSBINDIR='"$(sbindir)"' -ggdb $(LIBOSMOCORE_CFLAGS) +AM_CFLAGS = \ + -fno-builtin \ + -Wall \ + -DSBINDIR='"$(sbindir)"' \ + -I$(top_srcdir)/include \ + $(LIBOSMOCORE_CFLAGS) \ + $(NULL) -libmisc_a_SOURCES = getopt1.c getopt.c ippool.c lookup.c tun.c debug.c in46_addr.c netdev.c netns.c util.c icmpv6.c checksum.c +libmisc_a_SOURCES = \ + checksum.c \ + debug.c \ + getopt.c \ + getopt1.c \ + icmpv6.c \ + ippool.c \ + lookup.c \ + netdev.c \ + netns.c \ + tun.c \ + util.c \ + $(NULL) if ENABLE_GTP_KERNEL AM_CFLAGS += -DGTP_KERNEL $(LIBGTPNL_CFLAGS) diff --git a/lib/gtp-kernel.c b/lib/gtp-kernel.c index f6df408..9f2ad65 100644 --- a/lib/gtp-kernel.c +++ b/lib/gtp-kernel.c @@ -18,22 +18,18 @@ #include <libgtpnl/gtp.h> #include <libgtpnl/gtpnl.h> -#include <libmnl/libmnl.h> #include <errno.h> #include <time.h> +#include <osmocom/gtp/pdp.h> +#include <osmocom/gtp/gtp.h> + #include "../lib/tun.h" #include "../lib/syserr.h" #include "../lib/util.h" #include "../lib/ippool.h" -#include "../gtp/pdp.h" -#include "../gtp/gtp.h" - -#include <libgtpnl/gtp.h> -#include <libgtpnl/gtpnl.h> -#include <libmnl/libmnl.h> #include "gtp-kernel.h" @@ -109,61 +105,93 @@ void gtp_kernel_stop(const char *devname) int gtp_kernel_tunnel_add(struct pdp_t *pdp, const char *devname) { - struct in_addr ms, sgsn; + int ms_addr_count; + struct in46_addr ms[2]; + struct in46_addr sgsn; struct gtp_tunnel *t; int ret; pdp_debug(__func__, devname, pdp); - t = gtp_tunnel_alloc(); - if (t == NULL) - return -1; - - memcpy(&ms, &pdp->eua.v[2], sizeof(struct in_addr)); - memcpy(&sgsn, &pdp->gsnrc.v[0], sizeof(struct in_addr)); - - gtp_tunnel_set_ifidx(t, if_nametoindex(devname)); - gtp_tunnel_set_version(t, pdp->version); - gtp_tunnel_set_ms_ip4(t, &ms); - gtp_tunnel_set_sgsn_ip4(t, &sgsn); - if (pdp->version == 0) { - gtp_tunnel_set_tid(t, pdp_gettid(pdp->imsi, pdp->nsapi)); - gtp_tunnel_set_flowid(t, pdp->flru); - } else { - gtp_tunnel_set_i_tei(t, pdp->teid_own); - /* use the TEI advertised by SGSN when sending packets - * towards the SGSN */ - gtp_tunnel_set_o_tei(t, pdp->teid_gn); + in46a_from_gsna(&pdp->gsnrc, &sgsn); + + ms_addr_count = in46a_from_eua(&pdp->eua, ms); + + for (int i = 0; i < ms_addr_count; i++) { + t = gtp_tunnel_alloc(); + if (t == NULL) + return -1; + + gtp_tunnel_set_ifidx(t, if_nametoindex(devname)); + gtp_tunnel_set_version(t, pdp->version); + + if (in46a_to_af(&ms[i]) == AF_INET) + gtp_tunnel_set_ms_ip4(t, &ms[i].v4); + else { + /* In IPv6, EUA doesn't contain the actual IP + * addr/prefix. Set higher bits to 0 to get the 64 bit + * netmask. */ + memset(((void *)&ms[i].v6) + 8, 0, 8); + gtp_tunnel_set_ms_ip6(t, &ms[i].v6); + } + + if (in46a_to_af(&sgsn) == AF_INET) + gtp_tunnel_set_sgsn_ip4(t, &sgsn.v4); + else + gtp_tunnel_set_sgsn_ip6(t, &sgsn.v6); + + if (pdp->version == 0) { + gtp_tunnel_set_tid(t, pdp_gettid(pdp->imsi, pdp->nsapi)); + gtp_tunnel_set_flowid(t, pdp->flru); + } else { + gtp_tunnel_set_i_tei(t, pdp->teid_own); + /* use the TEI advertised by SGSN when sending packets + * towards the SGSN */ + gtp_tunnel_set_o_tei(t, pdp->teid_gn); + } + + ret = gtp_add_tunnel(gtp_nl.genl_id, gtp_nl.nl, t); + gtp_tunnel_free(t); + + if (ret != 0) + break; } - ret = gtp_add_tunnel(gtp_nl.genl_id, gtp_nl.nl, t); - gtp_tunnel_free(t); - return ret; } int gtp_kernel_tunnel_del(struct pdp_t *pdp, const char *devname) { + int ms_addr_count; + struct in46_addr ms[2]; struct gtp_tunnel *t; int ret; pdp_debug(__func__, devname, pdp); - t = gtp_tunnel_alloc(); - if (t == NULL) - return -1; + ms_addr_count = in46a_from_eua(&pdp->eua, ms); - gtp_tunnel_set_ifidx(t, if_nametoindex(devname)); - gtp_tunnel_set_version(t, pdp->version); - if (pdp->version == 0) { - gtp_tunnel_set_tid(t, pdp_gettid(pdp->imsi, pdp->nsapi)); - gtp_tunnel_set_flowid(t, pdp->flru); - } else { - gtp_tunnel_set_i_tei(t, pdp->teid_own); - } + for (int i = 0; i < ms_addr_count; i++) { + t = gtp_tunnel_alloc(); + if (t == NULL) + return -1; - ret = gtp_del_tunnel(gtp_nl.genl_id, gtp_nl.nl, t); - gtp_tunnel_free(t); + gtp_tunnel_set_ifidx(t, if_nametoindex(devname)); + gtp_tunnel_set_family(t, in46a_to_af(&ms[i])); + gtp_tunnel_set_version(t, pdp->version); + if (pdp->version == 0) { + gtp_tunnel_set_tid(t, pdp_gettid(pdp->imsi, pdp->nsapi)); + gtp_tunnel_set_flowid(t, pdp->flru); + } else { + gtp_tunnel_set_i_tei(t, pdp->teid_own); + } + + ret = gtp_del_tunnel(gtp_nl.genl_id, gtp_nl.nl, t); + gtp_tunnel_free(t); + + if (ret != 0) + break; + } return ret; } diff --git a/lib/icmpv6.c b/lib/icmpv6.c index ac1474d..b6994cd 100644 --- a/lib/icmpv6.c +++ b/lib/icmpv6.c @@ -21,10 +21,11 @@ #include <osmocom/core/msgb.h> #include <osmocom/core/utils.h> -#include "checksum.h" -#include "../gtp/gtp.h" -#include "../gtp/pdp.h" +#include <osmocom/gtp/gtp.h> +#include <osmocom/gtp/pdp.h> + +#include "checksum.h" #include "ippool.h" #include "syserr.h" #include "icmpv6.h" diff --git a/lib/icmpv6.h b/lib/icmpv6.h index 4b4dc37..5bed5c6 100644 --- a/lib/icmpv6.h +++ b/lib/icmpv6.h @@ -5,8 +5,8 @@ #include <osmocom/core/msgb.h> #include <osmocom/core/endian.h> -#include "../gtp/gtp.h" -#include "../gtp/pdp.h" +#include <osmocom/gtp/gtp.h> +#include <osmocom/gtp/pdp.h> #define ICMPv6_OPT_TYPE_PREFIX_INFO 0x03 @@ -44,10 +44,9 @@ struct icmpv6_radv_hdr { uint8_t res:6, m:1, o:1; -#else - uint8_t m:1, - o:1, - res:6; +#elif OSMO_IS_BIG_ENDIAN +/* auto-generated from the little endian part above (libosmocore/contrib/struct_endianness.py) */ + uint8_t o:1, m:1, res:6; #endif uint16_t router_lifetime; uint32_t reachable_time; @@ -72,10 +71,9 @@ struct icmpv6_opt_prefix { uint8_t res:6, a:1, l:1; -#else - uint8_t l:1, - a:1, - res:6; +#elif OSMO_IS_BIG_ENDIAN +/* auto-generated from the little endian part above (libosmocore/contrib/struct_endianness.py) */ + uint8_t l:1, a:1, res:6; #endif uint32_t valid_lifetime; uint32_t preferred_lifetime; diff --git a/lib/in46_addr.c b/lib/in46_addr.c deleted file mode 100644 index 2562c71..0000000 --- a/lib/in46_addr.c +++ /dev/null @@ -1,377 +0,0 @@ -/* - * IPv4/v6 address functions. - * Copyright (C) 2017 by Harald Welte <laforge@gnumonks.org> - * - * The contents of this file may be used under the terms of the GNU - * General Public License Version 2, provided that the above copyright - * notice and this permission notice is included in all copies or - * substantial portions of the software. - * - */ - -#include "../lib/in46_addr.h" -#include "../gtp/pdp.h" - -#include <osmocom/core/utils.h> - -#include <sys/types.h> -#include <netinet/in.h> -#include <sys/socket.h> -#include <arpa/inet.h> -#include <netdb.h> -#include <stdlib.h> -#include <string.h> - -/*! Return the address family of given \reff in46_addr argument */ -int in46a_to_af(const struct in46_addr *in) -{ - switch (in->len) { - case 4: - return AF_INET; - case 8: - case 16: - return AF_INET6; - default: - OSMO_ASSERT(0); - return -1; - } -} - -/*! Convert \ref in46_addr to sockaddr_storage */ -int in46a_to_sas(struct sockaddr_storage *out, const struct in46_addr *in) -{ - struct sockaddr_in *sin = (struct sockaddr_in *)out; - struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)out; - - switch (in->len) { - case 4: - sin->sin_family = AF_INET; - sin->sin_addr = in->v4; - break; - case 16: - sin6->sin6_family = AF_INET6; - sin6->sin6_addr = in->v6; - break; - default: - OSMO_ASSERT(0); - return -1; - } - - return 0; -} - -/*! Convenience wrapper around inet_ntop() for in46_addr. - * \param[in] in the in46_addr to print - * \param[out] dst destination buffer where string representation of the address is stored - * \param[out] dst_size size dst. Usually it should be at least INET6_ADDRSTRLEN. - * \return address of dst on success, NULL on error */ -const char *in46a_ntop(const struct in46_addr *in, char *dst, socklen_t dst_size) -{ - int af; - - if (!in || in->len == 0) { - strncpy(dst, "UNDEFINED", dst_size); - return dst; - } - - af = in46a_to_af(in); - if (af < 0) - return NULL; - - return inet_ntop(af, (const void *) &in->v4, dst, dst_size); -} - -/* like inet_ntoa() */ -const char *in46a_ntoa(const struct in46_addr *in46) -{ - static char addrstr_buf[256]; - if (in46a_ntop(in46, addrstr_buf, sizeof(addrstr_buf)) < 0) - return "INVALID"; - else - return addrstr_buf; -} - -const char *in46p_ntoa(const struct in46_prefix *in46p) -{ - static char addrstr_buf[256]; - snprintf(addrstr_buf, sizeof(addrstr_buf), "%s/%u", in46a_ntoa(&in46p->addr), in46p->prefixlen); - return addrstr_buf; -} - -/*! Determine if two in46_addr are equal or not - * \returns 1 in case they are equal; 0 otherwise */ -int in46a_equal(const struct in46_addr *a, const struct in46_addr *b) -{ - if (a->len == b->len && !memcmp(&a->v6, &b->v6, a->len)) - return 1; - else - return 0; -} - -/*! Determine if two in46_addr prefix are equal or not - * The prefix length is determined by the shortest of the prefixes of a and b - * \returns 1 in case the common prefix are equal; 0 otherwise */ -int in46a_prefix_equal(const struct in46_addr *a, const struct in46_addr *b) -{ - unsigned int len; - if (a->len > b->len) - len = b->len; - else - len = a->len; - - if (!memcmp(&a->v6, &b->v6, len)) - return 1; - else - return 0; -} - -/*! Match if IPv6 addr1 + addr2 are within same \a mask */ -static int ipv6_within_mask(const struct in6_addr *addr1, const struct in6_addr *addr2, - const struct in6_addr *mask) -{ - struct in6_addr masked = *addr2; -#if defined(__linux__) - masked.s6_addr32[0] &= mask->s6_addr32[0]; - masked.s6_addr32[1] &= mask->s6_addr32[1]; - masked.s6_addr32[2] &= mask->s6_addr32[2]; - masked.s6_addr32[3] &= mask->s6_addr32[3]; -#else - masked.__u6_addr.__u6_addr32[0] &= mask->__u6_addr.__u6_addr32[0]; - masked.__u6_addr.__u6_addr32[1] &= mask->__u6_addr.__u6_addr32[1]; - masked.__u6_addr.__u6_addr32[2] &= mask->__u6_addr.__u6_addr32[2]; - masked.__u6_addr.__u6_addr32[3] &= mask->__u6_addr.__u6_addr32[3]; -#endif - if (!memcmp(addr1, &masked, sizeof(struct in6_addr))) - return 1; - else - return 0; -} - -/*! Create an IPv6 netmask from the given prefix length */ -static void create_ipv6_netmask(struct in6_addr *netmask, int prefixlen) -{ - uint32_t *p_netmask; - memset(netmask, 0, sizeof(struct in6_addr)); - if (prefixlen < 0) - prefixlen = 0; - else if (128 < prefixlen) - prefixlen = 128; - -#if defined(__linux__) - p_netmask = &netmask->s6_addr32[0]; -#else - p_netmask = &netmask->__u6_addr.__u6_addr32[0]; -#endif - while (32 < prefixlen) { - *p_netmask = 0xffffffff; - p_netmask++; - prefixlen -= 32; - } - if (prefixlen != 0) { - *p_netmask = htonl(0xFFFFFFFF << (32 - prefixlen)); - } -} - -/*! Determine if given \a addr is within given \a net + \a prefixlen - * Builds the netmask from \a net + \a prefixlen and matches it to \a addr - * \returns 1 in case of a match, 0 otherwise */ -int in46a_within_mask(const struct in46_addr *addr, const struct in46_addr *net, size_t prefixlen) -{ - struct in_addr netmask; - struct in6_addr netmask6; - - if (addr->len != net->len) - return 0; - - switch (addr->len) { - case 4: - netmask.s_addr = htonl(0xFFFFFFFF << (32 - prefixlen)); - if ((addr->v4.s_addr & netmask.s_addr) == net->v4.s_addr) - return 1; - else - return 0; - case 16: - create_ipv6_netmask(&netmask6, prefixlen); - return ipv6_within_mask(&addr->v6, &net->v6, &netmask6); - default: - OSMO_ASSERT(0); - return 0; - } -} - -static unsigned int ipv4_netmasklen(const struct in_addr *netmask) -{ - uint32_t bits = netmask->s_addr; - uint8_t *b = (uint8_t*) &bits; - unsigned int i, prefix = 0; - - for (i = 0; i < 4; i++) { - while (b[i] & 0x80) { - prefix++; - b[i] = b[i] << 1; - } - } - return prefix; -} - -static unsigned int ipv6_netmasklen(const struct in6_addr *netmask) -{ - #if defined(__linux__) - #define ADDRFIELD(i) s6_addr32[i] - #else - #define ADDRFIELD(i) __u6_addr.__u6_addr32[i] - #endif - - unsigned int i, j, prefix = 0; - - for (j = 0; j < 4; j++) { - uint32_t bits = netmask->ADDRFIELD(j); - uint8_t *b = (uint8_t*) &bits; - for (i = 0; i < 4; i++) { - while (b[i] & 0x80) { - prefix++; - b[i] = b[i] << 1; - } - } - } - - #undef ADDRFIELD - - return prefix; -} - -/*! Convert netmask to prefix length representation - * \param[in] netmask in46_addr containing a netmask (consecutive list of 1-bit followed by consecutive list of 0-bit) - * \returns prefix length representation of the netmask (count of 1-bit from the start of the netmask) - */ -unsigned int in46a_netmasklen(const struct in46_addr *netmask) -{ - switch (netmask->len) { - case 4: - return ipv4_netmasklen(&netmask->v4); - case 16: - return ipv6_netmasklen(&netmask->v6); - default: - OSMO_ASSERT(0); - return 0; - } -} - -/*! Convert given array of in46_addr to PDP End User Address - * \param[in] src Array containing 1 or 2 in46_addr - * \param[out] eua End User Address structure to fill - * \returns 0 on success; negative on error - * - * In case size is 2, this function expects to find exactly one IPv4 and one - * IPv6 addresses in src. */ -int in46a_to_eua(const struct in46_addr *src, unsigned int size, struct ul66_t *eua) -{ - const struct in46_addr *src_v4, *src_v6; - if (size == 1) { - switch (src->len) { - case 4: - eua->l = 6; - eua->v[0] = PDP_EUA_ORG_IETF; - eua->v[1] = PDP_EUA_TYPE_v4; - memcpy(&eua->v[2], &src->v4, 4); /* Copy a 4 byte address */ - break; - case 8: - case 16: - eua->l = 18; - eua->v[0] = PDP_EUA_ORG_IETF; - eua->v[1] = PDP_EUA_TYPE_v6; - memcpy(&eua->v[2], &src->v6, 16); /* Copy a 16 byte address */ - break; - default: - OSMO_ASSERT(0); - return -1; - } - return 0; - } - - if (src[0].len == src[1].len) - return -1; /* we should have a v4 and a v6 address */ - - src_v4 = (src[0].len == 4) ? &src[0] : &src[1]; - src_v6 = (src[0].len == 4) ? &src[1] : &src[0]; - - eua->l = 22; - eua->v[0] = PDP_EUA_ORG_IETF; - eua->v[1] = PDP_EUA_TYPE_v4v6; - memcpy(&eua->v[2], &src_v4->v4, 4); - memcpy(&eua->v[6], &src_v6->v6, 16); - - return 0; -} - -/*! Convert given PDP End User Address to an array of in46_addr - * \param[in] eua End User Address structure to parse - * \param[out] dst Array containing 2 in46_addr - * \returns number of parsed addresses (1 or 2) on success; negative on error - * - * This function expects to receive an End User Address struct together with an - * array of 2 zeroed in46_addr structs. The in46_addr structs are filled in - * order, hence if the function returns 1 the parsed address will be stored in - * the first struct and the second one will be left intact. If 2 is returned, it - * is guaranteed that one of them is an IPv4 and the other one is an IPv6, but - * the order in which they are presented is not specified and must be - * discovered for instance by checking the len field of each address. - */ -int in46a_from_eua(const struct ul66_t *eua, struct in46_addr *dst) -{ - if (eua->l < 2) - goto default_to_dyn_v4; - - if (eua->v[0] != 0xf1) - return -1; - - switch (eua->v[1]) { - case PDP_EUA_TYPE_v4: - dst->len = 4; - if (eua->l >= 6) - memcpy(&dst->v4, &eua->v[2], 4); /* Copy a 4 byte address */ - else - dst->v4.s_addr = 0; - return 1; - case PDP_EUA_TYPE_v6: - dst->len = 16; - if (eua->l >= 18) - memcpy(&dst->v6, &eua->v[2], 16); /* Copy a 16 byte address */ - else - memset(&dst->v6, 0, 16); - return 1; - case PDP_EUA_TYPE_v4v6: - /* 3GPP TS 29.060, section 7.7.27 */ - switch (eua->l) { - case 2: /* v4 & v6 dynamic */ - dst[0].v4.s_addr = 0; - memset(&dst[1].v6, 0, 16); - break; - case 6: /* v4 static, v6 dynamic */ - memcpy(&dst[0].v4, &eua->v[2], 4); - memset(&dst[1].v6, 0, 16); - break; - case 18: /* v4 dynamic, v6 static */ - dst[0].v4.s_addr = 0; - memcpy(&dst[1].v6, &eua->v[2], 16); - break; - case 22: /* v4 & v6 static */ - memcpy(&dst[0].v4, &eua->v[2], 4); - memcpy(&dst[1].v6, &eua->v[6], 16); - break; - default: - return -1; - } - dst[0].len = 4; - dst[1].len = 16; - return 2; - default: - return -1; - } - -default_to_dyn_v4: - /* assume dynamic IPv4 by default */ - dst->len = 4; - dst->v4.s_addr = 0; - return 1; -} diff --git a/lib/in46_addr.h b/lib/in46_addr.h deleted file mode 100644 index 153df00..0000000 --- a/lib/in46_addr.h +++ /dev/null @@ -1,41 +0,0 @@ -#pragma once -#include <stdint.h> -#include <netinet/in.h> - -#include "../gtp/pdp.h" - -/* a simple wrapper around an in6_addr to also contain the length of the address, - * thereby implicitly indicating the address family of the address */ -struct in46_addr { - uint8_t len; - union { - struct in_addr v4; - struct in6_addr v6; - }; -}; - -struct in46_prefix { - struct in46_addr addr; - uint8_t prefixlen; -}; - -extern int in46a_to_af(const struct in46_addr *in); -extern int in46a_to_sas(struct sockaddr_storage *out, const struct in46_addr *in); -extern const char *in46a_ntop(const struct in46_addr *in, char *dst, socklen_t dst_size); -extern const char *in46a_ntoa(const struct in46_addr *in46); -extern const char *in46p_ntoa(const struct in46_prefix *in46p); -extern int in46a_equal(const struct in46_addr *a, const struct in46_addr *b); -extern int in46a_prefix_equal(const struct in46_addr *a, const struct in46_addr *b); -extern int in46a_within_mask(const struct in46_addr *addr, const struct in46_addr *net, size_t prefixlen); -unsigned int in46a_netmasklen(const struct in46_addr *netmask); - -int in46a_to_eua(const struct in46_addr *src, unsigned int size, struct ul66_t *eua); -int in46a_from_eua(const struct ul66_t *eua, struct in46_addr *dst); - -static inline bool in46a_is_v6(const struct in46_addr *addr) { - return addr->len == 8 || addr->len == 16; -} - -static inline bool in46a_is_v4(const struct in46_addr *addr) { - return addr->len == sizeof(struct in_addr); -} diff --git a/lib/ippool.h b/lib/ippool.h index efb274b..8baf330 100644 --- a/lib/ippool.h +++ b/lib/ippool.h @@ -12,8 +12,8 @@ #ifndef _IPPOOL_H #define _IPPOOL_H -#include "../lib/in46_addr.h" -#include "../gtp/gtp.h" +#include <osmocom/core/in46_addr.h> +#include <osmocom/gtp/gtp.h> /* Assuming that the address space is fragmented we need a hash table in order to return the addresses. diff --git a/lib/netdev.h b/lib/netdev.h index 1bce814..196340e 100644 --- a/lib/netdev.h +++ b/lib/netdev.h @@ -13,7 +13,7 @@ #include <net/if.h> -#include "../lib/in46_addr.h" +#include <osmocom/core/in46_addr.h> #define TUN_NLBUFSIZE 1024 @@ -318,7 +318,14 @@ int tun_decaps(struct tun_t *this) int tun_encaps(struct tun_t *tun, void *pack, unsigned len) { - return write(tun->fd, pack, len); + int rc; + rc = write(tun->fd, pack, len); + if (rc < 0) { + SYS_ERR(DTUN, LOGL_ERROR, errno, "TUN(%s): write() failed", tun->devname); + } else if (rc < len) { + LOGTUN(LOGL_ERROR, tun, "short write() %d < %u\n", rc, len); + } + return rc; } int tun_runscript(struct tun_t *tun, char *script) @@ -16,7 +16,7 @@ #include <stdbool.h> #include <net/if.h> -#include "../lib/in46_addr.h" +#include <osmocom/core/in46_addr.h> #define PACKET_MAX 8196 /* Maximum packet size we receive */ #define TUN_SCRIPTSIZE 256 @@ -59,4 +59,7 @@ extern int tun_runscript(struct tun_t *tun, char *script); int tun_ip_local_get(const struct tun_t *tun, struct in46_prefix *prefix_list, size_t prefix_size, int flags); +#define LOGTUN(level, tun, fmt, args...) \ + LOGP(DTUN, level, "TUN(%s): " fmt, (tun)->devname, ## args) + #endif /* !_TUN_H */ @@ -9,10 +9,10 @@ * */ -#include "../gtp/pdp.h" +#include <osmocom/core/in46_addr.h> +#include <osmocom/gtp/pdp.h> #include "ippool.h" -#include "in46_addr.h" /*! Get the peer of pdp based on IP version used. * \param[in] pdp PDP context to select the peer from. diff --git a/sgsnemu/Makefile.am b/sgsnemu/Makefile.am index 9f10cd2..5d88c7f 100644 --- a/sgsnemu/Makefile.am +++ b/sgsnemu/Makefile.am @@ -2,12 +2,22 @@ bin_PROGRAMS = sgsnemu AM_LDFLAGS = @EXEC_LDFLAGS@ -AM_CFLAGS = -O2 -D_GNU_SOURCE -fno-builtin -Wall -DSBINDIR='"$(sbindir)"' -ggdb $(LIBOSMOCORE_CFLAGS) +AM_CFLAGS = \ + -D_GNU_SOURCE \ + -fno-builtin \ + -Wall \ + -DSBINDIR='"$(sbindir)"' \ + -I$(top_srcdir)/include \ + $(LIBOSMOCORE_CFLAGS) \ + $(NULL) sgsnemu_LDADD = @EXEC_LDADD@ -lgtp -L../gtp ../lib/libmisc.a $(LIBOSMOCORE_LIBS) if ENABLE_GTP_KERNEL -AM_CFLAGS += -DGTP_KERNEL $(LIBGTPNL_CFLAGS) +AM_CFLAGS += \ + -DGTP_KERNEL \ + $(LIBGTPNL_CFLAGS) \ + $(NULL) sgsnemu_LDADD += $(LIBGTPNL_LIBS) endif diff --git a/sgsnemu/sgsnemu.c b/sgsnemu/sgsnemu.c index 7893f4f..152b05b 100644 --- a/sgsnemu/sgsnemu.c +++ b/sgsnemu/sgsnemu.c @@ -54,13 +54,15 @@ #endif // HAVE_IN6_ADDR_GEN_MODE_NONE #endif +#include <osmocom/gtp/pdp.h> +#include <osmocom/gtp/gtp.h> + #include "../lib/tun.h" #include "../lib/ippool.h" #include "../lib/syserr.h" #include "../lib/netns.h" #include "../lib/icmpv6.h" -#include "../gtp/pdp.h" -#include "../gtp/gtp.h" +#include "../gtp/gtp_internal.h" #include "cmdline.h" #define IPADDRLEN 256 /* Character length of addresses */ diff --git a/tests/gtp/Makefile.am b/tests/gtp/Makefile.am index fa0fb0b..ad2ed82 100644 --- a/tests/gtp/Makefile.am +++ b/tests/gtp/Makefile.am @@ -1,11 +1,16 @@ -AM_CFLAGS = -Wall -I$(top_srcdir)/include $(LIBOSMOCORE_CFLAGS) -g +AM_CFLAGS = \ + -Wall \ + -I$(top_srcdir)/include \ + $(LIBOSMOCORE_CFLAGS) \ + $(NULL) +AM_LDFLAGS = -no-install EXTRA_DIST = \ gtpie_test.ok \ queue_test.ok \ $(NULL) -noinst_PROGRAMS = \ +check_PROGRAMS = \ gtpie_test \ queue_test \ $(NULL) diff --git a/tests/gtp/gtpie_test.c b/tests/gtp/gtpie_test.c index ed1f26e..46c0a98 100644 --- a/tests/gtp/gtpie_test.c +++ b/tests/gtp/gtpie_test.c @@ -10,8 +10,9 @@ #include <osmocom/core/msgb.h> #include <osmocom/core/bits.h> +#include <osmocom/gtp/gtpie.h> + #include "../../lib/syserr.h" -#include "../../gtp/gtpie.h" static const uint8_t in[] = { 1,2,3,4,5,6 }; static uint8_t buf[256]; diff --git a/tests/gtp/queue_test.ok b/tests/gtp/queue_test.ok index fe1118d..ea61374 100644 --- a/tests/gtp/queue_test.ok +++ b/tests/gtp/queue_test.ok @@ -32,7 +32,7 @@ === [Queue created] Next: 0 First: -1 Last: -1 # seq next prev timeout retrans type cbp ====================================================== -=== [Queue after-fill] Next: 1023 First: 0 Last: 1022 +=== [Queue after-fill] Next: 2047 First: 0 Last: 2046 # seq next prev timeout retrans type cbp 0 0 1 -1 0 0 16 0 1 1 2 0 0 0 16 1 @@ -1056,11 +1056,1035 @@ 1019 1019 1020 1018 0 0 16 1019 1020 1020 1021 1019 0 0 16 1020 1021 1021 1022 1020 0 0 16 1021 -1022 1022 -1 1021 0 0 16 1022 +1022 1022 1023 1021 0 0 16 1022 +1023 1023 1024 1022 0 0 16 1023 +1024 1024 1025 1023 0 0 16 1024 +1025 1025 1026 1024 0 0 16 1025 +1026 1026 1027 1025 0 0 16 1026 +1027 1027 1028 1026 0 0 16 1027 +1028 1028 1029 1027 0 0 16 1028 +1029 1029 1030 1028 0 0 16 1029 +1030 1030 1031 1029 0 0 16 1030 +1031 1031 1032 1030 0 0 16 1031 +1032 1032 1033 1031 0 0 16 1032 +1033 1033 1034 1032 0 0 16 1033 +1034 1034 1035 1033 0 0 16 1034 +1035 1035 1036 1034 0 0 16 1035 +1036 1036 1037 1035 0 0 16 1036 +1037 1037 1038 1036 0 0 16 1037 +1038 1038 1039 1037 0 0 16 1038 +1039 1039 1040 1038 0 0 16 1039 +1040 1040 1041 1039 0 0 16 1040 +1041 1041 1042 1040 0 0 16 1041 +1042 1042 1043 1041 0 0 16 1042 +1043 1043 1044 1042 0 0 16 1043 +1044 1044 1045 1043 0 0 16 1044 +1045 1045 1046 1044 0 0 16 1045 +1046 1046 1047 1045 0 0 16 1046 +1047 1047 1048 1046 0 0 16 1047 +1048 1048 1049 1047 0 0 16 1048 +1049 1049 1050 1048 0 0 16 1049 +1050 1050 1051 1049 0 0 16 1050 +1051 1051 1052 1050 0 0 16 1051 +1052 1052 1053 1051 0 0 16 1052 +1053 1053 1054 1052 0 0 16 1053 +1054 1054 1055 1053 0 0 16 1054 +1055 1055 1056 1054 0 0 16 1055 +1056 1056 1057 1055 0 0 16 1056 +1057 1057 1058 1056 0 0 16 1057 +1058 1058 1059 1057 0 0 16 1058 +1059 1059 1060 1058 0 0 16 1059 +1060 1060 1061 1059 0 0 16 1060 +1061 1061 1062 1060 0 0 16 1061 +1062 1062 1063 1061 0 0 16 1062 +1063 1063 1064 1062 0 0 16 1063 +1064 1064 1065 1063 0 0 16 1064 +1065 1065 1066 1064 0 0 16 1065 +1066 1066 1067 1065 0 0 16 1066 +1067 1067 1068 1066 0 0 16 1067 +1068 1068 1069 1067 0 0 16 1068 +1069 1069 1070 1068 0 0 16 1069 +1070 1070 1071 1069 0 0 16 1070 +1071 1071 1072 1070 0 0 16 1071 +1072 1072 1073 1071 0 0 16 1072 +1073 1073 1074 1072 0 0 16 1073 +1074 1074 1075 1073 0 0 16 1074 +1075 1075 1076 1074 0 0 16 1075 +1076 1076 1077 1075 0 0 16 1076 +1077 1077 1078 1076 0 0 16 1077 +1078 1078 1079 1077 0 0 16 1078 +1079 1079 1080 1078 0 0 16 1079 +1080 1080 1081 1079 0 0 16 1080 +1081 1081 1082 1080 0 0 16 1081 +1082 1082 1083 1081 0 0 16 1082 +1083 1083 1084 1082 0 0 16 1083 +1084 1084 1085 1083 0 0 16 1084 +1085 1085 1086 1084 0 0 16 1085 +1086 1086 1087 1085 0 0 16 1086 +1087 1087 1088 1086 0 0 16 1087 +1088 1088 1089 1087 0 0 16 1088 +1089 1089 1090 1088 0 0 16 1089 +1090 1090 1091 1089 0 0 16 1090 +1091 1091 1092 1090 0 0 16 1091 +1092 1092 1093 1091 0 0 16 1092 +1093 1093 1094 1092 0 0 16 1093 +1094 1094 1095 1093 0 0 16 1094 +1095 1095 1096 1094 0 0 16 1095 +1096 1096 1097 1095 0 0 16 1096 +1097 1097 1098 1096 0 0 16 1097 +1098 1098 1099 1097 0 0 16 1098 +1099 1099 1100 1098 0 0 16 1099 +1100 1100 1101 1099 0 0 16 1100 +1101 1101 1102 1100 0 0 16 1101 +1102 1102 1103 1101 0 0 16 1102 +1103 1103 1104 1102 0 0 16 1103 +1104 1104 1105 1103 0 0 16 1104 +1105 1105 1106 1104 0 0 16 1105 +1106 1106 1107 1105 0 0 16 1106 +1107 1107 1108 1106 0 0 16 1107 +1108 1108 1109 1107 0 0 16 1108 +1109 1109 1110 1108 0 0 16 1109 +1110 1110 1111 1109 0 0 16 1110 +1111 1111 1112 1110 0 0 16 1111 +1112 1112 1113 1111 0 0 16 1112 +1113 1113 1114 1112 0 0 16 1113 +1114 1114 1115 1113 0 0 16 1114 +1115 1115 1116 1114 0 0 16 1115 +1116 1116 1117 1115 0 0 16 1116 +1117 1117 1118 1116 0 0 16 1117 +1118 1118 1119 1117 0 0 16 1118 +1119 1119 1120 1118 0 0 16 1119 +1120 1120 1121 1119 0 0 16 1120 +1121 1121 1122 1120 0 0 16 1121 +1122 1122 1123 1121 0 0 16 1122 +1123 1123 1124 1122 0 0 16 1123 +1124 1124 1125 1123 0 0 16 1124 +1125 1125 1126 1124 0 0 16 1125 +1126 1126 1127 1125 0 0 16 1126 +1127 1127 1128 1126 0 0 16 1127 +1128 1128 1129 1127 0 0 16 1128 +1129 1129 1130 1128 0 0 16 1129 +1130 1130 1131 1129 0 0 16 1130 +1131 1131 1132 1130 0 0 16 1131 +1132 1132 1133 1131 0 0 16 1132 +1133 1133 1134 1132 0 0 16 1133 +1134 1134 1135 1133 0 0 16 1134 +1135 1135 1136 1134 0 0 16 1135 +1136 1136 1137 1135 0 0 16 1136 +1137 1137 1138 1136 0 0 16 1137 +1138 1138 1139 1137 0 0 16 1138 +1139 1139 1140 1138 0 0 16 1139 +1140 1140 1141 1139 0 0 16 1140 +1141 1141 1142 1140 0 0 16 1141 +1142 1142 1143 1141 0 0 16 1142 +1143 1143 1144 1142 0 0 16 1143 +1144 1144 1145 1143 0 0 16 1144 +1145 1145 1146 1144 0 0 16 1145 +1146 1146 1147 1145 0 0 16 1146 +1147 1147 1148 1146 0 0 16 1147 +1148 1148 1149 1147 0 0 16 1148 +1149 1149 1150 1148 0 0 16 1149 +1150 1150 1151 1149 0 0 16 1150 +1151 1151 1152 1150 0 0 16 1151 +1152 1152 1153 1151 0 0 16 1152 +1153 1153 1154 1152 0 0 16 1153 +1154 1154 1155 1153 0 0 16 1154 +1155 1155 1156 1154 0 0 16 1155 +1156 1156 1157 1155 0 0 16 1156 +1157 1157 1158 1156 0 0 16 1157 +1158 1158 1159 1157 0 0 16 1158 +1159 1159 1160 1158 0 0 16 1159 +1160 1160 1161 1159 0 0 16 1160 +1161 1161 1162 1160 0 0 16 1161 +1162 1162 1163 1161 0 0 16 1162 +1163 1163 1164 1162 0 0 16 1163 +1164 1164 1165 1163 0 0 16 1164 +1165 1165 1166 1164 0 0 16 1165 +1166 1166 1167 1165 0 0 16 1166 +1167 1167 1168 1166 0 0 16 1167 +1168 1168 1169 1167 0 0 16 1168 +1169 1169 1170 1168 0 0 16 1169 +1170 1170 1171 1169 0 0 16 1170 +1171 1171 1172 1170 0 0 16 1171 +1172 1172 1173 1171 0 0 16 1172 +1173 1173 1174 1172 0 0 16 1173 +1174 1174 1175 1173 0 0 16 1174 +1175 1175 1176 1174 0 0 16 1175 +1176 1176 1177 1175 0 0 16 1176 +1177 1177 1178 1176 0 0 16 1177 +1178 1178 1179 1177 0 0 16 1178 +1179 1179 1180 1178 0 0 16 1179 +1180 1180 1181 1179 0 0 16 1180 +1181 1181 1182 1180 0 0 16 1181 +1182 1182 1183 1181 0 0 16 1182 +1183 1183 1184 1182 0 0 16 1183 +1184 1184 1185 1183 0 0 16 1184 +1185 1185 1186 1184 0 0 16 1185 +1186 1186 1187 1185 0 0 16 1186 +1187 1187 1188 1186 0 0 16 1187 +1188 1188 1189 1187 0 0 16 1188 +1189 1189 1190 1188 0 0 16 1189 +1190 1190 1191 1189 0 0 16 1190 +1191 1191 1192 1190 0 0 16 1191 +1192 1192 1193 1191 0 0 16 1192 +1193 1193 1194 1192 0 0 16 1193 +1194 1194 1195 1193 0 0 16 1194 +1195 1195 1196 1194 0 0 16 1195 +1196 1196 1197 1195 0 0 16 1196 +1197 1197 1198 1196 0 0 16 1197 +1198 1198 1199 1197 0 0 16 1198 +1199 1199 1200 1198 0 0 16 1199 +1200 1200 1201 1199 0 0 16 1200 +1201 1201 1202 1200 0 0 16 1201 +1202 1202 1203 1201 0 0 16 1202 +1203 1203 1204 1202 0 0 16 1203 +1204 1204 1205 1203 0 0 16 1204 +1205 1205 1206 1204 0 0 16 1205 +1206 1206 1207 1205 0 0 16 1206 +1207 1207 1208 1206 0 0 16 1207 +1208 1208 1209 1207 0 0 16 1208 +1209 1209 1210 1208 0 0 16 1209 +1210 1210 1211 1209 0 0 16 1210 +1211 1211 1212 1210 0 0 16 1211 +1212 1212 1213 1211 0 0 16 1212 +1213 1213 1214 1212 0 0 16 1213 +1214 1214 1215 1213 0 0 16 1214 +1215 1215 1216 1214 0 0 16 1215 +1216 1216 1217 1215 0 0 16 1216 +1217 1217 1218 1216 0 0 16 1217 +1218 1218 1219 1217 0 0 16 1218 +1219 1219 1220 1218 0 0 16 1219 +1220 1220 1221 1219 0 0 16 1220 +1221 1221 1222 1220 0 0 16 1221 +1222 1222 1223 1221 0 0 16 1222 +1223 1223 1224 1222 0 0 16 1223 +1224 1224 1225 1223 0 0 16 1224 +1225 1225 1226 1224 0 0 16 1225 +1226 1226 1227 1225 0 0 16 1226 +1227 1227 1228 1226 0 0 16 1227 +1228 1228 1229 1227 0 0 16 1228 +1229 1229 1230 1228 0 0 16 1229 +1230 1230 1231 1229 0 0 16 1230 +1231 1231 1232 1230 0 0 16 1231 +1232 1232 1233 1231 0 0 16 1232 +1233 1233 1234 1232 0 0 16 1233 +1234 1234 1235 1233 0 0 16 1234 +1235 1235 1236 1234 0 0 16 1235 +1236 1236 1237 1235 0 0 16 1236 +1237 1237 1238 1236 0 0 16 1237 +1238 1238 1239 1237 0 0 16 1238 +1239 1239 1240 1238 0 0 16 1239 +1240 1240 1241 1239 0 0 16 1240 +1241 1241 1242 1240 0 0 16 1241 +1242 1242 1243 1241 0 0 16 1242 +1243 1243 1244 1242 0 0 16 1243 +1244 1244 1245 1243 0 0 16 1244 +1245 1245 1246 1244 0 0 16 1245 +1246 1246 1247 1245 0 0 16 1246 +1247 1247 1248 1246 0 0 16 1247 +1248 1248 1249 1247 0 0 16 1248 +1249 1249 1250 1248 0 0 16 1249 +1250 1250 1251 1249 0 0 16 1250 +1251 1251 1252 1250 0 0 16 1251 +1252 1252 1253 1251 0 0 16 1252 +1253 1253 1254 1252 0 0 16 1253 +1254 1254 1255 1253 0 0 16 1254 +1255 1255 1256 1254 0 0 16 1255 +1256 1256 1257 1255 0 0 16 1256 +1257 1257 1258 1256 0 0 16 1257 +1258 1258 1259 1257 0 0 16 1258 +1259 1259 1260 1258 0 0 16 1259 +1260 1260 1261 1259 0 0 16 1260 +1261 1261 1262 1260 0 0 16 1261 +1262 1262 1263 1261 0 0 16 1262 +1263 1263 1264 1262 0 0 16 1263 +1264 1264 1265 1263 0 0 16 1264 +1265 1265 1266 1264 0 0 16 1265 +1266 1266 1267 1265 0 0 16 1266 +1267 1267 1268 1266 0 0 16 1267 +1268 1268 1269 1267 0 0 16 1268 +1269 1269 1270 1268 0 0 16 1269 +1270 1270 1271 1269 0 0 16 1270 +1271 1271 1272 1270 0 0 16 1271 +1272 1272 1273 1271 0 0 16 1272 +1273 1273 1274 1272 0 0 16 1273 +1274 1274 1275 1273 0 0 16 1274 +1275 1275 1276 1274 0 0 16 1275 +1276 1276 1277 1275 0 0 16 1276 +1277 1277 1278 1276 0 0 16 1277 +1278 1278 1279 1277 0 0 16 1278 +1279 1279 1280 1278 0 0 16 1279 +1280 1280 1281 1279 0 0 16 1280 +1281 1281 1282 1280 0 0 16 1281 +1282 1282 1283 1281 0 0 16 1282 +1283 1283 1284 1282 0 0 16 1283 +1284 1284 1285 1283 0 0 16 1284 +1285 1285 1286 1284 0 0 16 1285 +1286 1286 1287 1285 0 0 16 1286 +1287 1287 1288 1286 0 0 16 1287 +1288 1288 1289 1287 0 0 16 1288 +1289 1289 1290 1288 0 0 16 1289 +1290 1290 1291 1289 0 0 16 1290 +1291 1291 1292 1290 0 0 16 1291 +1292 1292 1293 1291 0 0 16 1292 +1293 1293 1294 1292 0 0 16 1293 +1294 1294 1295 1293 0 0 16 1294 +1295 1295 1296 1294 0 0 16 1295 +1296 1296 1297 1295 0 0 16 1296 +1297 1297 1298 1296 0 0 16 1297 +1298 1298 1299 1297 0 0 16 1298 +1299 1299 1300 1298 0 0 16 1299 +1300 1300 1301 1299 0 0 16 1300 +1301 1301 1302 1300 0 0 16 1301 +1302 1302 1303 1301 0 0 16 1302 +1303 1303 1304 1302 0 0 16 1303 +1304 1304 1305 1303 0 0 16 1304 +1305 1305 1306 1304 0 0 16 1305 +1306 1306 1307 1305 0 0 16 1306 +1307 1307 1308 1306 0 0 16 1307 +1308 1308 1309 1307 0 0 16 1308 +1309 1309 1310 1308 0 0 16 1309 +1310 1310 1311 1309 0 0 16 1310 +1311 1311 1312 1310 0 0 16 1311 +1312 1312 1313 1311 0 0 16 1312 +1313 1313 1314 1312 0 0 16 1313 +1314 1314 1315 1313 0 0 16 1314 +1315 1315 1316 1314 0 0 16 1315 +1316 1316 1317 1315 0 0 16 1316 +1317 1317 1318 1316 0 0 16 1317 +1318 1318 1319 1317 0 0 16 1318 +1319 1319 1320 1318 0 0 16 1319 +1320 1320 1321 1319 0 0 16 1320 +1321 1321 1322 1320 0 0 16 1321 +1322 1322 1323 1321 0 0 16 1322 +1323 1323 1324 1322 0 0 16 1323 +1324 1324 1325 1323 0 0 16 1324 +1325 1325 1326 1324 0 0 16 1325 +1326 1326 1327 1325 0 0 16 1326 +1327 1327 1328 1326 0 0 16 1327 +1328 1328 1329 1327 0 0 16 1328 +1329 1329 1330 1328 0 0 16 1329 +1330 1330 1331 1329 0 0 16 1330 +1331 1331 1332 1330 0 0 16 1331 +1332 1332 1333 1331 0 0 16 1332 +1333 1333 1334 1332 0 0 16 1333 +1334 1334 1335 1333 0 0 16 1334 +1335 1335 1336 1334 0 0 16 1335 +1336 1336 1337 1335 0 0 16 1336 +1337 1337 1338 1336 0 0 16 1337 +1338 1338 1339 1337 0 0 16 1338 +1339 1339 1340 1338 0 0 16 1339 +1340 1340 1341 1339 0 0 16 1340 +1341 1341 1342 1340 0 0 16 1341 +1342 1342 1343 1341 0 0 16 1342 +1343 1343 1344 1342 0 0 16 1343 +1344 1344 1345 1343 0 0 16 1344 +1345 1345 1346 1344 0 0 16 1345 +1346 1346 1347 1345 0 0 16 1346 +1347 1347 1348 1346 0 0 16 1347 +1348 1348 1349 1347 0 0 16 1348 +1349 1349 1350 1348 0 0 16 1349 +1350 1350 1351 1349 0 0 16 1350 +1351 1351 1352 1350 0 0 16 1351 +1352 1352 1353 1351 0 0 16 1352 +1353 1353 1354 1352 0 0 16 1353 +1354 1354 1355 1353 0 0 16 1354 +1355 1355 1356 1354 0 0 16 1355 +1356 1356 1357 1355 0 0 16 1356 +1357 1357 1358 1356 0 0 16 1357 +1358 1358 1359 1357 0 0 16 1358 +1359 1359 1360 1358 0 0 16 1359 +1360 1360 1361 1359 0 0 16 1360 +1361 1361 1362 1360 0 0 16 1361 +1362 1362 1363 1361 0 0 16 1362 +1363 1363 1364 1362 0 0 16 1363 +1364 1364 1365 1363 0 0 16 1364 +1365 1365 1366 1364 0 0 16 1365 +1366 1366 1367 1365 0 0 16 1366 +1367 1367 1368 1366 0 0 16 1367 +1368 1368 1369 1367 0 0 16 1368 +1369 1369 1370 1368 0 0 16 1369 +1370 1370 1371 1369 0 0 16 1370 +1371 1371 1372 1370 0 0 16 1371 +1372 1372 1373 1371 0 0 16 1372 +1373 1373 1374 1372 0 0 16 1373 +1374 1374 1375 1373 0 0 16 1374 +1375 1375 1376 1374 0 0 16 1375 +1376 1376 1377 1375 0 0 16 1376 +1377 1377 1378 1376 0 0 16 1377 +1378 1378 1379 1377 0 0 16 1378 +1379 1379 1380 1378 0 0 16 1379 +1380 1380 1381 1379 0 0 16 1380 +1381 1381 1382 1380 0 0 16 1381 +1382 1382 1383 1381 0 0 16 1382 +1383 1383 1384 1382 0 0 16 1383 +1384 1384 1385 1383 0 0 16 1384 +1385 1385 1386 1384 0 0 16 1385 +1386 1386 1387 1385 0 0 16 1386 +1387 1387 1388 1386 0 0 16 1387 +1388 1388 1389 1387 0 0 16 1388 +1389 1389 1390 1388 0 0 16 1389 +1390 1390 1391 1389 0 0 16 1390 +1391 1391 1392 1390 0 0 16 1391 +1392 1392 1393 1391 0 0 16 1392 +1393 1393 1394 1392 0 0 16 1393 +1394 1394 1395 1393 0 0 16 1394 +1395 1395 1396 1394 0 0 16 1395 +1396 1396 1397 1395 0 0 16 1396 +1397 1397 1398 1396 0 0 16 1397 +1398 1398 1399 1397 0 0 16 1398 +1399 1399 1400 1398 0 0 16 1399 +1400 1400 1401 1399 0 0 16 1400 +1401 1401 1402 1400 0 0 16 1401 +1402 1402 1403 1401 0 0 16 1402 +1403 1403 1404 1402 0 0 16 1403 +1404 1404 1405 1403 0 0 16 1404 +1405 1405 1406 1404 0 0 16 1405 +1406 1406 1407 1405 0 0 16 1406 +1407 1407 1408 1406 0 0 16 1407 +1408 1408 1409 1407 0 0 16 1408 +1409 1409 1410 1408 0 0 16 1409 +1410 1410 1411 1409 0 0 16 1410 +1411 1411 1412 1410 0 0 16 1411 +1412 1412 1413 1411 0 0 16 1412 +1413 1413 1414 1412 0 0 16 1413 +1414 1414 1415 1413 0 0 16 1414 +1415 1415 1416 1414 0 0 16 1415 +1416 1416 1417 1415 0 0 16 1416 +1417 1417 1418 1416 0 0 16 1417 +1418 1418 1419 1417 0 0 16 1418 +1419 1419 1420 1418 0 0 16 1419 +1420 1420 1421 1419 0 0 16 1420 +1421 1421 1422 1420 0 0 16 1421 +1422 1422 1423 1421 0 0 16 1422 +1423 1423 1424 1422 0 0 16 1423 +1424 1424 1425 1423 0 0 16 1424 +1425 1425 1426 1424 0 0 16 1425 +1426 1426 1427 1425 0 0 16 1426 +1427 1427 1428 1426 0 0 16 1427 +1428 1428 1429 1427 0 0 16 1428 +1429 1429 1430 1428 0 0 16 1429 +1430 1430 1431 1429 0 0 16 1430 +1431 1431 1432 1430 0 0 16 1431 +1432 1432 1433 1431 0 0 16 1432 +1433 1433 1434 1432 0 0 16 1433 +1434 1434 1435 1433 0 0 16 1434 +1435 1435 1436 1434 0 0 16 1435 +1436 1436 1437 1435 0 0 16 1436 +1437 1437 1438 1436 0 0 16 1437 +1438 1438 1439 1437 0 0 16 1438 +1439 1439 1440 1438 0 0 16 1439 +1440 1440 1441 1439 0 0 16 1440 +1441 1441 1442 1440 0 0 16 1441 +1442 1442 1443 1441 0 0 16 1442 +1443 1443 1444 1442 0 0 16 1443 +1444 1444 1445 1443 0 0 16 1444 +1445 1445 1446 1444 0 0 16 1445 +1446 1446 1447 1445 0 0 16 1446 +1447 1447 1448 1446 0 0 16 1447 +1448 1448 1449 1447 0 0 16 1448 +1449 1449 1450 1448 0 0 16 1449 +1450 1450 1451 1449 0 0 16 1450 +1451 1451 1452 1450 0 0 16 1451 +1452 1452 1453 1451 0 0 16 1452 +1453 1453 1454 1452 0 0 16 1453 +1454 1454 1455 1453 0 0 16 1454 +1455 1455 1456 1454 0 0 16 1455 +1456 1456 1457 1455 0 0 16 1456 +1457 1457 1458 1456 0 0 16 1457 +1458 1458 1459 1457 0 0 16 1458 +1459 1459 1460 1458 0 0 16 1459 +1460 1460 1461 1459 0 0 16 1460 +1461 1461 1462 1460 0 0 16 1461 +1462 1462 1463 1461 0 0 16 1462 +1463 1463 1464 1462 0 0 16 1463 +1464 1464 1465 1463 0 0 16 1464 +1465 1465 1466 1464 0 0 16 1465 +1466 1466 1467 1465 0 0 16 1466 +1467 1467 1468 1466 0 0 16 1467 +1468 1468 1469 1467 0 0 16 1468 +1469 1469 1470 1468 0 0 16 1469 +1470 1470 1471 1469 0 0 16 1470 +1471 1471 1472 1470 0 0 16 1471 +1472 1472 1473 1471 0 0 16 1472 +1473 1473 1474 1472 0 0 16 1473 +1474 1474 1475 1473 0 0 16 1474 +1475 1475 1476 1474 0 0 16 1475 +1476 1476 1477 1475 0 0 16 1476 +1477 1477 1478 1476 0 0 16 1477 +1478 1478 1479 1477 0 0 16 1478 +1479 1479 1480 1478 0 0 16 1479 +1480 1480 1481 1479 0 0 16 1480 +1481 1481 1482 1480 0 0 16 1481 +1482 1482 1483 1481 0 0 16 1482 +1483 1483 1484 1482 0 0 16 1483 +1484 1484 1485 1483 0 0 16 1484 +1485 1485 1486 1484 0 0 16 1485 +1486 1486 1487 1485 0 0 16 1486 +1487 1487 1488 1486 0 0 16 1487 +1488 1488 1489 1487 0 0 16 1488 +1489 1489 1490 1488 0 0 16 1489 +1490 1490 1491 1489 0 0 16 1490 +1491 1491 1492 1490 0 0 16 1491 +1492 1492 1493 1491 0 0 16 1492 +1493 1493 1494 1492 0 0 16 1493 +1494 1494 1495 1493 0 0 16 1494 +1495 1495 1496 1494 0 0 16 1495 +1496 1496 1497 1495 0 0 16 1496 +1497 1497 1498 1496 0 0 16 1497 +1498 1498 1499 1497 0 0 16 1498 +1499 1499 1500 1498 0 0 16 1499 +1500 1500 1501 1499 0 0 16 1500 +1501 1501 1502 1500 0 0 16 1501 +1502 1502 1503 1501 0 0 16 1502 +1503 1503 1504 1502 0 0 16 1503 +1504 1504 1505 1503 0 0 16 1504 +1505 1505 1506 1504 0 0 16 1505 +1506 1506 1507 1505 0 0 16 1506 +1507 1507 1508 1506 0 0 16 1507 +1508 1508 1509 1507 0 0 16 1508 +1509 1509 1510 1508 0 0 16 1509 +1510 1510 1511 1509 0 0 16 1510 +1511 1511 1512 1510 0 0 16 1511 +1512 1512 1513 1511 0 0 16 1512 +1513 1513 1514 1512 0 0 16 1513 +1514 1514 1515 1513 0 0 16 1514 +1515 1515 1516 1514 0 0 16 1515 +1516 1516 1517 1515 0 0 16 1516 +1517 1517 1518 1516 0 0 16 1517 +1518 1518 1519 1517 0 0 16 1518 +1519 1519 1520 1518 0 0 16 1519 +1520 1520 1521 1519 0 0 16 1520 +1521 1521 1522 1520 0 0 16 1521 +1522 1522 1523 1521 0 0 16 1522 +1523 1523 1524 1522 0 0 16 1523 +1524 1524 1525 1523 0 0 16 1524 +1525 1525 1526 1524 0 0 16 1525 +1526 1526 1527 1525 0 0 16 1526 +1527 1527 1528 1526 0 0 16 1527 +1528 1528 1529 1527 0 0 16 1528 +1529 1529 1530 1528 0 0 16 1529 +1530 1530 1531 1529 0 0 16 1530 +1531 1531 1532 1530 0 0 16 1531 +1532 1532 1533 1531 0 0 16 1532 +1533 1533 1534 1532 0 0 16 1533 +1534 1534 1535 1533 0 0 16 1534 +1535 1535 1536 1534 0 0 16 1535 +1536 1536 1537 1535 0 0 16 1536 +1537 1537 1538 1536 0 0 16 1537 +1538 1538 1539 1537 0 0 16 1538 +1539 1539 1540 1538 0 0 16 1539 +1540 1540 1541 1539 0 0 16 1540 +1541 1541 1542 1540 0 0 16 1541 +1542 1542 1543 1541 0 0 16 1542 +1543 1543 1544 1542 0 0 16 1543 +1544 1544 1545 1543 0 0 16 1544 +1545 1545 1546 1544 0 0 16 1545 +1546 1546 1547 1545 0 0 16 1546 +1547 1547 1548 1546 0 0 16 1547 +1548 1548 1549 1547 0 0 16 1548 +1549 1549 1550 1548 0 0 16 1549 +1550 1550 1551 1549 0 0 16 1550 +1551 1551 1552 1550 0 0 16 1551 +1552 1552 1553 1551 0 0 16 1552 +1553 1553 1554 1552 0 0 16 1553 +1554 1554 1555 1553 0 0 16 1554 +1555 1555 1556 1554 0 0 16 1555 +1556 1556 1557 1555 0 0 16 1556 +1557 1557 1558 1556 0 0 16 1557 +1558 1558 1559 1557 0 0 16 1558 +1559 1559 1560 1558 0 0 16 1559 +1560 1560 1561 1559 0 0 16 1560 +1561 1561 1562 1560 0 0 16 1561 +1562 1562 1563 1561 0 0 16 1562 +1563 1563 1564 1562 0 0 16 1563 +1564 1564 1565 1563 0 0 16 1564 +1565 1565 1566 1564 0 0 16 1565 +1566 1566 1567 1565 0 0 16 1566 +1567 1567 1568 1566 0 0 16 1567 +1568 1568 1569 1567 0 0 16 1568 +1569 1569 1570 1568 0 0 16 1569 +1570 1570 1571 1569 0 0 16 1570 +1571 1571 1572 1570 0 0 16 1571 +1572 1572 1573 1571 0 0 16 1572 +1573 1573 1574 1572 0 0 16 1573 +1574 1574 1575 1573 0 0 16 1574 +1575 1575 1576 1574 0 0 16 1575 +1576 1576 1577 1575 0 0 16 1576 +1577 1577 1578 1576 0 0 16 1577 +1578 1578 1579 1577 0 0 16 1578 +1579 1579 1580 1578 0 0 16 1579 +1580 1580 1581 1579 0 0 16 1580 +1581 1581 1582 1580 0 0 16 1581 +1582 1582 1583 1581 0 0 16 1582 +1583 1583 1584 1582 0 0 16 1583 +1584 1584 1585 1583 0 0 16 1584 +1585 1585 1586 1584 0 0 16 1585 +1586 1586 1587 1585 0 0 16 1586 +1587 1587 1588 1586 0 0 16 1587 +1588 1588 1589 1587 0 0 16 1588 +1589 1589 1590 1588 0 0 16 1589 +1590 1590 1591 1589 0 0 16 1590 +1591 1591 1592 1590 0 0 16 1591 +1592 1592 1593 1591 0 0 16 1592 +1593 1593 1594 1592 0 0 16 1593 +1594 1594 1595 1593 0 0 16 1594 +1595 1595 1596 1594 0 0 16 1595 +1596 1596 1597 1595 0 0 16 1596 +1597 1597 1598 1596 0 0 16 1597 +1598 1598 1599 1597 0 0 16 1598 +1599 1599 1600 1598 0 0 16 1599 +1600 1600 1601 1599 0 0 16 1600 +1601 1601 1602 1600 0 0 16 1601 +1602 1602 1603 1601 0 0 16 1602 +1603 1603 1604 1602 0 0 16 1603 +1604 1604 1605 1603 0 0 16 1604 +1605 1605 1606 1604 0 0 16 1605 +1606 1606 1607 1605 0 0 16 1606 +1607 1607 1608 1606 0 0 16 1607 +1608 1608 1609 1607 0 0 16 1608 +1609 1609 1610 1608 0 0 16 1609 +1610 1610 1611 1609 0 0 16 1610 +1611 1611 1612 1610 0 0 16 1611 +1612 1612 1613 1611 0 0 16 1612 +1613 1613 1614 1612 0 0 16 1613 +1614 1614 1615 1613 0 0 16 1614 +1615 1615 1616 1614 0 0 16 1615 +1616 1616 1617 1615 0 0 16 1616 +1617 1617 1618 1616 0 0 16 1617 +1618 1618 1619 1617 0 0 16 1618 +1619 1619 1620 1618 0 0 16 1619 +1620 1620 1621 1619 0 0 16 1620 +1621 1621 1622 1620 0 0 16 1621 +1622 1622 1623 1621 0 0 16 1622 +1623 1623 1624 1622 0 0 16 1623 +1624 1624 1625 1623 0 0 16 1624 +1625 1625 1626 1624 0 0 16 1625 +1626 1626 1627 1625 0 0 16 1626 +1627 1627 1628 1626 0 0 16 1627 +1628 1628 1629 1627 0 0 16 1628 +1629 1629 1630 1628 0 0 16 1629 +1630 1630 1631 1629 0 0 16 1630 +1631 1631 1632 1630 0 0 16 1631 +1632 1632 1633 1631 0 0 16 1632 +1633 1633 1634 1632 0 0 16 1633 +1634 1634 1635 1633 0 0 16 1634 +1635 1635 1636 1634 0 0 16 1635 +1636 1636 1637 1635 0 0 16 1636 +1637 1637 1638 1636 0 0 16 1637 +1638 1638 1639 1637 0 0 16 1638 +1639 1639 1640 1638 0 0 16 1639 +1640 1640 1641 1639 0 0 16 1640 +1641 1641 1642 1640 0 0 16 1641 +1642 1642 1643 1641 0 0 16 1642 +1643 1643 1644 1642 0 0 16 1643 +1644 1644 1645 1643 0 0 16 1644 +1645 1645 1646 1644 0 0 16 1645 +1646 1646 1647 1645 0 0 16 1646 +1647 1647 1648 1646 0 0 16 1647 +1648 1648 1649 1647 0 0 16 1648 +1649 1649 1650 1648 0 0 16 1649 +1650 1650 1651 1649 0 0 16 1650 +1651 1651 1652 1650 0 0 16 1651 +1652 1652 1653 1651 0 0 16 1652 +1653 1653 1654 1652 0 0 16 1653 +1654 1654 1655 1653 0 0 16 1654 +1655 1655 1656 1654 0 0 16 1655 +1656 1656 1657 1655 0 0 16 1656 +1657 1657 1658 1656 0 0 16 1657 +1658 1658 1659 1657 0 0 16 1658 +1659 1659 1660 1658 0 0 16 1659 +1660 1660 1661 1659 0 0 16 1660 +1661 1661 1662 1660 0 0 16 1661 +1662 1662 1663 1661 0 0 16 1662 +1663 1663 1664 1662 0 0 16 1663 +1664 1664 1665 1663 0 0 16 1664 +1665 1665 1666 1664 0 0 16 1665 +1666 1666 1667 1665 0 0 16 1666 +1667 1667 1668 1666 0 0 16 1667 +1668 1668 1669 1667 0 0 16 1668 +1669 1669 1670 1668 0 0 16 1669 +1670 1670 1671 1669 0 0 16 1670 +1671 1671 1672 1670 0 0 16 1671 +1672 1672 1673 1671 0 0 16 1672 +1673 1673 1674 1672 0 0 16 1673 +1674 1674 1675 1673 0 0 16 1674 +1675 1675 1676 1674 0 0 16 1675 +1676 1676 1677 1675 0 0 16 1676 +1677 1677 1678 1676 0 0 16 1677 +1678 1678 1679 1677 0 0 16 1678 +1679 1679 1680 1678 0 0 16 1679 +1680 1680 1681 1679 0 0 16 1680 +1681 1681 1682 1680 0 0 16 1681 +1682 1682 1683 1681 0 0 16 1682 +1683 1683 1684 1682 0 0 16 1683 +1684 1684 1685 1683 0 0 16 1684 +1685 1685 1686 1684 0 0 16 1685 +1686 1686 1687 1685 0 0 16 1686 +1687 1687 1688 1686 0 0 16 1687 +1688 1688 1689 1687 0 0 16 1688 +1689 1689 1690 1688 0 0 16 1689 +1690 1690 1691 1689 0 0 16 1690 +1691 1691 1692 1690 0 0 16 1691 +1692 1692 1693 1691 0 0 16 1692 +1693 1693 1694 1692 0 0 16 1693 +1694 1694 1695 1693 0 0 16 1694 +1695 1695 1696 1694 0 0 16 1695 +1696 1696 1697 1695 0 0 16 1696 +1697 1697 1698 1696 0 0 16 1697 +1698 1698 1699 1697 0 0 16 1698 +1699 1699 1700 1698 0 0 16 1699 +1700 1700 1701 1699 0 0 16 1700 +1701 1701 1702 1700 0 0 16 1701 +1702 1702 1703 1701 0 0 16 1702 +1703 1703 1704 1702 0 0 16 1703 +1704 1704 1705 1703 0 0 16 1704 +1705 1705 1706 1704 0 0 16 1705 +1706 1706 1707 1705 0 0 16 1706 +1707 1707 1708 1706 0 0 16 1707 +1708 1708 1709 1707 0 0 16 1708 +1709 1709 1710 1708 0 0 16 1709 +1710 1710 1711 1709 0 0 16 1710 +1711 1711 1712 1710 0 0 16 1711 +1712 1712 1713 1711 0 0 16 1712 +1713 1713 1714 1712 0 0 16 1713 +1714 1714 1715 1713 0 0 16 1714 +1715 1715 1716 1714 0 0 16 1715 +1716 1716 1717 1715 0 0 16 1716 +1717 1717 1718 1716 0 0 16 1717 +1718 1718 1719 1717 0 0 16 1718 +1719 1719 1720 1718 0 0 16 1719 +1720 1720 1721 1719 0 0 16 1720 +1721 1721 1722 1720 0 0 16 1721 +1722 1722 1723 1721 0 0 16 1722 +1723 1723 1724 1722 0 0 16 1723 +1724 1724 1725 1723 0 0 16 1724 +1725 1725 1726 1724 0 0 16 1725 +1726 1726 1727 1725 0 0 16 1726 +1727 1727 1728 1726 0 0 16 1727 +1728 1728 1729 1727 0 0 16 1728 +1729 1729 1730 1728 0 0 16 1729 +1730 1730 1731 1729 0 0 16 1730 +1731 1731 1732 1730 0 0 16 1731 +1732 1732 1733 1731 0 0 16 1732 +1733 1733 1734 1732 0 0 16 1733 +1734 1734 1735 1733 0 0 16 1734 +1735 1735 1736 1734 0 0 16 1735 +1736 1736 1737 1735 0 0 16 1736 +1737 1737 1738 1736 0 0 16 1737 +1738 1738 1739 1737 0 0 16 1738 +1739 1739 1740 1738 0 0 16 1739 +1740 1740 1741 1739 0 0 16 1740 +1741 1741 1742 1740 0 0 16 1741 +1742 1742 1743 1741 0 0 16 1742 +1743 1743 1744 1742 0 0 16 1743 +1744 1744 1745 1743 0 0 16 1744 +1745 1745 1746 1744 0 0 16 1745 +1746 1746 1747 1745 0 0 16 1746 +1747 1747 1748 1746 0 0 16 1747 +1748 1748 1749 1747 0 0 16 1748 +1749 1749 1750 1748 0 0 16 1749 +1750 1750 1751 1749 0 0 16 1750 +1751 1751 1752 1750 0 0 16 1751 +1752 1752 1753 1751 0 0 16 1752 +1753 1753 1754 1752 0 0 16 1753 +1754 1754 1755 1753 0 0 16 1754 +1755 1755 1756 1754 0 0 16 1755 +1756 1756 1757 1755 0 0 16 1756 +1757 1757 1758 1756 0 0 16 1757 +1758 1758 1759 1757 0 0 16 1758 +1759 1759 1760 1758 0 0 16 1759 +1760 1760 1761 1759 0 0 16 1760 +1761 1761 1762 1760 0 0 16 1761 +1762 1762 1763 1761 0 0 16 1762 +1763 1763 1764 1762 0 0 16 1763 +1764 1764 1765 1763 0 0 16 1764 +1765 1765 1766 1764 0 0 16 1765 +1766 1766 1767 1765 0 0 16 1766 +1767 1767 1768 1766 0 0 16 1767 +1768 1768 1769 1767 0 0 16 1768 +1769 1769 1770 1768 0 0 16 1769 +1770 1770 1771 1769 0 0 16 1770 +1771 1771 1772 1770 0 0 16 1771 +1772 1772 1773 1771 0 0 16 1772 +1773 1773 1774 1772 0 0 16 1773 +1774 1774 1775 1773 0 0 16 1774 +1775 1775 1776 1774 0 0 16 1775 +1776 1776 1777 1775 0 0 16 1776 +1777 1777 1778 1776 0 0 16 1777 +1778 1778 1779 1777 0 0 16 1778 +1779 1779 1780 1778 0 0 16 1779 +1780 1780 1781 1779 0 0 16 1780 +1781 1781 1782 1780 0 0 16 1781 +1782 1782 1783 1781 0 0 16 1782 +1783 1783 1784 1782 0 0 16 1783 +1784 1784 1785 1783 0 0 16 1784 +1785 1785 1786 1784 0 0 16 1785 +1786 1786 1787 1785 0 0 16 1786 +1787 1787 1788 1786 0 0 16 1787 +1788 1788 1789 1787 0 0 16 1788 +1789 1789 1790 1788 0 0 16 1789 +1790 1790 1791 1789 0 0 16 1790 +1791 1791 1792 1790 0 0 16 1791 +1792 1792 1793 1791 0 0 16 1792 +1793 1793 1794 1792 0 0 16 1793 +1794 1794 1795 1793 0 0 16 1794 +1795 1795 1796 1794 0 0 16 1795 +1796 1796 1797 1795 0 0 16 1796 +1797 1797 1798 1796 0 0 16 1797 +1798 1798 1799 1797 0 0 16 1798 +1799 1799 1800 1798 0 0 16 1799 +1800 1800 1801 1799 0 0 16 1800 +1801 1801 1802 1800 0 0 16 1801 +1802 1802 1803 1801 0 0 16 1802 +1803 1803 1804 1802 0 0 16 1803 +1804 1804 1805 1803 0 0 16 1804 +1805 1805 1806 1804 0 0 16 1805 +1806 1806 1807 1805 0 0 16 1806 +1807 1807 1808 1806 0 0 16 1807 +1808 1808 1809 1807 0 0 16 1808 +1809 1809 1810 1808 0 0 16 1809 +1810 1810 1811 1809 0 0 16 1810 +1811 1811 1812 1810 0 0 16 1811 +1812 1812 1813 1811 0 0 16 1812 +1813 1813 1814 1812 0 0 16 1813 +1814 1814 1815 1813 0 0 16 1814 +1815 1815 1816 1814 0 0 16 1815 +1816 1816 1817 1815 0 0 16 1816 +1817 1817 1818 1816 0 0 16 1817 +1818 1818 1819 1817 0 0 16 1818 +1819 1819 1820 1818 0 0 16 1819 +1820 1820 1821 1819 0 0 16 1820 +1821 1821 1822 1820 0 0 16 1821 +1822 1822 1823 1821 0 0 16 1822 +1823 1823 1824 1822 0 0 16 1823 +1824 1824 1825 1823 0 0 16 1824 +1825 1825 1826 1824 0 0 16 1825 +1826 1826 1827 1825 0 0 16 1826 +1827 1827 1828 1826 0 0 16 1827 +1828 1828 1829 1827 0 0 16 1828 +1829 1829 1830 1828 0 0 16 1829 +1830 1830 1831 1829 0 0 16 1830 +1831 1831 1832 1830 0 0 16 1831 +1832 1832 1833 1831 0 0 16 1832 +1833 1833 1834 1832 0 0 16 1833 +1834 1834 1835 1833 0 0 16 1834 +1835 1835 1836 1834 0 0 16 1835 +1836 1836 1837 1835 0 0 16 1836 +1837 1837 1838 1836 0 0 16 1837 +1838 1838 1839 1837 0 0 16 1838 +1839 1839 1840 1838 0 0 16 1839 +1840 1840 1841 1839 0 0 16 1840 +1841 1841 1842 1840 0 0 16 1841 +1842 1842 1843 1841 0 0 16 1842 +1843 1843 1844 1842 0 0 16 1843 +1844 1844 1845 1843 0 0 16 1844 +1845 1845 1846 1844 0 0 16 1845 +1846 1846 1847 1845 0 0 16 1846 +1847 1847 1848 1846 0 0 16 1847 +1848 1848 1849 1847 0 0 16 1848 +1849 1849 1850 1848 0 0 16 1849 +1850 1850 1851 1849 0 0 16 1850 +1851 1851 1852 1850 0 0 16 1851 +1852 1852 1853 1851 0 0 16 1852 +1853 1853 1854 1852 0 0 16 1853 +1854 1854 1855 1853 0 0 16 1854 +1855 1855 1856 1854 0 0 16 1855 +1856 1856 1857 1855 0 0 16 1856 +1857 1857 1858 1856 0 0 16 1857 +1858 1858 1859 1857 0 0 16 1858 +1859 1859 1860 1858 0 0 16 1859 +1860 1860 1861 1859 0 0 16 1860 +1861 1861 1862 1860 0 0 16 1861 +1862 1862 1863 1861 0 0 16 1862 +1863 1863 1864 1862 0 0 16 1863 +1864 1864 1865 1863 0 0 16 1864 +1865 1865 1866 1864 0 0 16 1865 +1866 1866 1867 1865 0 0 16 1866 +1867 1867 1868 1866 0 0 16 1867 +1868 1868 1869 1867 0 0 16 1868 +1869 1869 1870 1868 0 0 16 1869 +1870 1870 1871 1869 0 0 16 1870 +1871 1871 1872 1870 0 0 16 1871 +1872 1872 1873 1871 0 0 16 1872 +1873 1873 1874 1872 0 0 16 1873 +1874 1874 1875 1873 0 0 16 1874 +1875 1875 1876 1874 0 0 16 1875 +1876 1876 1877 1875 0 0 16 1876 +1877 1877 1878 1876 0 0 16 1877 +1878 1878 1879 1877 0 0 16 1878 +1879 1879 1880 1878 0 0 16 1879 +1880 1880 1881 1879 0 0 16 1880 +1881 1881 1882 1880 0 0 16 1881 +1882 1882 1883 1881 0 0 16 1882 +1883 1883 1884 1882 0 0 16 1883 +1884 1884 1885 1883 0 0 16 1884 +1885 1885 1886 1884 0 0 16 1885 +1886 1886 1887 1885 0 0 16 1886 +1887 1887 1888 1886 0 0 16 1887 +1888 1888 1889 1887 0 0 16 1888 +1889 1889 1890 1888 0 0 16 1889 +1890 1890 1891 1889 0 0 16 1890 +1891 1891 1892 1890 0 0 16 1891 +1892 1892 1893 1891 0 0 16 1892 +1893 1893 1894 1892 0 0 16 1893 +1894 1894 1895 1893 0 0 16 1894 +1895 1895 1896 1894 0 0 16 1895 +1896 1896 1897 1895 0 0 16 1896 +1897 1897 1898 1896 0 0 16 1897 +1898 1898 1899 1897 0 0 16 1898 +1899 1899 1900 1898 0 0 16 1899 +1900 1900 1901 1899 0 0 16 1900 +1901 1901 1902 1900 0 0 16 1901 +1902 1902 1903 1901 0 0 16 1902 +1903 1903 1904 1902 0 0 16 1903 +1904 1904 1905 1903 0 0 16 1904 +1905 1905 1906 1904 0 0 16 1905 +1906 1906 1907 1905 0 0 16 1906 +1907 1907 1908 1906 0 0 16 1907 +1908 1908 1909 1907 0 0 16 1908 +1909 1909 1910 1908 0 0 16 1909 +1910 1910 1911 1909 0 0 16 1910 +1911 1911 1912 1910 0 0 16 1911 +1912 1912 1913 1911 0 0 16 1912 +1913 1913 1914 1912 0 0 16 1913 +1914 1914 1915 1913 0 0 16 1914 +1915 1915 1916 1914 0 0 16 1915 +1916 1916 1917 1915 0 0 16 1916 +1917 1917 1918 1916 0 0 16 1917 +1918 1918 1919 1917 0 0 16 1918 +1919 1919 1920 1918 0 0 16 1919 +1920 1920 1921 1919 0 0 16 1920 +1921 1921 1922 1920 0 0 16 1921 +1922 1922 1923 1921 0 0 16 1922 +1923 1923 1924 1922 0 0 16 1923 +1924 1924 1925 1923 0 0 16 1924 +1925 1925 1926 1924 0 0 16 1925 +1926 1926 1927 1925 0 0 16 1926 +1927 1927 1928 1926 0 0 16 1927 +1928 1928 1929 1927 0 0 16 1928 +1929 1929 1930 1928 0 0 16 1929 +1930 1930 1931 1929 0 0 16 1930 +1931 1931 1932 1930 0 0 16 1931 +1932 1932 1933 1931 0 0 16 1932 +1933 1933 1934 1932 0 0 16 1933 +1934 1934 1935 1933 0 0 16 1934 +1935 1935 1936 1934 0 0 16 1935 +1936 1936 1937 1935 0 0 16 1936 +1937 1937 1938 1936 0 0 16 1937 +1938 1938 1939 1937 0 0 16 1938 +1939 1939 1940 1938 0 0 16 1939 +1940 1940 1941 1939 0 0 16 1940 +1941 1941 1942 1940 0 0 16 1941 +1942 1942 1943 1941 0 0 16 1942 +1943 1943 1944 1942 0 0 16 1943 +1944 1944 1945 1943 0 0 16 1944 +1945 1945 1946 1944 0 0 16 1945 +1946 1946 1947 1945 0 0 16 1946 +1947 1947 1948 1946 0 0 16 1947 +1948 1948 1949 1947 0 0 16 1948 +1949 1949 1950 1948 0 0 16 1949 +1950 1950 1951 1949 0 0 16 1950 +1951 1951 1952 1950 0 0 16 1951 +1952 1952 1953 1951 0 0 16 1952 +1953 1953 1954 1952 0 0 16 1953 +1954 1954 1955 1953 0 0 16 1954 +1955 1955 1956 1954 0 0 16 1955 +1956 1956 1957 1955 0 0 16 1956 +1957 1957 1958 1956 0 0 16 1957 +1958 1958 1959 1957 0 0 16 1958 +1959 1959 1960 1958 0 0 16 1959 +1960 1960 1961 1959 0 0 16 1960 +1961 1961 1962 1960 0 0 16 1961 +1962 1962 1963 1961 0 0 16 1962 +1963 1963 1964 1962 0 0 16 1963 +1964 1964 1965 1963 0 0 16 1964 +1965 1965 1966 1964 0 0 16 1965 +1966 1966 1967 1965 0 0 16 1966 +1967 1967 1968 1966 0 0 16 1967 +1968 1968 1969 1967 0 0 16 1968 +1969 1969 1970 1968 0 0 16 1969 +1970 1970 1971 1969 0 0 16 1970 +1971 1971 1972 1970 0 0 16 1971 +1972 1972 1973 1971 0 0 16 1972 +1973 1973 1974 1972 0 0 16 1973 +1974 1974 1975 1973 0 0 16 1974 +1975 1975 1976 1974 0 0 16 1975 +1976 1976 1977 1975 0 0 16 1976 +1977 1977 1978 1976 0 0 16 1977 +1978 1978 1979 1977 0 0 16 1978 +1979 1979 1980 1978 0 0 16 1979 +1980 1980 1981 1979 0 0 16 1980 +1981 1981 1982 1980 0 0 16 1981 +1982 1982 1983 1981 0 0 16 1982 +1983 1983 1984 1982 0 0 16 1983 +1984 1984 1985 1983 0 0 16 1984 +1985 1985 1986 1984 0 0 16 1985 +1986 1986 1987 1985 0 0 16 1986 +1987 1987 1988 1986 0 0 16 1987 +1988 1988 1989 1987 0 0 16 1988 +1989 1989 1990 1988 0 0 16 1989 +1990 1990 1991 1989 0 0 16 1990 +1991 1991 1992 1990 0 0 16 1991 +1992 1992 1993 1991 0 0 16 1992 +1993 1993 1994 1992 0 0 16 1993 +1994 1994 1995 1993 0 0 16 1994 +1995 1995 1996 1994 0 0 16 1995 +1996 1996 1997 1995 0 0 16 1996 +1997 1997 1998 1996 0 0 16 1997 +1998 1998 1999 1997 0 0 16 1998 +1999 1999 2000 1998 0 0 16 1999 +2000 2000 2001 1999 0 0 16 2000 +2001 2001 2002 2000 0 0 16 2001 +2002 2002 2003 2001 0 0 16 2002 +2003 2003 2004 2002 0 0 16 2003 +2004 2004 2005 2003 0 0 16 2004 +2005 2005 2006 2004 0 0 16 2005 +2006 2006 2007 2005 0 0 16 2006 +2007 2007 2008 2006 0 0 16 2007 +2008 2008 2009 2007 0 0 16 2008 +2009 2009 2010 2008 0 0 16 2009 +2010 2010 2011 2009 0 0 16 2010 +2011 2011 2012 2010 0 0 16 2011 +2012 2012 2013 2011 0 0 16 2012 +2013 2013 2014 2012 0 0 16 2013 +2014 2014 2015 2013 0 0 16 2014 +2015 2015 2016 2014 0 0 16 2015 +2016 2016 2017 2015 0 0 16 2016 +2017 2017 2018 2016 0 0 16 2017 +2018 2018 2019 2017 0 0 16 2018 +2019 2019 2020 2018 0 0 16 2019 +2020 2020 2021 2019 0 0 16 2020 +2021 2021 2022 2020 0 0 16 2021 +2022 2022 2023 2021 0 0 16 2022 +2023 2023 2024 2022 0 0 16 2023 +2024 2024 2025 2023 0 0 16 2024 +2025 2025 2026 2024 0 0 16 2025 +2026 2026 2027 2025 0 0 16 2026 +2027 2027 2028 2026 0 0 16 2027 +2028 2028 2029 2027 0 0 16 2028 +2029 2029 2030 2028 0 0 16 2029 +2030 2030 2031 2029 0 0 16 2030 +2031 2031 2032 2030 0 0 16 2031 +2032 2032 2033 2031 0 0 16 2032 +2033 2033 2034 2032 0 0 16 2033 +2034 2034 2035 2033 0 0 16 2034 +2035 2035 2036 2034 0 0 16 2035 +2036 2036 2037 2035 0 0 16 2036 +2037 2037 2038 2036 0 0 16 2037 +2038 2038 2039 2037 0 0 16 2038 +2039 2039 2040 2038 0 0 16 2039 +2040 2040 2041 2039 0 0 16 2040 +2041 2041 2042 2040 0 0 16 2041 +2042 2042 2043 2041 0 0 16 2042 +2043 2043 2044 2042 0 0 16 2043 +2044 2044 2045 2043 0 0 16 2044 +2045 2045 2046 2044 0 0 16 2045 +2046 2046 -1 2045 0 0 16 2046 ====================================================== -=== [Queue after-back] Next: 1023 First: 1 Last: 0 +=== [Queue after-back] Next: 2047 First: 1 Last: 0 # seq next prev timeout retrans type cbp -0 0 -1 1022 0 0 16 0 +0 0 -1 2046 0 0 16 0 1 1 2 -1 0 0 16 1 2 2 3 1 0 0 16 2 3 3 4 2 0 0 16 3 @@ -2082,11 +3106,1035 @@ 1019 1019 1020 1018 0 0 16 1019 1020 1020 1021 1019 0 0 16 1020 1021 1021 1022 1020 0 0 16 1021 -1022 1022 0 1021 0 0 16 1022 +1022 1022 1023 1021 0 0 16 1022 +1023 1023 1024 1022 0 0 16 1023 +1024 1024 1025 1023 0 0 16 1024 +1025 1025 1026 1024 0 0 16 1025 +1026 1026 1027 1025 0 0 16 1026 +1027 1027 1028 1026 0 0 16 1027 +1028 1028 1029 1027 0 0 16 1028 +1029 1029 1030 1028 0 0 16 1029 +1030 1030 1031 1029 0 0 16 1030 +1031 1031 1032 1030 0 0 16 1031 +1032 1032 1033 1031 0 0 16 1032 +1033 1033 1034 1032 0 0 16 1033 +1034 1034 1035 1033 0 0 16 1034 +1035 1035 1036 1034 0 0 16 1035 +1036 1036 1037 1035 0 0 16 1036 +1037 1037 1038 1036 0 0 16 1037 +1038 1038 1039 1037 0 0 16 1038 +1039 1039 1040 1038 0 0 16 1039 +1040 1040 1041 1039 0 0 16 1040 +1041 1041 1042 1040 0 0 16 1041 +1042 1042 1043 1041 0 0 16 1042 +1043 1043 1044 1042 0 0 16 1043 +1044 1044 1045 1043 0 0 16 1044 +1045 1045 1046 1044 0 0 16 1045 +1046 1046 1047 1045 0 0 16 1046 +1047 1047 1048 1046 0 0 16 1047 +1048 1048 1049 1047 0 0 16 1048 +1049 1049 1050 1048 0 0 16 1049 +1050 1050 1051 1049 0 0 16 1050 +1051 1051 1052 1050 0 0 16 1051 +1052 1052 1053 1051 0 0 16 1052 +1053 1053 1054 1052 0 0 16 1053 +1054 1054 1055 1053 0 0 16 1054 +1055 1055 1056 1054 0 0 16 1055 +1056 1056 1057 1055 0 0 16 1056 +1057 1057 1058 1056 0 0 16 1057 +1058 1058 1059 1057 0 0 16 1058 +1059 1059 1060 1058 0 0 16 1059 +1060 1060 1061 1059 0 0 16 1060 +1061 1061 1062 1060 0 0 16 1061 +1062 1062 1063 1061 0 0 16 1062 +1063 1063 1064 1062 0 0 16 1063 +1064 1064 1065 1063 0 0 16 1064 +1065 1065 1066 1064 0 0 16 1065 +1066 1066 1067 1065 0 0 16 1066 +1067 1067 1068 1066 0 0 16 1067 +1068 1068 1069 1067 0 0 16 1068 +1069 1069 1070 1068 0 0 16 1069 +1070 1070 1071 1069 0 0 16 1070 +1071 1071 1072 1070 0 0 16 1071 +1072 1072 1073 1071 0 0 16 1072 +1073 1073 1074 1072 0 0 16 1073 +1074 1074 1075 1073 0 0 16 1074 +1075 1075 1076 1074 0 0 16 1075 +1076 1076 1077 1075 0 0 16 1076 +1077 1077 1078 1076 0 0 16 1077 +1078 1078 1079 1077 0 0 16 1078 +1079 1079 1080 1078 0 0 16 1079 +1080 1080 1081 1079 0 0 16 1080 +1081 1081 1082 1080 0 0 16 1081 +1082 1082 1083 1081 0 0 16 1082 +1083 1083 1084 1082 0 0 16 1083 +1084 1084 1085 1083 0 0 16 1084 +1085 1085 1086 1084 0 0 16 1085 +1086 1086 1087 1085 0 0 16 1086 +1087 1087 1088 1086 0 0 16 1087 +1088 1088 1089 1087 0 0 16 1088 +1089 1089 1090 1088 0 0 16 1089 +1090 1090 1091 1089 0 0 16 1090 +1091 1091 1092 1090 0 0 16 1091 +1092 1092 1093 1091 0 0 16 1092 +1093 1093 1094 1092 0 0 16 1093 +1094 1094 1095 1093 0 0 16 1094 +1095 1095 1096 1094 0 0 16 1095 +1096 1096 1097 1095 0 0 16 1096 +1097 1097 1098 1096 0 0 16 1097 +1098 1098 1099 1097 0 0 16 1098 +1099 1099 1100 1098 0 0 16 1099 +1100 1100 1101 1099 0 0 16 1100 +1101 1101 1102 1100 0 0 16 1101 +1102 1102 1103 1101 0 0 16 1102 +1103 1103 1104 1102 0 0 16 1103 +1104 1104 1105 1103 0 0 16 1104 +1105 1105 1106 1104 0 0 16 1105 +1106 1106 1107 1105 0 0 16 1106 +1107 1107 1108 1106 0 0 16 1107 +1108 1108 1109 1107 0 0 16 1108 +1109 1109 1110 1108 0 0 16 1109 +1110 1110 1111 1109 0 0 16 1110 +1111 1111 1112 1110 0 0 16 1111 +1112 1112 1113 1111 0 0 16 1112 +1113 1113 1114 1112 0 0 16 1113 +1114 1114 1115 1113 0 0 16 1114 +1115 1115 1116 1114 0 0 16 1115 +1116 1116 1117 1115 0 0 16 1116 +1117 1117 1118 1116 0 0 16 1117 +1118 1118 1119 1117 0 0 16 1118 +1119 1119 1120 1118 0 0 16 1119 +1120 1120 1121 1119 0 0 16 1120 +1121 1121 1122 1120 0 0 16 1121 +1122 1122 1123 1121 0 0 16 1122 +1123 1123 1124 1122 0 0 16 1123 +1124 1124 1125 1123 0 0 16 1124 +1125 1125 1126 1124 0 0 16 1125 +1126 1126 1127 1125 0 0 16 1126 +1127 1127 1128 1126 0 0 16 1127 +1128 1128 1129 1127 0 0 16 1128 +1129 1129 1130 1128 0 0 16 1129 +1130 1130 1131 1129 0 0 16 1130 +1131 1131 1132 1130 0 0 16 1131 +1132 1132 1133 1131 0 0 16 1132 +1133 1133 1134 1132 0 0 16 1133 +1134 1134 1135 1133 0 0 16 1134 +1135 1135 1136 1134 0 0 16 1135 +1136 1136 1137 1135 0 0 16 1136 +1137 1137 1138 1136 0 0 16 1137 +1138 1138 1139 1137 0 0 16 1138 +1139 1139 1140 1138 0 0 16 1139 +1140 1140 1141 1139 0 0 16 1140 +1141 1141 1142 1140 0 0 16 1141 +1142 1142 1143 1141 0 0 16 1142 +1143 1143 1144 1142 0 0 16 1143 +1144 1144 1145 1143 0 0 16 1144 +1145 1145 1146 1144 0 0 16 1145 +1146 1146 1147 1145 0 0 16 1146 +1147 1147 1148 1146 0 0 16 1147 +1148 1148 1149 1147 0 0 16 1148 +1149 1149 1150 1148 0 0 16 1149 +1150 1150 1151 1149 0 0 16 1150 +1151 1151 1152 1150 0 0 16 1151 +1152 1152 1153 1151 0 0 16 1152 +1153 1153 1154 1152 0 0 16 1153 +1154 1154 1155 1153 0 0 16 1154 +1155 1155 1156 1154 0 0 16 1155 +1156 1156 1157 1155 0 0 16 1156 +1157 1157 1158 1156 0 0 16 1157 +1158 1158 1159 1157 0 0 16 1158 +1159 1159 1160 1158 0 0 16 1159 +1160 1160 1161 1159 0 0 16 1160 +1161 1161 1162 1160 0 0 16 1161 +1162 1162 1163 1161 0 0 16 1162 +1163 1163 1164 1162 0 0 16 1163 +1164 1164 1165 1163 0 0 16 1164 +1165 1165 1166 1164 0 0 16 1165 +1166 1166 1167 1165 0 0 16 1166 +1167 1167 1168 1166 0 0 16 1167 +1168 1168 1169 1167 0 0 16 1168 +1169 1169 1170 1168 0 0 16 1169 +1170 1170 1171 1169 0 0 16 1170 +1171 1171 1172 1170 0 0 16 1171 +1172 1172 1173 1171 0 0 16 1172 +1173 1173 1174 1172 0 0 16 1173 +1174 1174 1175 1173 0 0 16 1174 +1175 1175 1176 1174 0 0 16 1175 +1176 1176 1177 1175 0 0 16 1176 +1177 1177 1178 1176 0 0 16 1177 +1178 1178 1179 1177 0 0 16 1178 +1179 1179 1180 1178 0 0 16 1179 +1180 1180 1181 1179 0 0 16 1180 +1181 1181 1182 1180 0 0 16 1181 +1182 1182 1183 1181 0 0 16 1182 +1183 1183 1184 1182 0 0 16 1183 +1184 1184 1185 1183 0 0 16 1184 +1185 1185 1186 1184 0 0 16 1185 +1186 1186 1187 1185 0 0 16 1186 +1187 1187 1188 1186 0 0 16 1187 +1188 1188 1189 1187 0 0 16 1188 +1189 1189 1190 1188 0 0 16 1189 +1190 1190 1191 1189 0 0 16 1190 +1191 1191 1192 1190 0 0 16 1191 +1192 1192 1193 1191 0 0 16 1192 +1193 1193 1194 1192 0 0 16 1193 +1194 1194 1195 1193 0 0 16 1194 +1195 1195 1196 1194 0 0 16 1195 +1196 1196 1197 1195 0 0 16 1196 +1197 1197 1198 1196 0 0 16 1197 +1198 1198 1199 1197 0 0 16 1198 +1199 1199 1200 1198 0 0 16 1199 +1200 1200 1201 1199 0 0 16 1200 +1201 1201 1202 1200 0 0 16 1201 +1202 1202 1203 1201 0 0 16 1202 +1203 1203 1204 1202 0 0 16 1203 +1204 1204 1205 1203 0 0 16 1204 +1205 1205 1206 1204 0 0 16 1205 +1206 1206 1207 1205 0 0 16 1206 +1207 1207 1208 1206 0 0 16 1207 +1208 1208 1209 1207 0 0 16 1208 +1209 1209 1210 1208 0 0 16 1209 +1210 1210 1211 1209 0 0 16 1210 +1211 1211 1212 1210 0 0 16 1211 +1212 1212 1213 1211 0 0 16 1212 +1213 1213 1214 1212 0 0 16 1213 +1214 1214 1215 1213 0 0 16 1214 +1215 1215 1216 1214 0 0 16 1215 +1216 1216 1217 1215 0 0 16 1216 +1217 1217 1218 1216 0 0 16 1217 +1218 1218 1219 1217 0 0 16 1218 +1219 1219 1220 1218 0 0 16 1219 +1220 1220 1221 1219 0 0 16 1220 +1221 1221 1222 1220 0 0 16 1221 +1222 1222 1223 1221 0 0 16 1222 +1223 1223 1224 1222 0 0 16 1223 +1224 1224 1225 1223 0 0 16 1224 +1225 1225 1226 1224 0 0 16 1225 +1226 1226 1227 1225 0 0 16 1226 +1227 1227 1228 1226 0 0 16 1227 +1228 1228 1229 1227 0 0 16 1228 +1229 1229 1230 1228 0 0 16 1229 +1230 1230 1231 1229 0 0 16 1230 +1231 1231 1232 1230 0 0 16 1231 +1232 1232 1233 1231 0 0 16 1232 +1233 1233 1234 1232 0 0 16 1233 +1234 1234 1235 1233 0 0 16 1234 +1235 1235 1236 1234 0 0 16 1235 +1236 1236 1237 1235 0 0 16 1236 +1237 1237 1238 1236 0 0 16 1237 +1238 1238 1239 1237 0 0 16 1238 +1239 1239 1240 1238 0 0 16 1239 +1240 1240 1241 1239 0 0 16 1240 +1241 1241 1242 1240 0 0 16 1241 +1242 1242 1243 1241 0 0 16 1242 +1243 1243 1244 1242 0 0 16 1243 +1244 1244 1245 1243 0 0 16 1244 +1245 1245 1246 1244 0 0 16 1245 +1246 1246 1247 1245 0 0 16 1246 +1247 1247 1248 1246 0 0 16 1247 +1248 1248 1249 1247 0 0 16 1248 +1249 1249 1250 1248 0 0 16 1249 +1250 1250 1251 1249 0 0 16 1250 +1251 1251 1252 1250 0 0 16 1251 +1252 1252 1253 1251 0 0 16 1252 +1253 1253 1254 1252 0 0 16 1253 +1254 1254 1255 1253 0 0 16 1254 +1255 1255 1256 1254 0 0 16 1255 +1256 1256 1257 1255 0 0 16 1256 +1257 1257 1258 1256 0 0 16 1257 +1258 1258 1259 1257 0 0 16 1258 +1259 1259 1260 1258 0 0 16 1259 +1260 1260 1261 1259 0 0 16 1260 +1261 1261 1262 1260 0 0 16 1261 +1262 1262 1263 1261 0 0 16 1262 +1263 1263 1264 1262 0 0 16 1263 +1264 1264 1265 1263 0 0 16 1264 +1265 1265 1266 1264 0 0 16 1265 +1266 1266 1267 1265 0 0 16 1266 +1267 1267 1268 1266 0 0 16 1267 +1268 1268 1269 1267 0 0 16 1268 +1269 1269 1270 1268 0 0 16 1269 +1270 1270 1271 1269 0 0 16 1270 +1271 1271 1272 1270 0 0 16 1271 +1272 1272 1273 1271 0 0 16 1272 +1273 1273 1274 1272 0 0 16 1273 +1274 1274 1275 1273 0 0 16 1274 +1275 1275 1276 1274 0 0 16 1275 +1276 1276 1277 1275 0 0 16 1276 +1277 1277 1278 1276 0 0 16 1277 +1278 1278 1279 1277 0 0 16 1278 +1279 1279 1280 1278 0 0 16 1279 +1280 1280 1281 1279 0 0 16 1280 +1281 1281 1282 1280 0 0 16 1281 +1282 1282 1283 1281 0 0 16 1282 +1283 1283 1284 1282 0 0 16 1283 +1284 1284 1285 1283 0 0 16 1284 +1285 1285 1286 1284 0 0 16 1285 +1286 1286 1287 1285 0 0 16 1286 +1287 1287 1288 1286 0 0 16 1287 +1288 1288 1289 1287 0 0 16 1288 +1289 1289 1290 1288 0 0 16 1289 +1290 1290 1291 1289 0 0 16 1290 +1291 1291 1292 1290 0 0 16 1291 +1292 1292 1293 1291 0 0 16 1292 +1293 1293 1294 1292 0 0 16 1293 +1294 1294 1295 1293 0 0 16 1294 +1295 1295 1296 1294 0 0 16 1295 +1296 1296 1297 1295 0 0 16 1296 +1297 1297 1298 1296 0 0 16 1297 +1298 1298 1299 1297 0 0 16 1298 +1299 1299 1300 1298 0 0 16 1299 +1300 1300 1301 1299 0 0 16 1300 +1301 1301 1302 1300 0 0 16 1301 +1302 1302 1303 1301 0 0 16 1302 +1303 1303 1304 1302 0 0 16 1303 +1304 1304 1305 1303 0 0 16 1304 +1305 1305 1306 1304 0 0 16 1305 +1306 1306 1307 1305 0 0 16 1306 +1307 1307 1308 1306 0 0 16 1307 +1308 1308 1309 1307 0 0 16 1308 +1309 1309 1310 1308 0 0 16 1309 +1310 1310 1311 1309 0 0 16 1310 +1311 1311 1312 1310 0 0 16 1311 +1312 1312 1313 1311 0 0 16 1312 +1313 1313 1314 1312 0 0 16 1313 +1314 1314 1315 1313 0 0 16 1314 +1315 1315 1316 1314 0 0 16 1315 +1316 1316 1317 1315 0 0 16 1316 +1317 1317 1318 1316 0 0 16 1317 +1318 1318 1319 1317 0 0 16 1318 +1319 1319 1320 1318 0 0 16 1319 +1320 1320 1321 1319 0 0 16 1320 +1321 1321 1322 1320 0 0 16 1321 +1322 1322 1323 1321 0 0 16 1322 +1323 1323 1324 1322 0 0 16 1323 +1324 1324 1325 1323 0 0 16 1324 +1325 1325 1326 1324 0 0 16 1325 +1326 1326 1327 1325 0 0 16 1326 +1327 1327 1328 1326 0 0 16 1327 +1328 1328 1329 1327 0 0 16 1328 +1329 1329 1330 1328 0 0 16 1329 +1330 1330 1331 1329 0 0 16 1330 +1331 1331 1332 1330 0 0 16 1331 +1332 1332 1333 1331 0 0 16 1332 +1333 1333 1334 1332 0 0 16 1333 +1334 1334 1335 1333 0 0 16 1334 +1335 1335 1336 1334 0 0 16 1335 +1336 1336 1337 1335 0 0 16 1336 +1337 1337 1338 1336 0 0 16 1337 +1338 1338 1339 1337 0 0 16 1338 +1339 1339 1340 1338 0 0 16 1339 +1340 1340 1341 1339 0 0 16 1340 +1341 1341 1342 1340 0 0 16 1341 +1342 1342 1343 1341 0 0 16 1342 +1343 1343 1344 1342 0 0 16 1343 +1344 1344 1345 1343 0 0 16 1344 +1345 1345 1346 1344 0 0 16 1345 +1346 1346 1347 1345 0 0 16 1346 +1347 1347 1348 1346 0 0 16 1347 +1348 1348 1349 1347 0 0 16 1348 +1349 1349 1350 1348 0 0 16 1349 +1350 1350 1351 1349 0 0 16 1350 +1351 1351 1352 1350 0 0 16 1351 +1352 1352 1353 1351 0 0 16 1352 +1353 1353 1354 1352 0 0 16 1353 +1354 1354 1355 1353 0 0 16 1354 +1355 1355 1356 1354 0 0 16 1355 +1356 1356 1357 1355 0 0 16 1356 +1357 1357 1358 1356 0 0 16 1357 +1358 1358 1359 1357 0 0 16 1358 +1359 1359 1360 1358 0 0 16 1359 +1360 1360 1361 1359 0 0 16 1360 +1361 1361 1362 1360 0 0 16 1361 +1362 1362 1363 1361 0 0 16 1362 +1363 1363 1364 1362 0 0 16 1363 +1364 1364 1365 1363 0 0 16 1364 +1365 1365 1366 1364 0 0 16 1365 +1366 1366 1367 1365 0 0 16 1366 +1367 1367 1368 1366 0 0 16 1367 +1368 1368 1369 1367 0 0 16 1368 +1369 1369 1370 1368 0 0 16 1369 +1370 1370 1371 1369 0 0 16 1370 +1371 1371 1372 1370 0 0 16 1371 +1372 1372 1373 1371 0 0 16 1372 +1373 1373 1374 1372 0 0 16 1373 +1374 1374 1375 1373 0 0 16 1374 +1375 1375 1376 1374 0 0 16 1375 +1376 1376 1377 1375 0 0 16 1376 +1377 1377 1378 1376 0 0 16 1377 +1378 1378 1379 1377 0 0 16 1378 +1379 1379 1380 1378 0 0 16 1379 +1380 1380 1381 1379 0 0 16 1380 +1381 1381 1382 1380 0 0 16 1381 +1382 1382 1383 1381 0 0 16 1382 +1383 1383 1384 1382 0 0 16 1383 +1384 1384 1385 1383 0 0 16 1384 +1385 1385 1386 1384 0 0 16 1385 +1386 1386 1387 1385 0 0 16 1386 +1387 1387 1388 1386 0 0 16 1387 +1388 1388 1389 1387 0 0 16 1388 +1389 1389 1390 1388 0 0 16 1389 +1390 1390 1391 1389 0 0 16 1390 +1391 1391 1392 1390 0 0 16 1391 +1392 1392 1393 1391 0 0 16 1392 +1393 1393 1394 1392 0 0 16 1393 +1394 1394 1395 1393 0 0 16 1394 +1395 1395 1396 1394 0 0 16 1395 +1396 1396 1397 1395 0 0 16 1396 +1397 1397 1398 1396 0 0 16 1397 +1398 1398 1399 1397 0 0 16 1398 +1399 1399 1400 1398 0 0 16 1399 +1400 1400 1401 1399 0 0 16 1400 +1401 1401 1402 1400 0 0 16 1401 +1402 1402 1403 1401 0 0 16 1402 +1403 1403 1404 1402 0 0 16 1403 +1404 1404 1405 1403 0 0 16 1404 +1405 1405 1406 1404 0 0 16 1405 +1406 1406 1407 1405 0 0 16 1406 +1407 1407 1408 1406 0 0 16 1407 +1408 1408 1409 1407 0 0 16 1408 +1409 1409 1410 1408 0 0 16 1409 +1410 1410 1411 1409 0 0 16 1410 +1411 1411 1412 1410 0 0 16 1411 +1412 1412 1413 1411 0 0 16 1412 +1413 1413 1414 1412 0 0 16 1413 +1414 1414 1415 1413 0 0 16 1414 +1415 1415 1416 1414 0 0 16 1415 +1416 1416 1417 1415 0 0 16 1416 +1417 1417 1418 1416 0 0 16 1417 +1418 1418 1419 1417 0 0 16 1418 +1419 1419 1420 1418 0 0 16 1419 +1420 1420 1421 1419 0 0 16 1420 +1421 1421 1422 1420 0 0 16 1421 +1422 1422 1423 1421 0 0 16 1422 +1423 1423 1424 1422 0 0 16 1423 +1424 1424 1425 1423 0 0 16 1424 +1425 1425 1426 1424 0 0 16 1425 +1426 1426 1427 1425 0 0 16 1426 +1427 1427 1428 1426 0 0 16 1427 +1428 1428 1429 1427 0 0 16 1428 +1429 1429 1430 1428 0 0 16 1429 +1430 1430 1431 1429 0 0 16 1430 +1431 1431 1432 1430 0 0 16 1431 +1432 1432 1433 1431 0 0 16 1432 +1433 1433 1434 1432 0 0 16 1433 +1434 1434 1435 1433 0 0 16 1434 +1435 1435 1436 1434 0 0 16 1435 +1436 1436 1437 1435 0 0 16 1436 +1437 1437 1438 1436 0 0 16 1437 +1438 1438 1439 1437 0 0 16 1438 +1439 1439 1440 1438 0 0 16 1439 +1440 1440 1441 1439 0 0 16 1440 +1441 1441 1442 1440 0 0 16 1441 +1442 1442 1443 1441 0 0 16 1442 +1443 1443 1444 1442 0 0 16 1443 +1444 1444 1445 1443 0 0 16 1444 +1445 1445 1446 1444 0 0 16 1445 +1446 1446 1447 1445 0 0 16 1446 +1447 1447 1448 1446 0 0 16 1447 +1448 1448 1449 1447 0 0 16 1448 +1449 1449 1450 1448 0 0 16 1449 +1450 1450 1451 1449 0 0 16 1450 +1451 1451 1452 1450 0 0 16 1451 +1452 1452 1453 1451 0 0 16 1452 +1453 1453 1454 1452 0 0 16 1453 +1454 1454 1455 1453 0 0 16 1454 +1455 1455 1456 1454 0 0 16 1455 +1456 1456 1457 1455 0 0 16 1456 +1457 1457 1458 1456 0 0 16 1457 +1458 1458 1459 1457 0 0 16 1458 +1459 1459 1460 1458 0 0 16 1459 +1460 1460 1461 1459 0 0 16 1460 +1461 1461 1462 1460 0 0 16 1461 +1462 1462 1463 1461 0 0 16 1462 +1463 1463 1464 1462 0 0 16 1463 +1464 1464 1465 1463 0 0 16 1464 +1465 1465 1466 1464 0 0 16 1465 +1466 1466 1467 1465 0 0 16 1466 +1467 1467 1468 1466 0 0 16 1467 +1468 1468 1469 1467 0 0 16 1468 +1469 1469 1470 1468 0 0 16 1469 +1470 1470 1471 1469 0 0 16 1470 +1471 1471 1472 1470 0 0 16 1471 +1472 1472 1473 1471 0 0 16 1472 +1473 1473 1474 1472 0 0 16 1473 +1474 1474 1475 1473 0 0 16 1474 +1475 1475 1476 1474 0 0 16 1475 +1476 1476 1477 1475 0 0 16 1476 +1477 1477 1478 1476 0 0 16 1477 +1478 1478 1479 1477 0 0 16 1478 +1479 1479 1480 1478 0 0 16 1479 +1480 1480 1481 1479 0 0 16 1480 +1481 1481 1482 1480 0 0 16 1481 +1482 1482 1483 1481 0 0 16 1482 +1483 1483 1484 1482 0 0 16 1483 +1484 1484 1485 1483 0 0 16 1484 +1485 1485 1486 1484 0 0 16 1485 +1486 1486 1487 1485 0 0 16 1486 +1487 1487 1488 1486 0 0 16 1487 +1488 1488 1489 1487 0 0 16 1488 +1489 1489 1490 1488 0 0 16 1489 +1490 1490 1491 1489 0 0 16 1490 +1491 1491 1492 1490 0 0 16 1491 +1492 1492 1493 1491 0 0 16 1492 +1493 1493 1494 1492 0 0 16 1493 +1494 1494 1495 1493 0 0 16 1494 +1495 1495 1496 1494 0 0 16 1495 +1496 1496 1497 1495 0 0 16 1496 +1497 1497 1498 1496 0 0 16 1497 +1498 1498 1499 1497 0 0 16 1498 +1499 1499 1500 1498 0 0 16 1499 +1500 1500 1501 1499 0 0 16 1500 +1501 1501 1502 1500 0 0 16 1501 +1502 1502 1503 1501 0 0 16 1502 +1503 1503 1504 1502 0 0 16 1503 +1504 1504 1505 1503 0 0 16 1504 +1505 1505 1506 1504 0 0 16 1505 +1506 1506 1507 1505 0 0 16 1506 +1507 1507 1508 1506 0 0 16 1507 +1508 1508 1509 1507 0 0 16 1508 +1509 1509 1510 1508 0 0 16 1509 +1510 1510 1511 1509 0 0 16 1510 +1511 1511 1512 1510 0 0 16 1511 +1512 1512 1513 1511 0 0 16 1512 +1513 1513 1514 1512 0 0 16 1513 +1514 1514 1515 1513 0 0 16 1514 +1515 1515 1516 1514 0 0 16 1515 +1516 1516 1517 1515 0 0 16 1516 +1517 1517 1518 1516 0 0 16 1517 +1518 1518 1519 1517 0 0 16 1518 +1519 1519 1520 1518 0 0 16 1519 +1520 1520 1521 1519 0 0 16 1520 +1521 1521 1522 1520 0 0 16 1521 +1522 1522 1523 1521 0 0 16 1522 +1523 1523 1524 1522 0 0 16 1523 +1524 1524 1525 1523 0 0 16 1524 +1525 1525 1526 1524 0 0 16 1525 +1526 1526 1527 1525 0 0 16 1526 +1527 1527 1528 1526 0 0 16 1527 +1528 1528 1529 1527 0 0 16 1528 +1529 1529 1530 1528 0 0 16 1529 +1530 1530 1531 1529 0 0 16 1530 +1531 1531 1532 1530 0 0 16 1531 +1532 1532 1533 1531 0 0 16 1532 +1533 1533 1534 1532 0 0 16 1533 +1534 1534 1535 1533 0 0 16 1534 +1535 1535 1536 1534 0 0 16 1535 +1536 1536 1537 1535 0 0 16 1536 +1537 1537 1538 1536 0 0 16 1537 +1538 1538 1539 1537 0 0 16 1538 +1539 1539 1540 1538 0 0 16 1539 +1540 1540 1541 1539 0 0 16 1540 +1541 1541 1542 1540 0 0 16 1541 +1542 1542 1543 1541 0 0 16 1542 +1543 1543 1544 1542 0 0 16 1543 +1544 1544 1545 1543 0 0 16 1544 +1545 1545 1546 1544 0 0 16 1545 +1546 1546 1547 1545 0 0 16 1546 +1547 1547 1548 1546 0 0 16 1547 +1548 1548 1549 1547 0 0 16 1548 +1549 1549 1550 1548 0 0 16 1549 +1550 1550 1551 1549 0 0 16 1550 +1551 1551 1552 1550 0 0 16 1551 +1552 1552 1553 1551 0 0 16 1552 +1553 1553 1554 1552 0 0 16 1553 +1554 1554 1555 1553 0 0 16 1554 +1555 1555 1556 1554 0 0 16 1555 +1556 1556 1557 1555 0 0 16 1556 +1557 1557 1558 1556 0 0 16 1557 +1558 1558 1559 1557 0 0 16 1558 +1559 1559 1560 1558 0 0 16 1559 +1560 1560 1561 1559 0 0 16 1560 +1561 1561 1562 1560 0 0 16 1561 +1562 1562 1563 1561 0 0 16 1562 +1563 1563 1564 1562 0 0 16 1563 +1564 1564 1565 1563 0 0 16 1564 +1565 1565 1566 1564 0 0 16 1565 +1566 1566 1567 1565 0 0 16 1566 +1567 1567 1568 1566 0 0 16 1567 +1568 1568 1569 1567 0 0 16 1568 +1569 1569 1570 1568 0 0 16 1569 +1570 1570 1571 1569 0 0 16 1570 +1571 1571 1572 1570 0 0 16 1571 +1572 1572 1573 1571 0 0 16 1572 +1573 1573 1574 1572 0 0 16 1573 +1574 1574 1575 1573 0 0 16 1574 +1575 1575 1576 1574 0 0 16 1575 +1576 1576 1577 1575 0 0 16 1576 +1577 1577 1578 1576 0 0 16 1577 +1578 1578 1579 1577 0 0 16 1578 +1579 1579 1580 1578 0 0 16 1579 +1580 1580 1581 1579 0 0 16 1580 +1581 1581 1582 1580 0 0 16 1581 +1582 1582 1583 1581 0 0 16 1582 +1583 1583 1584 1582 0 0 16 1583 +1584 1584 1585 1583 0 0 16 1584 +1585 1585 1586 1584 0 0 16 1585 +1586 1586 1587 1585 0 0 16 1586 +1587 1587 1588 1586 0 0 16 1587 +1588 1588 1589 1587 0 0 16 1588 +1589 1589 1590 1588 0 0 16 1589 +1590 1590 1591 1589 0 0 16 1590 +1591 1591 1592 1590 0 0 16 1591 +1592 1592 1593 1591 0 0 16 1592 +1593 1593 1594 1592 0 0 16 1593 +1594 1594 1595 1593 0 0 16 1594 +1595 1595 1596 1594 0 0 16 1595 +1596 1596 1597 1595 0 0 16 1596 +1597 1597 1598 1596 0 0 16 1597 +1598 1598 1599 1597 0 0 16 1598 +1599 1599 1600 1598 0 0 16 1599 +1600 1600 1601 1599 0 0 16 1600 +1601 1601 1602 1600 0 0 16 1601 +1602 1602 1603 1601 0 0 16 1602 +1603 1603 1604 1602 0 0 16 1603 +1604 1604 1605 1603 0 0 16 1604 +1605 1605 1606 1604 0 0 16 1605 +1606 1606 1607 1605 0 0 16 1606 +1607 1607 1608 1606 0 0 16 1607 +1608 1608 1609 1607 0 0 16 1608 +1609 1609 1610 1608 0 0 16 1609 +1610 1610 1611 1609 0 0 16 1610 +1611 1611 1612 1610 0 0 16 1611 +1612 1612 1613 1611 0 0 16 1612 +1613 1613 1614 1612 0 0 16 1613 +1614 1614 1615 1613 0 0 16 1614 +1615 1615 1616 1614 0 0 16 1615 +1616 1616 1617 1615 0 0 16 1616 +1617 1617 1618 1616 0 0 16 1617 +1618 1618 1619 1617 0 0 16 1618 +1619 1619 1620 1618 0 0 16 1619 +1620 1620 1621 1619 0 0 16 1620 +1621 1621 1622 1620 0 0 16 1621 +1622 1622 1623 1621 0 0 16 1622 +1623 1623 1624 1622 0 0 16 1623 +1624 1624 1625 1623 0 0 16 1624 +1625 1625 1626 1624 0 0 16 1625 +1626 1626 1627 1625 0 0 16 1626 +1627 1627 1628 1626 0 0 16 1627 +1628 1628 1629 1627 0 0 16 1628 +1629 1629 1630 1628 0 0 16 1629 +1630 1630 1631 1629 0 0 16 1630 +1631 1631 1632 1630 0 0 16 1631 +1632 1632 1633 1631 0 0 16 1632 +1633 1633 1634 1632 0 0 16 1633 +1634 1634 1635 1633 0 0 16 1634 +1635 1635 1636 1634 0 0 16 1635 +1636 1636 1637 1635 0 0 16 1636 +1637 1637 1638 1636 0 0 16 1637 +1638 1638 1639 1637 0 0 16 1638 +1639 1639 1640 1638 0 0 16 1639 +1640 1640 1641 1639 0 0 16 1640 +1641 1641 1642 1640 0 0 16 1641 +1642 1642 1643 1641 0 0 16 1642 +1643 1643 1644 1642 0 0 16 1643 +1644 1644 1645 1643 0 0 16 1644 +1645 1645 1646 1644 0 0 16 1645 +1646 1646 1647 1645 0 0 16 1646 +1647 1647 1648 1646 0 0 16 1647 +1648 1648 1649 1647 0 0 16 1648 +1649 1649 1650 1648 0 0 16 1649 +1650 1650 1651 1649 0 0 16 1650 +1651 1651 1652 1650 0 0 16 1651 +1652 1652 1653 1651 0 0 16 1652 +1653 1653 1654 1652 0 0 16 1653 +1654 1654 1655 1653 0 0 16 1654 +1655 1655 1656 1654 0 0 16 1655 +1656 1656 1657 1655 0 0 16 1656 +1657 1657 1658 1656 0 0 16 1657 +1658 1658 1659 1657 0 0 16 1658 +1659 1659 1660 1658 0 0 16 1659 +1660 1660 1661 1659 0 0 16 1660 +1661 1661 1662 1660 0 0 16 1661 +1662 1662 1663 1661 0 0 16 1662 +1663 1663 1664 1662 0 0 16 1663 +1664 1664 1665 1663 0 0 16 1664 +1665 1665 1666 1664 0 0 16 1665 +1666 1666 1667 1665 0 0 16 1666 +1667 1667 1668 1666 0 0 16 1667 +1668 1668 1669 1667 0 0 16 1668 +1669 1669 1670 1668 0 0 16 1669 +1670 1670 1671 1669 0 0 16 1670 +1671 1671 1672 1670 0 0 16 1671 +1672 1672 1673 1671 0 0 16 1672 +1673 1673 1674 1672 0 0 16 1673 +1674 1674 1675 1673 0 0 16 1674 +1675 1675 1676 1674 0 0 16 1675 +1676 1676 1677 1675 0 0 16 1676 +1677 1677 1678 1676 0 0 16 1677 +1678 1678 1679 1677 0 0 16 1678 +1679 1679 1680 1678 0 0 16 1679 +1680 1680 1681 1679 0 0 16 1680 +1681 1681 1682 1680 0 0 16 1681 +1682 1682 1683 1681 0 0 16 1682 +1683 1683 1684 1682 0 0 16 1683 +1684 1684 1685 1683 0 0 16 1684 +1685 1685 1686 1684 0 0 16 1685 +1686 1686 1687 1685 0 0 16 1686 +1687 1687 1688 1686 0 0 16 1687 +1688 1688 1689 1687 0 0 16 1688 +1689 1689 1690 1688 0 0 16 1689 +1690 1690 1691 1689 0 0 16 1690 +1691 1691 1692 1690 0 0 16 1691 +1692 1692 1693 1691 0 0 16 1692 +1693 1693 1694 1692 0 0 16 1693 +1694 1694 1695 1693 0 0 16 1694 +1695 1695 1696 1694 0 0 16 1695 +1696 1696 1697 1695 0 0 16 1696 +1697 1697 1698 1696 0 0 16 1697 +1698 1698 1699 1697 0 0 16 1698 +1699 1699 1700 1698 0 0 16 1699 +1700 1700 1701 1699 0 0 16 1700 +1701 1701 1702 1700 0 0 16 1701 +1702 1702 1703 1701 0 0 16 1702 +1703 1703 1704 1702 0 0 16 1703 +1704 1704 1705 1703 0 0 16 1704 +1705 1705 1706 1704 0 0 16 1705 +1706 1706 1707 1705 0 0 16 1706 +1707 1707 1708 1706 0 0 16 1707 +1708 1708 1709 1707 0 0 16 1708 +1709 1709 1710 1708 0 0 16 1709 +1710 1710 1711 1709 0 0 16 1710 +1711 1711 1712 1710 0 0 16 1711 +1712 1712 1713 1711 0 0 16 1712 +1713 1713 1714 1712 0 0 16 1713 +1714 1714 1715 1713 0 0 16 1714 +1715 1715 1716 1714 0 0 16 1715 +1716 1716 1717 1715 0 0 16 1716 +1717 1717 1718 1716 0 0 16 1717 +1718 1718 1719 1717 0 0 16 1718 +1719 1719 1720 1718 0 0 16 1719 +1720 1720 1721 1719 0 0 16 1720 +1721 1721 1722 1720 0 0 16 1721 +1722 1722 1723 1721 0 0 16 1722 +1723 1723 1724 1722 0 0 16 1723 +1724 1724 1725 1723 0 0 16 1724 +1725 1725 1726 1724 0 0 16 1725 +1726 1726 1727 1725 0 0 16 1726 +1727 1727 1728 1726 0 0 16 1727 +1728 1728 1729 1727 0 0 16 1728 +1729 1729 1730 1728 0 0 16 1729 +1730 1730 1731 1729 0 0 16 1730 +1731 1731 1732 1730 0 0 16 1731 +1732 1732 1733 1731 0 0 16 1732 +1733 1733 1734 1732 0 0 16 1733 +1734 1734 1735 1733 0 0 16 1734 +1735 1735 1736 1734 0 0 16 1735 +1736 1736 1737 1735 0 0 16 1736 +1737 1737 1738 1736 0 0 16 1737 +1738 1738 1739 1737 0 0 16 1738 +1739 1739 1740 1738 0 0 16 1739 +1740 1740 1741 1739 0 0 16 1740 +1741 1741 1742 1740 0 0 16 1741 +1742 1742 1743 1741 0 0 16 1742 +1743 1743 1744 1742 0 0 16 1743 +1744 1744 1745 1743 0 0 16 1744 +1745 1745 1746 1744 0 0 16 1745 +1746 1746 1747 1745 0 0 16 1746 +1747 1747 1748 1746 0 0 16 1747 +1748 1748 1749 1747 0 0 16 1748 +1749 1749 1750 1748 0 0 16 1749 +1750 1750 1751 1749 0 0 16 1750 +1751 1751 1752 1750 0 0 16 1751 +1752 1752 1753 1751 0 0 16 1752 +1753 1753 1754 1752 0 0 16 1753 +1754 1754 1755 1753 0 0 16 1754 +1755 1755 1756 1754 0 0 16 1755 +1756 1756 1757 1755 0 0 16 1756 +1757 1757 1758 1756 0 0 16 1757 +1758 1758 1759 1757 0 0 16 1758 +1759 1759 1760 1758 0 0 16 1759 +1760 1760 1761 1759 0 0 16 1760 +1761 1761 1762 1760 0 0 16 1761 +1762 1762 1763 1761 0 0 16 1762 +1763 1763 1764 1762 0 0 16 1763 +1764 1764 1765 1763 0 0 16 1764 +1765 1765 1766 1764 0 0 16 1765 +1766 1766 1767 1765 0 0 16 1766 +1767 1767 1768 1766 0 0 16 1767 +1768 1768 1769 1767 0 0 16 1768 +1769 1769 1770 1768 0 0 16 1769 +1770 1770 1771 1769 0 0 16 1770 +1771 1771 1772 1770 0 0 16 1771 +1772 1772 1773 1771 0 0 16 1772 +1773 1773 1774 1772 0 0 16 1773 +1774 1774 1775 1773 0 0 16 1774 +1775 1775 1776 1774 0 0 16 1775 +1776 1776 1777 1775 0 0 16 1776 +1777 1777 1778 1776 0 0 16 1777 +1778 1778 1779 1777 0 0 16 1778 +1779 1779 1780 1778 0 0 16 1779 +1780 1780 1781 1779 0 0 16 1780 +1781 1781 1782 1780 0 0 16 1781 +1782 1782 1783 1781 0 0 16 1782 +1783 1783 1784 1782 0 0 16 1783 +1784 1784 1785 1783 0 0 16 1784 +1785 1785 1786 1784 0 0 16 1785 +1786 1786 1787 1785 0 0 16 1786 +1787 1787 1788 1786 0 0 16 1787 +1788 1788 1789 1787 0 0 16 1788 +1789 1789 1790 1788 0 0 16 1789 +1790 1790 1791 1789 0 0 16 1790 +1791 1791 1792 1790 0 0 16 1791 +1792 1792 1793 1791 0 0 16 1792 +1793 1793 1794 1792 0 0 16 1793 +1794 1794 1795 1793 0 0 16 1794 +1795 1795 1796 1794 0 0 16 1795 +1796 1796 1797 1795 0 0 16 1796 +1797 1797 1798 1796 0 0 16 1797 +1798 1798 1799 1797 0 0 16 1798 +1799 1799 1800 1798 0 0 16 1799 +1800 1800 1801 1799 0 0 16 1800 +1801 1801 1802 1800 0 0 16 1801 +1802 1802 1803 1801 0 0 16 1802 +1803 1803 1804 1802 0 0 16 1803 +1804 1804 1805 1803 0 0 16 1804 +1805 1805 1806 1804 0 0 16 1805 +1806 1806 1807 1805 0 0 16 1806 +1807 1807 1808 1806 0 0 16 1807 +1808 1808 1809 1807 0 0 16 1808 +1809 1809 1810 1808 0 0 16 1809 +1810 1810 1811 1809 0 0 16 1810 +1811 1811 1812 1810 0 0 16 1811 +1812 1812 1813 1811 0 0 16 1812 +1813 1813 1814 1812 0 0 16 1813 +1814 1814 1815 1813 0 0 16 1814 +1815 1815 1816 1814 0 0 16 1815 +1816 1816 1817 1815 0 0 16 1816 +1817 1817 1818 1816 0 0 16 1817 +1818 1818 1819 1817 0 0 16 1818 +1819 1819 1820 1818 0 0 16 1819 +1820 1820 1821 1819 0 0 16 1820 +1821 1821 1822 1820 0 0 16 1821 +1822 1822 1823 1821 0 0 16 1822 +1823 1823 1824 1822 0 0 16 1823 +1824 1824 1825 1823 0 0 16 1824 +1825 1825 1826 1824 0 0 16 1825 +1826 1826 1827 1825 0 0 16 1826 +1827 1827 1828 1826 0 0 16 1827 +1828 1828 1829 1827 0 0 16 1828 +1829 1829 1830 1828 0 0 16 1829 +1830 1830 1831 1829 0 0 16 1830 +1831 1831 1832 1830 0 0 16 1831 +1832 1832 1833 1831 0 0 16 1832 +1833 1833 1834 1832 0 0 16 1833 +1834 1834 1835 1833 0 0 16 1834 +1835 1835 1836 1834 0 0 16 1835 +1836 1836 1837 1835 0 0 16 1836 +1837 1837 1838 1836 0 0 16 1837 +1838 1838 1839 1837 0 0 16 1838 +1839 1839 1840 1838 0 0 16 1839 +1840 1840 1841 1839 0 0 16 1840 +1841 1841 1842 1840 0 0 16 1841 +1842 1842 1843 1841 0 0 16 1842 +1843 1843 1844 1842 0 0 16 1843 +1844 1844 1845 1843 0 0 16 1844 +1845 1845 1846 1844 0 0 16 1845 +1846 1846 1847 1845 0 0 16 1846 +1847 1847 1848 1846 0 0 16 1847 +1848 1848 1849 1847 0 0 16 1848 +1849 1849 1850 1848 0 0 16 1849 +1850 1850 1851 1849 0 0 16 1850 +1851 1851 1852 1850 0 0 16 1851 +1852 1852 1853 1851 0 0 16 1852 +1853 1853 1854 1852 0 0 16 1853 +1854 1854 1855 1853 0 0 16 1854 +1855 1855 1856 1854 0 0 16 1855 +1856 1856 1857 1855 0 0 16 1856 +1857 1857 1858 1856 0 0 16 1857 +1858 1858 1859 1857 0 0 16 1858 +1859 1859 1860 1858 0 0 16 1859 +1860 1860 1861 1859 0 0 16 1860 +1861 1861 1862 1860 0 0 16 1861 +1862 1862 1863 1861 0 0 16 1862 +1863 1863 1864 1862 0 0 16 1863 +1864 1864 1865 1863 0 0 16 1864 +1865 1865 1866 1864 0 0 16 1865 +1866 1866 1867 1865 0 0 16 1866 +1867 1867 1868 1866 0 0 16 1867 +1868 1868 1869 1867 0 0 16 1868 +1869 1869 1870 1868 0 0 16 1869 +1870 1870 1871 1869 0 0 16 1870 +1871 1871 1872 1870 0 0 16 1871 +1872 1872 1873 1871 0 0 16 1872 +1873 1873 1874 1872 0 0 16 1873 +1874 1874 1875 1873 0 0 16 1874 +1875 1875 1876 1874 0 0 16 1875 +1876 1876 1877 1875 0 0 16 1876 +1877 1877 1878 1876 0 0 16 1877 +1878 1878 1879 1877 0 0 16 1878 +1879 1879 1880 1878 0 0 16 1879 +1880 1880 1881 1879 0 0 16 1880 +1881 1881 1882 1880 0 0 16 1881 +1882 1882 1883 1881 0 0 16 1882 +1883 1883 1884 1882 0 0 16 1883 +1884 1884 1885 1883 0 0 16 1884 +1885 1885 1886 1884 0 0 16 1885 +1886 1886 1887 1885 0 0 16 1886 +1887 1887 1888 1886 0 0 16 1887 +1888 1888 1889 1887 0 0 16 1888 +1889 1889 1890 1888 0 0 16 1889 +1890 1890 1891 1889 0 0 16 1890 +1891 1891 1892 1890 0 0 16 1891 +1892 1892 1893 1891 0 0 16 1892 +1893 1893 1894 1892 0 0 16 1893 +1894 1894 1895 1893 0 0 16 1894 +1895 1895 1896 1894 0 0 16 1895 +1896 1896 1897 1895 0 0 16 1896 +1897 1897 1898 1896 0 0 16 1897 +1898 1898 1899 1897 0 0 16 1898 +1899 1899 1900 1898 0 0 16 1899 +1900 1900 1901 1899 0 0 16 1900 +1901 1901 1902 1900 0 0 16 1901 +1902 1902 1903 1901 0 0 16 1902 +1903 1903 1904 1902 0 0 16 1903 +1904 1904 1905 1903 0 0 16 1904 +1905 1905 1906 1904 0 0 16 1905 +1906 1906 1907 1905 0 0 16 1906 +1907 1907 1908 1906 0 0 16 1907 +1908 1908 1909 1907 0 0 16 1908 +1909 1909 1910 1908 0 0 16 1909 +1910 1910 1911 1909 0 0 16 1910 +1911 1911 1912 1910 0 0 16 1911 +1912 1912 1913 1911 0 0 16 1912 +1913 1913 1914 1912 0 0 16 1913 +1914 1914 1915 1913 0 0 16 1914 +1915 1915 1916 1914 0 0 16 1915 +1916 1916 1917 1915 0 0 16 1916 +1917 1917 1918 1916 0 0 16 1917 +1918 1918 1919 1917 0 0 16 1918 +1919 1919 1920 1918 0 0 16 1919 +1920 1920 1921 1919 0 0 16 1920 +1921 1921 1922 1920 0 0 16 1921 +1922 1922 1923 1921 0 0 16 1922 +1923 1923 1924 1922 0 0 16 1923 +1924 1924 1925 1923 0 0 16 1924 +1925 1925 1926 1924 0 0 16 1925 +1926 1926 1927 1925 0 0 16 1926 +1927 1927 1928 1926 0 0 16 1927 +1928 1928 1929 1927 0 0 16 1928 +1929 1929 1930 1928 0 0 16 1929 +1930 1930 1931 1929 0 0 16 1930 +1931 1931 1932 1930 0 0 16 1931 +1932 1932 1933 1931 0 0 16 1932 +1933 1933 1934 1932 0 0 16 1933 +1934 1934 1935 1933 0 0 16 1934 +1935 1935 1936 1934 0 0 16 1935 +1936 1936 1937 1935 0 0 16 1936 +1937 1937 1938 1936 0 0 16 1937 +1938 1938 1939 1937 0 0 16 1938 +1939 1939 1940 1938 0 0 16 1939 +1940 1940 1941 1939 0 0 16 1940 +1941 1941 1942 1940 0 0 16 1941 +1942 1942 1943 1941 0 0 16 1942 +1943 1943 1944 1942 0 0 16 1943 +1944 1944 1945 1943 0 0 16 1944 +1945 1945 1946 1944 0 0 16 1945 +1946 1946 1947 1945 0 0 16 1946 +1947 1947 1948 1946 0 0 16 1947 +1948 1948 1949 1947 0 0 16 1948 +1949 1949 1950 1948 0 0 16 1949 +1950 1950 1951 1949 0 0 16 1950 +1951 1951 1952 1950 0 0 16 1951 +1952 1952 1953 1951 0 0 16 1952 +1953 1953 1954 1952 0 0 16 1953 +1954 1954 1955 1953 0 0 16 1954 +1955 1955 1956 1954 0 0 16 1955 +1956 1956 1957 1955 0 0 16 1956 +1957 1957 1958 1956 0 0 16 1957 +1958 1958 1959 1957 0 0 16 1958 +1959 1959 1960 1958 0 0 16 1959 +1960 1960 1961 1959 0 0 16 1960 +1961 1961 1962 1960 0 0 16 1961 +1962 1962 1963 1961 0 0 16 1962 +1963 1963 1964 1962 0 0 16 1963 +1964 1964 1965 1963 0 0 16 1964 +1965 1965 1966 1964 0 0 16 1965 +1966 1966 1967 1965 0 0 16 1966 +1967 1967 1968 1966 0 0 16 1967 +1968 1968 1969 1967 0 0 16 1968 +1969 1969 1970 1968 0 0 16 1969 +1970 1970 1971 1969 0 0 16 1970 +1971 1971 1972 1970 0 0 16 1971 +1972 1972 1973 1971 0 0 16 1972 +1973 1973 1974 1972 0 0 16 1973 +1974 1974 1975 1973 0 0 16 1974 +1975 1975 1976 1974 0 0 16 1975 +1976 1976 1977 1975 0 0 16 1976 +1977 1977 1978 1976 0 0 16 1977 +1978 1978 1979 1977 0 0 16 1978 +1979 1979 1980 1978 0 0 16 1979 +1980 1980 1981 1979 0 0 16 1980 +1981 1981 1982 1980 0 0 16 1981 +1982 1982 1983 1981 0 0 16 1982 +1983 1983 1984 1982 0 0 16 1983 +1984 1984 1985 1983 0 0 16 1984 +1985 1985 1986 1984 0 0 16 1985 +1986 1986 1987 1985 0 0 16 1986 +1987 1987 1988 1986 0 0 16 1987 +1988 1988 1989 1987 0 0 16 1988 +1989 1989 1990 1988 0 0 16 1989 +1990 1990 1991 1989 0 0 16 1990 +1991 1991 1992 1990 0 0 16 1991 +1992 1992 1993 1991 0 0 16 1992 +1993 1993 1994 1992 0 0 16 1993 +1994 1994 1995 1993 0 0 16 1994 +1995 1995 1996 1994 0 0 16 1995 +1996 1996 1997 1995 0 0 16 1996 +1997 1997 1998 1996 0 0 16 1997 +1998 1998 1999 1997 0 0 16 1998 +1999 1999 2000 1998 0 0 16 1999 +2000 2000 2001 1999 0 0 16 2000 +2001 2001 2002 2000 0 0 16 2001 +2002 2002 2003 2001 0 0 16 2002 +2003 2003 2004 2002 0 0 16 2003 +2004 2004 2005 2003 0 0 16 2004 +2005 2005 2006 2004 0 0 16 2005 +2006 2006 2007 2005 0 0 16 2006 +2007 2007 2008 2006 0 0 16 2007 +2008 2008 2009 2007 0 0 16 2008 +2009 2009 2010 2008 0 0 16 2009 +2010 2010 2011 2009 0 0 16 2010 +2011 2011 2012 2010 0 0 16 2011 +2012 2012 2013 2011 0 0 16 2012 +2013 2013 2014 2012 0 0 16 2013 +2014 2014 2015 2013 0 0 16 2014 +2015 2015 2016 2014 0 0 16 2015 +2016 2016 2017 2015 0 0 16 2016 +2017 2017 2018 2016 0 0 16 2017 +2018 2018 2019 2017 0 0 16 2018 +2019 2019 2020 2018 0 0 16 2019 +2020 2020 2021 2019 0 0 16 2020 +2021 2021 2022 2020 0 0 16 2021 +2022 2022 2023 2021 0 0 16 2022 +2023 2023 2024 2022 0 0 16 2023 +2024 2024 2025 2023 0 0 16 2024 +2025 2025 2026 2024 0 0 16 2025 +2026 2026 2027 2025 0 0 16 2026 +2027 2027 2028 2026 0 0 16 2027 +2028 2028 2029 2027 0 0 16 2028 +2029 2029 2030 2028 0 0 16 2029 +2030 2030 2031 2029 0 0 16 2030 +2031 2031 2032 2030 0 0 16 2031 +2032 2032 2033 2031 0 0 16 2032 +2033 2033 2034 2032 0 0 16 2033 +2034 2034 2035 2033 0 0 16 2034 +2035 2035 2036 2034 0 0 16 2035 +2036 2036 2037 2035 0 0 16 2036 +2037 2037 2038 2036 0 0 16 2037 +2038 2038 2039 2037 0 0 16 2038 +2039 2039 2040 2038 0 0 16 2039 +2040 2040 2041 2039 0 0 16 2040 +2041 2041 2042 2040 0 0 16 2041 +2042 2042 2043 2041 0 0 16 2042 +2043 2043 2044 2042 0 0 16 2043 +2044 2044 2045 2043 0 0 16 2044 +2045 2045 2046 2044 0 0 16 2045 +2046 2046 0 2045 0 0 16 2046 ====================================================== -=== [Queue after-full] Next: 0 First: 1 Last: 1023 +=== [Queue after-full] Next: 0 First: 1 Last: 2047 # seq next prev timeout retrans type cbp -0 0 1023 1022 0 0 16 0 +0 0 2047 2046 0 0 16 0 1 1 2 -1 0 0 16 1 2 2 3 1 0 0 16 2 3 3 4 2 0 0 16 3 @@ -3108,12 +5156,1036 @@ 1019 1019 1020 1018 0 0 16 1019 1020 1020 1021 1019 0 0 16 1020 1021 1021 1022 1020 0 0 16 1021 -1022 1022 0 1021 0 0 16 1022 -1023 1023 -1 0 0 0 16 1023 +1022 1022 1023 1021 0 0 16 1022 +1023 1023 1024 1022 0 0 16 1023 +1024 1024 1025 1023 0 0 16 1024 +1025 1025 1026 1024 0 0 16 1025 +1026 1026 1027 1025 0 0 16 1026 +1027 1027 1028 1026 0 0 16 1027 +1028 1028 1029 1027 0 0 16 1028 +1029 1029 1030 1028 0 0 16 1029 +1030 1030 1031 1029 0 0 16 1030 +1031 1031 1032 1030 0 0 16 1031 +1032 1032 1033 1031 0 0 16 1032 +1033 1033 1034 1032 0 0 16 1033 +1034 1034 1035 1033 0 0 16 1034 +1035 1035 1036 1034 0 0 16 1035 +1036 1036 1037 1035 0 0 16 1036 +1037 1037 1038 1036 0 0 16 1037 +1038 1038 1039 1037 0 0 16 1038 +1039 1039 1040 1038 0 0 16 1039 +1040 1040 1041 1039 0 0 16 1040 +1041 1041 1042 1040 0 0 16 1041 +1042 1042 1043 1041 0 0 16 1042 +1043 1043 1044 1042 0 0 16 1043 +1044 1044 1045 1043 0 0 16 1044 +1045 1045 1046 1044 0 0 16 1045 +1046 1046 1047 1045 0 0 16 1046 +1047 1047 1048 1046 0 0 16 1047 +1048 1048 1049 1047 0 0 16 1048 +1049 1049 1050 1048 0 0 16 1049 +1050 1050 1051 1049 0 0 16 1050 +1051 1051 1052 1050 0 0 16 1051 +1052 1052 1053 1051 0 0 16 1052 +1053 1053 1054 1052 0 0 16 1053 +1054 1054 1055 1053 0 0 16 1054 +1055 1055 1056 1054 0 0 16 1055 +1056 1056 1057 1055 0 0 16 1056 +1057 1057 1058 1056 0 0 16 1057 +1058 1058 1059 1057 0 0 16 1058 +1059 1059 1060 1058 0 0 16 1059 +1060 1060 1061 1059 0 0 16 1060 +1061 1061 1062 1060 0 0 16 1061 +1062 1062 1063 1061 0 0 16 1062 +1063 1063 1064 1062 0 0 16 1063 +1064 1064 1065 1063 0 0 16 1064 +1065 1065 1066 1064 0 0 16 1065 +1066 1066 1067 1065 0 0 16 1066 +1067 1067 1068 1066 0 0 16 1067 +1068 1068 1069 1067 0 0 16 1068 +1069 1069 1070 1068 0 0 16 1069 +1070 1070 1071 1069 0 0 16 1070 +1071 1071 1072 1070 0 0 16 1071 +1072 1072 1073 1071 0 0 16 1072 +1073 1073 1074 1072 0 0 16 1073 +1074 1074 1075 1073 0 0 16 1074 +1075 1075 1076 1074 0 0 16 1075 +1076 1076 1077 1075 0 0 16 1076 +1077 1077 1078 1076 0 0 16 1077 +1078 1078 1079 1077 0 0 16 1078 +1079 1079 1080 1078 0 0 16 1079 +1080 1080 1081 1079 0 0 16 1080 +1081 1081 1082 1080 0 0 16 1081 +1082 1082 1083 1081 0 0 16 1082 +1083 1083 1084 1082 0 0 16 1083 +1084 1084 1085 1083 0 0 16 1084 +1085 1085 1086 1084 0 0 16 1085 +1086 1086 1087 1085 0 0 16 1086 +1087 1087 1088 1086 0 0 16 1087 +1088 1088 1089 1087 0 0 16 1088 +1089 1089 1090 1088 0 0 16 1089 +1090 1090 1091 1089 0 0 16 1090 +1091 1091 1092 1090 0 0 16 1091 +1092 1092 1093 1091 0 0 16 1092 +1093 1093 1094 1092 0 0 16 1093 +1094 1094 1095 1093 0 0 16 1094 +1095 1095 1096 1094 0 0 16 1095 +1096 1096 1097 1095 0 0 16 1096 +1097 1097 1098 1096 0 0 16 1097 +1098 1098 1099 1097 0 0 16 1098 +1099 1099 1100 1098 0 0 16 1099 +1100 1100 1101 1099 0 0 16 1100 +1101 1101 1102 1100 0 0 16 1101 +1102 1102 1103 1101 0 0 16 1102 +1103 1103 1104 1102 0 0 16 1103 +1104 1104 1105 1103 0 0 16 1104 +1105 1105 1106 1104 0 0 16 1105 +1106 1106 1107 1105 0 0 16 1106 +1107 1107 1108 1106 0 0 16 1107 +1108 1108 1109 1107 0 0 16 1108 +1109 1109 1110 1108 0 0 16 1109 +1110 1110 1111 1109 0 0 16 1110 +1111 1111 1112 1110 0 0 16 1111 +1112 1112 1113 1111 0 0 16 1112 +1113 1113 1114 1112 0 0 16 1113 +1114 1114 1115 1113 0 0 16 1114 +1115 1115 1116 1114 0 0 16 1115 +1116 1116 1117 1115 0 0 16 1116 +1117 1117 1118 1116 0 0 16 1117 +1118 1118 1119 1117 0 0 16 1118 +1119 1119 1120 1118 0 0 16 1119 +1120 1120 1121 1119 0 0 16 1120 +1121 1121 1122 1120 0 0 16 1121 +1122 1122 1123 1121 0 0 16 1122 +1123 1123 1124 1122 0 0 16 1123 +1124 1124 1125 1123 0 0 16 1124 +1125 1125 1126 1124 0 0 16 1125 +1126 1126 1127 1125 0 0 16 1126 +1127 1127 1128 1126 0 0 16 1127 +1128 1128 1129 1127 0 0 16 1128 +1129 1129 1130 1128 0 0 16 1129 +1130 1130 1131 1129 0 0 16 1130 +1131 1131 1132 1130 0 0 16 1131 +1132 1132 1133 1131 0 0 16 1132 +1133 1133 1134 1132 0 0 16 1133 +1134 1134 1135 1133 0 0 16 1134 +1135 1135 1136 1134 0 0 16 1135 +1136 1136 1137 1135 0 0 16 1136 +1137 1137 1138 1136 0 0 16 1137 +1138 1138 1139 1137 0 0 16 1138 +1139 1139 1140 1138 0 0 16 1139 +1140 1140 1141 1139 0 0 16 1140 +1141 1141 1142 1140 0 0 16 1141 +1142 1142 1143 1141 0 0 16 1142 +1143 1143 1144 1142 0 0 16 1143 +1144 1144 1145 1143 0 0 16 1144 +1145 1145 1146 1144 0 0 16 1145 +1146 1146 1147 1145 0 0 16 1146 +1147 1147 1148 1146 0 0 16 1147 +1148 1148 1149 1147 0 0 16 1148 +1149 1149 1150 1148 0 0 16 1149 +1150 1150 1151 1149 0 0 16 1150 +1151 1151 1152 1150 0 0 16 1151 +1152 1152 1153 1151 0 0 16 1152 +1153 1153 1154 1152 0 0 16 1153 +1154 1154 1155 1153 0 0 16 1154 +1155 1155 1156 1154 0 0 16 1155 +1156 1156 1157 1155 0 0 16 1156 +1157 1157 1158 1156 0 0 16 1157 +1158 1158 1159 1157 0 0 16 1158 +1159 1159 1160 1158 0 0 16 1159 +1160 1160 1161 1159 0 0 16 1160 +1161 1161 1162 1160 0 0 16 1161 +1162 1162 1163 1161 0 0 16 1162 +1163 1163 1164 1162 0 0 16 1163 +1164 1164 1165 1163 0 0 16 1164 +1165 1165 1166 1164 0 0 16 1165 +1166 1166 1167 1165 0 0 16 1166 +1167 1167 1168 1166 0 0 16 1167 +1168 1168 1169 1167 0 0 16 1168 +1169 1169 1170 1168 0 0 16 1169 +1170 1170 1171 1169 0 0 16 1170 +1171 1171 1172 1170 0 0 16 1171 +1172 1172 1173 1171 0 0 16 1172 +1173 1173 1174 1172 0 0 16 1173 +1174 1174 1175 1173 0 0 16 1174 +1175 1175 1176 1174 0 0 16 1175 +1176 1176 1177 1175 0 0 16 1176 +1177 1177 1178 1176 0 0 16 1177 +1178 1178 1179 1177 0 0 16 1178 +1179 1179 1180 1178 0 0 16 1179 +1180 1180 1181 1179 0 0 16 1180 +1181 1181 1182 1180 0 0 16 1181 +1182 1182 1183 1181 0 0 16 1182 +1183 1183 1184 1182 0 0 16 1183 +1184 1184 1185 1183 0 0 16 1184 +1185 1185 1186 1184 0 0 16 1185 +1186 1186 1187 1185 0 0 16 1186 +1187 1187 1188 1186 0 0 16 1187 +1188 1188 1189 1187 0 0 16 1188 +1189 1189 1190 1188 0 0 16 1189 +1190 1190 1191 1189 0 0 16 1190 +1191 1191 1192 1190 0 0 16 1191 +1192 1192 1193 1191 0 0 16 1192 +1193 1193 1194 1192 0 0 16 1193 +1194 1194 1195 1193 0 0 16 1194 +1195 1195 1196 1194 0 0 16 1195 +1196 1196 1197 1195 0 0 16 1196 +1197 1197 1198 1196 0 0 16 1197 +1198 1198 1199 1197 0 0 16 1198 +1199 1199 1200 1198 0 0 16 1199 +1200 1200 1201 1199 0 0 16 1200 +1201 1201 1202 1200 0 0 16 1201 +1202 1202 1203 1201 0 0 16 1202 +1203 1203 1204 1202 0 0 16 1203 +1204 1204 1205 1203 0 0 16 1204 +1205 1205 1206 1204 0 0 16 1205 +1206 1206 1207 1205 0 0 16 1206 +1207 1207 1208 1206 0 0 16 1207 +1208 1208 1209 1207 0 0 16 1208 +1209 1209 1210 1208 0 0 16 1209 +1210 1210 1211 1209 0 0 16 1210 +1211 1211 1212 1210 0 0 16 1211 +1212 1212 1213 1211 0 0 16 1212 +1213 1213 1214 1212 0 0 16 1213 +1214 1214 1215 1213 0 0 16 1214 +1215 1215 1216 1214 0 0 16 1215 +1216 1216 1217 1215 0 0 16 1216 +1217 1217 1218 1216 0 0 16 1217 +1218 1218 1219 1217 0 0 16 1218 +1219 1219 1220 1218 0 0 16 1219 +1220 1220 1221 1219 0 0 16 1220 +1221 1221 1222 1220 0 0 16 1221 +1222 1222 1223 1221 0 0 16 1222 +1223 1223 1224 1222 0 0 16 1223 +1224 1224 1225 1223 0 0 16 1224 +1225 1225 1226 1224 0 0 16 1225 +1226 1226 1227 1225 0 0 16 1226 +1227 1227 1228 1226 0 0 16 1227 +1228 1228 1229 1227 0 0 16 1228 +1229 1229 1230 1228 0 0 16 1229 +1230 1230 1231 1229 0 0 16 1230 +1231 1231 1232 1230 0 0 16 1231 +1232 1232 1233 1231 0 0 16 1232 +1233 1233 1234 1232 0 0 16 1233 +1234 1234 1235 1233 0 0 16 1234 +1235 1235 1236 1234 0 0 16 1235 +1236 1236 1237 1235 0 0 16 1236 +1237 1237 1238 1236 0 0 16 1237 +1238 1238 1239 1237 0 0 16 1238 +1239 1239 1240 1238 0 0 16 1239 +1240 1240 1241 1239 0 0 16 1240 +1241 1241 1242 1240 0 0 16 1241 +1242 1242 1243 1241 0 0 16 1242 +1243 1243 1244 1242 0 0 16 1243 +1244 1244 1245 1243 0 0 16 1244 +1245 1245 1246 1244 0 0 16 1245 +1246 1246 1247 1245 0 0 16 1246 +1247 1247 1248 1246 0 0 16 1247 +1248 1248 1249 1247 0 0 16 1248 +1249 1249 1250 1248 0 0 16 1249 +1250 1250 1251 1249 0 0 16 1250 +1251 1251 1252 1250 0 0 16 1251 +1252 1252 1253 1251 0 0 16 1252 +1253 1253 1254 1252 0 0 16 1253 +1254 1254 1255 1253 0 0 16 1254 +1255 1255 1256 1254 0 0 16 1255 +1256 1256 1257 1255 0 0 16 1256 +1257 1257 1258 1256 0 0 16 1257 +1258 1258 1259 1257 0 0 16 1258 +1259 1259 1260 1258 0 0 16 1259 +1260 1260 1261 1259 0 0 16 1260 +1261 1261 1262 1260 0 0 16 1261 +1262 1262 1263 1261 0 0 16 1262 +1263 1263 1264 1262 0 0 16 1263 +1264 1264 1265 1263 0 0 16 1264 +1265 1265 1266 1264 0 0 16 1265 +1266 1266 1267 1265 0 0 16 1266 +1267 1267 1268 1266 0 0 16 1267 +1268 1268 1269 1267 0 0 16 1268 +1269 1269 1270 1268 0 0 16 1269 +1270 1270 1271 1269 0 0 16 1270 +1271 1271 1272 1270 0 0 16 1271 +1272 1272 1273 1271 0 0 16 1272 +1273 1273 1274 1272 0 0 16 1273 +1274 1274 1275 1273 0 0 16 1274 +1275 1275 1276 1274 0 0 16 1275 +1276 1276 1277 1275 0 0 16 1276 +1277 1277 1278 1276 0 0 16 1277 +1278 1278 1279 1277 0 0 16 1278 +1279 1279 1280 1278 0 0 16 1279 +1280 1280 1281 1279 0 0 16 1280 +1281 1281 1282 1280 0 0 16 1281 +1282 1282 1283 1281 0 0 16 1282 +1283 1283 1284 1282 0 0 16 1283 +1284 1284 1285 1283 0 0 16 1284 +1285 1285 1286 1284 0 0 16 1285 +1286 1286 1287 1285 0 0 16 1286 +1287 1287 1288 1286 0 0 16 1287 +1288 1288 1289 1287 0 0 16 1288 +1289 1289 1290 1288 0 0 16 1289 +1290 1290 1291 1289 0 0 16 1290 +1291 1291 1292 1290 0 0 16 1291 +1292 1292 1293 1291 0 0 16 1292 +1293 1293 1294 1292 0 0 16 1293 +1294 1294 1295 1293 0 0 16 1294 +1295 1295 1296 1294 0 0 16 1295 +1296 1296 1297 1295 0 0 16 1296 +1297 1297 1298 1296 0 0 16 1297 +1298 1298 1299 1297 0 0 16 1298 +1299 1299 1300 1298 0 0 16 1299 +1300 1300 1301 1299 0 0 16 1300 +1301 1301 1302 1300 0 0 16 1301 +1302 1302 1303 1301 0 0 16 1302 +1303 1303 1304 1302 0 0 16 1303 +1304 1304 1305 1303 0 0 16 1304 +1305 1305 1306 1304 0 0 16 1305 +1306 1306 1307 1305 0 0 16 1306 +1307 1307 1308 1306 0 0 16 1307 +1308 1308 1309 1307 0 0 16 1308 +1309 1309 1310 1308 0 0 16 1309 +1310 1310 1311 1309 0 0 16 1310 +1311 1311 1312 1310 0 0 16 1311 +1312 1312 1313 1311 0 0 16 1312 +1313 1313 1314 1312 0 0 16 1313 +1314 1314 1315 1313 0 0 16 1314 +1315 1315 1316 1314 0 0 16 1315 +1316 1316 1317 1315 0 0 16 1316 +1317 1317 1318 1316 0 0 16 1317 +1318 1318 1319 1317 0 0 16 1318 +1319 1319 1320 1318 0 0 16 1319 +1320 1320 1321 1319 0 0 16 1320 +1321 1321 1322 1320 0 0 16 1321 +1322 1322 1323 1321 0 0 16 1322 +1323 1323 1324 1322 0 0 16 1323 +1324 1324 1325 1323 0 0 16 1324 +1325 1325 1326 1324 0 0 16 1325 +1326 1326 1327 1325 0 0 16 1326 +1327 1327 1328 1326 0 0 16 1327 +1328 1328 1329 1327 0 0 16 1328 +1329 1329 1330 1328 0 0 16 1329 +1330 1330 1331 1329 0 0 16 1330 +1331 1331 1332 1330 0 0 16 1331 +1332 1332 1333 1331 0 0 16 1332 +1333 1333 1334 1332 0 0 16 1333 +1334 1334 1335 1333 0 0 16 1334 +1335 1335 1336 1334 0 0 16 1335 +1336 1336 1337 1335 0 0 16 1336 +1337 1337 1338 1336 0 0 16 1337 +1338 1338 1339 1337 0 0 16 1338 +1339 1339 1340 1338 0 0 16 1339 +1340 1340 1341 1339 0 0 16 1340 +1341 1341 1342 1340 0 0 16 1341 +1342 1342 1343 1341 0 0 16 1342 +1343 1343 1344 1342 0 0 16 1343 +1344 1344 1345 1343 0 0 16 1344 +1345 1345 1346 1344 0 0 16 1345 +1346 1346 1347 1345 0 0 16 1346 +1347 1347 1348 1346 0 0 16 1347 +1348 1348 1349 1347 0 0 16 1348 +1349 1349 1350 1348 0 0 16 1349 +1350 1350 1351 1349 0 0 16 1350 +1351 1351 1352 1350 0 0 16 1351 +1352 1352 1353 1351 0 0 16 1352 +1353 1353 1354 1352 0 0 16 1353 +1354 1354 1355 1353 0 0 16 1354 +1355 1355 1356 1354 0 0 16 1355 +1356 1356 1357 1355 0 0 16 1356 +1357 1357 1358 1356 0 0 16 1357 +1358 1358 1359 1357 0 0 16 1358 +1359 1359 1360 1358 0 0 16 1359 +1360 1360 1361 1359 0 0 16 1360 +1361 1361 1362 1360 0 0 16 1361 +1362 1362 1363 1361 0 0 16 1362 +1363 1363 1364 1362 0 0 16 1363 +1364 1364 1365 1363 0 0 16 1364 +1365 1365 1366 1364 0 0 16 1365 +1366 1366 1367 1365 0 0 16 1366 +1367 1367 1368 1366 0 0 16 1367 +1368 1368 1369 1367 0 0 16 1368 +1369 1369 1370 1368 0 0 16 1369 +1370 1370 1371 1369 0 0 16 1370 +1371 1371 1372 1370 0 0 16 1371 +1372 1372 1373 1371 0 0 16 1372 +1373 1373 1374 1372 0 0 16 1373 +1374 1374 1375 1373 0 0 16 1374 +1375 1375 1376 1374 0 0 16 1375 +1376 1376 1377 1375 0 0 16 1376 +1377 1377 1378 1376 0 0 16 1377 +1378 1378 1379 1377 0 0 16 1378 +1379 1379 1380 1378 0 0 16 1379 +1380 1380 1381 1379 0 0 16 1380 +1381 1381 1382 1380 0 0 16 1381 +1382 1382 1383 1381 0 0 16 1382 +1383 1383 1384 1382 0 0 16 1383 +1384 1384 1385 1383 0 0 16 1384 +1385 1385 1386 1384 0 0 16 1385 +1386 1386 1387 1385 0 0 16 1386 +1387 1387 1388 1386 0 0 16 1387 +1388 1388 1389 1387 0 0 16 1388 +1389 1389 1390 1388 0 0 16 1389 +1390 1390 1391 1389 0 0 16 1390 +1391 1391 1392 1390 0 0 16 1391 +1392 1392 1393 1391 0 0 16 1392 +1393 1393 1394 1392 0 0 16 1393 +1394 1394 1395 1393 0 0 16 1394 +1395 1395 1396 1394 0 0 16 1395 +1396 1396 1397 1395 0 0 16 1396 +1397 1397 1398 1396 0 0 16 1397 +1398 1398 1399 1397 0 0 16 1398 +1399 1399 1400 1398 0 0 16 1399 +1400 1400 1401 1399 0 0 16 1400 +1401 1401 1402 1400 0 0 16 1401 +1402 1402 1403 1401 0 0 16 1402 +1403 1403 1404 1402 0 0 16 1403 +1404 1404 1405 1403 0 0 16 1404 +1405 1405 1406 1404 0 0 16 1405 +1406 1406 1407 1405 0 0 16 1406 +1407 1407 1408 1406 0 0 16 1407 +1408 1408 1409 1407 0 0 16 1408 +1409 1409 1410 1408 0 0 16 1409 +1410 1410 1411 1409 0 0 16 1410 +1411 1411 1412 1410 0 0 16 1411 +1412 1412 1413 1411 0 0 16 1412 +1413 1413 1414 1412 0 0 16 1413 +1414 1414 1415 1413 0 0 16 1414 +1415 1415 1416 1414 0 0 16 1415 +1416 1416 1417 1415 0 0 16 1416 +1417 1417 1418 1416 0 0 16 1417 +1418 1418 1419 1417 0 0 16 1418 +1419 1419 1420 1418 0 0 16 1419 +1420 1420 1421 1419 0 0 16 1420 +1421 1421 1422 1420 0 0 16 1421 +1422 1422 1423 1421 0 0 16 1422 +1423 1423 1424 1422 0 0 16 1423 +1424 1424 1425 1423 0 0 16 1424 +1425 1425 1426 1424 0 0 16 1425 +1426 1426 1427 1425 0 0 16 1426 +1427 1427 1428 1426 0 0 16 1427 +1428 1428 1429 1427 0 0 16 1428 +1429 1429 1430 1428 0 0 16 1429 +1430 1430 1431 1429 0 0 16 1430 +1431 1431 1432 1430 0 0 16 1431 +1432 1432 1433 1431 0 0 16 1432 +1433 1433 1434 1432 0 0 16 1433 +1434 1434 1435 1433 0 0 16 1434 +1435 1435 1436 1434 0 0 16 1435 +1436 1436 1437 1435 0 0 16 1436 +1437 1437 1438 1436 0 0 16 1437 +1438 1438 1439 1437 0 0 16 1438 +1439 1439 1440 1438 0 0 16 1439 +1440 1440 1441 1439 0 0 16 1440 +1441 1441 1442 1440 0 0 16 1441 +1442 1442 1443 1441 0 0 16 1442 +1443 1443 1444 1442 0 0 16 1443 +1444 1444 1445 1443 0 0 16 1444 +1445 1445 1446 1444 0 0 16 1445 +1446 1446 1447 1445 0 0 16 1446 +1447 1447 1448 1446 0 0 16 1447 +1448 1448 1449 1447 0 0 16 1448 +1449 1449 1450 1448 0 0 16 1449 +1450 1450 1451 1449 0 0 16 1450 +1451 1451 1452 1450 0 0 16 1451 +1452 1452 1453 1451 0 0 16 1452 +1453 1453 1454 1452 0 0 16 1453 +1454 1454 1455 1453 0 0 16 1454 +1455 1455 1456 1454 0 0 16 1455 +1456 1456 1457 1455 0 0 16 1456 +1457 1457 1458 1456 0 0 16 1457 +1458 1458 1459 1457 0 0 16 1458 +1459 1459 1460 1458 0 0 16 1459 +1460 1460 1461 1459 0 0 16 1460 +1461 1461 1462 1460 0 0 16 1461 +1462 1462 1463 1461 0 0 16 1462 +1463 1463 1464 1462 0 0 16 1463 +1464 1464 1465 1463 0 0 16 1464 +1465 1465 1466 1464 0 0 16 1465 +1466 1466 1467 1465 0 0 16 1466 +1467 1467 1468 1466 0 0 16 1467 +1468 1468 1469 1467 0 0 16 1468 +1469 1469 1470 1468 0 0 16 1469 +1470 1470 1471 1469 0 0 16 1470 +1471 1471 1472 1470 0 0 16 1471 +1472 1472 1473 1471 0 0 16 1472 +1473 1473 1474 1472 0 0 16 1473 +1474 1474 1475 1473 0 0 16 1474 +1475 1475 1476 1474 0 0 16 1475 +1476 1476 1477 1475 0 0 16 1476 +1477 1477 1478 1476 0 0 16 1477 +1478 1478 1479 1477 0 0 16 1478 +1479 1479 1480 1478 0 0 16 1479 +1480 1480 1481 1479 0 0 16 1480 +1481 1481 1482 1480 0 0 16 1481 +1482 1482 1483 1481 0 0 16 1482 +1483 1483 1484 1482 0 0 16 1483 +1484 1484 1485 1483 0 0 16 1484 +1485 1485 1486 1484 0 0 16 1485 +1486 1486 1487 1485 0 0 16 1486 +1487 1487 1488 1486 0 0 16 1487 +1488 1488 1489 1487 0 0 16 1488 +1489 1489 1490 1488 0 0 16 1489 +1490 1490 1491 1489 0 0 16 1490 +1491 1491 1492 1490 0 0 16 1491 +1492 1492 1493 1491 0 0 16 1492 +1493 1493 1494 1492 0 0 16 1493 +1494 1494 1495 1493 0 0 16 1494 +1495 1495 1496 1494 0 0 16 1495 +1496 1496 1497 1495 0 0 16 1496 +1497 1497 1498 1496 0 0 16 1497 +1498 1498 1499 1497 0 0 16 1498 +1499 1499 1500 1498 0 0 16 1499 +1500 1500 1501 1499 0 0 16 1500 +1501 1501 1502 1500 0 0 16 1501 +1502 1502 1503 1501 0 0 16 1502 +1503 1503 1504 1502 0 0 16 1503 +1504 1504 1505 1503 0 0 16 1504 +1505 1505 1506 1504 0 0 16 1505 +1506 1506 1507 1505 0 0 16 1506 +1507 1507 1508 1506 0 0 16 1507 +1508 1508 1509 1507 0 0 16 1508 +1509 1509 1510 1508 0 0 16 1509 +1510 1510 1511 1509 0 0 16 1510 +1511 1511 1512 1510 0 0 16 1511 +1512 1512 1513 1511 0 0 16 1512 +1513 1513 1514 1512 0 0 16 1513 +1514 1514 1515 1513 0 0 16 1514 +1515 1515 1516 1514 0 0 16 1515 +1516 1516 1517 1515 0 0 16 1516 +1517 1517 1518 1516 0 0 16 1517 +1518 1518 1519 1517 0 0 16 1518 +1519 1519 1520 1518 0 0 16 1519 +1520 1520 1521 1519 0 0 16 1520 +1521 1521 1522 1520 0 0 16 1521 +1522 1522 1523 1521 0 0 16 1522 +1523 1523 1524 1522 0 0 16 1523 +1524 1524 1525 1523 0 0 16 1524 +1525 1525 1526 1524 0 0 16 1525 +1526 1526 1527 1525 0 0 16 1526 +1527 1527 1528 1526 0 0 16 1527 +1528 1528 1529 1527 0 0 16 1528 +1529 1529 1530 1528 0 0 16 1529 +1530 1530 1531 1529 0 0 16 1530 +1531 1531 1532 1530 0 0 16 1531 +1532 1532 1533 1531 0 0 16 1532 +1533 1533 1534 1532 0 0 16 1533 +1534 1534 1535 1533 0 0 16 1534 +1535 1535 1536 1534 0 0 16 1535 +1536 1536 1537 1535 0 0 16 1536 +1537 1537 1538 1536 0 0 16 1537 +1538 1538 1539 1537 0 0 16 1538 +1539 1539 1540 1538 0 0 16 1539 +1540 1540 1541 1539 0 0 16 1540 +1541 1541 1542 1540 0 0 16 1541 +1542 1542 1543 1541 0 0 16 1542 +1543 1543 1544 1542 0 0 16 1543 +1544 1544 1545 1543 0 0 16 1544 +1545 1545 1546 1544 0 0 16 1545 +1546 1546 1547 1545 0 0 16 1546 +1547 1547 1548 1546 0 0 16 1547 +1548 1548 1549 1547 0 0 16 1548 +1549 1549 1550 1548 0 0 16 1549 +1550 1550 1551 1549 0 0 16 1550 +1551 1551 1552 1550 0 0 16 1551 +1552 1552 1553 1551 0 0 16 1552 +1553 1553 1554 1552 0 0 16 1553 +1554 1554 1555 1553 0 0 16 1554 +1555 1555 1556 1554 0 0 16 1555 +1556 1556 1557 1555 0 0 16 1556 +1557 1557 1558 1556 0 0 16 1557 +1558 1558 1559 1557 0 0 16 1558 +1559 1559 1560 1558 0 0 16 1559 +1560 1560 1561 1559 0 0 16 1560 +1561 1561 1562 1560 0 0 16 1561 +1562 1562 1563 1561 0 0 16 1562 +1563 1563 1564 1562 0 0 16 1563 +1564 1564 1565 1563 0 0 16 1564 +1565 1565 1566 1564 0 0 16 1565 +1566 1566 1567 1565 0 0 16 1566 +1567 1567 1568 1566 0 0 16 1567 +1568 1568 1569 1567 0 0 16 1568 +1569 1569 1570 1568 0 0 16 1569 +1570 1570 1571 1569 0 0 16 1570 +1571 1571 1572 1570 0 0 16 1571 +1572 1572 1573 1571 0 0 16 1572 +1573 1573 1574 1572 0 0 16 1573 +1574 1574 1575 1573 0 0 16 1574 +1575 1575 1576 1574 0 0 16 1575 +1576 1576 1577 1575 0 0 16 1576 +1577 1577 1578 1576 0 0 16 1577 +1578 1578 1579 1577 0 0 16 1578 +1579 1579 1580 1578 0 0 16 1579 +1580 1580 1581 1579 0 0 16 1580 +1581 1581 1582 1580 0 0 16 1581 +1582 1582 1583 1581 0 0 16 1582 +1583 1583 1584 1582 0 0 16 1583 +1584 1584 1585 1583 0 0 16 1584 +1585 1585 1586 1584 0 0 16 1585 +1586 1586 1587 1585 0 0 16 1586 +1587 1587 1588 1586 0 0 16 1587 +1588 1588 1589 1587 0 0 16 1588 +1589 1589 1590 1588 0 0 16 1589 +1590 1590 1591 1589 0 0 16 1590 +1591 1591 1592 1590 0 0 16 1591 +1592 1592 1593 1591 0 0 16 1592 +1593 1593 1594 1592 0 0 16 1593 +1594 1594 1595 1593 0 0 16 1594 +1595 1595 1596 1594 0 0 16 1595 +1596 1596 1597 1595 0 0 16 1596 +1597 1597 1598 1596 0 0 16 1597 +1598 1598 1599 1597 0 0 16 1598 +1599 1599 1600 1598 0 0 16 1599 +1600 1600 1601 1599 0 0 16 1600 +1601 1601 1602 1600 0 0 16 1601 +1602 1602 1603 1601 0 0 16 1602 +1603 1603 1604 1602 0 0 16 1603 +1604 1604 1605 1603 0 0 16 1604 +1605 1605 1606 1604 0 0 16 1605 +1606 1606 1607 1605 0 0 16 1606 +1607 1607 1608 1606 0 0 16 1607 +1608 1608 1609 1607 0 0 16 1608 +1609 1609 1610 1608 0 0 16 1609 +1610 1610 1611 1609 0 0 16 1610 +1611 1611 1612 1610 0 0 16 1611 +1612 1612 1613 1611 0 0 16 1612 +1613 1613 1614 1612 0 0 16 1613 +1614 1614 1615 1613 0 0 16 1614 +1615 1615 1616 1614 0 0 16 1615 +1616 1616 1617 1615 0 0 16 1616 +1617 1617 1618 1616 0 0 16 1617 +1618 1618 1619 1617 0 0 16 1618 +1619 1619 1620 1618 0 0 16 1619 +1620 1620 1621 1619 0 0 16 1620 +1621 1621 1622 1620 0 0 16 1621 +1622 1622 1623 1621 0 0 16 1622 +1623 1623 1624 1622 0 0 16 1623 +1624 1624 1625 1623 0 0 16 1624 +1625 1625 1626 1624 0 0 16 1625 +1626 1626 1627 1625 0 0 16 1626 +1627 1627 1628 1626 0 0 16 1627 +1628 1628 1629 1627 0 0 16 1628 +1629 1629 1630 1628 0 0 16 1629 +1630 1630 1631 1629 0 0 16 1630 +1631 1631 1632 1630 0 0 16 1631 +1632 1632 1633 1631 0 0 16 1632 +1633 1633 1634 1632 0 0 16 1633 +1634 1634 1635 1633 0 0 16 1634 +1635 1635 1636 1634 0 0 16 1635 +1636 1636 1637 1635 0 0 16 1636 +1637 1637 1638 1636 0 0 16 1637 +1638 1638 1639 1637 0 0 16 1638 +1639 1639 1640 1638 0 0 16 1639 +1640 1640 1641 1639 0 0 16 1640 +1641 1641 1642 1640 0 0 16 1641 +1642 1642 1643 1641 0 0 16 1642 +1643 1643 1644 1642 0 0 16 1643 +1644 1644 1645 1643 0 0 16 1644 +1645 1645 1646 1644 0 0 16 1645 +1646 1646 1647 1645 0 0 16 1646 +1647 1647 1648 1646 0 0 16 1647 +1648 1648 1649 1647 0 0 16 1648 +1649 1649 1650 1648 0 0 16 1649 +1650 1650 1651 1649 0 0 16 1650 +1651 1651 1652 1650 0 0 16 1651 +1652 1652 1653 1651 0 0 16 1652 +1653 1653 1654 1652 0 0 16 1653 +1654 1654 1655 1653 0 0 16 1654 +1655 1655 1656 1654 0 0 16 1655 +1656 1656 1657 1655 0 0 16 1656 +1657 1657 1658 1656 0 0 16 1657 +1658 1658 1659 1657 0 0 16 1658 +1659 1659 1660 1658 0 0 16 1659 +1660 1660 1661 1659 0 0 16 1660 +1661 1661 1662 1660 0 0 16 1661 +1662 1662 1663 1661 0 0 16 1662 +1663 1663 1664 1662 0 0 16 1663 +1664 1664 1665 1663 0 0 16 1664 +1665 1665 1666 1664 0 0 16 1665 +1666 1666 1667 1665 0 0 16 1666 +1667 1667 1668 1666 0 0 16 1667 +1668 1668 1669 1667 0 0 16 1668 +1669 1669 1670 1668 0 0 16 1669 +1670 1670 1671 1669 0 0 16 1670 +1671 1671 1672 1670 0 0 16 1671 +1672 1672 1673 1671 0 0 16 1672 +1673 1673 1674 1672 0 0 16 1673 +1674 1674 1675 1673 0 0 16 1674 +1675 1675 1676 1674 0 0 16 1675 +1676 1676 1677 1675 0 0 16 1676 +1677 1677 1678 1676 0 0 16 1677 +1678 1678 1679 1677 0 0 16 1678 +1679 1679 1680 1678 0 0 16 1679 +1680 1680 1681 1679 0 0 16 1680 +1681 1681 1682 1680 0 0 16 1681 +1682 1682 1683 1681 0 0 16 1682 +1683 1683 1684 1682 0 0 16 1683 +1684 1684 1685 1683 0 0 16 1684 +1685 1685 1686 1684 0 0 16 1685 +1686 1686 1687 1685 0 0 16 1686 +1687 1687 1688 1686 0 0 16 1687 +1688 1688 1689 1687 0 0 16 1688 +1689 1689 1690 1688 0 0 16 1689 +1690 1690 1691 1689 0 0 16 1690 +1691 1691 1692 1690 0 0 16 1691 +1692 1692 1693 1691 0 0 16 1692 +1693 1693 1694 1692 0 0 16 1693 +1694 1694 1695 1693 0 0 16 1694 +1695 1695 1696 1694 0 0 16 1695 +1696 1696 1697 1695 0 0 16 1696 +1697 1697 1698 1696 0 0 16 1697 +1698 1698 1699 1697 0 0 16 1698 +1699 1699 1700 1698 0 0 16 1699 +1700 1700 1701 1699 0 0 16 1700 +1701 1701 1702 1700 0 0 16 1701 +1702 1702 1703 1701 0 0 16 1702 +1703 1703 1704 1702 0 0 16 1703 +1704 1704 1705 1703 0 0 16 1704 +1705 1705 1706 1704 0 0 16 1705 +1706 1706 1707 1705 0 0 16 1706 +1707 1707 1708 1706 0 0 16 1707 +1708 1708 1709 1707 0 0 16 1708 +1709 1709 1710 1708 0 0 16 1709 +1710 1710 1711 1709 0 0 16 1710 +1711 1711 1712 1710 0 0 16 1711 +1712 1712 1713 1711 0 0 16 1712 +1713 1713 1714 1712 0 0 16 1713 +1714 1714 1715 1713 0 0 16 1714 +1715 1715 1716 1714 0 0 16 1715 +1716 1716 1717 1715 0 0 16 1716 +1717 1717 1718 1716 0 0 16 1717 +1718 1718 1719 1717 0 0 16 1718 +1719 1719 1720 1718 0 0 16 1719 +1720 1720 1721 1719 0 0 16 1720 +1721 1721 1722 1720 0 0 16 1721 +1722 1722 1723 1721 0 0 16 1722 +1723 1723 1724 1722 0 0 16 1723 +1724 1724 1725 1723 0 0 16 1724 +1725 1725 1726 1724 0 0 16 1725 +1726 1726 1727 1725 0 0 16 1726 +1727 1727 1728 1726 0 0 16 1727 +1728 1728 1729 1727 0 0 16 1728 +1729 1729 1730 1728 0 0 16 1729 +1730 1730 1731 1729 0 0 16 1730 +1731 1731 1732 1730 0 0 16 1731 +1732 1732 1733 1731 0 0 16 1732 +1733 1733 1734 1732 0 0 16 1733 +1734 1734 1735 1733 0 0 16 1734 +1735 1735 1736 1734 0 0 16 1735 +1736 1736 1737 1735 0 0 16 1736 +1737 1737 1738 1736 0 0 16 1737 +1738 1738 1739 1737 0 0 16 1738 +1739 1739 1740 1738 0 0 16 1739 +1740 1740 1741 1739 0 0 16 1740 +1741 1741 1742 1740 0 0 16 1741 +1742 1742 1743 1741 0 0 16 1742 +1743 1743 1744 1742 0 0 16 1743 +1744 1744 1745 1743 0 0 16 1744 +1745 1745 1746 1744 0 0 16 1745 +1746 1746 1747 1745 0 0 16 1746 +1747 1747 1748 1746 0 0 16 1747 +1748 1748 1749 1747 0 0 16 1748 +1749 1749 1750 1748 0 0 16 1749 +1750 1750 1751 1749 0 0 16 1750 +1751 1751 1752 1750 0 0 16 1751 +1752 1752 1753 1751 0 0 16 1752 +1753 1753 1754 1752 0 0 16 1753 +1754 1754 1755 1753 0 0 16 1754 +1755 1755 1756 1754 0 0 16 1755 +1756 1756 1757 1755 0 0 16 1756 +1757 1757 1758 1756 0 0 16 1757 +1758 1758 1759 1757 0 0 16 1758 +1759 1759 1760 1758 0 0 16 1759 +1760 1760 1761 1759 0 0 16 1760 +1761 1761 1762 1760 0 0 16 1761 +1762 1762 1763 1761 0 0 16 1762 +1763 1763 1764 1762 0 0 16 1763 +1764 1764 1765 1763 0 0 16 1764 +1765 1765 1766 1764 0 0 16 1765 +1766 1766 1767 1765 0 0 16 1766 +1767 1767 1768 1766 0 0 16 1767 +1768 1768 1769 1767 0 0 16 1768 +1769 1769 1770 1768 0 0 16 1769 +1770 1770 1771 1769 0 0 16 1770 +1771 1771 1772 1770 0 0 16 1771 +1772 1772 1773 1771 0 0 16 1772 +1773 1773 1774 1772 0 0 16 1773 +1774 1774 1775 1773 0 0 16 1774 +1775 1775 1776 1774 0 0 16 1775 +1776 1776 1777 1775 0 0 16 1776 +1777 1777 1778 1776 0 0 16 1777 +1778 1778 1779 1777 0 0 16 1778 +1779 1779 1780 1778 0 0 16 1779 +1780 1780 1781 1779 0 0 16 1780 +1781 1781 1782 1780 0 0 16 1781 +1782 1782 1783 1781 0 0 16 1782 +1783 1783 1784 1782 0 0 16 1783 +1784 1784 1785 1783 0 0 16 1784 +1785 1785 1786 1784 0 0 16 1785 +1786 1786 1787 1785 0 0 16 1786 +1787 1787 1788 1786 0 0 16 1787 +1788 1788 1789 1787 0 0 16 1788 +1789 1789 1790 1788 0 0 16 1789 +1790 1790 1791 1789 0 0 16 1790 +1791 1791 1792 1790 0 0 16 1791 +1792 1792 1793 1791 0 0 16 1792 +1793 1793 1794 1792 0 0 16 1793 +1794 1794 1795 1793 0 0 16 1794 +1795 1795 1796 1794 0 0 16 1795 +1796 1796 1797 1795 0 0 16 1796 +1797 1797 1798 1796 0 0 16 1797 +1798 1798 1799 1797 0 0 16 1798 +1799 1799 1800 1798 0 0 16 1799 +1800 1800 1801 1799 0 0 16 1800 +1801 1801 1802 1800 0 0 16 1801 +1802 1802 1803 1801 0 0 16 1802 +1803 1803 1804 1802 0 0 16 1803 +1804 1804 1805 1803 0 0 16 1804 +1805 1805 1806 1804 0 0 16 1805 +1806 1806 1807 1805 0 0 16 1806 +1807 1807 1808 1806 0 0 16 1807 +1808 1808 1809 1807 0 0 16 1808 +1809 1809 1810 1808 0 0 16 1809 +1810 1810 1811 1809 0 0 16 1810 +1811 1811 1812 1810 0 0 16 1811 +1812 1812 1813 1811 0 0 16 1812 +1813 1813 1814 1812 0 0 16 1813 +1814 1814 1815 1813 0 0 16 1814 +1815 1815 1816 1814 0 0 16 1815 +1816 1816 1817 1815 0 0 16 1816 +1817 1817 1818 1816 0 0 16 1817 +1818 1818 1819 1817 0 0 16 1818 +1819 1819 1820 1818 0 0 16 1819 +1820 1820 1821 1819 0 0 16 1820 +1821 1821 1822 1820 0 0 16 1821 +1822 1822 1823 1821 0 0 16 1822 +1823 1823 1824 1822 0 0 16 1823 +1824 1824 1825 1823 0 0 16 1824 +1825 1825 1826 1824 0 0 16 1825 +1826 1826 1827 1825 0 0 16 1826 +1827 1827 1828 1826 0 0 16 1827 +1828 1828 1829 1827 0 0 16 1828 +1829 1829 1830 1828 0 0 16 1829 +1830 1830 1831 1829 0 0 16 1830 +1831 1831 1832 1830 0 0 16 1831 +1832 1832 1833 1831 0 0 16 1832 +1833 1833 1834 1832 0 0 16 1833 +1834 1834 1835 1833 0 0 16 1834 +1835 1835 1836 1834 0 0 16 1835 +1836 1836 1837 1835 0 0 16 1836 +1837 1837 1838 1836 0 0 16 1837 +1838 1838 1839 1837 0 0 16 1838 +1839 1839 1840 1838 0 0 16 1839 +1840 1840 1841 1839 0 0 16 1840 +1841 1841 1842 1840 0 0 16 1841 +1842 1842 1843 1841 0 0 16 1842 +1843 1843 1844 1842 0 0 16 1843 +1844 1844 1845 1843 0 0 16 1844 +1845 1845 1846 1844 0 0 16 1845 +1846 1846 1847 1845 0 0 16 1846 +1847 1847 1848 1846 0 0 16 1847 +1848 1848 1849 1847 0 0 16 1848 +1849 1849 1850 1848 0 0 16 1849 +1850 1850 1851 1849 0 0 16 1850 +1851 1851 1852 1850 0 0 16 1851 +1852 1852 1853 1851 0 0 16 1852 +1853 1853 1854 1852 0 0 16 1853 +1854 1854 1855 1853 0 0 16 1854 +1855 1855 1856 1854 0 0 16 1855 +1856 1856 1857 1855 0 0 16 1856 +1857 1857 1858 1856 0 0 16 1857 +1858 1858 1859 1857 0 0 16 1858 +1859 1859 1860 1858 0 0 16 1859 +1860 1860 1861 1859 0 0 16 1860 +1861 1861 1862 1860 0 0 16 1861 +1862 1862 1863 1861 0 0 16 1862 +1863 1863 1864 1862 0 0 16 1863 +1864 1864 1865 1863 0 0 16 1864 +1865 1865 1866 1864 0 0 16 1865 +1866 1866 1867 1865 0 0 16 1866 +1867 1867 1868 1866 0 0 16 1867 +1868 1868 1869 1867 0 0 16 1868 +1869 1869 1870 1868 0 0 16 1869 +1870 1870 1871 1869 0 0 16 1870 +1871 1871 1872 1870 0 0 16 1871 +1872 1872 1873 1871 0 0 16 1872 +1873 1873 1874 1872 0 0 16 1873 +1874 1874 1875 1873 0 0 16 1874 +1875 1875 1876 1874 0 0 16 1875 +1876 1876 1877 1875 0 0 16 1876 +1877 1877 1878 1876 0 0 16 1877 +1878 1878 1879 1877 0 0 16 1878 +1879 1879 1880 1878 0 0 16 1879 +1880 1880 1881 1879 0 0 16 1880 +1881 1881 1882 1880 0 0 16 1881 +1882 1882 1883 1881 0 0 16 1882 +1883 1883 1884 1882 0 0 16 1883 +1884 1884 1885 1883 0 0 16 1884 +1885 1885 1886 1884 0 0 16 1885 +1886 1886 1887 1885 0 0 16 1886 +1887 1887 1888 1886 0 0 16 1887 +1888 1888 1889 1887 0 0 16 1888 +1889 1889 1890 1888 0 0 16 1889 +1890 1890 1891 1889 0 0 16 1890 +1891 1891 1892 1890 0 0 16 1891 +1892 1892 1893 1891 0 0 16 1892 +1893 1893 1894 1892 0 0 16 1893 +1894 1894 1895 1893 0 0 16 1894 +1895 1895 1896 1894 0 0 16 1895 +1896 1896 1897 1895 0 0 16 1896 +1897 1897 1898 1896 0 0 16 1897 +1898 1898 1899 1897 0 0 16 1898 +1899 1899 1900 1898 0 0 16 1899 +1900 1900 1901 1899 0 0 16 1900 +1901 1901 1902 1900 0 0 16 1901 +1902 1902 1903 1901 0 0 16 1902 +1903 1903 1904 1902 0 0 16 1903 +1904 1904 1905 1903 0 0 16 1904 +1905 1905 1906 1904 0 0 16 1905 +1906 1906 1907 1905 0 0 16 1906 +1907 1907 1908 1906 0 0 16 1907 +1908 1908 1909 1907 0 0 16 1908 +1909 1909 1910 1908 0 0 16 1909 +1910 1910 1911 1909 0 0 16 1910 +1911 1911 1912 1910 0 0 16 1911 +1912 1912 1913 1911 0 0 16 1912 +1913 1913 1914 1912 0 0 16 1913 +1914 1914 1915 1913 0 0 16 1914 +1915 1915 1916 1914 0 0 16 1915 +1916 1916 1917 1915 0 0 16 1916 +1917 1917 1918 1916 0 0 16 1917 +1918 1918 1919 1917 0 0 16 1918 +1919 1919 1920 1918 0 0 16 1919 +1920 1920 1921 1919 0 0 16 1920 +1921 1921 1922 1920 0 0 16 1921 +1922 1922 1923 1921 0 0 16 1922 +1923 1923 1924 1922 0 0 16 1923 +1924 1924 1925 1923 0 0 16 1924 +1925 1925 1926 1924 0 0 16 1925 +1926 1926 1927 1925 0 0 16 1926 +1927 1927 1928 1926 0 0 16 1927 +1928 1928 1929 1927 0 0 16 1928 +1929 1929 1930 1928 0 0 16 1929 +1930 1930 1931 1929 0 0 16 1930 +1931 1931 1932 1930 0 0 16 1931 +1932 1932 1933 1931 0 0 16 1932 +1933 1933 1934 1932 0 0 16 1933 +1934 1934 1935 1933 0 0 16 1934 +1935 1935 1936 1934 0 0 16 1935 +1936 1936 1937 1935 0 0 16 1936 +1937 1937 1938 1936 0 0 16 1937 +1938 1938 1939 1937 0 0 16 1938 +1939 1939 1940 1938 0 0 16 1939 +1940 1940 1941 1939 0 0 16 1940 +1941 1941 1942 1940 0 0 16 1941 +1942 1942 1943 1941 0 0 16 1942 +1943 1943 1944 1942 0 0 16 1943 +1944 1944 1945 1943 0 0 16 1944 +1945 1945 1946 1944 0 0 16 1945 +1946 1946 1947 1945 0 0 16 1946 +1947 1947 1948 1946 0 0 16 1947 +1948 1948 1949 1947 0 0 16 1948 +1949 1949 1950 1948 0 0 16 1949 +1950 1950 1951 1949 0 0 16 1950 +1951 1951 1952 1950 0 0 16 1951 +1952 1952 1953 1951 0 0 16 1952 +1953 1953 1954 1952 0 0 16 1953 +1954 1954 1955 1953 0 0 16 1954 +1955 1955 1956 1954 0 0 16 1955 +1956 1956 1957 1955 0 0 16 1956 +1957 1957 1958 1956 0 0 16 1957 +1958 1958 1959 1957 0 0 16 1958 +1959 1959 1960 1958 0 0 16 1959 +1960 1960 1961 1959 0 0 16 1960 +1961 1961 1962 1960 0 0 16 1961 +1962 1962 1963 1961 0 0 16 1962 +1963 1963 1964 1962 0 0 16 1963 +1964 1964 1965 1963 0 0 16 1964 +1965 1965 1966 1964 0 0 16 1965 +1966 1966 1967 1965 0 0 16 1966 +1967 1967 1968 1966 0 0 16 1967 +1968 1968 1969 1967 0 0 16 1968 +1969 1969 1970 1968 0 0 16 1969 +1970 1970 1971 1969 0 0 16 1970 +1971 1971 1972 1970 0 0 16 1971 +1972 1972 1973 1971 0 0 16 1972 +1973 1973 1974 1972 0 0 16 1973 +1974 1974 1975 1973 0 0 16 1974 +1975 1975 1976 1974 0 0 16 1975 +1976 1976 1977 1975 0 0 16 1976 +1977 1977 1978 1976 0 0 16 1977 +1978 1978 1979 1977 0 0 16 1978 +1979 1979 1980 1978 0 0 16 1979 +1980 1980 1981 1979 0 0 16 1980 +1981 1981 1982 1980 0 0 16 1981 +1982 1982 1983 1981 0 0 16 1982 +1983 1983 1984 1982 0 0 16 1983 +1984 1984 1985 1983 0 0 16 1984 +1985 1985 1986 1984 0 0 16 1985 +1986 1986 1987 1985 0 0 16 1986 +1987 1987 1988 1986 0 0 16 1987 +1988 1988 1989 1987 0 0 16 1988 +1989 1989 1990 1988 0 0 16 1989 +1990 1990 1991 1989 0 0 16 1990 +1991 1991 1992 1990 0 0 16 1991 +1992 1992 1993 1991 0 0 16 1992 +1993 1993 1994 1992 0 0 16 1993 +1994 1994 1995 1993 0 0 16 1994 +1995 1995 1996 1994 0 0 16 1995 +1996 1996 1997 1995 0 0 16 1996 +1997 1997 1998 1996 0 0 16 1997 +1998 1998 1999 1997 0 0 16 1998 +1999 1999 2000 1998 0 0 16 1999 +2000 2000 2001 1999 0 0 16 2000 +2001 2001 2002 2000 0 0 16 2001 +2002 2002 2003 2001 0 0 16 2002 +2003 2003 2004 2002 0 0 16 2003 +2004 2004 2005 2003 0 0 16 2004 +2005 2005 2006 2004 0 0 16 2005 +2006 2006 2007 2005 0 0 16 2006 +2007 2007 2008 2006 0 0 16 2007 +2008 2008 2009 2007 0 0 16 2008 +2009 2009 2010 2008 0 0 16 2009 +2010 2010 2011 2009 0 0 16 2010 +2011 2011 2012 2010 0 0 16 2011 +2012 2012 2013 2011 0 0 16 2012 +2013 2013 2014 2012 0 0 16 2013 +2014 2014 2015 2013 0 0 16 2014 +2015 2015 2016 2014 0 0 16 2015 +2016 2016 2017 2015 0 0 16 2016 +2017 2017 2018 2016 0 0 16 2017 +2018 2018 2019 2017 0 0 16 2018 +2019 2019 2020 2018 0 0 16 2019 +2020 2020 2021 2019 0 0 16 2020 +2021 2021 2022 2020 0 0 16 2021 +2022 2022 2023 2021 0 0 16 2022 +2023 2023 2024 2022 0 0 16 2023 +2024 2024 2025 2023 0 0 16 2024 +2025 2025 2026 2024 0 0 16 2025 +2026 2026 2027 2025 0 0 16 2026 +2027 2027 2028 2026 0 0 16 2027 +2028 2028 2029 2027 0 0 16 2028 +2029 2029 2030 2028 0 0 16 2029 +2030 2030 2031 2029 0 0 16 2030 +2031 2031 2032 2030 0 0 16 2031 +2032 2032 2033 2031 0 0 16 2032 +2033 2033 2034 2032 0 0 16 2033 +2034 2034 2035 2033 0 0 16 2034 +2035 2035 2036 2034 0 0 16 2035 +2036 2036 2037 2035 0 0 16 2036 +2037 2037 2038 2036 0 0 16 2037 +2038 2038 2039 2037 0 0 16 2038 +2039 2039 2040 2038 0 0 16 2039 +2040 2040 2041 2039 0 0 16 2040 +2041 2041 2042 2040 0 0 16 2041 +2042 2042 2043 2041 0 0 16 2042 +2043 2043 2044 2042 0 0 16 2043 +2044 2044 2045 2043 0 0 16 2044 +2045 2045 2046 2044 0 0 16 2045 +2046 2046 0 2045 0 0 16 2046 +2047 2047 -1 0 0 0 16 2047 ====================================================== -=== [Queue after-failing-full] Next: 0 First: 1 Last: 1023 +=== [Queue after-failing-full] Next: 0 First: 1 Last: 2047 # seq next prev timeout retrans type cbp -0 0 1023 1022 0 0 16 0 +0 0 2047 2046 0 0 16 0 1 1 2 -1 0 0 16 1 2 2 3 1 0 0 16 2 3 3 4 2 0 0 16 3 @@ -4135,10 +7207,1034 @@ 1019 1019 1020 1018 0 0 16 1019 1020 1020 1021 1019 0 0 16 1020 1021 1021 1022 1020 0 0 16 1021 -1022 1022 0 1021 0 0 16 1022 -1023 1023 -1 0 0 0 16 1023 +1022 1022 1023 1021 0 0 16 1022 +1023 1023 1024 1022 0 0 16 1023 +1024 1024 1025 1023 0 0 16 1024 +1025 1025 1026 1024 0 0 16 1025 +1026 1026 1027 1025 0 0 16 1026 +1027 1027 1028 1026 0 0 16 1027 +1028 1028 1029 1027 0 0 16 1028 +1029 1029 1030 1028 0 0 16 1029 +1030 1030 1031 1029 0 0 16 1030 +1031 1031 1032 1030 0 0 16 1031 +1032 1032 1033 1031 0 0 16 1032 +1033 1033 1034 1032 0 0 16 1033 +1034 1034 1035 1033 0 0 16 1034 +1035 1035 1036 1034 0 0 16 1035 +1036 1036 1037 1035 0 0 16 1036 +1037 1037 1038 1036 0 0 16 1037 +1038 1038 1039 1037 0 0 16 1038 +1039 1039 1040 1038 0 0 16 1039 +1040 1040 1041 1039 0 0 16 1040 +1041 1041 1042 1040 0 0 16 1041 +1042 1042 1043 1041 0 0 16 1042 +1043 1043 1044 1042 0 0 16 1043 +1044 1044 1045 1043 0 0 16 1044 +1045 1045 1046 1044 0 0 16 1045 +1046 1046 1047 1045 0 0 16 1046 +1047 1047 1048 1046 0 0 16 1047 +1048 1048 1049 1047 0 0 16 1048 +1049 1049 1050 1048 0 0 16 1049 +1050 1050 1051 1049 0 0 16 1050 +1051 1051 1052 1050 0 0 16 1051 +1052 1052 1053 1051 0 0 16 1052 +1053 1053 1054 1052 0 0 16 1053 +1054 1054 1055 1053 0 0 16 1054 +1055 1055 1056 1054 0 0 16 1055 +1056 1056 1057 1055 0 0 16 1056 +1057 1057 1058 1056 0 0 16 1057 +1058 1058 1059 1057 0 0 16 1058 +1059 1059 1060 1058 0 0 16 1059 +1060 1060 1061 1059 0 0 16 1060 +1061 1061 1062 1060 0 0 16 1061 +1062 1062 1063 1061 0 0 16 1062 +1063 1063 1064 1062 0 0 16 1063 +1064 1064 1065 1063 0 0 16 1064 +1065 1065 1066 1064 0 0 16 1065 +1066 1066 1067 1065 0 0 16 1066 +1067 1067 1068 1066 0 0 16 1067 +1068 1068 1069 1067 0 0 16 1068 +1069 1069 1070 1068 0 0 16 1069 +1070 1070 1071 1069 0 0 16 1070 +1071 1071 1072 1070 0 0 16 1071 +1072 1072 1073 1071 0 0 16 1072 +1073 1073 1074 1072 0 0 16 1073 +1074 1074 1075 1073 0 0 16 1074 +1075 1075 1076 1074 0 0 16 1075 +1076 1076 1077 1075 0 0 16 1076 +1077 1077 1078 1076 0 0 16 1077 +1078 1078 1079 1077 0 0 16 1078 +1079 1079 1080 1078 0 0 16 1079 +1080 1080 1081 1079 0 0 16 1080 +1081 1081 1082 1080 0 0 16 1081 +1082 1082 1083 1081 0 0 16 1082 +1083 1083 1084 1082 0 0 16 1083 +1084 1084 1085 1083 0 0 16 1084 +1085 1085 1086 1084 0 0 16 1085 +1086 1086 1087 1085 0 0 16 1086 +1087 1087 1088 1086 0 0 16 1087 +1088 1088 1089 1087 0 0 16 1088 +1089 1089 1090 1088 0 0 16 1089 +1090 1090 1091 1089 0 0 16 1090 +1091 1091 1092 1090 0 0 16 1091 +1092 1092 1093 1091 0 0 16 1092 +1093 1093 1094 1092 0 0 16 1093 +1094 1094 1095 1093 0 0 16 1094 +1095 1095 1096 1094 0 0 16 1095 +1096 1096 1097 1095 0 0 16 1096 +1097 1097 1098 1096 0 0 16 1097 +1098 1098 1099 1097 0 0 16 1098 +1099 1099 1100 1098 0 0 16 1099 +1100 1100 1101 1099 0 0 16 1100 +1101 1101 1102 1100 0 0 16 1101 +1102 1102 1103 1101 0 0 16 1102 +1103 1103 1104 1102 0 0 16 1103 +1104 1104 1105 1103 0 0 16 1104 +1105 1105 1106 1104 0 0 16 1105 +1106 1106 1107 1105 0 0 16 1106 +1107 1107 1108 1106 0 0 16 1107 +1108 1108 1109 1107 0 0 16 1108 +1109 1109 1110 1108 0 0 16 1109 +1110 1110 1111 1109 0 0 16 1110 +1111 1111 1112 1110 0 0 16 1111 +1112 1112 1113 1111 0 0 16 1112 +1113 1113 1114 1112 0 0 16 1113 +1114 1114 1115 1113 0 0 16 1114 +1115 1115 1116 1114 0 0 16 1115 +1116 1116 1117 1115 0 0 16 1116 +1117 1117 1118 1116 0 0 16 1117 +1118 1118 1119 1117 0 0 16 1118 +1119 1119 1120 1118 0 0 16 1119 +1120 1120 1121 1119 0 0 16 1120 +1121 1121 1122 1120 0 0 16 1121 +1122 1122 1123 1121 0 0 16 1122 +1123 1123 1124 1122 0 0 16 1123 +1124 1124 1125 1123 0 0 16 1124 +1125 1125 1126 1124 0 0 16 1125 +1126 1126 1127 1125 0 0 16 1126 +1127 1127 1128 1126 0 0 16 1127 +1128 1128 1129 1127 0 0 16 1128 +1129 1129 1130 1128 0 0 16 1129 +1130 1130 1131 1129 0 0 16 1130 +1131 1131 1132 1130 0 0 16 1131 +1132 1132 1133 1131 0 0 16 1132 +1133 1133 1134 1132 0 0 16 1133 +1134 1134 1135 1133 0 0 16 1134 +1135 1135 1136 1134 0 0 16 1135 +1136 1136 1137 1135 0 0 16 1136 +1137 1137 1138 1136 0 0 16 1137 +1138 1138 1139 1137 0 0 16 1138 +1139 1139 1140 1138 0 0 16 1139 +1140 1140 1141 1139 0 0 16 1140 +1141 1141 1142 1140 0 0 16 1141 +1142 1142 1143 1141 0 0 16 1142 +1143 1143 1144 1142 0 0 16 1143 +1144 1144 1145 1143 0 0 16 1144 +1145 1145 1146 1144 0 0 16 1145 +1146 1146 1147 1145 0 0 16 1146 +1147 1147 1148 1146 0 0 16 1147 +1148 1148 1149 1147 0 0 16 1148 +1149 1149 1150 1148 0 0 16 1149 +1150 1150 1151 1149 0 0 16 1150 +1151 1151 1152 1150 0 0 16 1151 +1152 1152 1153 1151 0 0 16 1152 +1153 1153 1154 1152 0 0 16 1153 +1154 1154 1155 1153 0 0 16 1154 +1155 1155 1156 1154 0 0 16 1155 +1156 1156 1157 1155 0 0 16 1156 +1157 1157 1158 1156 0 0 16 1157 +1158 1158 1159 1157 0 0 16 1158 +1159 1159 1160 1158 0 0 16 1159 +1160 1160 1161 1159 0 0 16 1160 +1161 1161 1162 1160 0 0 16 1161 +1162 1162 1163 1161 0 0 16 1162 +1163 1163 1164 1162 0 0 16 1163 +1164 1164 1165 1163 0 0 16 1164 +1165 1165 1166 1164 0 0 16 1165 +1166 1166 1167 1165 0 0 16 1166 +1167 1167 1168 1166 0 0 16 1167 +1168 1168 1169 1167 0 0 16 1168 +1169 1169 1170 1168 0 0 16 1169 +1170 1170 1171 1169 0 0 16 1170 +1171 1171 1172 1170 0 0 16 1171 +1172 1172 1173 1171 0 0 16 1172 +1173 1173 1174 1172 0 0 16 1173 +1174 1174 1175 1173 0 0 16 1174 +1175 1175 1176 1174 0 0 16 1175 +1176 1176 1177 1175 0 0 16 1176 +1177 1177 1178 1176 0 0 16 1177 +1178 1178 1179 1177 0 0 16 1178 +1179 1179 1180 1178 0 0 16 1179 +1180 1180 1181 1179 0 0 16 1180 +1181 1181 1182 1180 0 0 16 1181 +1182 1182 1183 1181 0 0 16 1182 +1183 1183 1184 1182 0 0 16 1183 +1184 1184 1185 1183 0 0 16 1184 +1185 1185 1186 1184 0 0 16 1185 +1186 1186 1187 1185 0 0 16 1186 +1187 1187 1188 1186 0 0 16 1187 +1188 1188 1189 1187 0 0 16 1188 +1189 1189 1190 1188 0 0 16 1189 +1190 1190 1191 1189 0 0 16 1190 +1191 1191 1192 1190 0 0 16 1191 +1192 1192 1193 1191 0 0 16 1192 +1193 1193 1194 1192 0 0 16 1193 +1194 1194 1195 1193 0 0 16 1194 +1195 1195 1196 1194 0 0 16 1195 +1196 1196 1197 1195 0 0 16 1196 +1197 1197 1198 1196 0 0 16 1197 +1198 1198 1199 1197 0 0 16 1198 +1199 1199 1200 1198 0 0 16 1199 +1200 1200 1201 1199 0 0 16 1200 +1201 1201 1202 1200 0 0 16 1201 +1202 1202 1203 1201 0 0 16 1202 +1203 1203 1204 1202 0 0 16 1203 +1204 1204 1205 1203 0 0 16 1204 +1205 1205 1206 1204 0 0 16 1205 +1206 1206 1207 1205 0 0 16 1206 +1207 1207 1208 1206 0 0 16 1207 +1208 1208 1209 1207 0 0 16 1208 +1209 1209 1210 1208 0 0 16 1209 +1210 1210 1211 1209 0 0 16 1210 +1211 1211 1212 1210 0 0 16 1211 +1212 1212 1213 1211 0 0 16 1212 +1213 1213 1214 1212 0 0 16 1213 +1214 1214 1215 1213 0 0 16 1214 +1215 1215 1216 1214 0 0 16 1215 +1216 1216 1217 1215 0 0 16 1216 +1217 1217 1218 1216 0 0 16 1217 +1218 1218 1219 1217 0 0 16 1218 +1219 1219 1220 1218 0 0 16 1219 +1220 1220 1221 1219 0 0 16 1220 +1221 1221 1222 1220 0 0 16 1221 +1222 1222 1223 1221 0 0 16 1222 +1223 1223 1224 1222 0 0 16 1223 +1224 1224 1225 1223 0 0 16 1224 +1225 1225 1226 1224 0 0 16 1225 +1226 1226 1227 1225 0 0 16 1226 +1227 1227 1228 1226 0 0 16 1227 +1228 1228 1229 1227 0 0 16 1228 +1229 1229 1230 1228 0 0 16 1229 +1230 1230 1231 1229 0 0 16 1230 +1231 1231 1232 1230 0 0 16 1231 +1232 1232 1233 1231 0 0 16 1232 +1233 1233 1234 1232 0 0 16 1233 +1234 1234 1235 1233 0 0 16 1234 +1235 1235 1236 1234 0 0 16 1235 +1236 1236 1237 1235 0 0 16 1236 +1237 1237 1238 1236 0 0 16 1237 +1238 1238 1239 1237 0 0 16 1238 +1239 1239 1240 1238 0 0 16 1239 +1240 1240 1241 1239 0 0 16 1240 +1241 1241 1242 1240 0 0 16 1241 +1242 1242 1243 1241 0 0 16 1242 +1243 1243 1244 1242 0 0 16 1243 +1244 1244 1245 1243 0 0 16 1244 +1245 1245 1246 1244 0 0 16 1245 +1246 1246 1247 1245 0 0 16 1246 +1247 1247 1248 1246 0 0 16 1247 +1248 1248 1249 1247 0 0 16 1248 +1249 1249 1250 1248 0 0 16 1249 +1250 1250 1251 1249 0 0 16 1250 +1251 1251 1252 1250 0 0 16 1251 +1252 1252 1253 1251 0 0 16 1252 +1253 1253 1254 1252 0 0 16 1253 +1254 1254 1255 1253 0 0 16 1254 +1255 1255 1256 1254 0 0 16 1255 +1256 1256 1257 1255 0 0 16 1256 +1257 1257 1258 1256 0 0 16 1257 +1258 1258 1259 1257 0 0 16 1258 +1259 1259 1260 1258 0 0 16 1259 +1260 1260 1261 1259 0 0 16 1260 +1261 1261 1262 1260 0 0 16 1261 +1262 1262 1263 1261 0 0 16 1262 +1263 1263 1264 1262 0 0 16 1263 +1264 1264 1265 1263 0 0 16 1264 +1265 1265 1266 1264 0 0 16 1265 +1266 1266 1267 1265 0 0 16 1266 +1267 1267 1268 1266 0 0 16 1267 +1268 1268 1269 1267 0 0 16 1268 +1269 1269 1270 1268 0 0 16 1269 +1270 1270 1271 1269 0 0 16 1270 +1271 1271 1272 1270 0 0 16 1271 +1272 1272 1273 1271 0 0 16 1272 +1273 1273 1274 1272 0 0 16 1273 +1274 1274 1275 1273 0 0 16 1274 +1275 1275 1276 1274 0 0 16 1275 +1276 1276 1277 1275 0 0 16 1276 +1277 1277 1278 1276 0 0 16 1277 +1278 1278 1279 1277 0 0 16 1278 +1279 1279 1280 1278 0 0 16 1279 +1280 1280 1281 1279 0 0 16 1280 +1281 1281 1282 1280 0 0 16 1281 +1282 1282 1283 1281 0 0 16 1282 +1283 1283 1284 1282 0 0 16 1283 +1284 1284 1285 1283 0 0 16 1284 +1285 1285 1286 1284 0 0 16 1285 +1286 1286 1287 1285 0 0 16 1286 +1287 1287 1288 1286 0 0 16 1287 +1288 1288 1289 1287 0 0 16 1288 +1289 1289 1290 1288 0 0 16 1289 +1290 1290 1291 1289 0 0 16 1290 +1291 1291 1292 1290 0 0 16 1291 +1292 1292 1293 1291 0 0 16 1292 +1293 1293 1294 1292 0 0 16 1293 +1294 1294 1295 1293 0 0 16 1294 +1295 1295 1296 1294 0 0 16 1295 +1296 1296 1297 1295 0 0 16 1296 +1297 1297 1298 1296 0 0 16 1297 +1298 1298 1299 1297 0 0 16 1298 +1299 1299 1300 1298 0 0 16 1299 +1300 1300 1301 1299 0 0 16 1300 +1301 1301 1302 1300 0 0 16 1301 +1302 1302 1303 1301 0 0 16 1302 +1303 1303 1304 1302 0 0 16 1303 +1304 1304 1305 1303 0 0 16 1304 +1305 1305 1306 1304 0 0 16 1305 +1306 1306 1307 1305 0 0 16 1306 +1307 1307 1308 1306 0 0 16 1307 +1308 1308 1309 1307 0 0 16 1308 +1309 1309 1310 1308 0 0 16 1309 +1310 1310 1311 1309 0 0 16 1310 +1311 1311 1312 1310 0 0 16 1311 +1312 1312 1313 1311 0 0 16 1312 +1313 1313 1314 1312 0 0 16 1313 +1314 1314 1315 1313 0 0 16 1314 +1315 1315 1316 1314 0 0 16 1315 +1316 1316 1317 1315 0 0 16 1316 +1317 1317 1318 1316 0 0 16 1317 +1318 1318 1319 1317 0 0 16 1318 +1319 1319 1320 1318 0 0 16 1319 +1320 1320 1321 1319 0 0 16 1320 +1321 1321 1322 1320 0 0 16 1321 +1322 1322 1323 1321 0 0 16 1322 +1323 1323 1324 1322 0 0 16 1323 +1324 1324 1325 1323 0 0 16 1324 +1325 1325 1326 1324 0 0 16 1325 +1326 1326 1327 1325 0 0 16 1326 +1327 1327 1328 1326 0 0 16 1327 +1328 1328 1329 1327 0 0 16 1328 +1329 1329 1330 1328 0 0 16 1329 +1330 1330 1331 1329 0 0 16 1330 +1331 1331 1332 1330 0 0 16 1331 +1332 1332 1333 1331 0 0 16 1332 +1333 1333 1334 1332 0 0 16 1333 +1334 1334 1335 1333 0 0 16 1334 +1335 1335 1336 1334 0 0 16 1335 +1336 1336 1337 1335 0 0 16 1336 +1337 1337 1338 1336 0 0 16 1337 +1338 1338 1339 1337 0 0 16 1338 +1339 1339 1340 1338 0 0 16 1339 +1340 1340 1341 1339 0 0 16 1340 +1341 1341 1342 1340 0 0 16 1341 +1342 1342 1343 1341 0 0 16 1342 +1343 1343 1344 1342 0 0 16 1343 +1344 1344 1345 1343 0 0 16 1344 +1345 1345 1346 1344 0 0 16 1345 +1346 1346 1347 1345 0 0 16 1346 +1347 1347 1348 1346 0 0 16 1347 +1348 1348 1349 1347 0 0 16 1348 +1349 1349 1350 1348 0 0 16 1349 +1350 1350 1351 1349 0 0 16 1350 +1351 1351 1352 1350 0 0 16 1351 +1352 1352 1353 1351 0 0 16 1352 +1353 1353 1354 1352 0 0 16 1353 +1354 1354 1355 1353 0 0 16 1354 +1355 1355 1356 1354 0 0 16 1355 +1356 1356 1357 1355 0 0 16 1356 +1357 1357 1358 1356 0 0 16 1357 +1358 1358 1359 1357 0 0 16 1358 +1359 1359 1360 1358 0 0 16 1359 +1360 1360 1361 1359 0 0 16 1360 +1361 1361 1362 1360 0 0 16 1361 +1362 1362 1363 1361 0 0 16 1362 +1363 1363 1364 1362 0 0 16 1363 +1364 1364 1365 1363 0 0 16 1364 +1365 1365 1366 1364 0 0 16 1365 +1366 1366 1367 1365 0 0 16 1366 +1367 1367 1368 1366 0 0 16 1367 +1368 1368 1369 1367 0 0 16 1368 +1369 1369 1370 1368 0 0 16 1369 +1370 1370 1371 1369 0 0 16 1370 +1371 1371 1372 1370 0 0 16 1371 +1372 1372 1373 1371 0 0 16 1372 +1373 1373 1374 1372 0 0 16 1373 +1374 1374 1375 1373 0 0 16 1374 +1375 1375 1376 1374 0 0 16 1375 +1376 1376 1377 1375 0 0 16 1376 +1377 1377 1378 1376 0 0 16 1377 +1378 1378 1379 1377 0 0 16 1378 +1379 1379 1380 1378 0 0 16 1379 +1380 1380 1381 1379 0 0 16 1380 +1381 1381 1382 1380 0 0 16 1381 +1382 1382 1383 1381 0 0 16 1382 +1383 1383 1384 1382 0 0 16 1383 +1384 1384 1385 1383 0 0 16 1384 +1385 1385 1386 1384 0 0 16 1385 +1386 1386 1387 1385 0 0 16 1386 +1387 1387 1388 1386 0 0 16 1387 +1388 1388 1389 1387 0 0 16 1388 +1389 1389 1390 1388 0 0 16 1389 +1390 1390 1391 1389 0 0 16 1390 +1391 1391 1392 1390 0 0 16 1391 +1392 1392 1393 1391 0 0 16 1392 +1393 1393 1394 1392 0 0 16 1393 +1394 1394 1395 1393 0 0 16 1394 +1395 1395 1396 1394 0 0 16 1395 +1396 1396 1397 1395 0 0 16 1396 +1397 1397 1398 1396 0 0 16 1397 +1398 1398 1399 1397 0 0 16 1398 +1399 1399 1400 1398 0 0 16 1399 +1400 1400 1401 1399 0 0 16 1400 +1401 1401 1402 1400 0 0 16 1401 +1402 1402 1403 1401 0 0 16 1402 +1403 1403 1404 1402 0 0 16 1403 +1404 1404 1405 1403 0 0 16 1404 +1405 1405 1406 1404 0 0 16 1405 +1406 1406 1407 1405 0 0 16 1406 +1407 1407 1408 1406 0 0 16 1407 +1408 1408 1409 1407 0 0 16 1408 +1409 1409 1410 1408 0 0 16 1409 +1410 1410 1411 1409 0 0 16 1410 +1411 1411 1412 1410 0 0 16 1411 +1412 1412 1413 1411 0 0 16 1412 +1413 1413 1414 1412 0 0 16 1413 +1414 1414 1415 1413 0 0 16 1414 +1415 1415 1416 1414 0 0 16 1415 +1416 1416 1417 1415 0 0 16 1416 +1417 1417 1418 1416 0 0 16 1417 +1418 1418 1419 1417 0 0 16 1418 +1419 1419 1420 1418 0 0 16 1419 +1420 1420 1421 1419 0 0 16 1420 +1421 1421 1422 1420 0 0 16 1421 +1422 1422 1423 1421 0 0 16 1422 +1423 1423 1424 1422 0 0 16 1423 +1424 1424 1425 1423 0 0 16 1424 +1425 1425 1426 1424 0 0 16 1425 +1426 1426 1427 1425 0 0 16 1426 +1427 1427 1428 1426 0 0 16 1427 +1428 1428 1429 1427 0 0 16 1428 +1429 1429 1430 1428 0 0 16 1429 +1430 1430 1431 1429 0 0 16 1430 +1431 1431 1432 1430 0 0 16 1431 +1432 1432 1433 1431 0 0 16 1432 +1433 1433 1434 1432 0 0 16 1433 +1434 1434 1435 1433 0 0 16 1434 +1435 1435 1436 1434 0 0 16 1435 +1436 1436 1437 1435 0 0 16 1436 +1437 1437 1438 1436 0 0 16 1437 +1438 1438 1439 1437 0 0 16 1438 +1439 1439 1440 1438 0 0 16 1439 +1440 1440 1441 1439 0 0 16 1440 +1441 1441 1442 1440 0 0 16 1441 +1442 1442 1443 1441 0 0 16 1442 +1443 1443 1444 1442 0 0 16 1443 +1444 1444 1445 1443 0 0 16 1444 +1445 1445 1446 1444 0 0 16 1445 +1446 1446 1447 1445 0 0 16 1446 +1447 1447 1448 1446 0 0 16 1447 +1448 1448 1449 1447 0 0 16 1448 +1449 1449 1450 1448 0 0 16 1449 +1450 1450 1451 1449 0 0 16 1450 +1451 1451 1452 1450 0 0 16 1451 +1452 1452 1453 1451 0 0 16 1452 +1453 1453 1454 1452 0 0 16 1453 +1454 1454 1455 1453 0 0 16 1454 +1455 1455 1456 1454 0 0 16 1455 +1456 1456 1457 1455 0 0 16 1456 +1457 1457 1458 1456 0 0 16 1457 +1458 1458 1459 1457 0 0 16 1458 +1459 1459 1460 1458 0 0 16 1459 +1460 1460 1461 1459 0 0 16 1460 +1461 1461 1462 1460 0 0 16 1461 +1462 1462 1463 1461 0 0 16 1462 +1463 1463 1464 1462 0 0 16 1463 +1464 1464 1465 1463 0 0 16 1464 +1465 1465 1466 1464 0 0 16 1465 +1466 1466 1467 1465 0 0 16 1466 +1467 1467 1468 1466 0 0 16 1467 +1468 1468 1469 1467 0 0 16 1468 +1469 1469 1470 1468 0 0 16 1469 +1470 1470 1471 1469 0 0 16 1470 +1471 1471 1472 1470 0 0 16 1471 +1472 1472 1473 1471 0 0 16 1472 +1473 1473 1474 1472 0 0 16 1473 +1474 1474 1475 1473 0 0 16 1474 +1475 1475 1476 1474 0 0 16 1475 +1476 1476 1477 1475 0 0 16 1476 +1477 1477 1478 1476 0 0 16 1477 +1478 1478 1479 1477 0 0 16 1478 +1479 1479 1480 1478 0 0 16 1479 +1480 1480 1481 1479 0 0 16 1480 +1481 1481 1482 1480 0 0 16 1481 +1482 1482 1483 1481 0 0 16 1482 +1483 1483 1484 1482 0 0 16 1483 +1484 1484 1485 1483 0 0 16 1484 +1485 1485 1486 1484 0 0 16 1485 +1486 1486 1487 1485 0 0 16 1486 +1487 1487 1488 1486 0 0 16 1487 +1488 1488 1489 1487 0 0 16 1488 +1489 1489 1490 1488 0 0 16 1489 +1490 1490 1491 1489 0 0 16 1490 +1491 1491 1492 1490 0 0 16 1491 +1492 1492 1493 1491 0 0 16 1492 +1493 1493 1494 1492 0 0 16 1493 +1494 1494 1495 1493 0 0 16 1494 +1495 1495 1496 1494 0 0 16 1495 +1496 1496 1497 1495 0 0 16 1496 +1497 1497 1498 1496 0 0 16 1497 +1498 1498 1499 1497 0 0 16 1498 +1499 1499 1500 1498 0 0 16 1499 +1500 1500 1501 1499 0 0 16 1500 +1501 1501 1502 1500 0 0 16 1501 +1502 1502 1503 1501 0 0 16 1502 +1503 1503 1504 1502 0 0 16 1503 +1504 1504 1505 1503 0 0 16 1504 +1505 1505 1506 1504 0 0 16 1505 +1506 1506 1507 1505 0 0 16 1506 +1507 1507 1508 1506 0 0 16 1507 +1508 1508 1509 1507 0 0 16 1508 +1509 1509 1510 1508 0 0 16 1509 +1510 1510 1511 1509 0 0 16 1510 +1511 1511 1512 1510 0 0 16 1511 +1512 1512 1513 1511 0 0 16 1512 +1513 1513 1514 1512 0 0 16 1513 +1514 1514 1515 1513 0 0 16 1514 +1515 1515 1516 1514 0 0 16 1515 +1516 1516 1517 1515 0 0 16 1516 +1517 1517 1518 1516 0 0 16 1517 +1518 1518 1519 1517 0 0 16 1518 +1519 1519 1520 1518 0 0 16 1519 +1520 1520 1521 1519 0 0 16 1520 +1521 1521 1522 1520 0 0 16 1521 +1522 1522 1523 1521 0 0 16 1522 +1523 1523 1524 1522 0 0 16 1523 +1524 1524 1525 1523 0 0 16 1524 +1525 1525 1526 1524 0 0 16 1525 +1526 1526 1527 1525 0 0 16 1526 +1527 1527 1528 1526 0 0 16 1527 +1528 1528 1529 1527 0 0 16 1528 +1529 1529 1530 1528 0 0 16 1529 +1530 1530 1531 1529 0 0 16 1530 +1531 1531 1532 1530 0 0 16 1531 +1532 1532 1533 1531 0 0 16 1532 +1533 1533 1534 1532 0 0 16 1533 +1534 1534 1535 1533 0 0 16 1534 +1535 1535 1536 1534 0 0 16 1535 +1536 1536 1537 1535 0 0 16 1536 +1537 1537 1538 1536 0 0 16 1537 +1538 1538 1539 1537 0 0 16 1538 +1539 1539 1540 1538 0 0 16 1539 +1540 1540 1541 1539 0 0 16 1540 +1541 1541 1542 1540 0 0 16 1541 +1542 1542 1543 1541 0 0 16 1542 +1543 1543 1544 1542 0 0 16 1543 +1544 1544 1545 1543 0 0 16 1544 +1545 1545 1546 1544 0 0 16 1545 +1546 1546 1547 1545 0 0 16 1546 +1547 1547 1548 1546 0 0 16 1547 +1548 1548 1549 1547 0 0 16 1548 +1549 1549 1550 1548 0 0 16 1549 +1550 1550 1551 1549 0 0 16 1550 +1551 1551 1552 1550 0 0 16 1551 +1552 1552 1553 1551 0 0 16 1552 +1553 1553 1554 1552 0 0 16 1553 +1554 1554 1555 1553 0 0 16 1554 +1555 1555 1556 1554 0 0 16 1555 +1556 1556 1557 1555 0 0 16 1556 +1557 1557 1558 1556 0 0 16 1557 +1558 1558 1559 1557 0 0 16 1558 +1559 1559 1560 1558 0 0 16 1559 +1560 1560 1561 1559 0 0 16 1560 +1561 1561 1562 1560 0 0 16 1561 +1562 1562 1563 1561 0 0 16 1562 +1563 1563 1564 1562 0 0 16 1563 +1564 1564 1565 1563 0 0 16 1564 +1565 1565 1566 1564 0 0 16 1565 +1566 1566 1567 1565 0 0 16 1566 +1567 1567 1568 1566 0 0 16 1567 +1568 1568 1569 1567 0 0 16 1568 +1569 1569 1570 1568 0 0 16 1569 +1570 1570 1571 1569 0 0 16 1570 +1571 1571 1572 1570 0 0 16 1571 +1572 1572 1573 1571 0 0 16 1572 +1573 1573 1574 1572 0 0 16 1573 +1574 1574 1575 1573 0 0 16 1574 +1575 1575 1576 1574 0 0 16 1575 +1576 1576 1577 1575 0 0 16 1576 +1577 1577 1578 1576 0 0 16 1577 +1578 1578 1579 1577 0 0 16 1578 +1579 1579 1580 1578 0 0 16 1579 +1580 1580 1581 1579 0 0 16 1580 +1581 1581 1582 1580 0 0 16 1581 +1582 1582 1583 1581 0 0 16 1582 +1583 1583 1584 1582 0 0 16 1583 +1584 1584 1585 1583 0 0 16 1584 +1585 1585 1586 1584 0 0 16 1585 +1586 1586 1587 1585 0 0 16 1586 +1587 1587 1588 1586 0 0 16 1587 +1588 1588 1589 1587 0 0 16 1588 +1589 1589 1590 1588 0 0 16 1589 +1590 1590 1591 1589 0 0 16 1590 +1591 1591 1592 1590 0 0 16 1591 +1592 1592 1593 1591 0 0 16 1592 +1593 1593 1594 1592 0 0 16 1593 +1594 1594 1595 1593 0 0 16 1594 +1595 1595 1596 1594 0 0 16 1595 +1596 1596 1597 1595 0 0 16 1596 +1597 1597 1598 1596 0 0 16 1597 +1598 1598 1599 1597 0 0 16 1598 +1599 1599 1600 1598 0 0 16 1599 +1600 1600 1601 1599 0 0 16 1600 +1601 1601 1602 1600 0 0 16 1601 +1602 1602 1603 1601 0 0 16 1602 +1603 1603 1604 1602 0 0 16 1603 +1604 1604 1605 1603 0 0 16 1604 +1605 1605 1606 1604 0 0 16 1605 +1606 1606 1607 1605 0 0 16 1606 +1607 1607 1608 1606 0 0 16 1607 +1608 1608 1609 1607 0 0 16 1608 +1609 1609 1610 1608 0 0 16 1609 +1610 1610 1611 1609 0 0 16 1610 +1611 1611 1612 1610 0 0 16 1611 +1612 1612 1613 1611 0 0 16 1612 +1613 1613 1614 1612 0 0 16 1613 +1614 1614 1615 1613 0 0 16 1614 +1615 1615 1616 1614 0 0 16 1615 +1616 1616 1617 1615 0 0 16 1616 +1617 1617 1618 1616 0 0 16 1617 +1618 1618 1619 1617 0 0 16 1618 +1619 1619 1620 1618 0 0 16 1619 +1620 1620 1621 1619 0 0 16 1620 +1621 1621 1622 1620 0 0 16 1621 +1622 1622 1623 1621 0 0 16 1622 +1623 1623 1624 1622 0 0 16 1623 +1624 1624 1625 1623 0 0 16 1624 +1625 1625 1626 1624 0 0 16 1625 +1626 1626 1627 1625 0 0 16 1626 +1627 1627 1628 1626 0 0 16 1627 +1628 1628 1629 1627 0 0 16 1628 +1629 1629 1630 1628 0 0 16 1629 +1630 1630 1631 1629 0 0 16 1630 +1631 1631 1632 1630 0 0 16 1631 +1632 1632 1633 1631 0 0 16 1632 +1633 1633 1634 1632 0 0 16 1633 +1634 1634 1635 1633 0 0 16 1634 +1635 1635 1636 1634 0 0 16 1635 +1636 1636 1637 1635 0 0 16 1636 +1637 1637 1638 1636 0 0 16 1637 +1638 1638 1639 1637 0 0 16 1638 +1639 1639 1640 1638 0 0 16 1639 +1640 1640 1641 1639 0 0 16 1640 +1641 1641 1642 1640 0 0 16 1641 +1642 1642 1643 1641 0 0 16 1642 +1643 1643 1644 1642 0 0 16 1643 +1644 1644 1645 1643 0 0 16 1644 +1645 1645 1646 1644 0 0 16 1645 +1646 1646 1647 1645 0 0 16 1646 +1647 1647 1648 1646 0 0 16 1647 +1648 1648 1649 1647 0 0 16 1648 +1649 1649 1650 1648 0 0 16 1649 +1650 1650 1651 1649 0 0 16 1650 +1651 1651 1652 1650 0 0 16 1651 +1652 1652 1653 1651 0 0 16 1652 +1653 1653 1654 1652 0 0 16 1653 +1654 1654 1655 1653 0 0 16 1654 +1655 1655 1656 1654 0 0 16 1655 +1656 1656 1657 1655 0 0 16 1656 +1657 1657 1658 1656 0 0 16 1657 +1658 1658 1659 1657 0 0 16 1658 +1659 1659 1660 1658 0 0 16 1659 +1660 1660 1661 1659 0 0 16 1660 +1661 1661 1662 1660 0 0 16 1661 +1662 1662 1663 1661 0 0 16 1662 +1663 1663 1664 1662 0 0 16 1663 +1664 1664 1665 1663 0 0 16 1664 +1665 1665 1666 1664 0 0 16 1665 +1666 1666 1667 1665 0 0 16 1666 +1667 1667 1668 1666 0 0 16 1667 +1668 1668 1669 1667 0 0 16 1668 +1669 1669 1670 1668 0 0 16 1669 +1670 1670 1671 1669 0 0 16 1670 +1671 1671 1672 1670 0 0 16 1671 +1672 1672 1673 1671 0 0 16 1672 +1673 1673 1674 1672 0 0 16 1673 +1674 1674 1675 1673 0 0 16 1674 +1675 1675 1676 1674 0 0 16 1675 +1676 1676 1677 1675 0 0 16 1676 +1677 1677 1678 1676 0 0 16 1677 +1678 1678 1679 1677 0 0 16 1678 +1679 1679 1680 1678 0 0 16 1679 +1680 1680 1681 1679 0 0 16 1680 +1681 1681 1682 1680 0 0 16 1681 +1682 1682 1683 1681 0 0 16 1682 +1683 1683 1684 1682 0 0 16 1683 +1684 1684 1685 1683 0 0 16 1684 +1685 1685 1686 1684 0 0 16 1685 +1686 1686 1687 1685 0 0 16 1686 +1687 1687 1688 1686 0 0 16 1687 +1688 1688 1689 1687 0 0 16 1688 +1689 1689 1690 1688 0 0 16 1689 +1690 1690 1691 1689 0 0 16 1690 +1691 1691 1692 1690 0 0 16 1691 +1692 1692 1693 1691 0 0 16 1692 +1693 1693 1694 1692 0 0 16 1693 +1694 1694 1695 1693 0 0 16 1694 +1695 1695 1696 1694 0 0 16 1695 +1696 1696 1697 1695 0 0 16 1696 +1697 1697 1698 1696 0 0 16 1697 +1698 1698 1699 1697 0 0 16 1698 +1699 1699 1700 1698 0 0 16 1699 +1700 1700 1701 1699 0 0 16 1700 +1701 1701 1702 1700 0 0 16 1701 +1702 1702 1703 1701 0 0 16 1702 +1703 1703 1704 1702 0 0 16 1703 +1704 1704 1705 1703 0 0 16 1704 +1705 1705 1706 1704 0 0 16 1705 +1706 1706 1707 1705 0 0 16 1706 +1707 1707 1708 1706 0 0 16 1707 +1708 1708 1709 1707 0 0 16 1708 +1709 1709 1710 1708 0 0 16 1709 +1710 1710 1711 1709 0 0 16 1710 +1711 1711 1712 1710 0 0 16 1711 +1712 1712 1713 1711 0 0 16 1712 +1713 1713 1714 1712 0 0 16 1713 +1714 1714 1715 1713 0 0 16 1714 +1715 1715 1716 1714 0 0 16 1715 +1716 1716 1717 1715 0 0 16 1716 +1717 1717 1718 1716 0 0 16 1717 +1718 1718 1719 1717 0 0 16 1718 +1719 1719 1720 1718 0 0 16 1719 +1720 1720 1721 1719 0 0 16 1720 +1721 1721 1722 1720 0 0 16 1721 +1722 1722 1723 1721 0 0 16 1722 +1723 1723 1724 1722 0 0 16 1723 +1724 1724 1725 1723 0 0 16 1724 +1725 1725 1726 1724 0 0 16 1725 +1726 1726 1727 1725 0 0 16 1726 +1727 1727 1728 1726 0 0 16 1727 +1728 1728 1729 1727 0 0 16 1728 +1729 1729 1730 1728 0 0 16 1729 +1730 1730 1731 1729 0 0 16 1730 +1731 1731 1732 1730 0 0 16 1731 +1732 1732 1733 1731 0 0 16 1732 +1733 1733 1734 1732 0 0 16 1733 +1734 1734 1735 1733 0 0 16 1734 +1735 1735 1736 1734 0 0 16 1735 +1736 1736 1737 1735 0 0 16 1736 +1737 1737 1738 1736 0 0 16 1737 +1738 1738 1739 1737 0 0 16 1738 +1739 1739 1740 1738 0 0 16 1739 +1740 1740 1741 1739 0 0 16 1740 +1741 1741 1742 1740 0 0 16 1741 +1742 1742 1743 1741 0 0 16 1742 +1743 1743 1744 1742 0 0 16 1743 +1744 1744 1745 1743 0 0 16 1744 +1745 1745 1746 1744 0 0 16 1745 +1746 1746 1747 1745 0 0 16 1746 +1747 1747 1748 1746 0 0 16 1747 +1748 1748 1749 1747 0 0 16 1748 +1749 1749 1750 1748 0 0 16 1749 +1750 1750 1751 1749 0 0 16 1750 +1751 1751 1752 1750 0 0 16 1751 +1752 1752 1753 1751 0 0 16 1752 +1753 1753 1754 1752 0 0 16 1753 +1754 1754 1755 1753 0 0 16 1754 +1755 1755 1756 1754 0 0 16 1755 +1756 1756 1757 1755 0 0 16 1756 +1757 1757 1758 1756 0 0 16 1757 +1758 1758 1759 1757 0 0 16 1758 +1759 1759 1760 1758 0 0 16 1759 +1760 1760 1761 1759 0 0 16 1760 +1761 1761 1762 1760 0 0 16 1761 +1762 1762 1763 1761 0 0 16 1762 +1763 1763 1764 1762 0 0 16 1763 +1764 1764 1765 1763 0 0 16 1764 +1765 1765 1766 1764 0 0 16 1765 +1766 1766 1767 1765 0 0 16 1766 +1767 1767 1768 1766 0 0 16 1767 +1768 1768 1769 1767 0 0 16 1768 +1769 1769 1770 1768 0 0 16 1769 +1770 1770 1771 1769 0 0 16 1770 +1771 1771 1772 1770 0 0 16 1771 +1772 1772 1773 1771 0 0 16 1772 +1773 1773 1774 1772 0 0 16 1773 +1774 1774 1775 1773 0 0 16 1774 +1775 1775 1776 1774 0 0 16 1775 +1776 1776 1777 1775 0 0 16 1776 +1777 1777 1778 1776 0 0 16 1777 +1778 1778 1779 1777 0 0 16 1778 +1779 1779 1780 1778 0 0 16 1779 +1780 1780 1781 1779 0 0 16 1780 +1781 1781 1782 1780 0 0 16 1781 +1782 1782 1783 1781 0 0 16 1782 +1783 1783 1784 1782 0 0 16 1783 +1784 1784 1785 1783 0 0 16 1784 +1785 1785 1786 1784 0 0 16 1785 +1786 1786 1787 1785 0 0 16 1786 +1787 1787 1788 1786 0 0 16 1787 +1788 1788 1789 1787 0 0 16 1788 +1789 1789 1790 1788 0 0 16 1789 +1790 1790 1791 1789 0 0 16 1790 +1791 1791 1792 1790 0 0 16 1791 +1792 1792 1793 1791 0 0 16 1792 +1793 1793 1794 1792 0 0 16 1793 +1794 1794 1795 1793 0 0 16 1794 +1795 1795 1796 1794 0 0 16 1795 +1796 1796 1797 1795 0 0 16 1796 +1797 1797 1798 1796 0 0 16 1797 +1798 1798 1799 1797 0 0 16 1798 +1799 1799 1800 1798 0 0 16 1799 +1800 1800 1801 1799 0 0 16 1800 +1801 1801 1802 1800 0 0 16 1801 +1802 1802 1803 1801 0 0 16 1802 +1803 1803 1804 1802 0 0 16 1803 +1804 1804 1805 1803 0 0 16 1804 +1805 1805 1806 1804 0 0 16 1805 +1806 1806 1807 1805 0 0 16 1806 +1807 1807 1808 1806 0 0 16 1807 +1808 1808 1809 1807 0 0 16 1808 +1809 1809 1810 1808 0 0 16 1809 +1810 1810 1811 1809 0 0 16 1810 +1811 1811 1812 1810 0 0 16 1811 +1812 1812 1813 1811 0 0 16 1812 +1813 1813 1814 1812 0 0 16 1813 +1814 1814 1815 1813 0 0 16 1814 +1815 1815 1816 1814 0 0 16 1815 +1816 1816 1817 1815 0 0 16 1816 +1817 1817 1818 1816 0 0 16 1817 +1818 1818 1819 1817 0 0 16 1818 +1819 1819 1820 1818 0 0 16 1819 +1820 1820 1821 1819 0 0 16 1820 +1821 1821 1822 1820 0 0 16 1821 +1822 1822 1823 1821 0 0 16 1822 +1823 1823 1824 1822 0 0 16 1823 +1824 1824 1825 1823 0 0 16 1824 +1825 1825 1826 1824 0 0 16 1825 +1826 1826 1827 1825 0 0 16 1826 +1827 1827 1828 1826 0 0 16 1827 +1828 1828 1829 1827 0 0 16 1828 +1829 1829 1830 1828 0 0 16 1829 +1830 1830 1831 1829 0 0 16 1830 +1831 1831 1832 1830 0 0 16 1831 +1832 1832 1833 1831 0 0 16 1832 +1833 1833 1834 1832 0 0 16 1833 +1834 1834 1835 1833 0 0 16 1834 +1835 1835 1836 1834 0 0 16 1835 +1836 1836 1837 1835 0 0 16 1836 +1837 1837 1838 1836 0 0 16 1837 +1838 1838 1839 1837 0 0 16 1838 +1839 1839 1840 1838 0 0 16 1839 +1840 1840 1841 1839 0 0 16 1840 +1841 1841 1842 1840 0 0 16 1841 +1842 1842 1843 1841 0 0 16 1842 +1843 1843 1844 1842 0 0 16 1843 +1844 1844 1845 1843 0 0 16 1844 +1845 1845 1846 1844 0 0 16 1845 +1846 1846 1847 1845 0 0 16 1846 +1847 1847 1848 1846 0 0 16 1847 +1848 1848 1849 1847 0 0 16 1848 +1849 1849 1850 1848 0 0 16 1849 +1850 1850 1851 1849 0 0 16 1850 +1851 1851 1852 1850 0 0 16 1851 +1852 1852 1853 1851 0 0 16 1852 +1853 1853 1854 1852 0 0 16 1853 +1854 1854 1855 1853 0 0 16 1854 +1855 1855 1856 1854 0 0 16 1855 +1856 1856 1857 1855 0 0 16 1856 +1857 1857 1858 1856 0 0 16 1857 +1858 1858 1859 1857 0 0 16 1858 +1859 1859 1860 1858 0 0 16 1859 +1860 1860 1861 1859 0 0 16 1860 +1861 1861 1862 1860 0 0 16 1861 +1862 1862 1863 1861 0 0 16 1862 +1863 1863 1864 1862 0 0 16 1863 +1864 1864 1865 1863 0 0 16 1864 +1865 1865 1866 1864 0 0 16 1865 +1866 1866 1867 1865 0 0 16 1866 +1867 1867 1868 1866 0 0 16 1867 +1868 1868 1869 1867 0 0 16 1868 +1869 1869 1870 1868 0 0 16 1869 +1870 1870 1871 1869 0 0 16 1870 +1871 1871 1872 1870 0 0 16 1871 +1872 1872 1873 1871 0 0 16 1872 +1873 1873 1874 1872 0 0 16 1873 +1874 1874 1875 1873 0 0 16 1874 +1875 1875 1876 1874 0 0 16 1875 +1876 1876 1877 1875 0 0 16 1876 +1877 1877 1878 1876 0 0 16 1877 +1878 1878 1879 1877 0 0 16 1878 +1879 1879 1880 1878 0 0 16 1879 +1880 1880 1881 1879 0 0 16 1880 +1881 1881 1882 1880 0 0 16 1881 +1882 1882 1883 1881 0 0 16 1882 +1883 1883 1884 1882 0 0 16 1883 +1884 1884 1885 1883 0 0 16 1884 +1885 1885 1886 1884 0 0 16 1885 +1886 1886 1887 1885 0 0 16 1886 +1887 1887 1888 1886 0 0 16 1887 +1888 1888 1889 1887 0 0 16 1888 +1889 1889 1890 1888 0 0 16 1889 +1890 1890 1891 1889 0 0 16 1890 +1891 1891 1892 1890 0 0 16 1891 +1892 1892 1893 1891 0 0 16 1892 +1893 1893 1894 1892 0 0 16 1893 +1894 1894 1895 1893 0 0 16 1894 +1895 1895 1896 1894 0 0 16 1895 +1896 1896 1897 1895 0 0 16 1896 +1897 1897 1898 1896 0 0 16 1897 +1898 1898 1899 1897 0 0 16 1898 +1899 1899 1900 1898 0 0 16 1899 +1900 1900 1901 1899 0 0 16 1900 +1901 1901 1902 1900 0 0 16 1901 +1902 1902 1903 1901 0 0 16 1902 +1903 1903 1904 1902 0 0 16 1903 +1904 1904 1905 1903 0 0 16 1904 +1905 1905 1906 1904 0 0 16 1905 +1906 1906 1907 1905 0 0 16 1906 +1907 1907 1908 1906 0 0 16 1907 +1908 1908 1909 1907 0 0 16 1908 +1909 1909 1910 1908 0 0 16 1909 +1910 1910 1911 1909 0 0 16 1910 +1911 1911 1912 1910 0 0 16 1911 +1912 1912 1913 1911 0 0 16 1912 +1913 1913 1914 1912 0 0 16 1913 +1914 1914 1915 1913 0 0 16 1914 +1915 1915 1916 1914 0 0 16 1915 +1916 1916 1917 1915 0 0 16 1916 +1917 1917 1918 1916 0 0 16 1917 +1918 1918 1919 1917 0 0 16 1918 +1919 1919 1920 1918 0 0 16 1919 +1920 1920 1921 1919 0 0 16 1920 +1921 1921 1922 1920 0 0 16 1921 +1922 1922 1923 1921 0 0 16 1922 +1923 1923 1924 1922 0 0 16 1923 +1924 1924 1925 1923 0 0 16 1924 +1925 1925 1926 1924 0 0 16 1925 +1926 1926 1927 1925 0 0 16 1926 +1927 1927 1928 1926 0 0 16 1927 +1928 1928 1929 1927 0 0 16 1928 +1929 1929 1930 1928 0 0 16 1929 +1930 1930 1931 1929 0 0 16 1930 +1931 1931 1932 1930 0 0 16 1931 +1932 1932 1933 1931 0 0 16 1932 +1933 1933 1934 1932 0 0 16 1933 +1934 1934 1935 1933 0 0 16 1934 +1935 1935 1936 1934 0 0 16 1935 +1936 1936 1937 1935 0 0 16 1936 +1937 1937 1938 1936 0 0 16 1937 +1938 1938 1939 1937 0 0 16 1938 +1939 1939 1940 1938 0 0 16 1939 +1940 1940 1941 1939 0 0 16 1940 +1941 1941 1942 1940 0 0 16 1941 +1942 1942 1943 1941 0 0 16 1942 +1943 1943 1944 1942 0 0 16 1943 +1944 1944 1945 1943 0 0 16 1944 +1945 1945 1946 1944 0 0 16 1945 +1946 1946 1947 1945 0 0 16 1946 +1947 1947 1948 1946 0 0 16 1947 +1948 1948 1949 1947 0 0 16 1948 +1949 1949 1950 1948 0 0 16 1949 +1950 1950 1951 1949 0 0 16 1950 +1951 1951 1952 1950 0 0 16 1951 +1952 1952 1953 1951 0 0 16 1952 +1953 1953 1954 1952 0 0 16 1953 +1954 1954 1955 1953 0 0 16 1954 +1955 1955 1956 1954 0 0 16 1955 +1956 1956 1957 1955 0 0 16 1956 +1957 1957 1958 1956 0 0 16 1957 +1958 1958 1959 1957 0 0 16 1958 +1959 1959 1960 1958 0 0 16 1959 +1960 1960 1961 1959 0 0 16 1960 +1961 1961 1962 1960 0 0 16 1961 +1962 1962 1963 1961 0 0 16 1962 +1963 1963 1964 1962 0 0 16 1963 +1964 1964 1965 1963 0 0 16 1964 +1965 1965 1966 1964 0 0 16 1965 +1966 1966 1967 1965 0 0 16 1966 +1967 1967 1968 1966 0 0 16 1967 +1968 1968 1969 1967 0 0 16 1968 +1969 1969 1970 1968 0 0 16 1969 +1970 1970 1971 1969 0 0 16 1970 +1971 1971 1972 1970 0 0 16 1971 +1972 1972 1973 1971 0 0 16 1972 +1973 1973 1974 1972 0 0 16 1973 +1974 1974 1975 1973 0 0 16 1974 +1975 1975 1976 1974 0 0 16 1975 +1976 1976 1977 1975 0 0 16 1976 +1977 1977 1978 1976 0 0 16 1977 +1978 1978 1979 1977 0 0 16 1978 +1979 1979 1980 1978 0 0 16 1979 +1980 1980 1981 1979 0 0 16 1980 +1981 1981 1982 1980 0 0 16 1981 +1982 1982 1983 1981 0 0 16 1982 +1983 1983 1984 1982 0 0 16 1983 +1984 1984 1985 1983 0 0 16 1984 +1985 1985 1986 1984 0 0 16 1985 +1986 1986 1987 1985 0 0 16 1986 +1987 1987 1988 1986 0 0 16 1987 +1988 1988 1989 1987 0 0 16 1988 +1989 1989 1990 1988 0 0 16 1989 +1990 1990 1991 1989 0 0 16 1990 +1991 1991 1992 1990 0 0 16 1991 +1992 1992 1993 1991 0 0 16 1992 +1993 1993 1994 1992 0 0 16 1993 +1994 1994 1995 1993 0 0 16 1994 +1995 1995 1996 1994 0 0 16 1995 +1996 1996 1997 1995 0 0 16 1996 +1997 1997 1998 1996 0 0 16 1997 +1998 1998 1999 1997 0 0 16 1998 +1999 1999 2000 1998 0 0 16 1999 +2000 2000 2001 1999 0 0 16 2000 +2001 2001 2002 2000 0 0 16 2001 +2002 2002 2003 2001 0 0 16 2002 +2003 2003 2004 2002 0 0 16 2003 +2004 2004 2005 2003 0 0 16 2004 +2005 2005 2006 2004 0 0 16 2005 +2006 2006 2007 2005 0 0 16 2006 +2007 2007 2008 2006 0 0 16 2007 +2008 2008 2009 2007 0 0 16 2008 +2009 2009 2010 2008 0 0 16 2009 +2010 2010 2011 2009 0 0 16 2010 +2011 2011 2012 2010 0 0 16 2011 +2012 2012 2013 2011 0 0 16 2012 +2013 2013 2014 2012 0 0 16 2013 +2014 2014 2015 2013 0 0 16 2014 +2015 2015 2016 2014 0 0 16 2015 +2016 2016 2017 2015 0 0 16 2016 +2017 2017 2018 2016 0 0 16 2017 +2018 2018 2019 2017 0 0 16 2018 +2019 2019 2020 2018 0 0 16 2019 +2020 2020 2021 2019 0 0 16 2020 +2021 2021 2022 2020 0 0 16 2021 +2022 2022 2023 2021 0 0 16 2022 +2023 2023 2024 2022 0 0 16 2023 +2024 2024 2025 2023 0 0 16 2024 +2025 2025 2026 2024 0 0 16 2025 +2026 2026 2027 2025 0 0 16 2026 +2027 2027 2028 2026 0 0 16 2027 +2028 2028 2029 2027 0 0 16 2028 +2029 2029 2030 2028 0 0 16 2029 +2030 2030 2031 2029 0 0 16 2030 +2031 2031 2032 2030 0 0 16 2031 +2032 2032 2033 2031 0 0 16 2032 +2033 2033 2034 2032 0 0 16 2033 +2034 2034 2035 2033 0 0 16 2034 +2035 2035 2036 2034 0 0 16 2035 +2036 2036 2037 2035 0 0 16 2036 +2037 2037 2038 2036 0 0 16 2037 +2038 2038 2039 2037 0 0 16 2038 +2039 2039 2040 2038 0 0 16 2039 +2040 2040 2041 2039 0 0 16 2040 +2041 2041 2042 2040 0 0 16 2041 +2042 2042 2043 2041 0 0 16 2042 +2043 2043 2044 2042 0 0 16 2043 +2044 2044 2045 2043 0 0 16 2044 +2045 2045 2046 2044 0 0 16 2045 +2046 2046 0 2045 0 0 16 2046 +2047 2047 -1 0 0 0 16 2047 ====================================================== -=== [Queue after-freeing-0] Next: 0 First: 1 Last: 1023 +=== [Queue after-freeing-0] Next: 0 First: 1 Last: 2047 # seq next prev timeout retrans type cbp 1 1 2 -1 0 0 16 1 2 2 3 1 0 0 16 2 @@ -5162,11 +9258,1035 @@ 1020 1020 1021 1019 0 0 16 1020 1021 1021 1022 1020 0 0 16 1021 1022 1022 1023 1021 0 0 16 1022 -1023 1023 -1 1022 0 0 16 1023 +1023 1023 1024 1022 0 0 16 1023 +1024 1024 1025 1023 0 0 16 1024 +1025 1025 1026 1024 0 0 16 1025 +1026 1026 1027 1025 0 0 16 1026 +1027 1027 1028 1026 0 0 16 1027 +1028 1028 1029 1027 0 0 16 1028 +1029 1029 1030 1028 0 0 16 1029 +1030 1030 1031 1029 0 0 16 1030 +1031 1031 1032 1030 0 0 16 1031 +1032 1032 1033 1031 0 0 16 1032 +1033 1033 1034 1032 0 0 16 1033 +1034 1034 1035 1033 0 0 16 1034 +1035 1035 1036 1034 0 0 16 1035 +1036 1036 1037 1035 0 0 16 1036 +1037 1037 1038 1036 0 0 16 1037 +1038 1038 1039 1037 0 0 16 1038 +1039 1039 1040 1038 0 0 16 1039 +1040 1040 1041 1039 0 0 16 1040 +1041 1041 1042 1040 0 0 16 1041 +1042 1042 1043 1041 0 0 16 1042 +1043 1043 1044 1042 0 0 16 1043 +1044 1044 1045 1043 0 0 16 1044 +1045 1045 1046 1044 0 0 16 1045 +1046 1046 1047 1045 0 0 16 1046 +1047 1047 1048 1046 0 0 16 1047 +1048 1048 1049 1047 0 0 16 1048 +1049 1049 1050 1048 0 0 16 1049 +1050 1050 1051 1049 0 0 16 1050 +1051 1051 1052 1050 0 0 16 1051 +1052 1052 1053 1051 0 0 16 1052 +1053 1053 1054 1052 0 0 16 1053 +1054 1054 1055 1053 0 0 16 1054 +1055 1055 1056 1054 0 0 16 1055 +1056 1056 1057 1055 0 0 16 1056 +1057 1057 1058 1056 0 0 16 1057 +1058 1058 1059 1057 0 0 16 1058 +1059 1059 1060 1058 0 0 16 1059 +1060 1060 1061 1059 0 0 16 1060 +1061 1061 1062 1060 0 0 16 1061 +1062 1062 1063 1061 0 0 16 1062 +1063 1063 1064 1062 0 0 16 1063 +1064 1064 1065 1063 0 0 16 1064 +1065 1065 1066 1064 0 0 16 1065 +1066 1066 1067 1065 0 0 16 1066 +1067 1067 1068 1066 0 0 16 1067 +1068 1068 1069 1067 0 0 16 1068 +1069 1069 1070 1068 0 0 16 1069 +1070 1070 1071 1069 0 0 16 1070 +1071 1071 1072 1070 0 0 16 1071 +1072 1072 1073 1071 0 0 16 1072 +1073 1073 1074 1072 0 0 16 1073 +1074 1074 1075 1073 0 0 16 1074 +1075 1075 1076 1074 0 0 16 1075 +1076 1076 1077 1075 0 0 16 1076 +1077 1077 1078 1076 0 0 16 1077 +1078 1078 1079 1077 0 0 16 1078 +1079 1079 1080 1078 0 0 16 1079 +1080 1080 1081 1079 0 0 16 1080 +1081 1081 1082 1080 0 0 16 1081 +1082 1082 1083 1081 0 0 16 1082 +1083 1083 1084 1082 0 0 16 1083 +1084 1084 1085 1083 0 0 16 1084 +1085 1085 1086 1084 0 0 16 1085 +1086 1086 1087 1085 0 0 16 1086 +1087 1087 1088 1086 0 0 16 1087 +1088 1088 1089 1087 0 0 16 1088 +1089 1089 1090 1088 0 0 16 1089 +1090 1090 1091 1089 0 0 16 1090 +1091 1091 1092 1090 0 0 16 1091 +1092 1092 1093 1091 0 0 16 1092 +1093 1093 1094 1092 0 0 16 1093 +1094 1094 1095 1093 0 0 16 1094 +1095 1095 1096 1094 0 0 16 1095 +1096 1096 1097 1095 0 0 16 1096 +1097 1097 1098 1096 0 0 16 1097 +1098 1098 1099 1097 0 0 16 1098 +1099 1099 1100 1098 0 0 16 1099 +1100 1100 1101 1099 0 0 16 1100 +1101 1101 1102 1100 0 0 16 1101 +1102 1102 1103 1101 0 0 16 1102 +1103 1103 1104 1102 0 0 16 1103 +1104 1104 1105 1103 0 0 16 1104 +1105 1105 1106 1104 0 0 16 1105 +1106 1106 1107 1105 0 0 16 1106 +1107 1107 1108 1106 0 0 16 1107 +1108 1108 1109 1107 0 0 16 1108 +1109 1109 1110 1108 0 0 16 1109 +1110 1110 1111 1109 0 0 16 1110 +1111 1111 1112 1110 0 0 16 1111 +1112 1112 1113 1111 0 0 16 1112 +1113 1113 1114 1112 0 0 16 1113 +1114 1114 1115 1113 0 0 16 1114 +1115 1115 1116 1114 0 0 16 1115 +1116 1116 1117 1115 0 0 16 1116 +1117 1117 1118 1116 0 0 16 1117 +1118 1118 1119 1117 0 0 16 1118 +1119 1119 1120 1118 0 0 16 1119 +1120 1120 1121 1119 0 0 16 1120 +1121 1121 1122 1120 0 0 16 1121 +1122 1122 1123 1121 0 0 16 1122 +1123 1123 1124 1122 0 0 16 1123 +1124 1124 1125 1123 0 0 16 1124 +1125 1125 1126 1124 0 0 16 1125 +1126 1126 1127 1125 0 0 16 1126 +1127 1127 1128 1126 0 0 16 1127 +1128 1128 1129 1127 0 0 16 1128 +1129 1129 1130 1128 0 0 16 1129 +1130 1130 1131 1129 0 0 16 1130 +1131 1131 1132 1130 0 0 16 1131 +1132 1132 1133 1131 0 0 16 1132 +1133 1133 1134 1132 0 0 16 1133 +1134 1134 1135 1133 0 0 16 1134 +1135 1135 1136 1134 0 0 16 1135 +1136 1136 1137 1135 0 0 16 1136 +1137 1137 1138 1136 0 0 16 1137 +1138 1138 1139 1137 0 0 16 1138 +1139 1139 1140 1138 0 0 16 1139 +1140 1140 1141 1139 0 0 16 1140 +1141 1141 1142 1140 0 0 16 1141 +1142 1142 1143 1141 0 0 16 1142 +1143 1143 1144 1142 0 0 16 1143 +1144 1144 1145 1143 0 0 16 1144 +1145 1145 1146 1144 0 0 16 1145 +1146 1146 1147 1145 0 0 16 1146 +1147 1147 1148 1146 0 0 16 1147 +1148 1148 1149 1147 0 0 16 1148 +1149 1149 1150 1148 0 0 16 1149 +1150 1150 1151 1149 0 0 16 1150 +1151 1151 1152 1150 0 0 16 1151 +1152 1152 1153 1151 0 0 16 1152 +1153 1153 1154 1152 0 0 16 1153 +1154 1154 1155 1153 0 0 16 1154 +1155 1155 1156 1154 0 0 16 1155 +1156 1156 1157 1155 0 0 16 1156 +1157 1157 1158 1156 0 0 16 1157 +1158 1158 1159 1157 0 0 16 1158 +1159 1159 1160 1158 0 0 16 1159 +1160 1160 1161 1159 0 0 16 1160 +1161 1161 1162 1160 0 0 16 1161 +1162 1162 1163 1161 0 0 16 1162 +1163 1163 1164 1162 0 0 16 1163 +1164 1164 1165 1163 0 0 16 1164 +1165 1165 1166 1164 0 0 16 1165 +1166 1166 1167 1165 0 0 16 1166 +1167 1167 1168 1166 0 0 16 1167 +1168 1168 1169 1167 0 0 16 1168 +1169 1169 1170 1168 0 0 16 1169 +1170 1170 1171 1169 0 0 16 1170 +1171 1171 1172 1170 0 0 16 1171 +1172 1172 1173 1171 0 0 16 1172 +1173 1173 1174 1172 0 0 16 1173 +1174 1174 1175 1173 0 0 16 1174 +1175 1175 1176 1174 0 0 16 1175 +1176 1176 1177 1175 0 0 16 1176 +1177 1177 1178 1176 0 0 16 1177 +1178 1178 1179 1177 0 0 16 1178 +1179 1179 1180 1178 0 0 16 1179 +1180 1180 1181 1179 0 0 16 1180 +1181 1181 1182 1180 0 0 16 1181 +1182 1182 1183 1181 0 0 16 1182 +1183 1183 1184 1182 0 0 16 1183 +1184 1184 1185 1183 0 0 16 1184 +1185 1185 1186 1184 0 0 16 1185 +1186 1186 1187 1185 0 0 16 1186 +1187 1187 1188 1186 0 0 16 1187 +1188 1188 1189 1187 0 0 16 1188 +1189 1189 1190 1188 0 0 16 1189 +1190 1190 1191 1189 0 0 16 1190 +1191 1191 1192 1190 0 0 16 1191 +1192 1192 1193 1191 0 0 16 1192 +1193 1193 1194 1192 0 0 16 1193 +1194 1194 1195 1193 0 0 16 1194 +1195 1195 1196 1194 0 0 16 1195 +1196 1196 1197 1195 0 0 16 1196 +1197 1197 1198 1196 0 0 16 1197 +1198 1198 1199 1197 0 0 16 1198 +1199 1199 1200 1198 0 0 16 1199 +1200 1200 1201 1199 0 0 16 1200 +1201 1201 1202 1200 0 0 16 1201 +1202 1202 1203 1201 0 0 16 1202 +1203 1203 1204 1202 0 0 16 1203 +1204 1204 1205 1203 0 0 16 1204 +1205 1205 1206 1204 0 0 16 1205 +1206 1206 1207 1205 0 0 16 1206 +1207 1207 1208 1206 0 0 16 1207 +1208 1208 1209 1207 0 0 16 1208 +1209 1209 1210 1208 0 0 16 1209 +1210 1210 1211 1209 0 0 16 1210 +1211 1211 1212 1210 0 0 16 1211 +1212 1212 1213 1211 0 0 16 1212 +1213 1213 1214 1212 0 0 16 1213 +1214 1214 1215 1213 0 0 16 1214 +1215 1215 1216 1214 0 0 16 1215 +1216 1216 1217 1215 0 0 16 1216 +1217 1217 1218 1216 0 0 16 1217 +1218 1218 1219 1217 0 0 16 1218 +1219 1219 1220 1218 0 0 16 1219 +1220 1220 1221 1219 0 0 16 1220 +1221 1221 1222 1220 0 0 16 1221 +1222 1222 1223 1221 0 0 16 1222 +1223 1223 1224 1222 0 0 16 1223 +1224 1224 1225 1223 0 0 16 1224 +1225 1225 1226 1224 0 0 16 1225 +1226 1226 1227 1225 0 0 16 1226 +1227 1227 1228 1226 0 0 16 1227 +1228 1228 1229 1227 0 0 16 1228 +1229 1229 1230 1228 0 0 16 1229 +1230 1230 1231 1229 0 0 16 1230 +1231 1231 1232 1230 0 0 16 1231 +1232 1232 1233 1231 0 0 16 1232 +1233 1233 1234 1232 0 0 16 1233 +1234 1234 1235 1233 0 0 16 1234 +1235 1235 1236 1234 0 0 16 1235 +1236 1236 1237 1235 0 0 16 1236 +1237 1237 1238 1236 0 0 16 1237 +1238 1238 1239 1237 0 0 16 1238 +1239 1239 1240 1238 0 0 16 1239 +1240 1240 1241 1239 0 0 16 1240 +1241 1241 1242 1240 0 0 16 1241 +1242 1242 1243 1241 0 0 16 1242 +1243 1243 1244 1242 0 0 16 1243 +1244 1244 1245 1243 0 0 16 1244 +1245 1245 1246 1244 0 0 16 1245 +1246 1246 1247 1245 0 0 16 1246 +1247 1247 1248 1246 0 0 16 1247 +1248 1248 1249 1247 0 0 16 1248 +1249 1249 1250 1248 0 0 16 1249 +1250 1250 1251 1249 0 0 16 1250 +1251 1251 1252 1250 0 0 16 1251 +1252 1252 1253 1251 0 0 16 1252 +1253 1253 1254 1252 0 0 16 1253 +1254 1254 1255 1253 0 0 16 1254 +1255 1255 1256 1254 0 0 16 1255 +1256 1256 1257 1255 0 0 16 1256 +1257 1257 1258 1256 0 0 16 1257 +1258 1258 1259 1257 0 0 16 1258 +1259 1259 1260 1258 0 0 16 1259 +1260 1260 1261 1259 0 0 16 1260 +1261 1261 1262 1260 0 0 16 1261 +1262 1262 1263 1261 0 0 16 1262 +1263 1263 1264 1262 0 0 16 1263 +1264 1264 1265 1263 0 0 16 1264 +1265 1265 1266 1264 0 0 16 1265 +1266 1266 1267 1265 0 0 16 1266 +1267 1267 1268 1266 0 0 16 1267 +1268 1268 1269 1267 0 0 16 1268 +1269 1269 1270 1268 0 0 16 1269 +1270 1270 1271 1269 0 0 16 1270 +1271 1271 1272 1270 0 0 16 1271 +1272 1272 1273 1271 0 0 16 1272 +1273 1273 1274 1272 0 0 16 1273 +1274 1274 1275 1273 0 0 16 1274 +1275 1275 1276 1274 0 0 16 1275 +1276 1276 1277 1275 0 0 16 1276 +1277 1277 1278 1276 0 0 16 1277 +1278 1278 1279 1277 0 0 16 1278 +1279 1279 1280 1278 0 0 16 1279 +1280 1280 1281 1279 0 0 16 1280 +1281 1281 1282 1280 0 0 16 1281 +1282 1282 1283 1281 0 0 16 1282 +1283 1283 1284 1282 0 0 16 1283 +1284 1284 1285 1283 0 0 16 1284 +1285 1285 1286 1284 0 0 16 1285 +1286 1286 1287 1285 0 0 16 1286 +1287 1287 1288 1286 0 0 16 1287 +1288 1288 1289 1287 0 0 16 1288 +1289 1289 1290 1288 0 0 16 1289 +1290 1290 1291 1289 0 0 16 1290 +1291 1291 1292 1290 0 0 16 1291 +1292 1292 1293 1291 0 0 16 1292 +1293 1293 1294 1292 0 0 16 1293 +1294 1294 1295 1293 0 0 16 1294 +1295 1295 1296 1294 0 0 16 1295 +1296 1296 1297 1295 0 0 16 1296 +1297 1297 1298 1296 0 0 16 1297 +1298 1298 1299 1297 0 0 16 1298 +1299 1299 1300 1298 0 0 16 1299 +1300 1300 1301 1299 0 0 16 1300 +1301 1301 1302 1300 0 0 16 1301 +1302 1302 1303 1301 0 0 16 1302 +1303 1303 1304 1302 0 0 16 1303 +1304 1304 1305 1303 0 0 16 1304 +1305 1305 1306 1304 0 0 16 1305 +1306 1306 1307 1305 0 0 16 1306 +1307 1307 1308 1306 0 0 16 1307 +1308 1308 1309 1307 0 0 16 1308 +1309 1309 1310 1308 0 0 16 1309 +1310 1310 1311 1309 0 0 16 1310 +1311 1311 1312 1310 0 0 16 1311 +1312 1312 1313 1311 0 0 16 1312 +1313 1313 1314 1312 0 0 16 1313 +1314 1314 1315 1313 0 0 16 1314 +1315 1315 1316 1314 0 0 16 1315 +1316 1316 1317 1315 0 0 16 1316 +1317 1317 1318 1316 0 0 16 1317 +1318 1318 1319 1317 0 0 16 1318 +1319 1319 1320 1318 0 0 16 1319 +1320 1320 1321 1319 0 0 16 1320 +1321 1321 1322 1320 0 0 16 1321 +1322 1322 1323 1321 0 0 16 1322 +1323 1323 1324 1322 0 0 16 1323 +1324 1324 1325 1323 0 0 16 1324 +1325 1325 1326 1324 0 0 16 1325 +1326 1326 1327 1325 0 0 16 1326 +1327 1327 1328 1326 0 0 16 1327 +1328 1328 1329 1327 0 0 16 1328 +1329 1329 1330 1328 0 0 16 1329 +1330 1330 1331 1329 0 0 16 1330 +1331 1331 1332 1330 0 0 16 1331 +1332 1332 1333 1331 0 0 16 1332 +1333 1333 1334 1332 0 0 16 1333 +1334 1334 1335 1333 0 0 16 1334 +1335 1335 1336 1334 0 0 16 1335 +1336 1336 1337 1335 0 0 16 1336 +1337 1337 1338 1336 0 0 16 1337 +1338 1338 1339 1337 0 0 16 1338 +1339 1339 1340 1338 0 0 16 1339 +1340 1340 1341 1339 0 0 16 1340 +1341 1341 1342 1340 0 0 16 1341 +1342 1342 1343 1341 0 0 16 1342 +1343 1343 1344 1342 0 0 16 1343 +1344 1344 1345 1343 0 0 16 1344 +1345 1345 1346 1344 0 0 16 1345 +1346 1346 1347 1345 0 0 16 1346 +1347 1347 1348 1346 0 0 16 1347 +1348 1348 1349 1347 0 0 16 1348 +1349 1349 1350 1348 0 0 16 1349 +1350 1350 1351 1349 0 0 16 1350 +1351 1351 1352 1350 0 0 16 1351 +1352 1352 1353 1351 0 0 16 1352 +1353 1353 1354 1352 0 0 16 1353 +1354 1354 1355 1353 0 0 16 1354 +1355 1355 1356 1354 0 0 16 1355 +1356 1356 1357 1355 0 0 16 1356 +1357 1357 1358 1356 0 0 16 1357 +1358 1358 1359 1357 0 0 16 1358 +1359 1359 1360 1358 0 0 16 1359 +1360 1360 1361 1359 0 0 16 1360 +1361 1361 1362 1360 0 0 16 1361 +1362 1362 1363 1361 0 0 16 1362 +1363 1363 1364 1362 0 0 16 1363 +1364 1364 1365 1363 0 0 16 1364 +1365 1365 1366 1364 0 0 16 1365 +1366 1366 1367 1365 0 0 16 1366 +1367 1367 1368 1366 0 0 16 1367 +1368 1368 1369 1367 0 0 16 1368 +1369 1369 1370 1368 0 0 16 1369 +1370 1370 1371 1369 0 0 16 1370 +1371 1371 1372 1370 0 0 16 1371 +1372 1372 1373 1371 0 0 16 1372 +1373 1373 1374 1372 0 0 16 1373 +1374 1374 1375 1373 0 0 16 1374 +1375 1375 1376 1374 0 0 16 1375 +1376 1376 1377 1375 0 0 16 1376 +1377 1377 1378 1376 0 0 16 1377 +1378 1378 1379 1377 0 0 16 1378 +1379 1379 1380 1378 0 0 16 1379 +1380 1380 1381 1379 0 0 16 1380 +1381 1381 1382 1380 0 0 16 1381 +1382 1382 1383 1381 0 0 16 1382 +1383 1383 1384 1382 0 0 16 1383 +1384 1384 1385 1383 0 0 16 1384 +1385 1385 1386 1384 0 0 16 1385 +1386 1386 1387 1385 0 0 16 1386 +1387 1387 1388 1386 0 0 16 1387 +1388 1388 1389 1387 0 0 16 1388 +1389 1389 1390 1388 0 0 16 1389 +1390 1390 1391 1389 0 0 16 1390 +1391 1391 1392 1390 0 0 16 1391 +1392 1392 1393 1391 0 0 16 1392 +1393 1393 1394 1392 0 0 16 1393 +1394 1394 1395 1393 0 0 16 1394 +1395 1395 1396 1394 0 0 16 1395 +1396 1396 1397 1395 0 0 16 1396 +1397 1397 1398 1396 0 0 16 1397 +1398 1398 1399 1397 0 0 16 1398 +1399 1399 1400 1398 0 0 16 1399 +1400 1400 1401 1399 0 0 16 1400 +1401 1401 1402 1400 0 0 16 1401 +1402 1402 1403 1401 0 0 16 1402 +1403 1403 1404 1402 0 0 16 1403 +1404 1404 1405 1403 0 0 16 1404 +1405 1405 1406 1404 0 0 16 1405 +1406 1406 1407 1405 0 0 16 1406 +1407 1407 1408 1406 0 0 16 1407 +1408 1408 1409 1407 0 0 16 1408 +1409 1409 1410 1408 0 0 16 1409 +1410 1410 1411 1409 0 0 16 1410 +1411 1411 1412 1410 0 0 16 1411 +1412 1412 1413 1411 0 0 16 1412 +1413 1413 1414 1412 0 0 16 1413 +1414 1414 1415 1413 0 0 16 1414 +1415 1415 1416 1414 0 0 16 1415 +1416 1416 1417 1415 0 0 16 1416 +1417 1417 1418 1416 0 0 16 1417 +1418 1418 1419 1417 0 0 16 1418 +1419 1419 1420 1418 0 0 16 1419 +1420 1420 1421 1419 0 0 16 1420 +1421 1421 1422 1420 0 0 16 1421 +1422 1422 1423 1421 0 0 16 1422 +1423 1423 1424 1422 0 0 16 1423 +1424 1424 1425 1423 0 0 16 1424 +1425 1425 1426 1424 0 0 16 1425 +1426 1426 1427 1425 0 0 16 1426 +1427 1427 1428 1426 0 0 16 1427 +1428 1428 1429 1427 0 0 16 1428 +1429 1429 1430 1428 0 0 16 1429 +1430 1430 1431 1429 0 0 16 1430 +1431 1431 1432 1430 0 0 16 1431 +1432 1432 1433 1431 0 0 16 1432 +1433 1433 1434 1432 0 0 16 1433 +1434 1434 1435 1433 0 0 16 1434 +1435 1435 1436 1434 0 0 16 1435 +1436 1436 1437 1435 0 0 16 1436 +1437 1437 1438 1436 0 0 16 1437 +1438 1438 1439 1437 0 0 16 1438 +1439 1439 1440 1438 0 0 16 1439 +1440 1440 1441 1439 0 0 16 1440 +1441 1441 1442 1440 0 0 16 1441 +1442 1442 1443 1441 0 0 16 1442 +1443 1443 1444 1442 0 0 16 1443 +1444 1444 1445 1443 0 0 16 1444 +1445 1445 1446 1444 0 0 16 1445 +1446 1446 1447 1445 0 0 16 1446 +1447 1447 1448 1446 0 0 16 1447 +1448 1448 1449 1447 0 0 16 1448 +1449 1449 1450 1448 0 0 16 1449 +1450 1450 1451 1449 0 0 16 1450 +1451 1451 1452 1450 0 0 16 1451 +1452 1452 1453 1451 0 0 16 1452 +1453 1453 1454 1452 0 0 16 1453 +1454 1454 1455 1453 0 0 16 1454 +1455 1455 1456 1454 0 0 16 1455 +1456 1456 1457 1455 0 0 16 1456 +1457 1457 1458 1456 0 0 16 1457 +1458 1458 1459 1457 0 0 16 1458 +1459 1459 1460 1458 0 0 16 1459 +1460 1460 1461 1459 0 0 16 1460 +1461 1461 1462 1460 0 0 16 1461 +1462 1462 1463 1461 0 0 16 1462 +1463 1463 1464 1462 0 0 16 1463 +1464 1464 1465 1463 0 0 16 1464 +1465 1465 1466 1464 0 0 16 1465 +1466 1466 1467 1465 0 0 16 1466 +1467 1467 1468 1466 0 0 16 1467 +1468 1468 1469 1467 0 0 16 1468 +1469 1469 1470 1468 0 0 16 1469 +1470 1470 1471 1469 0 0 16 1470 +1471 1471 1472 1470 0 0 16 1471 +1472 1472 1473 1471 0 0 16 1472 +1473 1473 1474 1472 0 0 16 1473 +1474 1474 1475 1473 0 0 16 1474 +1475 1475 1476 1474 0 0 16 1475 +1476 1476 1477 1475 0 0 16 1476 +1477 1477 1478 1476 0 0 16 1477 +1478 1478 1479 1477 0 0 16 1478 +1479 1479 1480 1478 0 0 16 1479 +1480 1480 1481 1479 0 0 16 1480 +1481 1481 1482 1480 0 0 16 1481 +1482 1482 1483 1481 0 0 16 1482 +1483 1483 1484 1482 0 0 16 1483 +1484 1484 1485 1483 0 0 16 1484 +1485 1485 1486 1484 0 0 16 1485 +1486 1486 1487 1485 0 0 16 1486 +1487 1487 1488 1486 0 0 16 1487 +1488 1488 1489 1487 0 0 16 1488 +1489 1489 1490 1488 0 0 16 1489 +1490 1490 1491 1489 0 0 16 1490 +1491 1491 1492 1490 0 0 16 1491 +1492 1492 1493 1491 0 0 16 1492 +1493 1493 1494 1492 0 0 16 1493 +1494 1494 1495 1493 0 0 16 1494 +1495 1495 1496 1494 0 0 16 1495 +1496 1496 1497 1495 0 0 16 1496 +1497 1497 1498 1496 0 0 16 1497 +1498 1498 1499 1497 0 0 16 1498 +1499 1499 1500 1498 0 0 16 1499 +1500 1500 1501 1499 0 0 16 1500 +1501 1501 1502 1500 0 0 16 1501 +1502 1502 1503 1501 0 0 16 1502 +1503 1503 1504 1502 0 0 16 1503 +1504 1504 1505 1503 0 0 16 1504 +1505 1505 1506 1504 0 0 16 1505 +1506 1506 1507 1505 0 0 16 1506 +1507 1507 1508 1506 0 0 16 1507 +1508 1508 1509 1507 0 0 16 1508 +1509 1509 1510 1508 0 0 16 1509 +1510 1510 1511 1509 0 0 16 1510 +1511 1511 1512 1510 0 0 16 1511 +1512 1512 1513 1511 0 0 16 1512 +1513 1513 1514 1512 0 0 16 1513 +1514 1514 1515 1513 0 0 16 1514 +1515 1515 1516 1514 0 0 16 1515 +1516 1516 1517 1515 0 0 16 1516 +1517 1517 1518 1516 0 0 16 1517 +1518 1518 1519 1517 0 0 16 1518 +1519 1519 1520 1518 0 0 16 1519 +1520 1520 1521 1519 0 0 16 1520 +1521 1521 1522 1520 0 0 16 1521 +1522 1522 1523 1521 0 0 16 1522 +1523 1523 1524 1522 0 0 16 1523 +1524 1524 1525 1523 0 0 16 1524 +1525 1525 1526 1524 0 0 16 1525 +1526 1526 1527 1525 0 0 16 1526 +1527 1527 1528 1526 0 0 16 1527 +1528 1528 1529 1527 0 0 16 1528 +1529 1529 1530 1528 0 0 16 1529 +1530 1530 1531 1529 0 0 16 1530 +1531 1531 1532 1530 0 0 16 1531 +1532 1532 1533 1531 0 0 16 1532 +1533 1533 1534 1532 0 0 16 1533 +1534 1534 1535 1533 0 0 16 1534 +1535 1535 1536 1534 0 0 16 1535 +1536 1536 1537 1535 0 0 16 1536 +1537 1537 1538 1536 0 0 16 1537 +1538 1538 1539 1537 0 0 16 1538 +1539 1539 1540 1538 0 0 16 1539 +1540 1540 1541 1539 0 0 16 1540 +1541 1541 1542 1540 0 0 16 1541 +1542 1542 1543 1541 0 0 16 1542 +1543 1543 1544 1542 0 0 16 1543 +1544 1544 1545 1543 0 0 16 1544 +1545 1545 1546 1544 0 0 16 1545 +1546 1546 1547 1545 0 0 16 1546 +1547 1547 1548 1546 0 0 16 1547 +1548 1548 1549 1547 0 0 16 1548 +1549 1549 1550 1548 0 0 16 1549 +1550 1550 1551 1549 0 0 16 1550 +1551 1551 1552 1550 0 0 16 1551 +1552 1552 1553 1551 0 0 16 1552 +1553 1553 1554 1552 0 0 16 1553 +1554 1554 1555 1553 0 0 16 1554 +1555 1555 1556 1554 0 0 16 1555 +1556 1556 1557 1555 0 0 16 1556 +1557 1557 1558 1556 0 0 16 1557 +1558 1558 1559 1557 0 0 16 1558 +1559 1559 1560 1558 0 0 16 1559 +1560 1560 1561 1559 0 0 16 1560 +1561 1561 1562 1560 0 0 16 1561 +1562 1562 1563 1561 0 0 16 1562 +1563 1563 1564 1562 0 0 16 1563 +1564 1564 1565 1563 0 0 16 1564 +1565 1565 1566 1564 0 0 16 1565 +1566 1566 1567 1565 0 0 16 1566 +1567 1567 1568 1566 0 0 16 1567 +1568 1568 1569 1567 0 0 16 1568 +1569 1569 1570 1568 0 0 16 1569 +1570 1570 1571 1569 0 0 16 1570 +1571 1571 1572 1570 0 0 16 1571 +1572 1572 1573 1571 0 0 16 1572 +1573 1573 1574 1572 0 0 16 1573 +1574 1574 1575 1573 0 0 16 1574 +1575 1575 1576 1574 0 0 16 1575 +1576 1576 1577 1575 0 0 16 1576 +1577 1577 1578 1576 0 0 16 1577 +1578 1578 1579 1577 0 0 16 1578 +1579 1579 1580 1578 0 0 16 1579 +1580 1580 1581 1579 0 0 16 1580 +1581 1581 1582 1580 0 0 16 1581 +1582 1582 1583 1581 0 0 16 1582 +1583 1583 1584 1582 0 0 16 1583 +1584 1584 1585 1583 0 0 16 1584 +1585 1585 1586 1584 0 0 16 1585 +1586 1586 1587 1585 0 0 16 1586 +1587 1587 1588 1586 0 0 16 1587 +1588 1588 1589 1587 0 0 16 1588 +1589 1589 1590 1588 0 0 16 1589 +1590 1590 1591 1589 0 0 16 1590 +1591 1591 1592 1590 0 0 16 1591 +1592 1592 1593 1591 0 0 16 1592 +1593 1593 1594 1592 0 0 16 1593 +1594 1594 1595 1593 0 0 16 1594 +1595 1595 1596 1594 0 0 16 1595 +1596 1596 1597 1595 0 0 16 1596 +1597 1597 1598 1596 0 0 16 1597 +1598 1598 1599 1597 0 0 16 1598 +1599 1599 1600 1598 0 0 16 1599 +1600 1600 1601 1599 0 0 16 1600 +1601 1601 1602 1600 0 0 16 1601 +1602 1602 1603 1601 0 0 16 1602 +1603 1603 1604 1602 0 0 16 1603 +1604 1604 1605 1603 0 0 16 1604 +1605 1605 1606 1604 0 0 16 1605 +1606 1606 1607 1605 0 0 16 1606 +1607 1607 1608 1606 0 0 16 1607 +1608 1608 1609 1607 0 0 16 1608 +1609 1609 1610 1608 0 0 16 1609 +1610 1610 1611 1609 0 0 16 1610 +1611 1611 1612 1610 0 0 16 1611 +1612 1612 1613 1611 0 0 16 1612 +1613 1613 1614 1612 0 0 16 1613 +1614 1614 1615 1613 0 0 16 1614 +1615 1615 1616 1614 0 0 16 1615 +1616 1616 1617 1615 0 0 16 1616 +1617 1617 1618 1616 0 0 16 1617 +1618 1618 1619 1617 0 0 16 1618 +1619 1619 1620 1618 0 0 16 1619 +1620 1620 1621 1619 0 0 16 1620 +1621 1621 1622 1620 0 0 16 1621 +1622 1622 1623 1621 0 0 16 1622 +1623 1623 1624 1622 0 0 16 1623 +1624 1624 1625 1623 0 0 16 1624 +1625 1625 1626 1624 0 0 16 1625 +1626 1626 1627 1625 0 0 16 1626 +1627 1627 1628 1626 0 0 16 1627 +1628 1628 1629 1627 0 0 16 1628 +1629 1629 1630 1628 0 0 16 1629 +1630 1630 1631 1629 0 0 16 1630 +1631 1631 1632 1630 0 0 16 1631 +1632 1632 1633 1631 0 0 16 1632 +1633 1633 1634 1632 0 0 16 1633 +1634 1634 1635 1633 0 0 16 1634 +1635 1635 1636 1634 0 0 16 1635 +1636 1636 1637 1635 0 0 16 1636 +1637 1637 1638 1636 0 0 16 1637 +1638 1638 1639 1637 0 0 16 1638 +1639 1639 1640 1638 0 0 16 1639 +1640 1640 1641 1639 0 0 16 1640 +1641 1641 1642 1640 0 0 16 1641 +1642 1642 1643 1641 0 0 16 1642 +1643 1643 1644 1642 0 0 16 1643 +1644 1644 1645 1643 0 0 16 1644 +1645 1645 1646 1644 0 0 16 1645 +1646 1646 1647 1645 0 0 16 1646 +1647 1647 1648 1646 0 0 16 1647 +1648 1648 1649 1647 0 0 16 1648 +1649 1649 1650 1648 0 0 16 1649 +1650 1650 1651 1649 0 0 16 1650 +1651 1651 1652 1650 0 0 16 1651 +1652 1652 1653 1651 0 0 16 1652 +1653 1653 1654 1652 0 0 16 1653 +1654 1654 1655 1653 0 0 16 1654 +1655 1655 1656 1654 0 0 16 1655 +1656 1656 1657 1655 0 0 16 1656 +1657 1657 1658 1656 0 0 16 1657 +1658 1658 1659 1657 0 0 16 1658 +1659 1659 1660 1658 0 0 16 1659 +1660 1660 1661 1659 0 0 16 1660 +1661 1661 1662 1660 0 0 16 1661 +1662 1662 1663 1661 0 0 16 1662 +1663 1663 1664 1662 0 0 16 1663 +1664 1664 1665 1663 0 0 16 1664 +1665 1665 1666 1664 0 0 16 1665 +1666 1666 1667 1665 0 0 16 1666 +1667 1667 1668 1666 0 0 16 1667 +1668 1668 1669 1667 0 0 16 1668 +1669 1669 1670 1668 0 0 16 1669 +1670 1670 1671 1669 0 0 16 1670 +1671 1671 1672 1670 0 0 16 1671 +1672 1672 1673 1671 0 0 16 1672 +1673 1673 1674 1672 0 0 16 1673 +1674 1674 1675 1673 0 0 16 1674 +1675 1675 1676 1674 0 0 16 1675 +1676 1676 1677 1675 0 0 16 1676 +1677 1677 1678 1676 0 0 16 1677 +1678 1678 1679 1677 0 0 16 1678 +1679 1679 1680 1678 0 0 16 1679 +1680 1680 1681 1679 0 0 16 1680 +1681 1681 1682 1680 0 0 16 1681 +1682 1682 1683 1681 0 0 16 1682 +1683 1683 1684 1682 0 0 16 1683 +1684 1684 1685 1683 0 0 16 1684 +1685 1685 1686 1684 0 0 16 1685 +1686 1686 1687 1685 0 0 16 1686 +1687 1687 1688 1686 0 0 16 1687 +1688 1688 1689 1687 0 0 16 1688 +1689 1689 1690 1688 0 0 16 1689 +1690 1690 1691 1689 0 0 16 1690 +1691 1691 1692 1690 0 0 16 1691 +1692 1692 1693 1691 0 0 16 1692 +1693 1693 1694 1692 0 0 16 1693 +1694 1694 1695 1693 0 0 16 1694 +1695 1695 1696 1694 0 0 16 1695 +1696 1696 1697 1695 0 0 16 1696 +1697 1697 1698 1696 0 0 16 1697 +1698 1698 1699 1697 0 0 16 1698 +1699 1699 1700 1698 0 0 16 1699 +1700 1700 1701 1699 0 0 16 1700 +1701 1701 1702 1700 0 0 16 1701 +1702 1702 1703 1701 0 0 16 1702 +1703 1703 1704 1702 0 0 16 1703 +1704 1704 1705 1703 0 0 16 1704 +1705 1705 1706 1704 0 0 16 1705 +1706 1706 1707 1705 0 0 16 1706 +1707 1707 1708 1706 0 0 16 1707 +1708 1708 1709 1707 0 0 16 1708 +1709 1709 1710 1708 0 0 16 1709 +1710 1710 1711 1709 0 0 16 1710 +1711 1711 1712 1710 0 0 16 1711 +1712 1712 1713 1711 0 0 16 1712 +1713 1713 1714 1712 0 0 16 1713 +1714 1714 1715 1713 0 0 16 1714 +1715 1715 1716 1714 0 0 16 1715 +1716 1716 1717 1715 0 0 16 1716 +1717 1717 1718 1716 0 0 16 1717 +1718 1718 1719 1717 0 0 16 1718 +1719 1719 1720 1718 0 0 16 1719 +1720 1720 1721 1719 0 0 16 1720 +1721 1721 1722 1720 0 0 16 1721 +1722 1722 1723 1721 0 0 16 1722 +1723 1723 1724 1722 0 0 16 1723 +1724 1724 1725 1723 0 0 16 1724 +1725 1725 1726 1724 0 0 16 1725 +1726 1726 1727 1725 0 0 16 1726 +1727 1727 1728 1726 0 0 16 1727 +1728 1728 1729 1727 0 0 16 1728 +1729 1729 1730 1728 0 0 16 1729 +1730 1730 1731 1729 0 0 16 1730 +1731 1731 1732 1730 0 0 16 1731 +1732 1732 1733 1731 0 0 16 1732 +1733 1733 1734 1732 0 0 16 1733 +1734 1734 1735 1733 0 0 16 1734 +1735 1735 1736 1734 0 0 16 1735 +1736 1736 1737 1735 0 0 16 1736 +1737 1737 1738 1736 0 0 16 1737 +1738 1738 1739 1737 0 0 16 1738 +1739 1739 1740 1738 0 0 16 1739 +1740 1740 1741 1739 0 0 16 1740 +1741 1741 1742 1740 0 0 16 1741 +1742 1742 1743 1741 0 0 16 1742 +1743 1743 1744 1742 0 0 16 1743 +1744 1744 1745 1743 0 0 16 1744 +1745 1745 1746 1744 0 0 16 1745 +1746 1746 1747 1745 0 0 16 1746 +1747 1747 1748 1746 0 0 16 1747 +1748 1748 1749 1747 0 0 16 1748 +1749 1749 1750 1748 0 0 16 1749 +1750 1750 1751 1749 0 0 16 1750 +1751 1751 1752 1750 0 0 16 1751 +1752 1752 1753 1751 0 0 16 1752 +1753 1753 1754 1752 0 0 16 1753 +1754 1754 1755 1753 0 0 16 1754 +1755 1755 1756 1754 0 0 16 1755 +1756 1756 1757 1755 0 0 16 1756 +1757 1757 1758 1756 0 0 16 1757 +1758 1758 1759 1757 0 0 16 1758 +1759 1759 1760 1758 0 0 16 1759 +1760 1760 1761 1759 0 0 16 1760 +1761 1761 1762 1760 0 0 16 1761 +1762 1762 1763 1761 0 0 16 1762 +1763 1763 1764 1762 0 0 16 1763 +1764 1764 1765 1763 0 0 16 1764 +1765 1765 1766 1764 0 0 16 1765 +1766 1766 1767 1765 0 0 16 1766 +1767 1767 1768 1766 0 0 16 1767 +1768 1768 1769 1767 0 0 16 1768 +1769 1769 1770 1768 0 0 16 1769 +1770 1770 1771 1769 0 0 16 1770 +1771 1771 1772 1770 0 0 16 1771 +1772 1772 1773 1771 0 0 16 1772 +1773 1773 1774 1772 0 0 16 1773 +1774 1774 1775 1773 0 0 16 1774 +1775 1775 1776 1774 0 0 16 1775 +1776 1776 1777 1775 0 0 16 1776 +1777 1777 1778 1776 0 0 16 1777 +1778 1778 1779 1777 0 0 16 1778 +1779 1779 1780 1778 0 0 16 1779 +1780 1780 1781 1779 0 0 16 1780 +1781 1781 1782 1780 0 0 16 1781 +1782 1782 1783 1781 0 0 16 1782 +1783 1783 1784 1782 0 0 16 1783 +1784 1784 1785 1783 0 0 16 1784 +1785 1785 1786 1784 0 0 16 1785 +1786 1786 1787 1785 0 0 16 1786 +1787 1787 1788 1786 0 0 16 1787 +1788 1788 1789 1787 0 0 16 1788 +1789 1789 1790 1788 0 0 16 1789 +1790 1790 1791 1789 0 0 16 1790 +1791 1791 1792 1790 0 0 16 1791 +1792 1792 1793 1791 0 0 16 1792 +1793 1793 1794 1792 0 0 16 1793 +1794 1794 1795 1793 0 0 16 1794 +1795 1795 1796 1794 0 0 16 1795 +1796 1796 1797 1795 0 0 16 1796 +1797 1797 1798 1796 0 0 16 1797 +1798 1798 1799 1797 0 0 16 1798 +1799 1799 1800 1798 0 0 16 1799 +1800 1800 1801 1799 0 0 16 1800 +1801 1801 1802 1800 0 0 16 1801 +1802 1802 1803 1801 0 0 16 1802 +1803 1803 1804 1802 0 0 16 1803 +1804 1804 1805 1803 0 0 16 1804 +1805 1805 1806 1804 0 0 16 1805 +1806 1806 1807 1805 0 0 16 1806 +1807 1807 1808 1806 0 0 16 1807 +1808 1808 1809 1807 0 0 16 1808 +1809 1809 1810 1808 0 0 16 1809 +1810 1810 1811 1809 0 0 16 1810 +1811 1811 1812 1810 0 0 16 1811 +1812 1812 1813 1811 0 0 16 1812 +1813 1813 1814 1812 0 0 16 1813 +1814 1814 1815 1813 0 0 16 1814 +1815 1815 1816 1814 0 0 16 1815 +1816 1816 1817 1815 0 0 16 1816 +1817 1817 1818 1816 0 0 16 1817 +1818 1818 1819 1817 0 0 16 1818 +1819 1819 1820 1818 0 0 16 1819 +1820 1820 1821 1819 0 0 16 1820 +1821 1821 1822 1820 0 0 16 1821 +1822 1822 1823 1821 0 0 16 1822 +1823 1823 1824 1822 0 0 16 1823 +1824 1824 1825 1823 0 0 16 1824 +1825 1825 1826 1824 0 0 16 1825 +1826 1826 1827 1825 0 0 16 1826 +1827 1827 1828 1826 0 0 16 1827 +1828 1828 1829 1827 0 0 16 1828 +1829 1829 1830 1828 0 0 16 1829 +1830 1830 1831 1829 0 0 16 1830 +1831 1831 1832 1830 0 0 16 1831 +1832 1832 1833 1831 0 0 16 1832 +1833 1833 1834 1832 0 0 16 1833 +1834 1834 1835 1833 0 0 16 1834 +1835 1835 1836 1834 0 0 16 1835 +1836 1836 1837 1835 0 0 16 1836 +1837 1837 1838 1836 0 0 16 1837 +1838 1838 1839 1837 0 0 16 1838 +1839 1839 1840 1838 0 0 16 1839 +1840 1840 1841 1839 0 0 16 1840 +1841 1841 1842 1840 0 0 16 1841 +1842 1842 1843 1841 0 0 16 1842 +1843 1843 1844 1842 0 0 16 1843 +1844 1844 1845 1843 0 0 16 1844 +1845 1845 1846 1844 0 0 16 1845 +1846 1846 1847 1845 0 0 16 1846 +1847 1847 1848 1846 0 0 16 1847 +1848 1848 1849 1847 0 0 16 1848 +1849 1849 1850 1848 0 0 16 1849 +1850 1850 1851 1849 0 0 16 1850 +1851 1851 1852 1850 0 0 16 1851 +1852 1852 1853 1851 0 0 16 1852 +1853 1853 1854 1852 0 0 16 1853 +1854 1854 1855 1853 0 0 16 1854 +1855 1855 1856 1854 0 0 16 1855 +1856 1856 1857 1855 0 0 16 1856 +1857 1857 1858 1856 0 0 16 1857 +1858 1858 1859 1857 0 0 16 1858 +1859 1859 1860 1858 0 0 16 1859 +1860 1860 1861 1859 0 0 16 1860 +1861 1861 1862 1860 0 0 16 1861 +1862 1862 1863 1861 0 0 16 1862 +1863 1863 1864 1862 0 0 16 1863 +1864 1864 1865 1863 0 0 16 1864 +1865 1865 1866 1864 0 0 16 1865 +1866 1866 1867 1865 0 0 16 1866 +1867 1867 1868 1866 0 0 16 1867 +1868 1868 1869 1867 0 0 16 1868 +1869 1869 1870 1868 0 0 16 1869 +1870 1870 1871 1869 0 0 16 1870 +1871 1871 1872 1870 0 0 16 1871 +1872 1872 1873 1871 0 0 16 1872 +1873 1873 1874 1872 0 0 16 1873 +1874 1874 1875 1873 0 0 16 1874 +1875 1875 1876 1874 0 0 16 1875 +1876 1876 1877 1875 0 0 16 1876 +1877 1877 1878 1876 0 0 16 1877 +1878 1878 1879 1877 0 0 16 1878 +1879 1879 1880 1878 0 0 16 1879 +1880 1880 1881 1879 0 0 16 1880 +1881 1881 1882 1880 0 0 16 1881 +1882 1882 1883 1881 0 0 16 1882 +1883 1883 1884 1882 0 0 16 1883 +1884 1884 1885 1883 0 0 16 1884 +1885 1885 1886 1884 0 0 16 1885 +1886 1886 1887 1885 0 0 16 1886 +1887 1887 1888 1886 0 0 16 1887 +1888 1888 1889 1887 0 0 16 1888 +1889 1889 1890 1888 0 0 16 1889 +1890 1890 1891 1889 0 0 16 1890 +1891 1891 1892 1890 0 0 16 1891 +1892 1892 1893 1891 0 0 16 1892 +1893 1893 1894 1892 0 0 16 1893 +1894 1894 1895 1893 0 0 16 1894 +1895 1895 1896 1894 0 0 16 1895 +1896 1896 1897 1895 0 0 16 1896 +1897 1897 1898 1896 0 0 16 1897 +1898 1898 1899 1897 0 0 16 1898 +1899 1899 1900 1898 0 0 16 1899 +1900 1900 1901 1899 0 0 16 1900 +1901 1901 1902 1900 0 0 16 1901 +1902 1902 1903 1901 0 0 16 1902 +1903 1903 1904 1902 0 0 16 1903 +1904 1904 1905 1903 0 0 16 1904 +1905 1905 1906 1904 0 0 16 1905 +1906 1906 1907 1905 0 0 16 1906 +1907 1907 1908 1906 0 0 16 1907 +1908 1908 1909 1907 0 0 16 1908 +1909 1909 1910 1908 0 0 16 1909 +1910 1910 1911 1909 0 0 16 1910 +1911 1911 1912 1910 0 0 16 1911 +1912 1912 1913 1911 0 0 16 1912 +1913 1913 1914 1912 0 0 16 1913 +1914 1914 1915 1913 0 0 16 1914 +1915 1915 1916 1914 0 0 16 1915 +1916 1916 1917 1915 0 0 16 1916 +1917 1917 1918 1916 0 0 16 1917 +1918 1918 1919 1917 0 0 16 1918 +1919 1919 1920 1918 0 0 16 1919 +1920 1920 1921 1919 0 0 16 1920 +1921 1921 1922 1920 0 0 16 1921 +1922 1922 1923 1921 0 0 16 1922 +1923 1923 1924 1922 0 0 16 1923 +1924 1924 1925 1923 0 0 16 1924 +1925 1925 1926 1924 0 0 16 1925 +1926 1926 1927 1925 0 0 16 1926 +1927 1927 1928 1926 0 0 16 1927 +1928 1928 1929 1927 0 0 16 1928 +1929 1929 1930 1928 0 0 16 1929 +1930 1930 1931 1929 0 0 16 1930 +1931 1931 1932 1930 0 0 16 1931 +1932 1932 1933 1931 0 0 16 1932 +1933 1933 1934 1932 0 0 16 1933 +1934 1934 1935 1933 0 0 16 1934 +1935 1935 1936 1934 0 0 16 1935 +1936 1936 1937 1935 0 0 16 1936 +1937 1937 1938 1936 0 0 16 1937 +1938 1938 1939 1937 0 0 16 1938 +1939 1939 1940 1938 0 0 16 1939 +1940 1940 1941 1939 0 0 16 1940 +1941 1941 1942 1940 0 0 16 1941 +1942 1942 1943 1941 0 0 16 1942 +1943 1943 1944 1942 0 0 16 1943 +1944 1944 1945 1943 0 0 16 1944 +1945 1945 1946 1944 0 0 16 1945 +1946 1946 1947 1945 0 0 16 1946 +1947 1947 1948 1946 0 0 16 1947 +1948 1948 1949 1947 0 0 16 1948 +1949 1949 1950 1948 0 0 16 1949 +1950 1950 1951 1949 0 0 16 1950 +1951 1951 1952 1950 0 0 16 1951 +1952 1952 1953 1951 0 0 16 1952 +1953 1953 1954 1952 0 0 16 1953 +1954 1954 1955 1953 0 0 16 1954 +1955 1955 1956 1954 0 0 16 1955 +1956 1956 1957 1955 0 0 16 1956 +1957 1957 1958 1956 0 0 16 1957 +1958 1958 1959 1957 0 0 16 1958 +1959 1959 1960 1958 0 0 16 1959 +1960 1960 1961 1959 0 0 16 1960 +1961 1961 1962 1960 0 0 16 1961 +1962 1962 1963 1961 0 0 16 1962 +1963 1963 1964 1962 0 0 16 1963 +1964 1964 1965 1963 0 0 16 1964 +1965 1965 1966 1964 0 0 16 1965 +1966 1966 1967 1965 0 0 16 1966 +1967 1967 1968 1966 0 0 16 1967 +1968 1968 1969 1967 0 0 16 1968 +1969 1969 1970 1968 0 0 16 1969 +1970 1970 1971 1969 0 0 16 1970 +1971 1971 1972 1970 0 0 16 1971 +1972 1972 1973 1971 0 0 16 1972 +1973 1973 1974 1972 0 0 16 1973 +1974 1974 1975 1973 0 0 16 1974 +1975 1975 1976 1974 0 0 16 1975 +1976 1976 1977 1975 0 0 16 1976 +1977 1977 1978 1976 0 0 16 1977 +1978 1978 1979 1977 0 0 16 1978 +1979 1979 1980 1978 0 0 16 1979 +1980 1980 1981 1979 0 0 16 1980 +1981 1981 1982 1980 0 0 16 1981 +1982 1982 1983 1981 0 0 16 1982 +1983 1983 1984 1982 0 0 16 1983 +1984 1984 1985 1983 0 0 16 1984 +1985 1985 1986 1984 0 0 16 1985 +1986 1986 1987 1985 0 0 16 1986 +1987 1987 1988 1986 0 0 16 1987 +1988 1988 1989 1987 0 0 16 1988 +1989 1989 1990 1988 0 0 16 1989 +1990 1990 1991 1989 0 0 16 1990 +1991 1991 1992 1990 0 0 16 1991 +1992 1992 1993 1991 0 0 16 1992 +1993 1993 1994 1992 0 0 16 1993 +1994 1994 1995 1993 0 0 16 1994 +1995 1995 1996 1994 0 0 16 1995 +1996 1996 1997 1995 0 0 16 1996 +1997 1997 1998 1996 0 0 16 1997 +1998 1998 1999 1997 0 0 16 1998 +1999 1999 2000 1998 0 0 16 1999 +2000 2000 2001 1999 0 0 16 2000 +2001 2001 2002 2000 0 0 16 2001 +2002 2002 2003 2001 0 0 16 2002 +2003 2003 2004 2002 0 0 16 2003 +2004 2004 2005 2003 0 0 16 2004 +2005 2005 2006 2004 0 0 16 2005 +2006 2006 2007 2005 0 0 16 2006 +2007 2007 2008 2006 0 0 16 2007 +2008 2008 2009 2007 0 0 16 2008 +2009 2009 2010 2008 0 0 16 2009 +2010 2010 2011 2009 0 0 16 2010 +2011 2011 2012 2010 0 0 16 2011 +2012 2012 2013 2011 0 0 16 2012 +2013 2013 2014 2012 0 0 16 2013 +2014 2014 2015 2013 0 0 16 2014 +2015 2015 2016 2014 0 0 16 2015 +2016 2016 2017 2015 0 0 16 2016 +2017 2017 2018 2016 0 0 16 2017 +2018 2018 2019 2017 0 0 16 2018 +2019 2019 2020 2018 0 0 16 2019 +2020 2020 2021 2019 0 0 16 2020 +2021 2021 2022 2020 0 0 16 2021 +2022 2022 2023 2021 0 0 16 2022 +2023 2023 2024 2022 0 0 16 2023 +2024 2024 2025 2023 0 0 16 2024 +2025 2025 2026 2024 0 0 16 2025 +2026 2026 2027 2025 0 0 16 2026 +2027 2027 2028 2026 0 0 16 2027 +2028 2028 2029 2027 0 0 16 2028 +2029 2029 2030 2028 0 0 16 2029 +2030 2030 2031 2029 0 0 16 2030 +2031 2031 2032 2030 0 0 16 2031 +2032 2032 2033 2031 0 0 16 2032 +2033 2033 2034 2032 0 0 16 2033 +2034 2034 2035 2033 0 0 16 2034 +2035 2035 2036 2034 0 0 16 2035 +2036 2036 2037 2035 0 0 16 2036 +2037 2037 2038 2036 0 0 16 2037 +2038 2038 2039 2037 0 0 16 2038 +2039 2039 2040 2038 0 0 16 2039 +2040 2040 2041 2039 0 0 16 2040 +2041 2041 2042 2040 0 0 16 2041 +2042 2042 2043 2041 0 0 16 2042 +2043 2043 2044 2042 0 0 16 2043 +2044 2044 2045 2043 0 0 16 2044 +2045 2045 2046 2044 0 0 16 2045 +2046 2046 2047 2045 0 0 16 2046 +2047 2047 -1 2046 0 0 16 2047 ====================================================== === [Queue after-refilling-0] Next: 1 First: 1 Last: 0 # seq next prev timeout retrans type cbp -0 0 -1 1023 0 0 16 0 +0 0 -1 2047 0 0 16 0 1 1 2 -1 0 0 16 1 2 2 3 1 0 0 16 2 3 3 4 2 0 0 16 3 @@ -6189,522 +11309,2058 @@ 1020 1020 1021 1019 0 0 16 1020 1021 1021 1022 1020 0 0 16 1021 1022 1022 1023 1021 0 0 16 1022 -1023 1023 0 1022 0 0 16 1023 +1023 1023 1024 1022 0 0 16 1023 +1024 1024 1025 1023 0 0 16 1024 +1025 1025 1026 1024 0 0 16 1025 +1026 1026 1027 1025 0 0 16 1026 +1027 1027 1028 1026 0 0 16 1027 +1028 1028 1029 1027 0 0 16 1028 +1029 1029 1030 1028 0 0 16 1029 +1030 1030 1031 1029 0 0 16 1030 +1031 1031 1032 1030 0 0 16 1031 +1032 1032 1033 1031 0 0 16 1032 +1033 1033 1034 1032 0 0 16 1033 +1034 1034 1035 1033 0 0 16 1034 +1035 1035 1036 1034 0 0 16 1035 +1036 1036 1037 1035 0 0 16 1036 +1037 1037 1038 1036 0 0 16 1037 +1038 1038 1039 1037 0 0 16 1038 +1039 1039 1040 1038 0 0 16 1039 +1040 1040 1041 1039 0 0 16 1040 +1041 1041 1042 1040 0 0 16 1041 +1042 1042 1043 1041 0 0 16 1042 +1043 1043 1044 1042 0 0 16 1043 +1044 1044 1045 1043 0 0 16 1044 +1045 1045 1046 1044 0 0 16 1045 +1046 1046 1047 1045 0 0 16 1046 +1047 1047 1048 1046 0 0 16 1047 +1048 1048 1049 1047 0 0 16 1048 +1049 1049 1050 1048 0 0 16 1049 +1050 1050 1051 1049 0 0 16 1050 +1051 1051 1052 1050 0 0 16 1051 +1052 1052 1053 1051 0 0 16 1052 +1053 1053 1054 1052 0 0 16 1053 +1054 1054 1055 1053 0 0 16 1054 +1055 1055 1056 1054 0 0 16 1055 +1056 1056 1057 1055 0 0 16 1056 +1057 1057 1058 1056 0 0 16 1057 +1058 1058 1059 1057 0 0 16 1058 +1059 1059 1060 1058 0 0 16 1059 +1060 1060 1061 1059 0 0 16 1060 +1061 1061 1062 1060 0 0 16 1061 +1062 1062 1063 1061 0 0 16 1062 +1063 1063 1064 1062 0 0 16 1063 +1064 1064 1065 1063 0 0 16 1064 +1065 1065 1066 1064 0 0 16 1065 +1066 1066 1067 1065 0 0 16 1066 +1067 1067 1068 1066 0 0 16 1067 +1068 1068 1069 1067 0 0 16 1068 +1069 1069 1070 1068 0 0 16 1069 +1070 1070 1071 1069 0 0 16 1070 +1071 1071 1072 1070 0 0 16 1071 +1072 1072 1073 1071 0 0 16 1072 +1073 1073 1074 1072 0 0 16 1073 +1074 1074 1075 1073 0 0 16 1074 +1075 1075 1076 1074 0 0 16 1075 +1076 1076 1077 1075 0 0 16 1076 +1077 1077 1078 1076 0 0 16 1077 +1078 1078 1079 1077 0 0 16 1078 +1079 1079 1080 1078 0 0 16 1079 +1080 1080 1081 1079 0 0 16 1080 +1081 1081 1082 1080 0 0 16 1081 +1082 1082 1083 1081 0 0 16 1082 +1083 1083 1084 1082 0 0 16 1083 +1084 1084 1085 1083 0 0 16 1084 +1085 1085 1086 1084 0 0 16 1085 +1086 1086 1087 1085 0 0 16 1086 +1087 1087 1088 1086 0 0 16 1087 +1088 1088 1089 1087 0 0 16 1088 +1089 1089 1090 1088 0 0 16 1089 +1090 1090 1091 1089 0 0 16 1090 +1091 1091 1092 1090 0 0 16 1091 +1092 1092 1093 1091 0 0 16 1092 +1093 1093 1094 1092 0 0 16 1093 +1094 1094 1095 1093 0 0 16 1094 +1095 1095 1096 1094 0 0 16 1095 +1096 1096 1097 1095 0 0 16 1096 +1097 1097 1098 1096 0 0 16 1097 +1098 1098 1099 1097 0 0 16 1098 +1099 1099 1100 1098 0 0 16 1099 +1100 1100 1101 1099 0 0 16 1100 +1101 1101 1102 1100 0 0 16 1101 +1102 1102 1103 1101 0 0 16 1102 +1103 1103 1104 1102 0 0 16 1103 +1104 1104 1105 1103 0 0 16 1104 +1105 1105 1106 1104 0 0 16 1105 +1106 1106 1107 1105 0 0 16 1106 +1107 1107 1108 1106 0 0 16 1107 +1108 1108 1109 1107 0 0 16 1108 +1109 1109 1110 1108 0 0 16 1109 +1110 1110 1111 1109 0 0 16 1110 +1111 1111 1112 1110 0 0 16 1111 +1112 1112 1113 1111 0 0 16 1112 +1113 1113 1114 1112 0 0 16 1113 +1114 1114 1115 1113 0 0 16 1114 +1115 1115 1116 1114 0 0 16 1115 +1116 1116 1117 1115 0 0 16 1116 +1117 1117 1118 1116 0 0 16 1117 +1118 1118 1119 1117 0 0 16 1118 +1119 1119 1120 1118 0 0 16 1119 +1120 1120 1121 1119 0 0 16 1120 +1121 1121 1122 1120 0 0 16 1121 +1122 1122 1123 1121 0 0 16 1122 +1123 1123 1124 1122 0 0 16 1123 +1124 1124 1125 1123 0 0 16 1124 +1125 1125 1126 1124 0 0 16 1125 +1126 1126 1127 1125 0 0 16 1126 +1127 1127 1128 1126 0 0 16 1127 +1128 1128 1129 1127 0 0 16 1128 +1129 1129 1130 1128 0 0 16 1129 +1130 1130 1131 1129 0 0 16 1130 +1131 1131 1132 1130 0 0 16 1131 +1132 1132 1133 1131 0 0 16 1132 +1133 1133 1134 1132 0 0 16 1133 +1134 1134 1135 1133 0 0 16 1134 +1135 1135 1136 1134 0 0 16 1135 +1136 1136 1137 1135 0 0 16 1136 +1137 1137 1138 1136 0 0 16 1137 +1138 1138 1139 1137 0 0 16 1138 +1139 1139 1140 1138 0 0 16 1139 +1140 1140 1141 1139 0 0 16 1140 +1141 1141 1142 1140 0 0 16 1141 +1142 1142 1143 1141 0 0 16 1142 +1143 1143 1144 1142 0 0 16 1143 +1144 1144 1145 1143 0 0 16 1144 +1145 1145 1146 1144 0 0 16 1145 +1146 1146 1147 1145 0 0 16 1146 +1147 1147 1148 1146 0 0 16 1147 +1148 1148 1149 1147 0 0 16 1148 +1149 1149 1150 1148 0 0 16 1149 +1150 1150 1151 1149 0 0 16 1150 +1151 1151 1152 1150 0 0 16 1151 +1152 1152 1153 1151 0 0 16 1152 +1153 1153 1154 1152 0 0 16 1153 +1154 1154 1155 1153 0 0 16 1154 +1155 1155 1156 1154 0 0 16 1155 +1156 1156 1157 1155 0 0 16 1156 +1157 1157 1158 1156 0 0 16 1157 +1158 1158 1159 1157 0 0 16 1158 +1159 1159 1160 1158 0 0 16 1159 +1160 1160 1161 1159 0 0 16 1160 +1161 1161 1162 1160 0 0 16 1161 +1162 1162 1163 1161 0 0 16 1162 +1163 1163 1164 1162 0 0 16 1163 +1164 1164 1165 1163 0 0 16 1164 +1165 1165 1166 1164 0 0 16 1165 +1166 1166 1167 1165 0 0 16 1166 +1167 1167 1168 1166 0 0 16 1167 +1168 1168 1169 1167 0 0 16 1168 +1169 1169 1170 1168 0 0 16 1169 +1170 1170 1171 1169 0 0 16 1170 +1171 1171 1172 1170 0 0 16 1171 +1172 1172 1173 1171 0 0 16 1172 +1173 1173 1174 1172 0 0 16 1173 +1174 1174 1175 1173 0 0 16 1174 +1175 1175 1176 1174 0 0 16 1175 +1176 1176 1177 1175 0 0 16 1176 +1177 1177 1178 1176 0 0 16 1177 +1178 1178 1179 1177 0 0 16 1178 +1179 1179 1180 1178 0 0 16 1179 +1180 1180 1181 1179 0 0 16 1180 +1181 1181 1182 1180 0 0 16 1181 +1182 1182 1183 1181 0 0 16 1182 +1183 1183 1184 1182 0 0 16 1183 +1184 1184 1185 1183 0 0 16 1184 +1185 1185 1186 1184 0 0 16 1185 +1186 1186 1187 1185 0 0 16 1186 +1187 1187 1188 1186 0 0 16 1187 +1188 1188 1189 1187 0 0 16 1188 +1189 1189 1190 1188 0 0 16 1189 +1190 1190 1191 1189 0 0 16 1190 +1191 1191 1192 1190 0 0 16 1191 +1192 1192 1193 1191 0 0 16 1192 +1193 1193 1194 1192 0 0 16 1193 +1194 1194 1195 1193 0 0 16 1194 +1195 1195 1196 1194 0 0 16 1195 +1196 1196 1197 1195 0 0 16 1196 +1197 1197 1198 1196 0 0 16 1197 +1198 1198 1199 1197 0 0 16 1198 +1199 1199 1200 1198 0 0 16 1199 +1200 1200 1201 1199 0 0 16 1200 +1201 1201 1202 1200 0 0 16 1201 +1202 1202 1203 1201 0 0 16 1202 +1203 1203 1204 1202 0 0 16 1203 +1204 1204 1205 1203 0 0 16 1204 +1205 1205 1206 1204 0 0 16 1205 +1206 1206 1207 1205 0 0 16 1206 +1207 1207 1208 1206 0 0 16 1207 +1208 1208 1209 1207 0 0 16 1208 +1209 1209 1210 1208 0 0 16 1209 +1210 1210 1211 1209 0 0 16 1210 +1211 1211 1212 1210 0 0 16 1211 +1212 1212 1213 1211 0 0 16 1212 +1213 1213 1214 1212 0 0 16 1213 +1214 1214 1215 1213 0 0 16 1214 +1215 1215 1216 1214 0 0 16 1215 +1216 1216 1217 1215 0 0 16 1216 +1217 1217 1218 1216 0 0 16 1217 +1218 1218 1219 1217 0 0 16 1218 +1219 1219 1220 1218 0 0 16 1219 +1220 1220 1221 1219 0 0 16 1220 +1221 1221 1222 1220 0 0 16 1221 +1222 1222 1223 1221 0 0 16 1222 +1223 1223 1224 1222 0 0 16 1223 +1224 1224 1225 1223 0 0 16 1224 +1225 1225 1226 1224 0 0 16 1225 +1226 1226 1227 1225 0 0 16 1226 +1227 1227 1228 1226 0 0 16 1227 +1228 1228 1229 1227 0 0 16 1228 +1229 1229 1230 1228 0 0 16 1229 +1230 1230 1231 1229 0 0 16 1230 +1231 1231 1232 1230 0 0 16 1231 +1232 1232 1233 1231 0 0 16 1232 +1233 1233 1234 1232 0 0 16 1233 +1234 1234 1235 1233 0 0 16 1234 +1235 1235 1236 1234 0 0 16 1235 +1236 1236 1237 1235 0 0 16 1236 +1237 1237 1238 1236 0 0 16 1237 +1238 1238 1239 1237 0 0 16 1238 +1239 1239 1240 1238 0 0 16 1239 +1240 1240 1241 1239 0 0 16 1240 +1241 1241 1242 1240 0 0 16 1241 +1242 1242 1243 1241 0 0 16 1242 +1243 1243 1244 1242 0 0 16 1243 +1244 1244 1245 1243 0 0 16 1244 +1245 1245 1246 1244 0 0 16 1245 +1246 1246 1247 1245 0 0 16 1246 +1247 1247 1248 1246 0 0 16 1247 +1248 1248 1249 1247 0 0 16 1248 +1249 1249 1250 1248 0 0 16 1249 +1250 1250 1251 1249 0 0 16 1250 +1251 1251 1252 1250 0 0 16 1251 +1252 1252 1253 1251 0 0 16 1252 +1253 1253 1254 1252 0 0 16 1253 +1254 1254 1255 1253 0 0 16 1254 +1255 1255 1256 1254 0 0 16 1255 +1256 1256 1257 1255 0 0 16 1256 +1257 1257 1258 1256 0 0 16 1257 +1258 1258 1259 1257 0 0 16 1258 +1259 1259 1260 1258 0 0 16 1259 +1260 1260 1261 1259 0 0 16 1260 +1261 1261 1262 1260 0 0 16 1261 +1262 1262 1263 1261 0 0 16 1262 +1263 1263 1264 1262 0 0 16 1263 +1264 1264 1265 1263 0 0 16 1264 +1265 1265 1266 1264 0 0 16 1265 +1266 1266 1267 1265 0 0 16 1266 +1267 1267 1268 1266 0 0 16 1267 +1268 1268 1269 1267 0 0 16 1268 +1269 1269 1270 1268 0 0 16 1269 +1270 1270 1271 1269 0 0 16 1270 +1271 1271 1272 1270 0 0 16 1271 +1272 1272 1273 1271 0 0 16 1272 +1273 1273 1274 1272 0 0 16 1273 +1274 1274 1275 1273 0 0 16 1274 +1275 1275 1276 1274 0 0 16 1275 +1276 1276 1277 1275 0 0 16 1276 +1277 1277 1278 1276 0 0 16 1277 +1278 1278 1279 1277 0 0 16 1278 +1279 1279 1280 1278 0 0 16 1279 +1280 1280 1281 1279 0 0 16 1280 +1281 1281 1282 1280 0 0 16 1281 +1282 1282 1283 1281 0 0 16 1282 +1283 1283 1284 1282 0 0 16 1283 +1284 1284 1285 1283 0 0 16 1284 +1285 1285 1286 1284 0 0 16 1285 +1286 1286 1287 1285 0 0 16 1286 +1287 1287 1288 1286 0 0 16 1287 +1288 1288 1289 1287 0 0 16 1288 +1289 1289 1290 1288 0 0 16 1289 +1290 1290 1291 1289 0 0 16 1290 +1291 1291 1292 1290 0 0 16 1291 +1292 1292 1293 1291 0 0 16 1292 +1293 1293 1294 1292 0 0 16 1293 +1294 1294 1295 1293 0 0 16 1294 +1295 1295 1296 1294 0 0 16 1295 +1296 1296 1297 1295 0 0 16 1296 +1297 1297 1298 1296 0 0 16 1297 +1298 1298 1299 1297 0 0 16 1298 +1299 1299 1300 1298 0 0 16 1299 +1300 1300 1301 1299 0 0 16 1300 +1301 1301 1302 1300 0 0 16 1301 +1302 1302 1303 1301 0 0 16 1302 +1303 1303 1304 1302 0 0 16 1303 +1304 1304 1305 1303 0 0 16 1304 +1305 1305 1306 1304 0 0 16 1305 +1306 1306 1307 1305 0 0 16 1306 +1307 1307 1308 1306 0 0 16 1307 +1308 1308 1309 1307 0 0 16 1308 +1309 1309 1310 1308 0 0 16 1309 +1310 1310 1311 1309 0 0 16 1310 +1311 1311 1312 1310 0 0 16 1311 +1312 1312 1313 1311 0 0 16 1312 +1313 1313 1314 1312 0 0 16 1313 +1314 1314 1315 1313 0 0 16 1314 +1315 1315 1316 1314 0 0 16 1315 +1316 1316 1317 1315 0 0 16 1316 +1317 1317 1318 1316 0 0 16 1317 +1318 1318 1319 1317 0 0 16 1318 +1319 1319 1320 1318 0 0 16 1319 +1320 1320 1321 1319 0 0 16 1320 +1321 1321 1322 1320 0 0 16 1321 +1322 1322 1323 1321 0 0 16 1322 +1323 1323 1324 1322 0 0 16 1323 +1324 1324 1325 1323 0 0 16 1324 +1325 1325 1326 1324 0 0 16 1325 +1326 1326 1327 1325 0 0 16 1326 +1327 1327 1328 1326 0 0 16 1327 +1328 1328 1329 1327 0 0 16 1328 +1329 1329 1330 1328 0 0 16 1329 +1330 1330 1331 1329 0 0 16 1330 +1331 1331 1332 1330 0 0 16 1331 +1332 1332 1333 1331 0 0 16 1332 +1333 1333 1334 1332 0 0 16 1333 +1334 1334 1335 1333 0 0 16 1334 +1335 1335 1336 1334 0 0 16 1335 +1336 1336 1337 1335 0 0 16 1336 +1337 1337 1338 1336 0 0 16 1337 +1338 1338 1339 1337 0 0 16 1338 +1339 1339 1340 1338 0 0 16 1339 +1340 1340 1341 1339 0 0 16 1340 +1341 1341 1342 1340 0 0 16 1341 +1342 1342 1343 1341 0 0 16 1342 +1343 1343 1344 1342 0 0 16 1343 +1344 1344 1345 1343 0 0 16 1344 +1345 1345 1346 1344 0 0 16 1345 +1346 1346 1347 1345 0 0 16 1346 +1347 1347 1348 1346 0 0 16 1347 +1348 1348 1349 1347 0 0 16 1348 +1349 1349 1350 1348 0 0 16 1349 +1350 1350 1351 1349 0 0 16 1350 +1351 1351 1352 1350 0 0 16 1351 +1352 1352 1353 1351 0 0 16 1352 +1353 1353 1354 1352 0 0 16 1353 +1354 1354 1355 1353 0 0 16 1354 +1355 1355 1356 1354 0 0 16 1355 +1356 1356 1357 1355 0 0 16 1356 +1357 1357 1358 1356 0 0 16 1357 +1358 1358 1359 1357 0 0 16 1358 +1359 1359 1360 1358 0 0 16 1359 +1360 1360 1361 1359 0 0 16 1360 +1361 1361 1362 1360 0 0 16 1361 +1362 1362 1363 1361 0 0 16 1362 +1363 1363 1364 1362 0 0 16 1363 +1364 1364 1365 1363 0 0 16 1364 +1365 1365 1366 1364 0 0 16 1365 +1366 1366 1367 1365 0 0 16 1366 +1367 1367 1368 1366 0 0 16 1367 +1368 1368 1369 1367 0 0 16 1368 +1369 1369 1370 1368 0 0 16 1369 +1370 1370 1371 1369 0 0 16 1370 +1371 1371 1372 1370 0 0 16 1371 +1372 1372 1373 1371 0 0 16 1372 +1373 1373 1374 1372 0 0 16 1373 +1374 1374 1375 1373 0 0 16 1374 +1375 1375 1376 1374 0 0 16 1375 +1376 1376 1377 1375 0 0 16 1376 +1377 1377 1378 1376 0 0 16 1377 +1378 1378 1379 1377 0 0 16 1378 +1379 1379 1380 1378 0 0 16 1379 +1380 1380 1381 1379 0 0 16 1380 +1381 1381 1382 1380 0 0 16 1381 +1382 1382 1383 1381 0 0 16 1382 +1383 1383 1384 1382 0 0 16 1383 +1384 1384 1385 1383 0 0 16 1384 +1385 1385 1386 1384 0 0 16 1385 +1386 1386 1387 1385 0 0 16 1386 +1387 1387 1388 1386 0 0 16 1387 +1388 1388 1389 1387 0 0 16 1388 +1389 1389 1390 1388 0 0 16 1389 +1390 1390 1391 1389 0 0 16 1390 +1391 1391 1392 1390 0 0 16 1391 +1392 1392 1393 1391 0 0 16 1392 +1393 1393 1394 1392 0 0 16 1393 +1394 1394 1395 1393 0 0 16 1394 +1395 1395 1396 1394 0 0 16 1395 +1396 1396 1397 1395 0 0 16 1396 +1397 1397 1398 1396 0 0 16 1397 +1398 1398 1399 1397 0 0 16 1398 +1399 1399 1400 1398 0 0 16 1399 +1400 1400 1401 1399 0 0 16 1400 +1401 1401 1402 1400 0 0 16 1401 +1402 1402 1403 1401 0 0 16 1402 +1403 1403 1404 1402 0 0 16 1403 +1404 1404 1405 1403 0 0 16 1404 +1405 1405 1406 1404 0 0 16 1405 +1406 1406 1407 1405 0 0 16 1406 +1407 1407 1408 1406 0 0 16 1407 +1408 1408 1409 1407 0 0 16 1408 +1409 1409 1410 1408 0 0 16 1409 +1410 1410 1411 1409 0 0 16 1410 +1411 1411 1412 1410 0 0 16 1411 +1412 1412 1413 1411 0 0 16 1412 +1413 1413 1414 1412 0 0 16 1413 +1414 1414 1415 1413 0 0 16 1414 +1415 1415 1416 1414 0 0 16 1415 +1416 1416 1417 1415 0 0 16 1416 +1417 1417 1418 1416 0 0 16 1417 +1418 1418 1419 1417 0 0 16 1418 +1419 1419 1420 1418 0 0 16 1419 +1420 1420 1421 1419 0 0 16 1420 +1421 1421 1422 1420 0 0 16 1421 +1422 1422 1423 1421 0 0 16 1422 +1423 1423 1424 1422 0 0 16 1423 +1424 1424 1425 1423 0 0 16 1424 +1425 1425 1426 1424 0 0 16 1425 +1426 1426 1427 1425 0 0 16 1426 +1427 1427 1428 1426 0 0 16 1427 +1428 1428 1429 1427 0 0 16 1428 +1429 1429 1430 1428 0 0 16 1429 +1430 1430 1431 1429 0 0 16 1430 +1431 1431 1432 1430 0 0 16 1431 +1432 1432 1433 1431 0 0 16 1432 +1433 1433 1434 1432 0 0 16 1433 +1434 1434 1435 1433 0 0 16 1434 +1435 1435 1436 1434 0 0 16 1435 +1436 1436 1437 1435 0 0 16 1436 +1437 1437 1438 1436 0 0 16 1437 +1438 1438 1439 1437 0 0 16 1438 +1439 1439 1440 1438 0 0 16 1439 +1440 1440 1441 1439 0 0 16 1440 +1441 1441 1442 1440 0 0 16 1441 +1442 1442 1443 1441 0 0 16 1442 +1443 1443 1444 1442 0 0 16 1443 +1444 1444 1445 1443 0 0 16 1444 +1445 1445 1446 1444 0 0 16 1445 +1446 1446 1447 1445 0 0 16 1446 +1447 1447 1448 1446 0 0 16 1447 +1448 1448 1449 1447 0 0 16 1448 +1449 1449 1450 1448 0 0 16 1449 +1450 1450 1451 1449 0 0 16 1450 +1451 1451 1452 1450 0 0 16 1451 +1452 1452 1453 1451 0 0 16 1452 +1453 1453 1454 1452 0 0 16 1453 +1454 1454 1455 1453 0 0 16 1454 +1455 1455 1456 1454 0 0 16 1455 +1456 1456 1457 1455 0 0 16 1456 +1457 1457 1458 1456 0 0 16 1457 +1458 1458 1459 1457 0 0 16 1458 +1459 1459 1460 1458 0 0 16 1459 +1460 1460 1461 1459 0 0 16 1460 +1461 1461 1462 1460 0 0 16 1461 +1462 1462 1463 1461 0 0 16 1462 +1463 1463 1464 1462 0 0 16 1463 +1464 1464 1465 1463 0 0 16 1464 +1465 1465 1466 1464 0 0 16 1465 +1466 1466 1467 1465 0 0 16 1466 +1467 1467 1468 1466 0 0 16 1467 +1468 1468 1469 1467 0 0 16 1468 +1469 1469 1470 1468 0 0 16 1469 +1470 1470 1471 1469 0 0 16 1470 +1471 1471 1472 1470 0 0 16 1471 +1472 1472 1473 1471 0 0 16 1472 +1473 1473 1474 1472 0 0 16 1473 +1474 1474 1475 1473 0 0 16 1474 +1475 1475 1476 1474 0 0 16 1475 +1476 1476 1477 1475 0 0 16 1476 +1477 1477 1478 1476 0 0 16 1477 +1478 1478 1479 1477 0 0 16 1478 +1479 1479 1480 1478 0 0 16 1479 +1480 1480 1481 1479 0 0 16 1480 +1481 1481 1482 1480 0 0 16 1481 +1482 1482 1483 1481 0 0 16 1482 +1483 1483 1484 1482 0 0 16 1483 +1484 1484 1485 1483 0 0 16 1484 +1485 1485 1486 1484 0 0 16 1485 +1486 1486 1487 1485 0 0 16 1486 +1487 1487 1488 1486 0 0 16 1487 +1488 1488 1489 1487 0 0 16 1488 +1489 1489 1490 1488 0 0 16 1489 +1490 1490 1491 1489 0 0 16 1490 +1491 1491 1492 1490 0 0 16 1491 +1492 1492 1493 1491 0 0 16 1492 +1493 1493 1494 1492 0 0 16 1493 +1494 1494 1495 1493 0 0 16 1494 +1495 1495 1496 1494 0 0 16 1495 +1496 1496 1497 1495 0 0 16 1496 +1497 1497 1498 1496 0 0 16 1497 +1498 1498 1499 1497 0 0 16 1498 +1499 1499 1500 1498 0 0 16 1499 +1500 1500 1501 1499 0 0 16 1500 +1501 1501 1502 1500 0 0 16 1501 +1502 1502 1503 1501 0 0 16 1502 +1503 1503 1504 1502 0 0 16 1503 +1504 1504 1505 1503 0 0 16 1504 +1505 1505 1506 1504 0 0 16 1505 +1506 1506 1507 1505 0 0 16 1506 +1507 1507 1508 1506 0 0 16 1507 +1508 1508 1509 1507 0 0 16 1508 +1509 1509 1510 1508 0 0 16 1509 +1510 1510 1511 1509 0 0 16 1510 +1511 1511 1512 1510 0 0 16 1511 +1512 1512 1513 1511 0 0 16 1512 +1513 1513 1514 1512 0 0 16 1513 +1514 1514 1515 1513 0 0 16 1514 +1515 1515 1516 1514 0 0 16 1515 +1516 1516 1517 1515 0 0 16 1516 +1517 1517 1518 1516 0 0 16 1517 +1518 1518 1519 1517 0 0 16 1518 +1519 1519 1520 1518 0 0 16 1519 +1520 1520 1521 1519 0 0 16 1520 +1521 1521 1522 1520 0 0 16 1521 +1522 1522 1523 1521 0 0 16 1522 +1523 1523 1524 1522 0 0 16 1523 +1524 1524 1525 1523 0 0 16 1524 +1525 1525 1526 1524 0 0 16 1525 +1526 1526 1527 1525 0 0 16 1526 +1527 1527 1528 1526 0 0 16 1527 +1528 1528 1529 1527 0 0 16 1528 +1529 1529 1530 1528 0 0 16 1529 +1530 1530 1531 1529 0 0 16 1530 +1531 1531 1532 1530 0 0 16 1531 +1532 1532 1533 1531 0 0 16 1532 +1533 1533 1534 1532 0 0 16 1533 +1534 1534 1535 1533 0 0 16 1534 +1535 1535 1536 1534 0 0 16 1535 +1536 1536 1537 1535 0 0 16 1536 +1537 1537 1538 1536 0 0 16 1537 +1538 1538 1539 1537 0 0 16 1538 +1539 1539 1540 1538 0 0 16 1539 +1540 1540 1541 1539 0 0 16 1540 +1541 1541 1542 1540 0 0 16 1541 +1542 1542 1543 1541 0 0 16 1542 +1543 1543 1544 1542 0 0 16 1543 +1544 1544 1545 1543 0 0 16 1544 +1545 1545 1546 1544 0 0 16 1545 +1546 1546 1547 1545 0 0 16 1546 +1547 1547 1548 1546 0 0 16 1547 +1548 1548 1549 1547 0 0 16 1548 +1549 1549 1550 1548 0 0 16 1549 +1550 1550 1551 1549 0 0 16 1550 +1551 1551 1552 1550 0 0 16 1551 +1552 1552 1553 1551 0 0 16 1552 +1553 1553 1554 1552 0 0 16 1553 +1554 1554 1555 1553 0 0 16 1554 +1555 1555 1556 1554 0 0 16 1555 +1556 1556 1557 1555 0 0 16 1556 +1557 1557 1558 1556 0 0 16 1557 +1558 1558 1559 1557 0 0 16 1558 +1559 1559 1560 1558 0 0 16 1559 +1560 1560 1561 1559 0 0 16 1560 +1561 1561 1562 1560 0 0 16 1561 +1562 1562 1563 1561 0 0 16 1562 +1563 1563 1564 1562 0 0 16 1563 +1564 1564 1565 1563 0 0 16 1564 +1565 1565 1566 1564 0 0 16 1565 +1566 1566 1567 1565 0 0 16 1566 +1567 1567 1568 1566 0 0 16 1567 +1568 1568 1569 1567 0 0 16 1568 +1569 1569 1570 1568 0 0 16 1569 +1570 1570 1571 1569 0 0 16 1570 +1571 1571 1572 1570 0 0 16 1571 +1572 1572 1573 1571 0 0 16 1572 +1573 1573 1574 1572 0 0 16 1573 +1574 1574 1575 1573 0 0 16 1574 +1575 1575 1576 1574 0 0 16 1575 +1576 1576 1577 1575 0 0 16 1576 +1577 1577 1578 1576 0 0 16 1577 +1578 1578 1579 1577 0 0 16 1578 +1579 1579 1580 1578 0 0 16 1579 +1580 1580 1581 1579 0 0 16 1580 +1581 1581 1582 1580 0 0 16 1581 +1582 1582 1583 1581 0 0 16 1582 +1583 1583 1584 1582 0 0 16 1583 +1584 1584 1585 1583 0 0 16 1584 +1585 1585 1586 1584 0 0 16 1585 +1586 1586 1587 1585 0 0 16 1586 +1587 1587 1588 1586 0 0 16 1587 +1588 1588 1589 1587 0 0 16 1588 +1589 1589 1590 1588 0 0 16 1589 +1590 1590 1591 1589 0 0 16 1590 +1591 1591 1592 1590 0 0 16 1591 +1592 1592 1593 1591 0 0 16 1592 +1593 1593 1594 1592 0 0 16 1593 +1594 1594 1595 1593 0 0 16 1594 +1595 1595 1596 1594 0 0 16 1595 +1596 1596 1597 1595 0 0 16 1596 +1597 1597 1598 1596 0 0 16 1597 +1598 1598 1599 1597 0 0 16 1598 +1599 1599 1600 1598 0 0 16 1599 +1600 1600 1601 1599 0 0 16 1600 +1601 1601 1602 1600 0 0 16 1601 +1602 1602 1603 1601 0 0 16 1602 +1603 1603 1604 1602 0 0 16 1603 +1604 1604 1605 1603 0 0 16 1604 +1605 1605 1606 1604 0 0 16 1605 +1606 1606 1607 1605 0 0 16 1606 +1607 1607 1608 1606 0 0 16 1607 +1608 1608 1609 1607 0 0 16 1608 +1609 1609 1610 1608 0 0 16 1609 +1610 1610 1611 1609 0 0 16 1610 +1611 1611 1612 1610 0 0 16 1611 +1612 1612 1613 1611 0 0 16 1612 +1613 1613 1614 1612 0 0 16 1613 +1614 1614 1615 1613 0 0 16 1614 +1615 1615 1616 1614 0 0 16 1615 +1616 1616 1617 1615 0 0 16 1616 +1617 1617 1618 1616 0 0 16 1617 +1618 1618 1619 1617 0 0 16 1618 +1619 1619 1620 1618 0 0 16 1619 +1620 1620 1621 1619 0 0 16 1620 +1621 1621 1622 1620 0 0 16 1621 +1622 1622 1623 1621 0 0 16 1622 +1623 1623 1624 1622 0 0 16 1623 +1624 1624 1625 1623 0 0 16 1624 +1625 1625 1626 1624 0 0 16 1625 +1626 1626 1627 1625 0 0 16 1626 +1627 1627 1628 1626 0 0 16 1627 +1628 1628 1629 1627 0 0 16 1628 +1629 1629 1630 1628 0 0 16 1629 +1630 1630 1631 1629 0 0 16 1630 +1631 1631 1632 1630 0 0 16 1631 +1632 1632 1633 1631 0 0 16 1632 +1633 1633 1634 1632 0 0 16 1633 +1634 1634 1635 1633 0 0 16 1634 +1635 1635 1636 1634 0 0 16 1635 +1636 1636 1637 1635 0 0 16 1636 +1637 1637 1638 1636 0 0 16 1637 +1638 1638 1639 1637 0 0 16 1638 +1639 1639 1640 1638 0 0 16 1639 +1640 1640 1641 1639 0 0 16 1640 +1641 1641 1642 1640 0 0 16 1641 +1642 1642 1643 1641 0 0 16 1642 +1643 1643 1644 1642 0 0 16 1643 +1644 1644 1645 1643 0 0 16 1644 +1645 1645 1646 1644 0 0 16 1645 +1646 1646 1647 1645 0 0 16 1646 +1647 1647 1648 1646 0 0 16 1647 +1648 1648 1649 1647 0 0 16 1648 +1649 1649 1650 1648 0 0 16 1649 +1650 1650 1651 1649 0 0 16 1650 +1651 1651 1652 1650 0 0 16 1651 +1652 1652 1653 1651 0 0 16 1652 +1653 1653 1654 1652 0 0 16 1653 +1654 1654 1655 1653 0 0 16 1654 +1655 1655 1656 1654 0 0 16 1655 +1656 1656 1657 1655 0 0 16 1656 +1657 1657 1658 1656 0 0 16 1657 +1658 1658 1659 1657 0 0 16 1658 +1659 1659 1660 1658 0 0 16 1659 +1660 1660 1661 1659 0 0 16 1660 +1661 1661 1662 1660 0 0 16 1661 +1662 1662 1663 1661 0 0 16 1662 +1663 1663 1664 1662 0 0 16 1663 +1664 1664 1665 1663 0 0 16 1664 +1665 1665 1666 1664 0 0 16 1665 +1666 1666 1667 1665 0 0 16 1666 +1667 1667 1668 1666 0 0 16 1667 +1668 1668 1669 1667 0 0 16 1668 +1669 1669 1670 1668 0 0 16 1669 +1670 1670 1671 1669 0 0 16 1670 +1671 1671 1672 1670 0 0 16 1671 +1672 1672 1673 1671 0 0 16 1672 +1673 1673 1674 1672 0 0 16 1673 +1674 1674 1675 1673 0 0 16 1674 +1675 1675 1676 1674 0 0 16 1675 +1676 1676 1677 1675 0 0 16 1676 +1677 1677 1678 1676 0 0 16 1677 +1678 1678 1679 1677 0 0 16 1678 +1679 1679 1680 1678 0 0 16 1679 +1680 1680 1681 1679 0 0 16 1680 +1681 1681 1682 1680 0 0 16 1681 +1682 1682 1683 1681 0 0 16 1682 +1683 1683 1684 1682 0 0 16 1683 +1684 1684 1685 1683 0 0 16 1684 +1685 1685 1686 1684 0 0 16 1685 +1686 1686 1687 1685 0 0 16 1686 +1687 1687 1688 1686 0 0 16 1687 +1688 1688 1689 1687 0 0 16 1688 +1689 1689 1690 1688 0 0 16 1689 +1690 1690 1691 1689 0 0 16 1690 +1691 1691 1692 1690 0 0 16 1691 +1692 1692 1693 1691 0 0 16 1692 +1693 1693 1694 1692 0 0 16 1693 +1694 1694 1695 1693 0 0 16 1694 +1695 1695 1696 1694 0 0 16 1695 +1696 1696 1697 1695 0 0 16 1696 +1697 1697 1698 1696 0 0 16 1697 +1698 1698 1699 1697 0 0 16 1698 +1699 1699 1700 1698 0 0 16 1699 +1700 1700 1701 1699 0 0 16 1700 +1701 1701 1702 1700 0 0 16 1701 +1702 1702 1703 1701 0 0 16 1702 +1703 1703 1704 1702 0 0 16 1703 +1704 1704 1705 1703 0 0 16 1704 +1705 1705 1706 1704 0 0 16 1705 +1706 1706 1707 1705 0 0 16 1706 +1707 1707 1708 1706 0 0 16 1707 +1708 1708 1709 1707 0 0 16 1708 +1709 1709 1710 1708 0 0 16 1709 +1710 1710 1711 1709 0 0 16 1710 +1711 1711 1712 1710 0 0 16 1711 +1712 1712 1713 1711 0 0 16 1712 +1713 1713 1714 1712 0 0 16 1713 +1714 1714 1715 1713 0 0 16 1714 +1715 1715 1716 1714 0 0 16 1715 +1716 1716 1717 1715 0 0 16 1716 +1717 1717 1718 1716 0 0 16 1717 +1718 1718 1719 1717 0 0 16 1718 +1719 1719 1720 1718 0 0 16 1719 +1720 1720 1721 1719 0 0 16 1720 +1721 1721 1722 1720 0 0 16 1721 +1722 1722 1723 1721 0 0 16 1722 +1723 1723 1724 1722 0 0 16 1723 +1724 1724 1725 1723 0 0 16 1724 +1725 1725 1726 1724 0 0 16 1725 +1726 1726 1727 1725 0 0 16 1726 +1727 1727 1728 1726 0 0 16 1727 +1728 1728 1729 1727 0 0 16 1728 +1729 1729 1730 1728 0 0 16 1729 +1730 1730 1731 1729 0 0 16 1730 +1731 1731 1732 1730 0 0 16 1731 +1732 1732 1733 1731 0 0 16 1732 +1733 1733 1734 1732 0 0 16 1733 +1734 1734 1735 1733 0 0 16 1734 +1735 1735 1736 1734 0 0 16 1735 +1736 1736 1737 1735 0 0 16 1736 +1737 1737 1738 1736 0 0 16 1737 +1738 1738 1739 1737 0 0 16 1738 +1739 1739 1740 1738 0 0 16 1739 +1740 1740 1741 1739 0 0 16 1740 +1741 1741 1742 1740 0 0 16 1741 +1742 1742 1743 1741 0 0 16 1742 +1743 1743 1744 1742 0 0 16 1743 +1744 1744 1745 1743 0 0 16 1744 +1745 1745 1746 1744 0 0 16 1745 +1746 1746 1747 1745 0 0 16 1746 +1747 1747 1748 1746 0 0 16 1747 +1748 1748 1749 1747 0 0 16 1748 +1749 1749 1750 1748 0 0 16 1749 +1750 1750 1751 1749 0 0 16 1750 +1751 1751 1752 1750 0 0 16 1751 +1752 1752 1753 1751 0 0 16 1752 +1753 1753 1754 1752 0 0 16 1753 +1754 1754 1755 1753 0 0 16 1754 +1755 1755 1756 1754 0 0 16 1755 +1756 1756 1757 1755 0 0 16 1756 +1757 1757 1758 1756 0 0 16 1757 +1758 1758 1759 1757 0 0 16 1758 +1759 1759 1760 1758 0 0 16 1759 +1760 1760 1761 1759 0 0 16 1760 +1761 1761 1762 1760 0 0 16 1761 +1762 1762 1763 1761 0 0 16 1762 +1763 1763 1764 1762 0 0 16 1763 +1764 1764 1765 1763 0 0 16 1764 +1765 1765 1766 1764 0 0 16 1765 +1766 1766 1767 1765 0 0 16 1766 +1767 1767 1768 1766 0 0 16 1767 +1768 1768 1769 1767 0 0 16 1768 +1769 1769 1770 1768 0 0 16 1769 +1770 1770 1771 1769 0 0 16 1770 +1771 1771 1772 1770 0 0 16 1771 +1772 1772 1773 1771 0 0 16 1772 +1773 1773 1774 1772 0 0 16 1773 +1774 1774 1775 1773 0 0 16 1774 +1775 1775 1776 1774 0 0 16 1775 +1776 1776 1777 1775 0 0 16 1776 +1777 1777 1778 1776 0 0 16 1777 +1778 1778 1779 1777 0 0 16 1778 +1779 1779 1780 1778 0 0 16 1779 +1780 1780 1781 1779 0 0 16 1780 +1781 1781 1782 1780 0 0 16 1781 +1782 1782 1783 1781 0 0 16 1782 +1783 1783 1784 1782 0 0 16 1783 +1784 1784 1785 1783 0 0 16 1784 +1785 1785 1786 1784 0 0 16 1785 +1786 1786 1787 1785 0 0 16 1786 +1787 1787 1788 1786 0 0 16 1787 +1788 1788 1789 1787 0 0 16 1788 +1789 1789 1790 1788 0 0 16 1789 +1790 1790 1791 1789 0 0 16 1790 +1791 1791 1792 1790 0 0 16 1791 +1792 1792 1793 1791 0 0 16 1792 +1793 1793 1794 1792 0 0 16 1793 +1794 1794 1795 1793 0 0 16 1794 +1795 1795 1796 1794 0 0 16 1795 +1796 1796 1797 1795 0 0 16 1796 +1797 1797 1798 1796 0 0 16 1797 +1798 1798 1799 1797 0 0 16 1798 +1799 1799 1800 1798 0 0 16 1799 +1800 1800 1801 1799 0 0 16 1800 +1801 1801 1802 1800 0 0 16 1801 +1802 1802 1803 1801 0 0 16 1802 +1803 1803 1804 1802 0 0 16 1803 +1804 1804 1805 1803 0 0 16 1804 +1805 1805 1806 1804 0 0 16 1805 +1806 1806 1807 1805 0 0 16 1806 +1807 1807 1808 1806 0 0 16 1807 +1808 1808 1809 1807 0 0 16 1808 +1809 1809 1810 1808 0 0 16 1809 +1810 1810 1811 1809 0 0 16 1810 +1811 1811 1812 1810 0 0 16 1811 +1812 1812 1813 1811 0 0 16 1812 +1813 1813 1814 1812 0 0 16 1813 +1814 1814 1815 1813 0 0 16 1814 +1815 1815 1816 1814 0 0 16 1815 +1816 1816 1817 1815 0 0 16 1816 +1817 1817 1818 1816 0 0 16 1817 +1818 1818 1819 1817 0 0 16 1818 +1819 1819 1820 1818 0 0 16 1819 +1820 1820 1821 1819 0 0 16 1820 +1821 1821 1822 1820 0 0 16 1821 +1822 1822 1823 1821 0 0 16 1822 +1823 1823 1824 1822 0 0 16 1823 +1824 1824 1825 1823 0 0 16 1824 +1825 1825 1826 1824 0 0 16 1825 +1826 1826 1827 1825 0 0 16 1826 +1827 1827 1828 1826 0 0 16 1827 +1828 1828 1829 1827 0 0 16 1828 +1829 1829 1830 1828 0 0 16 1829 +1830 1830 1831 1829 0 0 16 1830 +1831 1831 1832 1830 0 0 16 1831 +1832 1832 1833 1831 0 0 16 1832 +1833 1833 1834 1832 0 0 16 1833 +1834 1834 1835 1833 0 0 16 1834 +1835 1835 1836 1834 0 0 16 1835 +1836 1836 1837 1835 0 0 16 1836 +1837 1837 1838 1836 0 0 16 1837 +1838 1838 1839 1837 0 0 16 1838 +1839 1839 1840 1838 0 0 16 1839 +1840 1840 1841 1839 0 0 16 1840 +1841 1841 1842 1840 0 0 16 1841 +1842 1842 1843 1841 0 0 16 1842 +1843 1843 1844 1842 0 0 16 1843 +1844 1844 1845 1843 0 0 16 1844 +1845 1845 1846 1844 0 0 16 1845 +1846 1846 1847 1845 0 0 16 1846 +1847 1847 1848 1846 0 0 16 1847 +1848 1848 1849 1847 0 0 16 1848 +1849 1849 1850 1848 0 0 16 1849 +1850 1850 1851 1849 0 0 16 1850 +1851 1851 1852 1850 0 0 16 1851 +1852 1852 1853 1851 0 0 16 1852 +1853 1853 1854 1852 0 0 16 1853 +1854 1854 1855 1853 0 0 16 1854 +1855 1855 1856 1854 0 0 16 1855 +1856 1856 1857 1855 0 0 16 1856 +1857 1857 1858 1856 0 0 16 1857 +1858 1858 1859 1857 0 0 16 1858 +1859 1859 1860 1858 0 0 16 1859 +1860 1860 1861 1859 0 0 16 1860 +1861 1861 1862 1860 0 0 16 1861 +1862 1862 1863 1861 0 0 16 1862 +1863 1863 1864 1862 0 0 16 1863 +1864 1864 1865 1863 0 0 16 1864 +1865 1865 1866 1864 0 0 16 1865 +1866 1866 1867 1865 0 0 16 1866 +1867 1867 1868 1866 0 0 16 1867 +1868 1868 1869 1867 0 0 16 1868 +1869 1869 1870 1868 0 0 16 1869 +1870 1870 1871 1869 0 0 16 1870 +1871 1871 1872 1870 0 0 16 1871 +1872 1872 1873 1871 0 0 16 1872 +1873 1873 1874 1872 0 0 16 1873 +1874 1874 1875 1873 0 0 16 1874 +1875 1875 1876 1874 0 0 16 1875 +1876 1876 1877 1875 0 0 16 1876 +1877 1877 1878 1876 0 0 16 1877 +1878 1878 1879 1877 0 0 16 1878 +1879 1879 1880 1878 0 0 16 1879 +1880 1880 1881 1879 0 0 16 1880 +1881 1881 1882 1880 0 0 16 1881 +1882 1882 1883 1881 0 0 16 1882 +1883 1883 1884 1882 0 0 16 1883 +1884 1884 1885 1883 0 0 16 1884 +1885 1885 1886 1884 0 0 16 1885 +1886 1886 1887 1885 0 0 16 1886 +1887 1887 1888 1886 0 0 16 1887 +1888 1888 1889 1887 0 0 16 1888 +1889 1889 1890 1888 0 0 16 1889 +1890 1890 1891 1889 0 0 16 1890 +1891 1891 1892 1890 0 0 16 1891 +1892 1892 1893 1891 0 0 16 1892 +1893 1893 1894 1892 0 0 16 1893 +1894 1894 1895 1893 0 0 16 1894 +1895 1895 1896 1894 0 0 16 1895 +1896 1896 1897 1895 0 0 16 1896 +1897 1897 1898 1896 0 0 16 1897 +1898 1898 1899 1897 0 0 16 1898 +1899 1899 1900 1898 0 0 16 1899 +1900 1900 1901 1899 0 0 16 1900 +1901 1901 1902 1900 0 0 16 1901 +1902 1902 1903 1901 0 0 16 1902 +1903 1903 1904 1902 0 0 16 1903 +1904 1904 1905 1903 0 0 16 1904 +1905 1905 1906 1904 0 0 16 1905 +1906 1906 1907 1905 0 0 16 1906 +1907 1907 1908 1906 0 0 16 1907 +1908 1908 1909 1907 0 0 16 1908 +1909 1909 1910 1908 0 0 16 1909 +1910 1910 1911 1909 0 0 16 1910 +1911 1911 1912 1910 0 0 16 1911 +1912 1912 1913 1911 0 0 16 1912 +1913 1913 1914 1912 0 0 16 1913 +1914 1914 1915 1913 0 0 16 1914 +1915 1915 1916 1914 0 0 16 1915 +1916 1916 1917 1915 0 0 16 1916 +1917 1917 1918 1916 0 0 16 1917 +1918 1918 1919 1917 0 0 16 1918 +1919 1919 1920 1918 0 0 16 1919 +1920 1920 1921 1919 0 0 16 1920 +1921 1921 1922 1920 0 0 16 1921 +1922 1922 1923 1921 0 0 16 1922 +1923 1923 1924 1922 0 0 16 1923 +1924 1924 1925 1923 0 0 16 1924 +1925 1925 1926 1924 0 0 16 1925 +1926 1926 1927 1925 0 0 16 1926 +1927 1927 1928 1926 0 0 16 1927 +1928 1928 1929 1927 0 0 16 1928 +1929 1929 1930 1928 0 0 16 1929 +1930 1930 1931 1929 0 0 16 1930 +1931 1931 1932 1930 0 0 16 1931 +1932 1932 1933 1931 0 0 16 1932 +1933 1933 1934 1932 0 0 16 1933 +1934 1934 1935 1933 0 0 16 1934 +1935 1935 1936 1934 0 0 16 1935 +1936 1936 1937 1935 0 0 16 1936 +1937 1937 1938 1936 0 0 16 1937 +1938 1938 1939 1937 0 0 16 1938 +1939 1939 1940 1938 0 0 16 1939 +1940 1940 1941 1939 0 0 16 1940 +1941 1941 1942 1940 0 0 16 1941 +1942 1942 1943 1941 0 0 16 1942 +1943 1943 1944 1942 0 0 16 1943 +1944 1944 1945 1943 0 0 16 1944 +1945 1945 1946 1944 0 0 16 1945 +1946 1946 1947 1945 0 0 16 1946 +1947 1947 1948 1946 0 0 16 1947 +1948 1948 1949 1947 0 0 16 1948 +1949 1949 1950 1948 0 0 16 1949 +1950 1950 1951 1949 0 0 16 1950 +1951 1951 1952 1950 0 0 16 1951 +1952 1952 1953 1951 0 0 16 1952 +1953 1953 1954 1952 0 0 16 1953 +1954 1954 1955 1953 0 0 16 1954 +1955 1955 1956 1954 0 0 16 1955 +1956 1956 1957 1955 0 0 16 1956 +1957 1957 1958 1956 0 0 16 1957 +1958 1958 1959 1957 0 0 16 1958 +1959 1959 1960 1958 0 0 16 1959 +1960 1960 1961 1959 0 0 16 1960 +1961 1961 1962 1960 0 0 16 1961 +1962 1962 1963 1961 0 0 16 1962 +1963 1963 1964 1962 0 0 16 1963 +1964 1964 1965 1963 0 0 16 1964 +1965 1965 1966 1964 0 0 16 1965 +1966 1966 1967 1965 0 0 16 1966 +1967 1967 1968 1966 0 0 16 1967 +1968 1968 1969 1967 0 0 16 1968 +1969 1969 1970 1968 0 0 16 1969 +1970 1970 1971 1969 0 0 16 1970 +1971 1971 1972 1970 0 0 16 1971 +1972 1972 1973 1971 0 0 16 1972 +1973 1973 1974 1972 0 0 16 1973 +1974 1974 1975 1973 0 0 16 1974 +1975 1975 1976 1974 0 0 16 1975 +1976 1976 1977 1975 0 0 16 1976 +1977 1977 1978 1976 0 0 16 1977 +1978 1978 1979 1977 0 0 16 1978 +1979 1979 1980 1978 0 0 16 1979 +1980 1980 1981 1979 0 0 16 1980 +1981 1981 1982 1980 0 0 16 1981 +1982 1982 1983 1981 0 0 16 1982 +1983 1983 1984 1982 0 0 16 1983 +1984 1984 1985 1983 0 0 16 1984 +1985 1985 1986 1984 0 0 16 1985 +1986 1986 1987 1985 0 0 16 1986 +1987 1987 1988 1986 0 0 16 1987 +1988 1988 1989 1987 0 0 16 1988 +1989 1989 1990 1988 0 0 16 1989 +1990 1990 1991 1989 0 0 16 1990 +1991 1991 1992 1990 0 0 16 1991 +1992 1992 1993 1991 0 0 16 1992 +1993 1993 1994 1992 0 0 16 1993 +1994 1994 1995 1993 0 0 16 1994 +1995 1995 1996 1994 0 0 16 1995 +1996 1996 1997 1995 0 0 16 1996 +1997 1997 1998 1996 0 0 16 1997 +1998 1998 1999 1997 0 0 16 1998 +1999 1999 2000 1998 0 0 16 1999 +2000 2000 2001 1999 0 0 16 2000 +2001 2001 2002 2000 0 0 16 2001 +2002 2002 2003 2001 0 0 16 2002 +2003 2003 2004 2002 0 0 16 2003 +2004 2004 2005 2003 0 0 16 2004 +2005 2005 2006 2004 0 0 16 2005 +2006 2006 2007 2005 0 0 16 2006 +2007 2007 2008 2006 0 0 16 2007 +2008 2008 2009 2007 0 0 16 2008 +2009 2009 2010 2008 0 0 16 2009 +2010 2010 2011 2009 0 0 16 2010 +2011 2011 2012 2010 0 0 16 2011 +2012 2012 2013 2011 0 0 16 2012 +2013 2013 2014 2012 0 0 16 2013 +2014 2014 2015 2013 0 0 16 2014 +2015 2015 2016 2014 0 0 16 2015 +2016 2016 2017 2015 0 0 16 2016 +2017 2017 2018 2016 0 0 16 2017 +2018 2018 2019 2017 0 0 16 2018 +2019 2019 2020 2018 0 0 16 2019 +2020 2020 2021 2019 0 0 16 2020 +2021 2021 2022 2020 0 0 16 2021 +2022 2022 2023 2021 0 0 16 2022 +2023 2023 2024 2022 0 0 16 2023 +2024 2024 2025 2023 0 0 16 2024 +2025 2025 2026 2024 0 0 16 2025 +2026 2026 2027 2025 0 0 16 2026 +2027 2027 2028 2026 0 0 16 2027 +2028 2028 2029 2027 0 0 16 2028 +2029 2029 2030 2028 0 0 16 2029 +2030 2030 2031 2029 0 0 16 2030 +2031 2031 2032 2030 0 0 16 2031 +2032 2032 2033 2031 0 0 16 2032 +2033 2033 2034 2032 0 0 16 2033 +2034 2034 2035 2033 0 0 16 2034 +2035 2035 2036 2034 0 0 16 2035 +2036 2036 2037 2035 0 0 16 2036 +2037 2037 2038 2036 0 0 16 2037 +2038 2038 2039 2037 0 0 16 2038 +2039 2039 2040 2038 0 0 16 2039 +2040 2040 2041 2039 0 0 16 2040 +2041 2041 2042 2040 0 0 16 2041 +2042 2042 2043 2041 0 0 16 2042 +2043 2043 2044 2042 0 0 16 2043 +2044 2044 2045 2043 0 0 16 2044 +2045 2045 2046 2044 0 0 16 2045 +2046 2046 2047 2045 0 0 16 2046 +2047 2047 0 2046 0 0 16 2047 ====================================================== -=== [Queue after-first-half-free] Next: 1 First: 512 Last: 1023 +=== [Queue after-first-half-free] Next: 1 First: 1024 Last: 2047 # seq next prev timeout retrans type cbp -512 512 513 -1 0 0 16 512 -513 513 514 512 0 0 16 513 -514 514 515 513 0 0 16 514 -515 515 516 514 0 0 16 515 -516 516 517 515 0 0 16 516 -517 517 518 516 0 0 16 517 -518 518 519 517 0 0 16 518 -519 519 520 518 0 0 16 519 -520 520 521 519 0 0 16 520 -521 521 522 520 0 0 16 521 -522 522 523 521 0 0 16 522 -523 523 524 522 0 0 16 523 -524 524 525 523 0 0 16 524 -525 525 526 524 0 0 16 525 -526 526 527 525 0 0 16 526 -527 527 528 526 0 0 16 527 -528 528 529 527 0 0 16 528 -529 529 530 528 0 0 16 529 -530 530 531 529 0 0 16 530 -531 531 532 530 0 0 16 531 -532 532 533 531 0 0 16 532 -533 533 534 532 0 0 16 533 -534 534 535 533 0 0 16 534 -535 535 536 534 0 0 16 535 -536 536 537 535 0 0 16 536 -537 537 538 536 0 0 16 537 -538 538 539 537 0 0 16 538 -539 539 540 538 0 0 16 539 -540 540 541 539 0 0 16 540 -541 541 542 540 0 0 16 541 -542 542 543 541 0 0 16 542 -543 543 544 542 0 0 16 543 -544 544 545 543 0 0 16 544 -545 545 546 544 0 0 16 545 -546 546 547 545 0 0 16 546 -547 547 548 546 0 0 16 547 -548 548 549 547 0 0 16 548 -549 549 550 548 0 0 16 549 -550 550 551 549 0 0 16 550 -551 551 552 550 0 0 16 551 -552 552 553 551 0 0 16 552 -553 553 554 552 0 0 16 553 -554 554 555 553 0 0 16 554 -555 555 556 554 0 0 16 555 -556 556 557 555 0 0 16 556 -557 557 558 556 0 0 16 557 -558 558 559 557 0 0 16 558 -559 559 560 558 0 0 16 559 -560 560 561 559 0 0 16 560 -561 561 562 560 0 0 16 561 -562 562 563 561 0 0 16 562 -563 563 564 562 0 0 16 563 -564 564 565 563 0 0 16 564 -565 565 566 564 0 0 16 565 -566 566 567 565 0 0 16 566 -567 567 568 566 0 0 16 567 -568 568 569 567 0 0 16 568 -569 569 570 568 0 0 16 569 -570 570 571 569 0 0 16 570 -571 571 572 570 0 0 16 571 -572 572 573 571 0 0 16 572 -573 573 574 572 0 0 16 573 -574 574 575 573 0 0 16 574 -575 575 576 574 0 0 16 575 -576 576 577 575 0 0 16 576 -577 577 578 576 0 0 16 577 -578 578 579 577 0 0 16 578 -579 579 580 578 0 0 16 579 -580 580 581 579 0 0 16 580 -581 581 582 580 0 0 16 581 -582 582 583 581 0 0 16 582 -583 583 584 582 0 0 16 583 -584 584 585 583 0 0 16 584 -585 585 586 584 0 0 16 585 -586 586 587 585 0 0 16 586 -587 587 588 586 0 0 16 587 -588 588 589 587 0 0 16 588 -589 589 590 588 0 0 16 589 -590 590 591 589 0 0 16 590 -591 591 592 590 0 0 16 591 -592 592 593 591 0 0 16 592 -593 593 594 592 0 0 16 593 -594 594 595 593 0 0 16 594 -595 595 596 594 0 0 16 595 -596 596 597 595 0 0 16 596 -597 597 598 596 0 0 16 597 -598 598 599 597 0 0 16 598 -599 599 600 598 0 0 16 599 -600 600 601 599 0 0 16 600 -601 601 602 600 0 0 16 601 -602 602 603 601 0 0 16 602 -603 603 604 602 0 0 16 603 -604 604 605 603 0 0 16 604 -605 605 606 604 0 0 16 605 -606 606 607 605 0 0 16 606 -607 607 608 606 0 0 16 607 -608 608 609 607 0 0 16 608 -609 609 610 608 0 0 16 609 -610 610 611 609 0 0 16 610 -611 611 612 610 0 0 16 611 -612 612 613 611 0 0 16 612 -613 613 614 612 0 0 16 613 -614 614 615 613 0 0 16 614 -615 615 616 614 0 0 16 615 -616 616 617 615 0 0 16 616 -617 617 618 616 0 0 16 617 -618 618 619 617 0 0 16 618 -619 619 620 618 0 0 16 619 -620 620 621 619 0 0 16 620 -621 621 622 620 0 0 16 621 -622 622 623 621 0 0 16 622 -623 623 624 622 0 0 16 623 -624 624 625 623 0 0 16 624 -625 625 626 624 0 0 16 625 -626 626 627 625 0 0 16 626 -627 627 628 626 0 0 16 627 -628 628 629 627 0 0 16 628 -629 629 630 628 0 0 16 629 -630 630 631 629 0 0 16 630 -631 631 632 630 0 0 16 631 -632 632 633 631 0 0 16 632 -633 633 634 632 0 0 16 633 -634 634 635 633 0 0 16 634 -635 635 636 634 0 0 16 635 -636 636 637 635 0 0 16 636 -637 637 638 636 0 0 16 637 -638 638 639 637 0 0 16 638 -639 639 640 638 0 0 16 639 -640 640 641 639 0 0 16 640 -641 641 642 640 0 0 16 641 -642 642 643 641 0 0 16 642 -643 643 644 642 0 0 16 643 -644 644 645 643 0 0 16 644 -645 645 646 644 0 0 16 645 -646 646 647 645 0 0 16 646 -647 647 648 646 0 0 16 647 -648 648 649 647 0 0 16 648 -649 649 650 648 0 0 16 649 -650 650 651 649 0 0 16 650 -651 651 652 650 0 0 16 651 -652 652 653 651 0 0 16 652 -653 653 654 652 0 0 16 653 -654 654 655 653 0 0 16 654 -655 655 656 654 0 0 16 655 -656 656 657 655 0 0 16 656 -657 657 658 656 0 0 16 657 -658 658 659 657 0 0 16 658 -659 659 660 658 0 0 16 659 -660 660 661 659 0 0 16 660 -661 661 662 660 0 0 16 661 -662 662 663 661 0 0 16 662 -663 663 664 662 0 0 16 663 -664 664 665 663 0 0 16 664 -665 665 666 664 0 0 16 665 -666 666 667 665 0 0 16 666 -667 667 668 666 0 0 16 667 -668 668 669 667 0 0 16 668 -669 669 670 668 0 0 16 669 -670 670 671 669 0 0 16 670 -671 671 672 670 0 0 16 671 -672 672 673 671 0 0 16 672 -673 673 674 672 0 0 16 673 -674 674 675 673 0 0 16 674 -675 675 676 674 0 0 16 675 -676 676 677 675 0 0 16 676 -677 677 678 676 0 0 16 677 -678 678 679 677 0 0 16 678 -679 679 680 678 0 0 16 679 -680 680 681 679 0 0 16 680 -681 681 682 680 0 0 16 681 -682 682 683 681 0 0 16 682 -683 683 684 682 0 0 16 683 -684 684 685 683 0 0 16 684 -685 685 686 684 0 0 16 685 -686 686 687 685 0 0 16 686 -687 687 688 686 0 0 16 687 -688 688 689 687 0 0 16 688 -689 689 690 688 0 0 16 689 -690 690 691 689 0 0 16 690 -691 691 692 690 0 0 16 691 -692 692 693 691 0 0 16 692 -693 693 694 692 0 0 16 693 -694 694 695 693 0 0 16 694 -695 695 696 694 0 0 16 695 -696 696 697 695 0 0 16 696 -697 697 698 696 0 0 16 697 -698 698 699 697 0 0 16 698 -699 699 700 698 0 0 16 699 -700 700 701 699 0 0 16 700 -701 701 702 700 0 0 16 701 -702 702 703 701 0 0 16 702 -703 703 704 702 0 0 16 703 -704 704 705 703 0 0 16 704 -705 705 706 704 0 0 16 705 -706 706 707 705 0 0 16 706 -707 707 708 706 0 0 16 707 -708 708 709 707 0 0 16 708 -709 709 710 708 0 0 16 709 -710 710 711 709 0 0 16 710 -711 711 712 710 0 0 16 711 -712 712 713 711 0 0 16 712 -713 713 714 712 0 0 16 713 -714 714 715 713 0 0 16 714 -715 715 716 714 0 0 16 715 -716 716 717 715 0 0 16 716 -717 717 718 716 0 0 16 717 -718 718 719 717 0 0 16 718 -719 719 720 718 0 0 16 719 -720 720 721 719 0 0 16 720 -721 721 722 720 0 0 16 721 -722 722 723 721 0 0 16 722 -723 723 724 722 0 0 16 723 -724 724 725 723 0 0 16 724 -725 725 726 724 0 0 16 725 -726 726 727 725 0 0 16 726 -727 727 728 726 0 0 16 727 -728 728 729 727 0 0 16 728 -729 729 730 728 0 0 16 729 -730 730 731 729 0 0 16 730 -731 731 732 730 0 0 16 731 -732 732 733 731 0 0 16 732 -733 733 734 732 0 0 16 733 -734 734 735 733 0 0 16 734 -735 735 736 734 0 0 16 735 -736 736 737 735 0 0 16 736 -737 737 738 736 0 0 16 737 -738 738 739 737 0 0 16 738 -739 739 740 738 0 0 16 739 -740 740 741 739 0 0 16 740 -741 741 742 740 0 0 16 741 -742 742 743 741 0 0 16 742 -743 743 744 742 0 0 16 743 -744 744 745 743 0 0 16 744 -745 745 746 744 0 0 16 745 -746 746 747 745 0 0 16 746 -747 747 748 746 0 0 16 747 -748 748 749 747 0 0 16 748 -749 749 750 748 0 0 16 749 -750 750 751 749 0 0 16 750 -751 751 752 750 0 0 16 751 -752 752 753 751 0 0 16 752 -753 753 754 752 0 0 16 753 -754 754 755 753 0 0 16 754 -755 755 756 754 0 0 16 755 -756 756 757 755 0 0 16 756 -757 757 758 756 0 0 16 757 -758 758 759 757 0 0 16 758 -759 759 760 758 0 0 16 759 -760 760 761 759 0 0 16 760 -761 761 762 760 0 0 16 761 -762 762 763 761 0 0 16 762 -763 763 764 762 0 0 16 763 -764 764 765 763 0 0 16 764 -765 765 766 764 0 0 16 765 -766 766 767 765 0 0 16 766 -767 767 768 766 0 0 16 767 -768 768 769 767 0 0 16 768 -769 769 770 768 0 0 16 769 -770 770 771 769 0 0 16 770 -771 771 772 770 0 0 16 771 -772 772 773 771 0 0 16 772 -773 773 774 772 0 0 16 773 -774 774 775 773 0 0 16 774 -775 775 776 774 0 0 16 775 -776 776 777 775 0 0 16 776 -777 777 778 776 0 0 16 777 -778 778 779 777 0 0 16 778 -779 779 780 778 0 0 16 779 -780 780 781 779 0 0 16 780 -781 781 782 780 0 0 16 781 -782 782 783 781 0 0 16 782 -783 783 784 782 0 0 16 783 -784 784 785 783 0 0 16 784 -785 785 786 784 0 0 16 785 -786 786 787 785 0 0 16 786 -787 787 788 786 0 0 16 787 -788 788 789 787 0 0 16 788 -789 789 790 788 0 0 16 789 -790 790 791 789 0 0 16 790 -791 791 792 790 0 0 16 791 -792 792 793 791 0 0 16 792 -793 793 794 792 0 0 16 793 -794 794 795 793 0 0 16 794 -795 795 796 794 0 0 16 795 -796 796 797 795 0 0 16 796 -797 797 798 796 0 0 16 797 -798 798 799 797 0 0 16 798 -799 799 800 798 0 0 16 799 -800 800 801 799 0 0 16 800 -801 801 802 800 0 0 16 801 -802 802 803 801 0 0 16 802 -803 803 804 802 0 0 16 803 -804 804 805 803 0 0 16 804 -805 805 806 804 0 0 16 805 -806 806 807 805 0 0 16 806 -807 807 808 806 0 0 16 807 -808 808 809 807 0 0 16 808 -809 809 810 808 0 0 16 809 -810 810 811 809 0 0 16 810 -811 811 812 810 0 0 16 811 -812 812 813 811 0 0 16 812 -813 813 814 812 0 0 16 813 -814 814 815 813 0 0 16 814 -815 815 816 814 0 0 16 815 -816 816 817 815 0 0 16 816 -817 817 818 816 0 0 16 817 -818 818 819 817 0 0 16 818 -819 819 820 818 0 0 16 819 -820 820 821 819 0 0 16 820 -821 821 822 820 0 0 16 821 -822 822 823 821 0 0 16 822 -823 823 824 822 0 0 16 823 -824 824 825 823 0 0 16 824 -825 825 826 824 0 0 16 825 -826 826 827 825 0 0 16 826 -827 827 828 826 0 0 16 827 -828 828 829 827 0 0 16 828 -829 829 830 828 0 0 16 829 -830 830 831 829 0 0 16 830 -831 831 832 830 0 0 16 831 -832 832 833 831 0 0 16 832 -833 833 834 832 0 0 16 833 -834 834 835 833 0 0 16 834 -835 835 836 834 0 0 16 835 -836 836 837 835 0 0 16 836 -837 837 838 836 0 0 16 837 -838 838 839 837 0 0 16 838 -839 839 840 838 0 0 16 839 -840 840 841 839 0 0 16 840 -841 841 842 840 0 0 16 841 -842 842 843 841 0 0 16 842 -843 843 844 842 0 0 16 843 -844 844 845 843 0 0 16 844 -845 845 846 844 0 0 16 845 -846 846 847 845 0 0 16 846 -847 847 848 846 0 0 16 847 -848 848 849 847 0 0 16 848 -849 849 850 848 0 0 16 849 -850 850 851 849 0 0 16 850 -851 851 852 850 0 0 16 851 -852 852 853 851 0 0 16 852 -853 853 854 852 0 0 16 853 -854 854 855 853 0 0 16 854 -855 855 856 854 0 0 16 855 -856 856 857 855 0 0 16 856 -857 857 858 856 0 0 16 857 -858 858 859 857 0 0 16 858 -859 859 860 858 0 0 16 859 -860 860 861 859 0 0 16 860 -861 861 862 860 0 0 16 861 -862 862 863 861 0 0 16 862 -863 863 864 862 0 0 16 863 -864 864 865 863 0 0 16 864 -865 865 866 864 0 0 16 865 -866 866 867 865 0 0 16 866 -867 867 868 866 0 0 16 867 -868 868 869 867 0 0 16 868 -869 869 870 868 0 0 16 869 -870 870 871 869 0 0 16 870 -871 871 872 870 0 0 16 871 -872 872 873 871 0 0 16 872 -873 873 874 872 0 0 16 873 -874 874 875 873 0 0 16 874 -875 875 876 874 0 0 16 875 -876 876 877 875 0 0 16 876 -877 877 878 876 0 0 16 877 -878 878 879 877 0 0 16 878 -879 879 880 878 0 0 16 879 -880 880 881 879 0 0 16 880 -881 881 882 880 0 0 16 881 -882 882 883 881 0 0 16 882 -883 883 884 882 0 0 16 883 -884 884 885 883 0 0 16 884 -885 885 886 884 0 0 16 885 -886 886 887 885 0 0 16 886 -887 887 888 886 0 0 16 887 -888 888 889 887 0 0 16 888 -889 889 890 888 0 0 16 889 -890 890 891 889 0 0 16 890 -891 891 892 890 0 0 16 891 -892 892 893 891 0 0 16 892 -893 893 894 892 0 0 16 893 -894 894 895 893 0 0 16 894 -895 895 896 894 0 0 16 895 -896 896 897 895 0 0 16 896 -897 897 898 896 0 0 16 897 -898 898 899 897 0 0 16 898 -899 899 900 898 0 0 16 899 -900 900 901 899 0 0 16 900 -901 901 902 900 0 0 16 901 -902 902 903 901 0 0 16 902 -903 903 904 902 0 0 16 903 -904 904 905 903 0 0 16 904 -905 905 906 904 0 0 16 905 -906 906 907 905 0 0 16 906 -907 907 908 906 0 0 16 907 -908 908 909 907 0 0 16 908 -909 909 910 908 0 0 16 909 -910 910 911 909 0 0 16 910 -911 911 912 910 0 0 16 911 -912 912 913 911 0 0 16 912 -913 913 914 912 0 0 16 913 -914 914 915 913 0 0 16 914 -915 915 916 914 0 0 16 915 -916 916 917 915 0 0 16 916 -917 917 918 916 0 0 16 917 -918 918 919 917 0 0 16 918 -919 919 920 918 0 0 16 919 -920 920 921 919 0 0 16 920 -921 921 922 920 0 0 16 921 -922 922 923 921 0 0 16 922 -923 923 924 922 0 0 16 923 -924 924 925 923 0 0 16 924 -925 925 926 924 0 0 16 925 -926 926 927 925 0 0 16 926 -927 927 928 926 0 0 16 927 -928 928 929 927 0 0 16 928 -929 929 930 928 0 0 16 929 -930 930 931 929 0 0 16 930 -931 931 932 930 0 0 16 931 -932 932 933 931 0 0 16 932 -933 933 934 932 0 0 16 933 -934 934 935 933 0 0 16 934 -935 935 936 934 0 0 16 935 -936 936 937 935 0 0 16 936 -937 937 938 936 0 0 16 937 -938 938 939 937 0 0 16 938 -939 939 940 938 0 0 16 939 -940 940 941 939 0 0 16 940 -941 941 942 940 0 0 16 941 -942 942 943 941 0 0 16 942 -943 943 944 942 0 0 16 943 -944 944 945 943 0 0 16 944 -945 945 946 944 0 0 16 945 -946 946 947 945 0 0 16 946 -947 947 948 946 0 0 16 947 -948 948 949 947 0 0 16 948 -949 949 950 948 0 0 16 949 -950 950 951 949 0 0 16 950 -951 951 952 950 0 0 16 951 -952 952 953 951 0 0 16 952 -953 953 954 952 0 0 16 953 -954 954 955 953 0 0 16 954 -955 955 956 954 0 0 16 955 -956 956 957 955 0 0 16 956 -957 957 958 956 0 0 16 957 -958 958 959 957 0 0 16 958 -959 959 960 958 0 0 16 959 -960 960 961 959 0 0 16 960 -961 961 962 960 0 0 16 961 -962 962 963 961 0 0 16 962 -963 963 964 962 0 0 16 963 -964 964 965 963 0 0 16 964 -965 965 966 964 0 0 16 965 -966 966 967 965 0 0 16 966 -967 967 968 966 0 0 16 967 -968 968 969 967 0 0 16 968 -969 969 970 968 0 0 16 969 -970 970 971 969 0 0 16 970 -971 971 972 970 0 0 16 971 -972 972 973 971 0 0 16 972 -973 973 974 972 0 0 16 973 -974 974 975 973 0 0 16 974 -975 975 976 974 0 0 16 975 -976 976 977 975 0 0 16 976 -977 977 978 976 0 0 16 977 -978 978 979 977 0 0 16 978 -979 979 980 978 0 0 16 979 -980 980 981 979 0 0 16 980 -981 981 982 980 0 0 16 981 -982 982 983 981 0 0 16 982 -983 983 984 982 0 0 16 983 -984 984 985 983 0 0 16 984 -985 985 986 984 0 0 16 985 -986 986 987 985 0 0 16 986 -987 987 988 986 0 0 16 987 -988 988 989 987 0 0 16 988 -989 989 990 988 0 0 16 989 -990 990 991 989 0 0 16 990 -991 991 992 990 0 0 16 991 -992 992 993 991 0 0 16 992 -993 993 994 992 0 0 16 993 -994 994 995 993 0 0 16 994 -995 995 996 994 0 0 16 995 -996 996 997 995 0 0 16 996 -997 997 998 996 0 0 16 997 -998 998 999 997 0 0 16 998 -999 999 1000 998 0 0 16 999 -1000 1000 1001 999 0 0 16 1000 -1001 1001 1002 1000 0 0 16 1001 -1002 1002 1003 1001 0 0 16 1002 -1003 1003 1004 1002 0 0 16 1003 -1004 1004 1005 1003 0 0 16 1004 -1005 1005 1006 1004 0 0 16 1005 -1006 1006 1007 1005 0 0 16 1006 -1007 1007 1008 1006 0 0 16 1007 -1008 1008 1009 1007 0 0 16 1008 -1009 1009 1010 1008 0 0 16 1009 -1010 1010 1011 1009 0 0 16 1010 -1011 1011 1012 1010 0 0 16 1011 -1012 1012 1013 1011 0 0 16 1012 -1013 1013 1014 1012 0 0 16 1013 -1014 1014 1015 1013 0 0 16 1014 -1015 1015 1016 1014 0 0 16 1015 -1016 1016 1017 1015 0 0 16 1016 -1017 1017 1018 1016 0 0 16 1017 -1018 1018 1019 1017 0 0 16 1018 -1019 1019 1020 1018 0 0 16 1019 -1020 1020 1021 1019 0 0 16 1020 -1021 1021 1022 1020 0 0 16 1021 -1022 1022 1023 1021 0 0 16 1022 -1023 1023 -1 1022 0 0 16 1023 +1024 1024 1025 -1 0 0 16 1024 +1025 1025 1026 1024 0 0 16 1025 +1026 1026 1027 1025 0 0 16 1026 +1027 1027 1028 1026 0 0 16 1027 +1028 1028 1029 1027 0 0 16 1028 +1029 1029 1030 1028 0 0 16 1029 +1030 1030 1031 1029 0 0 16 1030 +1031 1031 1032 1030 0 0 16 1031 +1032 1032 1033 1031 0 0 16 1032 +1033 1033 1034 1032 0 0 16 1033 +1034 1034 1035 1033 0 0 16 1034 +1035 1035 1036 1034 0 0 16 1035 +1036 1036 1037 1035 0 0 16 1036 +1037 1037 1038 1036 0 0 16 1037 +1038 1038 1039 1037 0 0 16 1038 +1039 1039 1040 1038 0 0 16 1039 +1040 1040 1041 1039 0 0 16 1040 +1041 1041 1042 1040 0 0 16 1041 +1042 1042 1043 1041 0 0 16 1042 +1043 1043 1044 1042 0 0 16 1043 +1044 1044 1045 1043 0 0 16 1044 +1045 1045 1046 1044 0 0 16 1045 +1046 1046 1047 1045 0 0 16 1046 +1047 1047 1048 1046 0 0 16 1047 +1048 1048 1049 1047 0 0 16 1048 +1049 1049 1050 1048 0 0 16 1049 +1050 1050 1051 1049 0 0 16 1050 +1051 1051 1052 1050 0 0 16 1051 +1052 1052 1053 1051 0 0 16 1052 +1053 1053 1054 1052 0 0 16 1053 +1054 1054 1055 1053 0 0 16 1054 +1055 1055 1056 1054 0 0 16 1055 +1056 1056 1057 1055 0 0 16 1056 +1057 1057 1058 1056 0 0 16 1057 +1058 1058 1059 1057 0 0 16 1058 +1059 1059 1060 1058 0 0 16 1059 +1060 1060 1061 1059 0 0 16 1060 +1061 1061 1062 1060 0 0 16 1061 +1062 1062 1063 1061 0 0 16 1062 +1063 1063 1064 1062 0 0 16 1063 +1064 1064 1065 1063 0 0 16 1064 +1065 1065 1066 1064 0 0 16 1065 +1066 1066 1067 1065 0 0 16 1066 +1067 1067 1068 1066 0 0 16 1067 +1068 1068 1069 1067 0 0 16 1068 +1069 1069 1070 1068 0 0 16 1069 +1070 1070 1071 1069 0 0 16 1070 +1071 1071 1072 1070 0 0 16 1071 +1072 1072 1073 1071 0 0 16 1072 +1073 1073 1074 1072 0 0 16 1073 +1074 1074 1075 1073 0 0 16 1074 +1075 1075 1076 1074 0 0 16 1075 +1076 1076 1077 1075 0 0 16 1076 +1077 1077 1078 1076 0 0 16 1077 +1078 1078 1079 1077 0 0 16 1078 +1079 1079 1080 1078 0 0 16 1079 +1080 1080 1081 1079 0 0 16 1080 +1081 1081 1082 1080 0 0 16 1081 +1082 1082 1083 1081 0 0 16 1082 +1083 1083 1084 1082 0 0 16 1083 +1084 1084 1085 1083 0 0 16 1084 +1085 1085 1086 1084 0 0 16 1085 +1086 1086 1087 1085 0 0 16 1086 +1087 1087 1088 1086 0 0 16 1087 +1088 1088 1089 1087 0 0 16 1088 +1089 1089 1090 1088 0 0 16 1089 +1090 1090 1091 1089 0 0 16 1090 +1091 1091 1092 1090 0 0 16 1091 +1092 1092 1093 1091 0 0 16 1092 +1093 1093 1094 1092 0 0 16 1093 +1094 1094 1095 1093 0 0 16 1094 +1095 1095 1096 1094 0 0 16 1095 +1096 1096 1097 1095 0 0 16 1096 +1097 1097 1098 1096 0 0 16 1097 +1098 1098 1099 1097 0 0 16 1098 +1099 1099 1100 1098 0 0 16 1099 +1100 1100 1101 1099 0 0 16 1100 +1101 1101 1102 1100 0 0 16 1101 +1102 1102 1103 1101 0 0 16 1102 +1103 1103 1104 1102 0 0 16 1103 +1104 1104 1105 1103 0 0 16 1104 +1105 1105 1106 1104 0 0 16 1105 +1106 1106 1107 1105 0 0 16 1106 +1107 1107 1108 1106 0 0 16 1107 +1108 1108 1109 1107 0 0 16 1108 +1109 1109 1110 1108 0 0 16 1109 +1110 1110 1111 1109 0 0 16 1110 +1111 1111 1112 1110 0 0 16 1111 +1112 1112 1113 1111 0 0 16 1112 +1113 1113 1114 1112 0 0 16 1113 +1114 1114 1115 1113 0 0 16 1114 +1115 1115 1116 1114 0 0 16 1115 +1116 1116 1117 1115 0 0 16 1116 +1117 1117 1118 1116 0 0 16 1117 +1118 1118 1119 1117 0 0 16 1118 +1119 1119 1120 1118 0 0 16 1119 +1120 1120 1121 1119 0 0 16 1120 +1121 1121 1122 1120 0 0 16 1121 +1122 1122 1123 1121 0 0 16 1122 +1123 1123 1124 1122 0 0 16 1123 +1124 1124 1125 1123 0 0 16 1124 +1125 1125 1126 1124 0 0 16 1125 +1126 1126 1127 1125 0 0 16 1126 +1127 1127 1128 1126 0 0 16 1127 +1128 1128 1129 1127 0 0 16 1128 +1129 1129 1130 1128 0 0 16 1129 +1130 1130 1131 1129 0 0 16 1130 +1131 1131 1132 1130 0 0 16 1131 +1132 1132 1133 1131 0 0 16 1132 +1133 1133 1134 1132 0 0 16 1133 +1134 1134 1135 1133 0 0 16 1134 +1135 1135 1136 1134 0 0 16 1135 +1136 1136 1137 1135 0 0 16 1136 +1137 1137 1138 1136 0 0 16 1137 +1138 1138 1139 1137 0 0 16 1138 +1139 1139 1140 1138 0 0 16 1139 +1140 1140 1141 1139 0 0 16 1140 +1141 1141 1142 1140 0 0 16 1141 +1142 1142 1143 1141 0 0 16 1142 +1143 1143 1144 1142 0 0 16 1143 +1144 1144 1145 1143 0 0 16 1144 +1145 1145 1146 1144 0 0 16 1145 +1146 1146 1147 1145 0 0 16 1146 +1147 1147 1148 1146 0 0 16 1147 +1148 1148 1149 1147 0 0 16 1148 +1149 1149 1150 1148 0 0 16 1149 +1150 1150 1151 1149 0 0 16 1150 +1151 1151 1152 1150 0 0 16 1151 +1152 1152 1153 1151 0 0 16 1152 +1153 1153 1154 1152 0 0 16 1153 +1154 1154 1155 1153 0 0 16 1154 +1155 1155 1156 1154 0 0 16 1155 +1156 1156 1157 1155 0 0 16 1156 +1157 1157 1158 1156 0 0 16 1157 +1158 1158 1159 1157 0 0 16 1158 +1159 1159 1160 1158 0 0 16 1159 +1160 1160 1161 1159 0 0 16 1160 +1161 1161 1162 1160 0 0 16 1161 +1162 1162 1163 1161 0 0 16 1162 +1163 1163 1164 1162 0 0 16 1163 +1164 1164 1165 1163 0 0 16 1164 +1165 1165 1166 1164 0 0 16 1165 +1166 1166 1167 1165 0 0 16 1166 +1167 1167 1168 1166 0 0 16 1167 +1168 1168 1169 1167 0 0 16 1168 +1169 1169 1170 1168 0 0 16 1169 +1170 1170 1171 1169 0 0 16 1170 +1171 1171 1172 1170 0 0 16 1171 +1172 1172 1173 1171 0 0 16 1172 +1173 1173 1174 1172 0 0 16 1173 +1174 1174 1175 1173 0 0 16 1174 +1175 1175 1176 1174 0 0 16 1175 +1176 1176 1177 1175 0 0 16 1176 +1177 1177 1178 1176 0 0 16 1177 +1178 1178 1179 1177 0 0 16 1178 +1179 1179 1180 1178 0 0 16 1179 +1180 1180 1181 1179 0 0 16 1180 +1181 1181 1182 1180 0 0 16 1181 +1182 1182 1183 1181 0 0 16 1182 +1183 1183 1184 1182 0 0 16 1183 +1184 1184 1185 1183 0 0 16 1184 +1185 1185 1186 1184 0 0 16 1185 +1186 1186 1187 1185 0 0 16 1186 +1187 1187 1188 1186 0 0 16 1187 +1188 1188 1189 1187 0 0 16 1188 +1189 1189 1190 1188 0 0 16 1189 +1190 1190 1191 1189 0 0 16 1190 +1191 1191 1192 1190 0 0 16 1191 +1192 1192 1193 1191 0 0 16 1192 +1193 1193 1194 1192 0 0 16 1193 +1194 1194 1195 1193 0 0 16 1194 +1195 1195 1196 1194 0 0 16 1195 +1196 1196 1197 1195 0 0 16 1196 +1197 1197 1198 1196 0 0 16 1197 +1198 1198 1199 1197 0 0 16 1198 +1199 1199 1200 1198 0 0 16 1199 +1200 1200 1201 1199 0 0 16 1200 +1201 1201 1202 1200 0 0 16 1201 +1202 1202 1203 1201 0 0 16 1202 +1203 1203 1204 1202 0 0 16 1203 +1204 1204 1205 1203 0 0 16 1204 +1205 1205 1206 1204 0 0 16 1205 +1206 1206 1207 1205 0 0 16 1206 +1207 1207 1208 1206 0 0 16 1207 +1208 1208 1209 1207 0 0 16 1208 +1209 1209 1210 1208 0 0 16 1209 +1210 1210 1211 1209 0 0 16 1210 +1211 1211 1212 1210 0 0 16 1211 +1212 1212 1213 1211 0 0 16 1212 +1213 1213 1214 1212 0 0 16 1213 +1214 1214 1215 1213 0 0 16 1214 +1215 1215 1216 1214 0 0 16 1215 +1216 1216 1217 1215 0 0 16 1216 +1217 1217 1218 1216 0 0 16 1217 +1218 1218 1219 1217 0 0 16 1218 +1219 1219 1220 1218 0 0 16 1219 +1220 1220 1221 1219 0 0 16 1220 +1221 1221 1222 1220 0 0 16 1221 +1222 1222 1223 1221 0 0 16 1222 +1223 1223 1224 1222 0 0 16 1223 +1224 1224 1225 1223 0 0 16 1224 +1225 1225 1226 1224 0 0 16 1225 +1226 1226 1227 1225 0 0 16 1226 +1227 1227 1228 1226 0 0 16 1227 +1228 1228 1229 1227 0 0 16 1228 +1229 1229 1230 1228 0 0 16 1229 +1230 1230 1231 1229 0 0 16 1230 +1231 1231 1232 1230 0 0 16 1231 +1232 1232 1233 1231 0 0 16 1232 +1233 1233 1234 1232 0 0 16 1233 +1234 1234 1235 1233 0 0 16 1234 +1235 1235 1236 1234 0 0 16 1235 +1236 1236 1237 1235 0 0 16 1236 +1237 1237 1238 1236 0 0 16 1237 +1238 1238 1239 1237 0 0 16 1238 +1239 1239 1240 1238 0 0 16 1239 +1240 1240 1241 1239 0 0 16 1240 +1241 1241 1242 1240 0 0 16 1241 +1242 1242 1243 1241 0 0 16 1242 +1243 1243 1244 1242 0 0 16 1243 +1244 1244 1245 1243 0 0 16 1244 +1245 1245 1246 1244 0 0 16 1245 +1246 1246 1247 1245 0 0 16 1246 +1247 1247 1248 1246 0 0 16 1247 +1248 1248 1249 1247 0 0 16 1248 +1249 1249 1250 1248 0 0 16 1249 +1250 1250 1251 1249 0 0 16 1250 +1251 1251 1252 1250 0 0 16 1251 +1252 1252 1253 1251 0 0 16 1252 +1253 1253 1254 1252 0 0 16 1253 +1254 1254 1255 1253 0 0 16 1254 +1255 1255 1256 1254 0 0 16 1255 +1256 1256 1257 1255 0 0 16 1256 +1257 1257 1258 1256 0 0 16 1257 +1258 1258 1259 1257 0 0 16 1258 +1259 1259 1260 1258 0 0 16 1259 +1260 1260 1261 1259 0 0 16 1260 +1261 1261 1262 1260 0 0 16 1261 +1262 1262 1263 1261 0 0 16 1262 +1263 1263 1264 1262 0 0 16 1263 +1264 1264 1265 1263 0 0 16 1264 +1265 1265 1266 1264 0 0 16 1265 +1266 1266 1267 1265 0 0 16 1266 +1267 1267 1268 1266 0 0 16 1267 +1268 1268 1269 1267 0 0 16 1268 +1269 1269 1270 1268 0 0 16 1269 +1270 1270 1271 1269 0 0 16 1270 +1271 1271 1272 1270 0 0 16 1271 +1272 1272 1273 1271 0 0 16 1272 +1273 1273 1274 1272 0 0 16 1273 +1274 1274 1275 1273 0 0 16 1274 +1275 1275 1276 1274 0 0 16 1275 +1276 1276 1277 1275 0 0 16 1276 +1277 1277 1278 1276 0 0 16 1277 +1278 1278 1279 1277 0 0 16 1278 +1279 1279 1280 1278 0 0 16 1279 +1280 1280 1281 1279 0 0 16 1280 +1281 1281 1282 1280 0 0 16 1281 +1282 1282 1283 1281 0 0 16 1282 +1283 1283 1284 1282 0 0 16 1283 +1284 1284 1285 1283 0 0 16 1284 +1285 1285 1286 1284 0 0 16 1285 +1286 1286 1287 1285 0 0 16 1286 +1287 1287 1288 1286 0 0 16 1287 +1288 1288 1289 1287 0 0 16 1288 +1289 1289 1290 1288 0 0 16 1289 +1290 1290 1291 1289 0 0 16 1290 +1291 1291 1292 1290 0 0 16 1291 +1292 1292 1293 1291 0 0 16 1292 +1293 1293 1294 1292 0 0 16 1293 +1294 1294 1295 1293 0 0 16 1294 +1295 1295 1296 1294 0 0 16 1295 +1296 1296 1297 1295 0 0 16 1296 +1297 1297 1298 1296 0 0 16 1297 +1298 1298 1299 1297 0 0 16 1298 +1299 1299 1300 1298 0 0 16 1299 +1300 1300 1301 1299 0 0 16 1300 +1301 1301 1302 1300 0 0 16 1301 +1302 1302 1303 1301 0 0 16 1302 +1303 1303 1304 1302 0 0 16 1303 +1304 1304 1305 1303 0 0 16 1304 +1305 1305 1306 1304 0 0 16 1305 +1306 1306 1307 1305 0 0 16 1306 +1307 1307 1308 1306 0 0 16 1307 +1308 1308 1309 1307 0 0 16 1308 +1309 1309 1310 1308 0 0 16 1309 +1310 1310 1311 1309 0 0 16 1310 +1311 1311 1312 1310 0 0 16 1311 +1312 1312 1313 1311 0 0 16 1312 +1313 1313 1314 1312 0 0 16 1313 +1314 1314 1315 1313 0 0 16 1314 +1315 1315 1316 1314 0 0 16 1315 +1316 1316 1317 1315 0 0 16 1316 +1317 1317 1318 1316 0 0 16 1317 +1318 1318 1319 1317 0 0 16 1318 +1319 1319 1320 1318 0 0 16 1319 +1320 1320 1321 1319 0 0 16 1320 +1321 1321 1322 1320 0 0 16 1321 +1322 1322 1323 1321 0 0 16 1322 +1323 1323 1324 1322 0 0 16 1323 +1324 1324 1325 1323 0 0 16 1324 +1325 1325 1326 1324 0 0 16 1325 +1326 1326 1327 1325 0 0 16 1326 +1327 1327 1328 1326 0 0 16 1327 +1328 1328 1329 1327 0 0 16 1328 +1329 1329 1330 1328 0 0 16 1329 +1330 1330 1331 1329 0 0 16 1330 +1331 1331 1332 1330 0 0 16 1331 +1332 1332 1333 1331 0 0 16 1332 +1333 1333 1334 1332 0 0 16 1333 +1334 1334 1335 1333 0 0 16 1334 +1335 1335 1336 1334 0 0 16 1335 +1336 1336 1337 1335 0 0 16 1336 +1337 1337 1338 1336 0 0 16 1337 +1338 1338 1339 1337 0 0 16 1338 +1339 1339 1340 1338 0 0 16 1339 +1340 1340 1341 1339 0 0 16 1340 +1341 1341 1342 1340 0 0 16 1341 +1342 1342 1343 1341 0 0 16 1342 +1343 1343 1344 1342 0 0 16 1343 +1344 1344 1345 1343 0 0 16 1344 +1345 1345 1346 1344 0 0 16 1345 +1346 1346 1347 1345 0 0 16 1346 +1347 1347 1348 1346 0 0 16 1347 +1348 1348 1349 1347 0 0 16 1348 +1349 1349 1350 1348 0 0 16 1349 +1350 1350 1351 1349 0 0 16 1350 +1351 1351 1352 1350 0 0 16 1351 +1352 1352 1353 1351 0 0 16 1352 +1353 1353 1354 1352 0 0 16 1353 +1354 1354 1355 1353 0 0 16 1354 +1355 1355 1356 1354 0 0 16 1355 +1356 1356 1357 1355 0 0 16 1356 +1357 1357 1358 1356 0 0 16 1357 +1358 1358 1359 1357 0 0 16 1358 +1359 1359 1360 1358 0 0 16 1359 +1360 1360 1361 1359 0 0 16 1360 +1361 1361 1362 1360 0 0 16 1361 +1362 1362 1363 1361 0 0 16 1362 +1363 1363 1364 1362 0 0 16 1363 +1364 1364 1365 1363 0 0 16 1364 +1365 1365 1366 1364 0 0 16 1365 +1366 1366 1367 1365 0 0 16 1366 +1367 1367 1368 1366 0 0 16 1367 +1368 1368 1369 1367 0 0 16 1368 +1369 1369 1370 1368 0 0 16 1369 +1370 1370 1371 1369 0 0 16 1370 +1371 1371 1372 1370 0 0 16 1371 +1372 1372 1373 1371 0 0 16 1372 +1373 1373 1374 1372 0 0 16 1373 +1374 1374 1375 1373 0 0 16 1374 +1375 1375 1376 1374 0 0 16 1375 +1376 1376 1377 1375 0 0 16 1376 +1377 1377 1378 1376 0 0 16 1377 +1378 1378 1379 1377 0 0 16 1378 +1379 1379 1380 1378 0 0 16 1379 +1380 1380 1381 1379 0 0 16 1380 +1381 1381 1382 1380 0 0 16 1381 +1382 1382 1383 1381 0 0 16 1382 +1383 1383 1384 1382 0 0 16 1383 +1384 1384 1385 1383 0 0 16 1384 +1385 1385 1386 1384 0 0 16 1385 +1386 1386 1387 1385 0 0 16 1386 +1387 1387 1388 1386 0 0 16 1387 +1388 1388 1389 1387 0 0 16 1388 +1389 1389 1390 1388 0 0 16 1389 +1390 1390 1391 1389 0 0 16 1390 +1391 1391 1392 1390 0 0 16 1391 +1392 1392 1393 1391 0 0 16 1392 +1393 1393 1394 1392 0 0 16 1393 +1394 1394 1395 1393 0 0 16 1394 +1395 1395 1396 1394 0 0 16 1395 +1396 1396 1397 1395 0 0 16 1396 +1397 1397 1398 1396 0 0 16 1397 +1398 1398 1399 1397 0 0 16 1398 +1399 1399 1400 1398 0 0 16 1399 +1400 1400 1401 1399 0 0 16 1400 +1401 1401 1402 1400 0 0 16 1401 +1402 1402 1403 1401 0 0 16 1402 +1403 1403 1404 1402 0 0 16 1403 +1404 1404 1405 1403 0 0 16 1404 +1405 1405 1406 1404 0 0 16 1405 +1406 1406 1407 1405 0 0 16 1406 +1407 1407 1408 1406 0 0 16 1407 +1408 1408 1409 1407 0 0 16 1408 +1409 1409 1410 1408 0 0 16 1409 +1410 1410 1411 1409 0 0 16 1410 +1411 1411 1412 1410 0 0 16 1411 +1412 1412 1413 1411 0 0 16 1412 +1413 1413 1414 1412 0 0 16 1413 +1414 1414 1415 1413 0 0 16 1414 +1415 1415 1416 1414 0 0 16 1415 +1416 1416 1417 1415 0 0 16 1416 +1417 1417 1418 1416 0 0 16 1417 +1418 1418 1419 1417 0 0 16 1418 +1419 1419 1420 1418 0 0 16 1419 +1420 1420 1421 1419 0 0 16 1420 +1421 1421 1422 1420 0 0 16 1421 +1422 1422 1423 1421 0 0 16 1422 +1423 1423 1424 1422 0 0 16 1423 +1424 1424 1425 1423 0 0 16 1424 +1425 1425 1426 1424 0 0 16 1425 +1426 1426 1427 1425 0 0 16 1426 +1427 1427 1428 1426 0 0 16 1427 +1428 1428 1429 1427 0 0 16 1428 +1429 1429 1430 1428 0 0 16 1429 +1430 1430 1431 1429 0 0 16 1430 +1431 1431 1432 1430 0 0 16 1431 +1432 1432 1433 1431 0 0 16 1432 +1433 1433 1434 1432 0 0 16 1433 +1434 1434 1435 1433 0 0 16 1434 +1435 1435 1436 1434 0 0 16 1435 +1436 1436 1437 1435 0 0 16 1436 +1437 1437 1438 1436 0 0 16 1437 +1438 1438 1439 1437 0 0 16 1438 +1439 1439 1440 1438 0 0 16 1439 +1440 1440 1441 1439 0 0 16 1440 +1441 1441 1442 1440 0 0 16 1441 +1442 1442 1443 1441 0 0 16 1442 +1443 1443 1444 1442 0 0 16 1443 +1444 1444 1445 1443 0 0 16 1444 +1445 1445 1446 1444 0 0 16 1445 +1446 1446 1447 1445 0 0 16 1446 +1447 1447 1448 1446 0 0 16 1447 +1448 1448 1449 1447 0 0 16 1448 +1449 1449 1450 1448 0 0 16 1449 +1450 1450 1451 1449 0 0 16 1450 +1451 1451 1452 1450 0 0 16 1451 +1452 1452 1453 1451 0 0 16 1452 +1453 1453 1454 1452 0 0 16 1453 +1454 1454 1455 1453 0 0 16 1454 +1455 1455 1456 1454 0 0 16 1455 +1456 1456 1457 1455 0 0 16 1456 +1457 1457 1458 1456 0 0 16 1457 +1458 1458 1459 1457 0 0 16 1458 +1459 1459 1460 1458 0 0 16 1459 +1460 1460 1461 1459 0 0 16 1460 +1461 1461 1462 1460 0 0 16 1461 +1462 1462 1463 1461 0 0 16 1462 +1463 1463 1464 1462 0 0 16 1463 +1464 1464 1465 1463 0 0 16 1464 +1465 1465 1466 1464 0 0 16 1465 +1466 1466 1467 1465 0 0 16 1466 +1467 1467 1468 1466 0 0 16 1467 +1468 1468 1469 1467 0 0 16 1468 +1469 1469 1470 1468 0 0 16 1469 +1470 1470 1471 1469 0 0 16 1470 +1471 1471 1472 1470 0 0 16 1471 +1472 1472 1473 1471 0 0 16 1472 +1473 1473 1474 1472 0 0 16 1473 +1474 1474 1475 1473 0 0 16 1474 +1475 1475 1476 1474 0 0 16 1475 +1476 1476 1477 1475 0 0 16 1476 +1477 1477 1478 1476 0 0 16 1477 +1478 1478 1479 1477 0 0 16 1478 +1479 1479 1480 1478 0 0 16 1479 +1480 1480 1481 1479 0 0 16 1480 +1481 1481 1482 1480 0 0 16 1481 +1482 1482 1483 1481 0 0 16 1482 +1483 1483 1484 1482 0 0 16 1483 +1484 1484 1485 1483 0 0 16 1484 +1485 1485 1486 1484 0 0 16 1485 +1486 1486 1487 1485 0 0 16 1486 +1487 1487 1488 1486 0 0 16 1487 +1488 1488 1489 1487 0 0 16 1488 +1489 1489 1490 1488 0 0 16 1489 +1490 1490 1491 1489 0 0 16 1490 +1491 1491 1492 1490 0 0 16 1491 +1492 1492 1493 1491 0 0 16 1492 +1493 1493 1494 1492 0 0 16 1493 +1494 1494 1495 1493 0 0 16 1494 +1495 1495 1496 1494 0 0 16 1495 +1496 1496 1497 1495 0 0 16 1496 +1497 1497 1498 1496 0 0 16 1497 +1498 1498 1499 1497 0 0 16 1498 +1499 1499 1500 1498 0 0 16 1499 +1500 1500 1501 1499 0 0 16 1500 +1501 1501 1502 1500 0 0 16 1501 +1502 1502 1503 1501 0 0 16 1502 +1503 1503 1504 1502 0 0 16 1503 +1504 1504 1505 1503 0 0 16 1504 +1505 1505 1506 1504 0 0 16 1505 +1506 1506 1507 1505 0 0 16 1506 +1507 1507 1508 1506 0 0 16 1507 +1508 1508 1509 1507 0 0 16 1508 +1509 1509 1510 1508 0 0 16 1509 +1510 1510 1511 1509 0 0 16 1510 +1511 1511 1512 1510 0 0 16 1511 +1512 1512 1513 1511 0 0 16 1512 +1513 1513 1514 1512 0 0 16 1513 +1514 1514 1515 1513 0 0 16 1514 +1515 1515 1516 1514 0 0 16 1515 +1516 1516 1517 1515 0 0 16 1516 +1517 1517 1518 1516 0 0 16 1517 +1518 1518 1519 1517 0 0 16 1518 +1519 1519 1520 1518 0 0 16 1519 +1520 1520 1521 1519 0 0 16 1520 +1521 1521 1522 1520 0 0 16 1521 +1522 1522 1523 1521 0 0 16 1522 +1523 1523 1524 1522 0 0 16 1523 +1524 1524 1525 1523 0 0 16 1524 +1525 1525 1526 1524 0 0 16 1525 +1526 1526 1527 1525 0 0 16 1526 +1527 1527 1528 1526 0 0 16 1527 +1528 1528 1529 1527 0 0 16 1528 +1529 1529 1530 1528 0 0 16 1529 +1530 1530 1531 1529 0 0 16 1530 +1531 1531 1532 1530 0 0 16 1531 +1532 1532 1533 1531 0 0 16 1532 +1533 1533 1534 1532 0 0 16 1533 +1534 1534 1535 1533 0 0 16 1534 +1535 1535 1536 1534 0 0 16 1535 +1536 1536 1537 1535 0 0 16 1536 +1537 1537 1538 1536 0 0 16 1537 +1538 1538 1539 1537 0 0 16 1538 +1539 1539 1540 1538 0 0 16 1539 +1540 1540 1541 1539 0 0 16 1540 +1541 1541 1542 1540 0 0 16 1541 +1542 1542 1543 1541 0 0 16 1542 +1543 1543 1544 1542 0 0 16 1543 +1544 1544 1545 1543 0 0 16 1544 +1545 1545 1546 1544 0 0 16 1545 +1546 1546 1547 1545 0 0 16 1546 +1547 1547 1548 1546 0 0 16 1547 +1548 1548 1549 1547 0 0 16 1548 +1549 1549 1550 1548 0 0 16 1549 +1550 1550 1551 1549 0 0 16 1550 +1551 1551 1552 1550 0 0 16 1551 +1552 1552 1553 1551 0 0 16 1552 +1553 1553 1554 1552 0 0 16 1553 +1554 1554 1555 1553 0 0 16 1554 +1555 1555 1556 1554 0 0 16 1555 +1556 1556 1557 1555 0 0 16 1556 +1557 1557 1558 1556 0 0 16 1557 +1558 1558 1559 1557 0 0 16 1558 +1559 1559 1560 1558 0 0 16 1559 +1560 1560 1561 1559 0 0 16 1560 +1561 1561 1562 1560 0 0 16 1561 +1562 1562 1563 1561 0 0 16 1562 +1563 1563 1564 1562 0 0 16 1563 +1564 1564 1565 1563 0 0 16 1564 +1565 1565 1566 1564 0 0 16 1565 +1566 1566 1567 1565 0 0 16 1566 +1567 1567 1568 1566 0 0 16 1567 +1568 1568 1569 1567 0 0 16 1568 +1569 1569 1570 1568 0 0 16 1569 +1570 1570 1571 1569 0 0 16 1570 +1571 1571 1572 1570 0 0 16 1571 +1572 1572 1573 1571 0 0 16 1572 +1573 1573 1574 1572 0 0 16 1573 +1574 1574 1575 1573 0 0 16 1574 +1575 1575 1576 1574 0 0 16 1575 +1576 1576 1577 1575 0 0 16 1576 +1577 1577 1578 1576 0 0 16 1577 +1578 1578 1579 1577 0 0 16 1578 +1579 1579 1580 1578 0 0 16 1579 +1580 1580 1581 1579 0 0 16 1580 +1581 1581 1582 1580 0 0 16 1581 +1582 1582 1583 1581 0 0 16 1582 +1583 1583 1584 1582 0 0 16 1583 +1584 1584 1585 1583 0 0 16 1584 +1585 1585 1586 1584 0 0 16 1585 +1586 1586 1587 1585 0 0 16 1586 +1587 1587 1588 1586 0 0 16 1587 +1588 1588 1589 1587 0 0 16 1588 +1589 1589 1590 1588 0 0 16 1589 +1590 1590 1591 1589 0 0 16 1590 +1591 1591 1592 1590 0 0 16 1591 +1592 1592 1593 1591 0 0 16 1592 +1593 1593 1594 1592 0 0 16 1593 +1594 1594 1595 1593 0 0 16 1594 +1595 1595 1596 1594 0 0 16 1595 +1596 1596 1597 1595 0 0 16 1596 +1597 1597 1598 1596 0 0 16 1597 +1598 1598 1599 1597 0 0 16 1598 +1599 1599 1600 1598 0 0 16 1599 +1600 1600 1601 1599 0 0 16 1600 +1601 1601 1602 1600 0 0 16 1601 +1602 1602 1603 1601 0 0 16 1602 +1603 1603 1604 1602 0 0 16 1603 +1604 1604 1605 1603 0 0 16 1604 +1605 1605 1606 1604 0 0 16 1605 +1606 1606 1607 1605 0 0 16 1606 +1607 1607 1608 1606 0 0 16 1607 +1608 1608 1609 1607 0 0 16 1608 +1609 1609 1610 1608 0 0 16 1609 +1610 1610 1611 1609 0 0 16 1610 +1611 1611 1612 1610 0 0 16 1611 +1612 1612 1613 1611 0 0 16 1612 +1613 1613 1614 1612 0 0 16 1613 +1614 1614 1615 1613 0 0 16 1614 +1615 1615 1616 1614 0 0 16 1615 +1616 1616 1617 1615 0 0 16 1616 +1617 1617 1618 1616 0 0 16 1617 +1618 1618 1619 1617 0 0 16 1618 +1619 1619 1620 1618 0 0 16 1619 +1620 1620 1621 1619 0 0 16 1620 +1621 1621 1622 1620 0 0 16 1621 +1622 1622 1623 1621 0 0 16 1622 +1623 1623 1624 1622 0 0 16 1623 +1624 1624 1625 1623 0 0 16 1624 +1625 1625 1626 1624 0 0 16 1625 +1626 1626 1627 1625 0 0 16 1626 +1627 1627 1628 1626 0 0 16 1627 +1628 1628 1629 1627 0 0 16 1628 +1629 1629 1630 1628 0 0 16 1629 +1630 1630 1631 1629 0 0 16 1630 +1631 1631 1632 1630 0 0 16 1631 +1632 1632 1633 1631 0 0 16 1632 +1633 1633 1634 1632 0 0 16 1633 +1634 1634 1635 1633 0 0 16 1634 +1635 1635 1636 1634 0 0 16 1635 +1636 1636 1637 1635 0 0 16 1636 +1637 1637 1638 1636 0 0 16 1637 +1638 1638 1639 1637 0 0 16 1638 +1639 1639 1640 1638 0 0 16 1639 +1640 1640 1641 1639 0 0 16 1640 +1641 1641 1642 1640 0 0 16 1641 +1642 1642 1643 1641 0 0 16 1642 +1643 1643 1644 1642 0 0 16 1643 +1644 1644 1645 1643 0 0 16 1644 +1645 1645 1646 1644 0 0 16 1645 +1646 1646 1647 1645 0 0 16 1646 +1647 1647 1648 1646 0 0 16 1647 +1648 1648 1649 1647 0 0 16 1648 +1649 1649 1650 1648 0 0 16 1649 +1650 1650 1651 1649 0 0 16 1650 +1651 1651 1652 1650 0 0 16 1651 +1652 1652 1653 1651 0 0 16 1652 +1653 1653 1654 1652 0 0 16 1653 +1654 1654 1655 1653 0 0 16 1654 +1655 1655 1656 1654 0 0 16 1655 +1656 1656 1657 1655 0 0 16 1656 +1657 1657 1658 1656 0 0 16 1657 +1658 1658 1659 1657 0 0 16 1658 +1659 1659 1660 1658 0 0 16 1659 +1660 1660 1661 1659 0 0 16 1660 +1661 1661 1662 1660 0 0 16 1661 +1662 1662 1663 1661 0 0 16 1662 +1663 1663 1664 1662 0 0 16 1663 +1664 1664 1665 1663 0 0 16 1664 +1665 1665 1666 1664 0 0 16 1665 +1666 1666 1667 1665 0 0 16 1666 +1667 1667 1668 1666 0 0 16 1667 +1668 1668 1669 1667 0 0 16 1668 +1669 1669 1670 1668 0 0 16 1669 +1670 1670 1671 1669 0 0 16 1670 +1671 1671 1672 1670 0 0 16 1671 +1672 1672 1673 1671 0 0 16 1672 +1673 1673 1674 1672 0 0 16 1673 +1674 1674 1675 1673 0 0 16 1674 +1675 1675 1676 1674 0 0 16 1675 +1676 1676 1677 1675 0 0 16 1676 +1677 1677 1678 1676 0 0 16 1677 +1678 1678 1679 1677 0 0 16 1678 +1679 1679 1680 1678 0 0 16 1679 +1680 1680 1681 1679 0 0 16 1680 +1681 1681 1682 1680 0 0 16 1681 +1682 1682 1683 1681 0 0 16 1682 +1683 1683 1684 1682 0 0 16 1683 +1684 1684 1685 1683 0 0 16 1684 +1685 1685 1686 1684 0 0 16 1685 +1686 1686 1687 1685 0 0 16 1686 +1687 1687 1688 1686 0 0 16 1687 +1688 1688 1689 1687 0 0 16 1688 +1689 1689 1690 1688 0 0 16 1689 +1690 1690 1691 1689 0 0 16 1690 +1691 1691 1692 1690 0 0 16 1691 +1692 1692 1693 1691 0 0 16 1692 +1693 1693 1694 1692 0 0 16 1693 +1694 1694 1695 1693 0 0 16 1694 +1695 1695 1696 1694 0 0 16 1695 +1696 1696 1697 1695 0 0 16 1696 +1697 1697 1698 1696 0 0 16 1697 +1698 1698 1699 1697 0 0 16 1698 +1699 1699 1700 1698 0 0 16 1699 +1700 1700 1701 1699 0 0 16 1700 +1701 1701 1702 1700 0 0 16 1701 +1702 1702 1703 1701 0 0 16 1702 +1703 1703 1704 1702 0 0 16 1703 +1704 1704 1705 1703 0 0 16 1704 +1705 1705 1706 1704 0 0 16 1705 +1706 1706 1707 1705 0 0 16 1706 +1707 1707 1708 1706 0 0 16 1707 +1708 1708 1709 1707 0 0 16 1708 +1709 1709 1710 1708 0 0 16 1709 +1710 1710 1711 1709 0 0 16 1710 +1711 1711 1712 1710 0 0 16 1711 +1712 1712 1713 1711 0 0 16 1712 +1713 1713 1714 1712 0 0 16 1713 +1714 1714 1715 1713 0 0 16 1714 +1715 1715 1716 1714 0 0 16 1715 +1716 1716 1717 1715 0 0 16 1716 +1717 1717 1718 1716 0 0 16 1717 +1718 1718 1719 1717 0 0 16 1718 +1719 1719 1720 1718 0 0 16 1719 +1720 1720 1721 1719 0 0 16 1720 +1721 1721 1722 1720 0 0 16 1721 +1722 1722 1723 1721 0 0 16 1722 +1723 1723 1724 1722 0 0 16 1723 +1724 1724 1725 1723 0 0 16 1724 +1725 1725 1726 1724 0 0 16 1725 +1726 1726 1727 1725 0 0 16 1726 +1727 1727 1728 1726 0 0 16 1727 +1728 1728 1729 1727 0 0 16 1728 +1729 1729 1730 1728 0 0 16 1729 +1730 1730 1731 1729 0 0 16 1730 +1731 1731 1732 1730 0 0 16 1731 +1732 1732 1733 1731 0 0 16 1732 +1733 1733 1734 1732 0 0 16 1733 +1734 1734 1735 1733 0 0 16 1734 +1735 1735 1736 1734 0 0 16 1735 +1736 1736 1737 1735 0 0 16 1736 +1737 1737 1738 1736 0 0 16 1737 +1738 1738 1739 1737 0 0 16 1738 +1739 1739 1740 1738 0 0 16 1739 +1740 1740 1741 1739 0 0 16 1740 +1741 1741 1742 1740 0 0 16 1741 +1742 1742 1743 1741 0 0 16 1742 +1743 1743 1744 1742 0 0 16 1743 +1744 1744 1745 1743 0 0 16 1744 +1745 1745 1746 1744 0 0 16 1745 +1746 1746 1747 1745 0 0 16 1746 +1747 1747 1748 1746 0 0 16 1747 +1748 1748 1749 1747 0 0 16 1748 +1749 1749 1750 1748 0 0 16 1749 +1750 1750 1751 1749 0 0 16 1750 +1751 1751 1752 1750 0 0 16 1751 +1752 1752 1753 1751 0 0 16 1752 +1753 1753 1754 1752 0 0 16 1753 +1754 1754 1755 1753 0 0 16 1754 +1755 1755 1756 1754 0 0 16 1755 +1756 1756 1757 1755 0 0 16 1756 +1757 1757 1758 1756 0 0 16 1757 +1758 1758 1759 1757 0 0 16 1758 +1759 1759 1760 1758 0 0 16 1759 +1760 1760 1761 1759 0 0 16 1760 +1761 1761 1762 1760 0 0 16 1761 +1762 1762 1763 1761 0 0 16 1762 +1763 1763 1764 1762 0 0 16 1763 +1764 1764 1765 1763 0 0 16 1764 +1765 1765 1766 1764 0 0 16 1765 +1766 1766 1767 1765 0 0 16 1766 +1767 1767 1768 1766 0 0 16 1767 +1768 1768 1769 1767 0 0 16 1768 +1769 1769 1770 1768 0 0 16 1769 +1770 1770 1771 1769 0 0 16 1770 +1771 1771 1772 1770 0 0 16 1771 +1772 1772 1773 1771 0 0 16 1772 +1773 1773 1774 1772 0 0 16 1773 +1774 1774 1775 1773 0 0 16 1774 +1775 1775 1776 1774 0 0 16 1775 +1776 1776 1777 1775 0 0 16 1776 +1777 1777 1778 1776 0 0 16 1777 +1778 1778 1779 1777 0 0 16 1778 +1779 1779 1780 1778 0 0 16 1779 +1780 1780 1781 1779 0 0 16 1780 +1781 1781 1782 1780 0 0 16 1781 +1782 1782 1783 1781 0 0 16 1782 +1783 1783 1784 1782 0 0 16 1783 +1784 1784 1785 1783 0 0 16 1784 +1785 1785 1786 1784 0 0 16 1785 +1786 1786 1787 1785 0 0 16 1786 +1787 1787 1788 1786 0 0 16 1787 +1788 1788 1789 1787 0 0 16 1788 +1789 1789 1790 1788 0 0 16 1789 +1790 1790 1791 1789 0 0 16 1790 +1791 1791 1792 1790 0 0 16 1791 +1792 1792 1793 1791 0 0 16 1792 +1793 1793 1794 1792 0 0 16 1793 +1794 1794 1795 1793 0 0 16 1794 +1795 1795 1796 1794 0 0 16 1795 +1796 1796 1797 1795 0 0 16 1796 +1797 1797 1798 1796 0 0 16 1797 +1798 1798 1799 1797 0 0 16 1798 +1799 1799 1800 1798 0 0 16 1799 +1800 1800 1801 1799 0 0 16 1800 +1801 1801 1802 1800 0 0 16 1801 +1802 1802 1803 1801 0 0 16 1802 +1803 1803 1804 1802 0 0 16 1803 +1804 1804 1805 1803 0 0 16 1804 +1805 1805 1806 1804 0 0 16 1805 +1806 1806 1807 1805 0 0 16 1806 +1807 1807 1808 1806 0 0 16 1807 +1808 1808 1809 1807 0 0 16 1808 +1809 1809 1810 1808 0 0 16 1809 +1810 1810 1811 1809 0 0 16 1810 +1811 1811 1812 1810 0 0 16 1811 +1812 1812 1813 1811 0 0 16 1812 +1813 1813 1814 1812 0 0 16 1813 +1814 1814 1815 1813 0 0 16 1814 +1815 1815 1816 1814 0 0 16 1815 +1816 1816 1817 1815 0 0 16 1816 +1817 1817 1818 1816 0 0 16 1817 +1818 1818 1819 1817 0 0 16 1818 +1819 1819 1820 1818 0 0 16 1819 +1820 1820 1821 1819 0 0 16 1820 +1821 1821 1822 1820 0 0 16 1821 +1822 1822 1823 1821 0 0 16 1822 +1823 1823 1824 1822 0 0 16 1823 +1824 1824 1825 1823 0 0 16 1824 +1825 1825 1826 1824 0 0 16 1825 +1826 1826 1827 1825 0 0 16 1826 +1827 1827 1828 1826 0 0 16 1827 +1828 1828 1829 1827 0 0 16 1828 +1829 1829 1830 1828 0 0 16 1829 +1830 1830 1831 1829 0 0 16 1830 +1831 1831 1832 1830 0 0 16 1831 +1832 1832 1833 1831 0 0 16 1832 +1833 1833 1834 1832 0 0 16 1833 +1834 1834 1835 1833 0 0 16 1834 +1835 1835 1836 1834 0 0 16 1835 +1836 1836 1837 1835 0 0 16 1836 +1837 1837 1838 1836 0 0 16 1837 +1838 1838 1839 1837 0 0 16 1838 +1839 1839 1840 1838 0 0 16 1839 +1840 1840 1841 1839 0 0 16 1840 +1841 1841 1842 1840 0 0 16 1841 +1842 1842 1843 1841 0 0 16 1842 +1843 1843 1844 1842 0 0 16 1843 +1844 1844 1845 1843 0 0 16 1844 +1845 1845 1846 1844 0 0 16 1845 +1846 1846 1847 1845 0 0 16 1846 +1847 1847 1848 1846 0 0 16 1847 +1848 1848 1849 1847 0 0 16 1848 +1849 1849 1850 1848 0 0 16 1849 +1850 1850 1851 1849 0 0 16 1850 +1851 1851 1852 1850 0 0 16 1851 +1852 1852 1853 1851 0 0 16 1852 +1853 1853 1854 1852 0 0 16 1853 +1854 1854 1855 1853 0 0 16 1854 +1855 1855 1856 1854 0 0 16 1855 +1856 1856 1857 1855 0 0 16 1856 +1857 1857 1858 1856 0 0 16 1857 +1858 1858 1859 1857 0 0 16 1858 +1859 1859 1860 1858 0 0 16 1859 +1860 1860 1861 1859 0 0 16 1860 +1861 1861 1862 1860 0 0 16 1861 +1862 1862 1863 1861 0 0 16 1862 +1863 1863 1864 1862 0 0 16 1863 +1864 1864 1865 1863 0 0 16 1864 +1865 1865 1866 1864 0 0 16 1865 +1866 1866 1867 1865 0 0 16 1866 +1867 1867 1868 1866 0 0 16 1867 +1868 1868 1869 1867 0 0 16 1868 +1869 1869 1870 1868 0 0 16 1869 +1870 1870 1871 1869 0 0 16 1870 +1871 1871 1872 1870 0 0 16 1871 +1872 1872 1873 1871 0 0 16 1872 +1873 1873 1874 1872 0 0 16 1873 +1874 1874 1875 1873 0 0 16 1874 +1875 1875 1876 1874 0 0 16 1875 +1876 1876 1877 1875 0 0 16 1876 +1877 1877 1878 1876 0 0 16 1877 +1878 1878 1879 1877 0 0 16 1878 +1879 1879 1880 1878 0 0 16 1879 +1880 1880 1881 1879 0 0 16 1880 +1881 1881 1882 1880 0 0 16 1881 +1882 1882 1883 1881 0 0 16 1882 +1883 1883 1884 1882 0 0 16 1883 +1884 1884 1885 1883 0 0 16 1884 +1885 1885 1886 1884 0 0 16 1885 +1886 1886 1887 1885 0 0 16 1886 +1887 1887 1888 1886 0 0 16 1887 +1888 1888 1889 1887 0 0 16 1888 +1889 1889 1890 1888 0 0 16 1889 +1890 1890 1891 1889 0 0 16 1890 +1891 1891 1892 1890 0 0 16 1891 +1892 1892 1893 1891 0 0 16 1892 +1893 1893 1894 1892 0 0 16 1893 +1894 1894 1895 1893 0 0 16 1894 +1895 1895 1896 1894 0 0 16 1895 +1896 1896 1897 1895 0 0 16 1896 +1897 1897 1898 1896 0 0 16 1897 +1898 1898 1899 1897 0 0 16 1898 +1899 1899 1900 1898 0 0 16 1899 +1900 1900 1901 1899 0 0 16 1900 +1901 1901 1902 1900 0 0 16 1901 +1902 1902 1903 1901 0 0 16 1902 +1903 1903 1904 1902 0 0 16 1903 +1904 1904 1905 1903 0 0 16 1904 +1905 1905 1906 1904 0 0 16 1905 +1906 1906 1907 1905 0 0 16 1906 +1907 1907 1908 1906 0 0 16 1907 +1908 1908 1909 1907 0 0 16 1908 +1909 1909 1910 1908 0 0 16 1909 +1910 1910 1911 1909 0 0 16 1910 +1911 1911 1912 1910 0 0 16 1911 +1912 1912 1913 1911 0 0 16 1912 +1913 1913 1914 1912 0 0 16 1913 +1914 1914 1915 1913 0 0 16 1914 +1915 1915 1916 1914 0 0 16 1915 +1916 1916 1917 1915 0 0 16 1916 +1917 1917 1918 1916 0 0 16 1917 +1918 1918 1919 1917 0 0 16 1918 +1919 1919 1920 1918 0 0 16 1919 +1920 1920 1921 1919 0 0 16 1920 +1921 1921 1922 1920 0 0 16 1921 +1922 1922 1923 1921 0 0 16 1922 +1923 1923 1924 1922 0 0 16 1923 +1924 1924 1925 1923 0 0 16 1924 +1925 1925 1926 1924 0 0 16 1925 +1926 1926 1927 1925 0 0 16 1926 +1927 1927 1928 1926 0 0 16 1927 +1928 1928 1929 1927 0 0 16 1928 +1929 1929 1930 1928 0 0 16 1929 +1930 1930 1931 1929 0 0 16 1930 +1931 1931 1932 1930 0 0 16 1931 +1932 1932 1933 1931 0 0 16 1932 +1933 1933 1934 1932 0 0 16 1933 +1934 1934 1935 1933 0 0 16 1934 +1935 1935 1936 1934 0 0 16 1935 +1936 1936 1937 1935 0 0 16 1936 +1937 1937 1938 1936 0 0 16 1937 +1938 1938 1939 1937 0 0 16 1938 +1939 1939 1940 1938 0 0 16 1939 +1940 1940 1941 1939 0 0 16 1940 +1941 1941 1942 1940 0 0 16 1941 +1942 1942 1943 1941 0 0 16 1942 +1943 1943 1944 1942 0 0 16 1943 +1944 1944 1945 1943 0 0 16 1944 +1945 1945 1946 1944 0 0 16 1945 +1946 1946 1947 1945 0 0 16 1946 +1947 1947 1948 1946 0 0 16 1947 +1948 1948 1949 1947 0 0 16 1948 +1949 1949 1950 1948 0 0 16 1949 +1950 1950 1951 1949 0 0 16 1950 +1951 1951 1952 1950 0 0 16 1951 +1952 1952 1953 1951 0 0 16 1952 +1953 1953 1954 1952 0 0 16 1953 +1954 1954 1955 1953 0 0 16 1954 +1955 1955 1956 1954 0 0 16 1955 +1956 1956 1957 1955 0 0 16 1956 +1957 1957 1958 1956 0 0 16 1957 +1958 1958 1959 1957 0 0 16 1958 +1959 1959 1960 1958 0 0 16 1959 +1960 1960 1961 1959 0 0 16 1960 +1961 1961 1962 1960 0 0 16 1961 +1962 1962 1963 1961 0 0 16 1962 +1963 1963 1964 1962 0 0 16 1963 +1964 1964 1965 1963 0 0 16 1964 +1965 1965 1966 1964 0 0 16 1965 +1966 1966 1967 1965 0 0 16 1966 +1967 1967 1968 1966 0 0 16 1967 +1968 1968 1969 1967 0 0 16 1968 +1969 1969 1970 1968 0 0 16 1969 +1970 1970 1971 1969 0 0 16 1970 +1971 1971 1972 1970 0 0 16 1971 +1972 1972 1973 1971 0 0 16 1972 +1973 1973 1974 1972 0 0 16 1973 +1974 1974 1975 1973 0 0 16 1974 +1975 1975 1976 1974 0 0 16 1975 +1976 1976 1977 1975 0 0 16 1976 +1977 1977 1978 1976 0 0 16 1977 +1978 1978 1979 1977 0 0 16 1978 +1979 1979 1980 1978 0 0 16 1979 +1980 1980 1981 1979 0 0 16 1980 +1981 1981 1982 1980 0 0 16 1981 +1982 1982 1983 1981 0 0 16 1982 +1983 1983 1984 1982 0 0 16 1983 +1984 1984 1985 1983 0 0 16 1984 +1985 1985 1986 1984 0 0 16 1985 +1986 1986 1987 1985 0 0 16 1986 +1987 1987 1988 1986 0 0 16 1987 +1988 1988 1989 1987 0 0 16 1988 +1989 1989 1990 1988 0 0 16 1989 +1990 1990 1991 1989 0 0 16 1990 +1991 1991 1992 1990 0 0 16 1991 +1992 1992 1993 1991 0 0 16 1992 +1993 1993 1994 1992 0 0 16 1993 +1994 1994 1995 1993 0 0 16 1994 +1995 1995 1996 1994 0 0 16 1995 +1996 1996 1997 1995 0 0 16 1996 +1997 1997 1998 1996 0 0 16 1997 +1998 1998 1999 1997 0 0 16 1998 +1999 1999 2000 1998 0 0 16 1999 +2000 2000 2001 1999 0 0 16 2000 +2001 2001 2002 2000 0 0 16 2001 +2002 2002 2003 2001 0 0 16 2002 +2003 2003 2004 2002 0 0 16 2003 +2004 2004 2005 2003 0 0 16 2004 +2005 2005 2006 2004 0 0 16 2005 +2006 2006 2007 2005 0 0 16 2006 +2007 2007 2008 2006 0 0 16 2007 +2008 2008 2009 2007 0 0 16 2008 +2009 2009 2010 2008 0 0 16 2009 +2010 2010 2011 2009 0 0 16 2010 +2011 2011 2012 2010 0 0 16 2011 +2012 2012 2013 2011 0 0 16 2012 +2013 2013 2014 2012 0 0 16 2013 +2014 2014 2015 2013 0 0 16 2014 +2015 2015 2016 2014 0 0 16 2015 +2016 2016 2017 2015 0 0 16 2016 +2017 2017 2018 2016 0 0 16 2017 +2018 2018 2019 2017 0 0 16 2018 +2019 2019 2020 2018 0 0 16 2019 +2020 2020 2021 2019 0 0 16 2020 +2021 2021 2022 2020 0 0 16 2021 +2022 2022 2023 2021 0 0 16 2022 +2023 2023 2024 2022 0 0 16 2023 +2024 2024 2025 2023 0 0 16 2024 +2025 2025 2026 2024 0 0 16 2025 +2026 2026 2027 2025 0 0 16 2026 +2027 2027 2028 2026 0 0 16 2027 +2028 2028 2029 2027 0 0 16 2028 +2029 2029 2030 2028 0 0 16 2029 +2030 2030 2031 2029 0 0 16 2030 +2031 2031 2032 2030 0 0 16 2031 +2032 2032 2033 2031 0 0 16 2032 +2033 2033 2034 2032 0 0 16 2033 +2034 2034 2035 2033 0 0 16 2034 +2035 2035 2036 2034 0 0 16 2035 +2036 2036 2037 2035 0 0 16 2036 +2037 2037 2038 2036 0 0 16 2037 +2038 2038 2039 2037 0 0 16 2038 +2039 2039 2040 2038 0 0 16 2039 +2040 2040 2041 2039 0 0 16 2040 +2041 2041 2042 2040 0 0 16 2041 +2042 2042 2043 2041 0 0 16 2042 +2043 2043 2044 2042 0 0 16 2043 +2044 2044 2045 2043 0 0 16 2044 +2045 2045 2046 2044 0 0 16 2045 +2046 2046 2047 2045 0 0 16 2046 +2047 2047 -1 2046 0 0 16 2047 ====================================================== === [Queue after-second-half-free] Next: 1 First: -1 Last: -1 # seq next prev timeout retrans type cbp diff --git a/tests/lib/Makefile.am b/tests/lib/Makefile.am index ee46468..9f672f8 100644 --- a/tests/lib/Makefile.am +++ b/tests/lib/Makefile.am @@ -1,13 +1,17 @@ -AM_CFLAGS = -Wall -I$(top_srcdir)/include $(LIBOSMOCORE_CFLAGS) -g +AM_CFLAGS = \ + -Wall \ + -I$(top_srcdir)/include \ + $(LIBOSMOCORE_CFLAGS) \ + $(NULL) +AM_LDFLAGS = -no-install EXTRA_DIST = ippool_test.ok \ ippool_test.err \ ippool_v6_test.ok \ ippool_v6_test.err \ - in46a_test.ok \ - in46a_v6_test.ok + $(NULL) -noinst_PROGRAMS = ippool_test in46a_test +check_PROGRAMS = ippool_test ippool_test_SOURCES = \ ippool_test.c \ @@ -17,12 +21,3 @@ ippool_test_LDADD = \ $(top_builddir)/lib/libmisc.a \ $(LIBOSMOCORE_LIBS) \ $(NULL) - -in46a_test_SOURCES = \ - in46a_test.c \ - $(NULL) - -in46a_test_LDADD = \ - $(top_builddir)/lib/libmisc.a \ - $(LIBOSMOCORE_LIBS) \ - $(NULL) diff --git a/tests/lib/in46a_test.c b/tests/lib/in46a_test.c deleted file mode 100644 index d6c4f47..0000000 --- a/tests/lib/in46a_test.c +++ /dev/null @@ -1,460 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <time.h> - -#include <netinet/in.h> -#include <sys/socket.h> - -#include <osmocom/core/utils.h> -#include <osmocom/core/application.h> -#include <osmocom/core/logging.h> -#include <osmocom/core/msgb.h> -#include <osmocom/core/bits.h> - -#include "../../lib/in46_addr.h" -#include "../../lib/syserr.h" - -static const struct in46_addr g_ia4 = { - .len = 4, - .v4.s_addr = 0x0d0c0b0a, -}; - -static void test_in46a_to_af(void) -{ - printf("Testing in46a_to_af() with IPv4 addresses\n"); - - OSMO_ASSERT(in46a_to_af(&g_ia4) == AF_INET); -} - -static void test_in46a_to_sas(void) -{ - struct sockaddr_storage ss; - struct sockaddr_in *sin = (struct sockaddr_in *) &ss; - - printf("Testing in46a_to_sas() with IPv4 addresses\n"); - - memset(&ss, 0, sizeof(ss)); - OSMO_ASSERT(in46a_to_sas(&ss, &g_ia4) == 0); - OSMO_ASSERT(sin->sin_family == AF_INET); - OSMO_ASSERT(sin->sin_addr.s_addr == g_ia4.v4.s_addr); -} - -static void test_in46a_ntop(void) -{ - struct in46_addr ia; - char buf[256]; - const char *res; - - printf("Testing in46a_ntop() with IPv4 addresses\n"); - - res = in46a_ntop(NULL, buf, sizeof(buf)); - OSMO_ASSERT(res && !strcmp(res, "UNDEFINED")); - printf("res = %s\n", res); - - ia.len = 0; - res = in46a_ntop(&ia, buf, sizeof(buf)); - printf("res = %s\n", res); - OSMO_ASSERT(res && !strcmp(res, "UNDEFINED")); - - ia.len = 4; - ia.v4.s_addr = htonl(0x01020304); - res = in46a_ntop(&ia, buf, sizeof(buf)); - OSMO_ASSERT(res && !strcmp(res, "1.2.3.4")); - printf("res = %s\n", res); -} - -static void test_in46p_ntoa(void) -{ - const struct in46_prefix ip46 = { - .prefixlen = 24, - .addr = { - .len = 4, - .v4.s_addr = htonl(0x10203000), - }, - }; - printf("in46p_ntoa() returns %s\n", in46p_ntoa(&ip46)); -} - -static void test_in46a_equal(void) -{ - struct in46_addr b; - - printf("Testing in46a_equal() with IPv4 addresses\n"); - - memset(&b, 0xff, sizeof(b)); - b.len = g_ia4.len; - b.v4.s_addr = g_ia4.v4.s_addr; - OSMO_ASSERT(in46a_equal(&g_ia4, &b)); -} - -static int log_in46a_within_mask(const struct in46_addr *addr, const struct in46_addr *net, - size_t prefixlen) -{ - int rc; - - printf("in46a_within_mask(%s, ", in46a_ntoa(addr)); - printf("%s, %lu) = ", in46a_ntoa(net), prefixlen); - - rc = in46a_within_mask(addr, net, prefixlen); - printf("%d\n", rc); - - return rc; -} - -static void test_in46a_within_mask(void) -{ - struct in46_addr addr, mask; - - printf("Testing in46a_within_mask() with IPv4 addresses\n"); - - addr = g_ia4; - mask = g_ia4; - OSMO_ASSERT(log_in46a_within_mask(&addr, &mask, 32)); - - mask.v4.s_addr = htonl( ntohl(mask.v4.s_addr) & 0xfffffffC ); - OSMO_ASSERT(log_in46a_within_mask(&addr, &mask, 30)); - - mask.v4.s_addr = htonl( ntohl(mask.v4.s_addr) & 0xfff80000 ); - OSMO_ASSERT(log_in46a_within_mask(&addr, &mask, 13)); - - addr.v4.s_addr = htonl(ntohl(addr.v4.s_addr) + 1); - mask = g_ia4; - OSMO_ASSERT(!log_in46a_within_mask(&addr, &mask, 32)); - mask.v4.s_addr = htonl( ntohl(mask.v4.s_addr) & 0xfffffffC ); - OSMO_ASSERT(log_in46a_within_mask(&addr, &mask, 30)); -} - -static void test_in46a_to_eua(void) -{ - struct ul66_t eua; - - printf("testing in46a_to_eua() with IPv4 addresses\n"); - -#if 0 /* triggers assert in current implementation */ - const struct in46_addr ia_invalid = { .len = 3, }; - OSMO_ASSERT(in46a_to_eua(&ia_invalid, &eua) < 0); -#endif - - /* IPv4 address */ - OSMO_ASSERT(in46a_to_eua(&g_ia4, 1, &eua) == 0); - OSMO_ASSERT(eua.v[0] == PDP_EUA_ORG_IETF); - OSMO_ASSERT(eua.v[1] == PDP_EUA_TYPE_v4); - OSMO_ASSERT(osmo_load32le(&eua.v[2]) == g_ia4.v4.s_addr); -} - -static void test_in46a_from_eua(void) -{ - struct in46_addr ia; - struct ul66_t eua; - const uint8_t v4_unspec[] = { PDP_EUA_ORG_IETF, PDP_EUA_TYPE_v4 }; - const uint8_t v4_spec[] = { PDP_EUA_ORG_IETF, PDP_EUA_TYPE_v4, 1,2,3,4 }; - memset(&eua, 0, sizeof(eua)); - - printf("Testing in46a_from_eua() with IPv4 addresses\n"); - - /* default: v4 unspec */ - OSMO_ASSERT(in46a_from_eua(&eua, &ia) == 1); - OSMO_ASSERT(ia.len == 4); - OSMO_ASSERT(ia.v4.s_addr == 0); - - /* invalid */ - eua.v[0] = 0x23; - eua.v[1] = PDP_EUA_TYPE_v4; - eua.l = 6; - OSMO_ASSERT(in46a_from_eua(&eua, &ia) < 0); - - /* invalid */ - eua.v[0] = PDP_EUA_ORG_IETF; - eua.v[1] = 0x23; - eua.l = 6; - OSMO_ASSERT(in46a_from_eua(&eua, &ia) < 0); - - /* unspecified V4 */ - memcpy(eua.v, v4_unspec, sizeof(v4_unspec)); - eua.l = sizeof(v4_unspec); - OSMO_ASSERT(in46a_from_eua(&eua, &ia) == 1); - OSMO_ASSERT(ia.len == 4); - OSMO_ASSERT(ia.v4.s_addr == 0); - - /* specified V4 */ - memcpy(eua.v, v4_spec, sizeof(v4_spec)); - eua.l = sizeof(v4_spec); - OSMO_ASSERT(in46a_from_eua(&eua, &ia) == 1); - OSMO_ASSERT(ia.len == 4); - OSMO_ASSERT(ia.v4.s_addr == htonl(0x01020304)); -} - -static void test_in46a_netmasklen(void) -{ - struct in46_addr netmask; - unsigned int len; - - printf("Testing in46a_netmasklen() with IPv4 addresses\n"); - netmask.len = 4; - - netmask.v4.s_addr = 0xffffffff; - len = in46a_netmasklen(&netmask); - OSMO_ASSERT(len == 32); - - netmask.v4.s_addr = 0x00ffffff; - len = in46a_netmasklen(&netmask); - OSMO_ASSERT(len == 24); - - netmask.v4.s_addr = 0x00f0ffff; - len = in46a_netmasklen(&netmask); - OSMO_ASSERT(len == 20); - - netmask.v4.s_addr = 0x000000fe; - len = in46a_netmasklen(&netmask); - OSMO_ASSERT(len == 7); - - netmask.v4.s_addr = 0x00000000; - len = in46a_netmasklen(&netmask); - OSMO_ASSERT(len == 0); -} - -/* IPv6 specific tests */ - -static const struct in46_addr g_ia6 = { - .len = 16, - .v6.s6_addr = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 }, -}; - -static void test_in46a_to_af_v6(void) -{ - struct in46_addr ia; - - printf("Testing in46a_to_af() with IPv6 addresses\n"); - - OSMO_ASSERT(in46a_to_af(&g_ia6) == AF_INET6); - - ia.len = 8; - OSMO_ASSERT(in46a_to_af(&ia) == AF_INET6); -} - -static void test_in46a_to_sas_v6(void) -{ - struct sockaddr_storage ss; - struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) &ss; - - printf("Testing in46a_to_sas() with IPv6 addresses\n"); - - memset(&ss, 0, sizeof(ss)); - OSMO_ASSERT(in46a_to_sas(&ss, &g_ia6) == 0); - OSMO_ASSERT(sin6->sin6_family == AF_INET6); - OSMO_ASSERT(!memcmp(&sin6->sin6_addr, &g_ia6.v6, sizeof(sin6->sin6_addr))); -} - -static void test_in46a_ntop_v6(void) -{ - char buf[256]; - const char *res; - - printf("Testing in46a_ntop() with IPv6 addresses\n"); - - res = in46a_ntop(&g_ia6, buf, sizeof(buf)); - OSMO_ASSERT(res && !strcmp(res, "102:304:506:708:90a:b0c:d0e:f10")); - printf("res = %s\n", res); -} - -static void test_in46a_equal_v6(void) -{ - struct in46_addr b; - - printf("Testing in46a_equal() with IPv6 addresses\n"); - - memset(&b, 0xff, sizeof(b)); - b.len = g_ia6.len; - b.v6 = g_ia6.v6; - OSMO_ASSERT(in46a_equal(&g_ia6, &b)); -} - -static void test_in46a_to_eua_v6(void) -{ - const struct in46_addr ia_v6_8 = { - .len = 8, - .v6.s6_addr = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 }, - }; - struct ul66_t eua; - - printf("Testing in46a_to_eua() with IPv6 addresses\n"); - - /* IPv6 address */ - OSMO_ASSERT(in46a_to_eua(&g_ia6, 1, &eua) == 0); - OSMO_ASSERT(eua.v[0] == PDP_EUA_ORG_IETF); - OSMO_ASSERT(eua.v[1] == PDP_EUA_TYPE_v6); - OSMO_ASSERT(!memcmp(&eua.v[2], &g_ia6.v6, 16)); - - /* IPv6 address with prefix / length 8 */ - OSMO_ASSERT(in46a_to_eua(&ia_v6_8, 1, &eua) == 0); - OSMO_ASSERT(eua.v[0] == PDP_EUA_ORG_IETF); - OSMO_ASSERT(eua.v[1] == PDP_EUA_TYPE_v6); - OSMO_ASSERT(!memcmp(&eua.v[2], &ia_v6_8.v6, 16)); -} - -static void test_in46a_to_eua_v4v6() { - const struct in46_addr ia_v4v6[2] = { - { - .len = 16, - .v6.s6_addr = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 }, - }, - { - .len = 4, - .v4.s_addr = 0x0d0c0b0a, - } - }; - struct ul66_t eua; - printf("Testing in46a_to_eua() with IPv4v6 addresses\n"); - - /* IPv4 address */ - OSMO_ASSERT(in46a_to_eua(ia_v4v6, 2, &eua) == 0); - OSMO_ASSERT(eua.v[0] == PDP_EUA_ORG_IETF); - OSMO_ASSERT(eua.v[1] == PDP_EUA_TYPE_v4v6); - OSMO_ASSERT(osmo_load32le(&eua.v[2]) == g_ia4.v4.s_addr); - OSMO_ASSERT(!memcmp(&eua.v[6], &g_ia6.v6, 16)); -} - -static void test_in46a_from_eua_v6(void) -{ - struct in46_addr ia; - struct ul66_t eua; - const uint8_t v6_unspec[] = { PDP_EUA_ORG_IETF, PDP_EUA_TYPE_v6 }; - const uint8_t v6_spec[] = { PDP_EUA_ORG_IETF, PDP_EUA_TYPE_v6, - 1,2,3,4,5,6,7,8,9,0xa,0xb,0xc,0xd,0xe,0xf,0x10 }; - - memset(&eua, 0, sizeof(eua)); - - printf("Testing in46a_from_eua() with IPv6 addresses\n"); - - /* unspecified V6 */ - memcpy(eua.v, v6_unspec, sizeof(v6_unspec)); - eua.l = sizeof(v6_unspec); - OSMO_ASSERT(in46a_from_eua(&eua, &ia) == 1); - OSMO_ASSERT(ia.len == 16); - OSMO_ASSERT(IN6_IS_ADDR_UNSPECIFIED(&ia.v6)); - - /* specified V6 */ - memcpy(eua.v, v6_spec, sizeof(v6_spec)); - eua.l = sizeof(v6_spec); - OSMO_ASSERT(in46a_from_eua(&eua, &ia) == 1); - OSMO_ASSERT(ia.len == 16); - OSMO_ASSERT(!memcmp(&ia.v6, v6_spec+2, ia.len)); -} - -static void test_in46a_from_eua_v4v6(void) { - struct in46_addr ia[2]; - struct ul66_t eua; - const uint8_t v4_unspec_v6_unspec[] = { PDP_EUA_ORG_IETF, PDP_EUA_TYPE_v4v6 }; - const uint8_t v4_spec_v6_unspec[] = { PDP_EUA_ORG_IETF, PDP_EUA_TYPE_v4v6, 1,2,3,4 }; - const uint8_t v4_unspec_v6_spec[] = { PDP_EUA_ORG_IETF, PDP_EUA_TYPE_v4v6, 1,2,3,4,5,6,7,8,9,0xa,0xb,0xc,0xd,0xe,0xf,0x10 }; - const uint8_t v4_spec_v6_spec[] = { PDP_EUA_ORG_IETF, PDP_EUA_TYPE_v4v6, 1,2,3,4, 1,2,3,4,5,6,7,8,9,0xa,0xb,0xc,0xd,0xe,0xf,0x10 }; - - memset(&eua, 0, sizeof(eua)); - - printf("Testing in46a_from_eua() with IPv4v6 addresses\n"); - - /* unspecified V4 & V6 */ - memcpy(eua.v, v4_unspec_v6_unspec, sizeof(v4_unspec_v6_unspec)); - eua.l = sizeof(v4_unspec_v6_unspec); - OSMO_ASSERT(in46a_from_eua(&eua, ia) == 2); - OSMO_ASSERT(ia[0].len == 4); - OSMO_ASSERT(ia[1].len == 16); - OSMO_ASSERT(ia[0].v4.s_addr == 0); - OSMO_ASSERT(IN6_IS_ADDR_UNSPECIFIED(&ia[1].v6)); - - /* specified V4, unspecified V6 */ - memcpy(eua.v, v4_spec_v6_unspec, sizeof(v4_spec_v6_unspec)); - eua.l = sizeof(v4_spec_v6_unspec); - OSMO_ASSERT(in46a_from_eua(&eua, ia) == 2); - OSMO_ASSERT(ia[0].len == 4); - OSMO_ASSERT(ia[1].len == 16); - OSMO_ASSERT(ia[0].v4.s_addr == htonl(0x01020304)); - OSMO_ASSERT(IN6_IS_ADDR_UNSPECIFIED(&ia[1].v6)); - - /* unspecified V4, specified V6 */ - memcpy(eua.v, v4_unspec_v6_spec, sizeof(v4_unspec_v6_spec)); - eua.l = sizeof(v4_unspec_v6_spec); - OSMO_ASSERT(in46a_from_eua(&eua, ia) == 2); - OSMO_ASSERT(ia[0].len == 4); - OSMO_ASSERT(ia[1].len == 16); - OSMO_ASSERT(ia[0].v4.s_addr == 0); - OSMO_ASSERT(!memcmp(&ia[1].v6, v4_unspec_v6_spec+2, ia[1].len)); - - /* specified V4, specified V6 */ - memcpy(eua.v, v4_spec_v6_spec, sizeof(v4_spec_v6_spec)); - eua.l = sizeof(v4_spec_v6_spec); - OSMO_ASSERT(in46a_from_eua(&eua, ia) == 2); - OSMO_ASSERT(ia[0].len == 4); - OSMO_ASSERT(ia[1].len == 16); - OSMO_ASSERT(ia[0].v4.s_addr == htonl(0x01020304)); - OSMO_ASSERT(!memcmp(&ia[1].v6, v4_spec_v6_spec+6, ia[1].len)); -} - -static void test_in46a_netmasklen_v6(void) -{ - unsigned int len; - printf("Testing in46a_netmasklen() with IPv6 addresses\n"); - const struct in46_addr netmaskA = { - .len = 16, - .v6.s6_addr = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, - }; - len = in46a_netmasklen(&netmaskA); - OSMO_ASSERT(len == 128); - - const struct in46_addr netmaskB = { - .len = 16, - .v6.s6_addr = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00}, - }; - len = in46a_netmasklen(&netmaskB); - OSMO_ASSERT(len == 104); - - const struct in46_addr netmaskC = { - .len = 16, - .v6.s6_addr = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x00,0x00,0x00}, - }; - len = in46a_netmasklen(&netmaskC); - OSMO_ASSERT(len == 103); - - const struct in46_addr netmaskD = { - .len = 16, - .v6.s6_addr = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, - }; - len = in46a_netmasklen(&netmaskD); - OSMO_ASSERT(len == 0); -} - -int main(int argc, char **argv) -{ - void *tall_ctx = talloc_named_const(NULL, 1, "Root context"); - msgb_talloc_ctx_init(tall_ctx, 0); - osmo_init_logging2(tall_ctx, &log_info); - log_set_use_color(osmo_stderr_target, 0); - log_set_print_filename2(osmo_stderr_target, LOG_FILENAME_NONE); - - srand(time(NULL)); - - if (argc < 2 || strcmp(argv[1], "-v6")) { - test_in46a_to_af(); - test_in46a_to_sas(); - test_in46a_ntop(); - test_in46p_ntoa(); - test_in46a_equal(); - test_in46a_within_mask(); - test_in46a_to_eua(); - test_in46a_from_eua(); - test_in46a_netmasklen(); - } else { - test_in46a_to_af_v6(); - test_in46a_to_sas_v6(); - test_in46a_ntop_v6(); - test_in46a_equal_v6(); - test_in46a_to_eua_v6(); - test_in46a_from_eua_v6(); - test_in46a_to_eua_v4v6(); - test_in46a_from_eua_v4v6(); - test_in46a_netmasklen_v6(); - } - return 0; -} diff --git a/tests/lib/in46a_test.ok b/tests/lib/in46a_test.ok deleted file mode 100644 index b497ad1..0000000 --- a/tests/lib/in46a_test.ok +++ /dev/null @@ -1,17 +0,0 @@ -Testing in46a_to_af() with IPv4 addresses -Testing in46a_to_sas() with IPv4 addresses -Testing in46a_ntop() with IPv4 addresses -res = UNDEFINED -res = UNDEFINED -res = 1.2.3.4 -in46p_ntoa() returns 16.32.48.0/24 -Testing in46a_equal() with IPv4 addresses -Testing in46a_within_mask() with IPv4 addresses -in46a_within_mask(10.11.12.13, 10.11.12.13, 32) = 1 -in46a_within_mask(10.11.12.13, 10.11.12.12, 30) = 1 -in46a_within_mask(10.11.12.13, 10.8.0.0, 13) = 1 -in46a_within_mask(10.11.12.14, 10.11.12.13, 32) = 0 -in46a_within_mask(10.11.12.14, 10.11.12.12, 30) = 1 -testing in46a_to_eua() with IPv4 addresses -Testing in46a_from_eua() with IPv4 addresses -Testing in46a_netmasklen() with IPv4 addresses diff --git a/tests/lib/in46a_v6_test.ok b/tests/lib/in46a_v6_test.ok deleted file mode 100644 index 10dc7f4..0000000 --- a/tests/lib/in46a_v6_test.ok +++ /dev/null @@ -1,10 +0,0 @@ -Testing in46a_to_af() with IPv6 addresses -Testing in46a_to_sas() with IPv6 addresses -Testing in46a_ntop() with IPv6 addresses -res = 102:304:506:708:90a:b0c:d0e:f10 -Testing in46a_equal() with IPv6 addresses -Testing in46a_to_eua() with IPv6 addresses -Testing in46a_from_eua() with IPv6 addresses -Testing in46a_to_eua() with IPv4v6 addresses -Testing in46a_from_eua() with IPv4v6 addresses -Testing in46a_netmasklen() with IPv6 addresses diff --git a/tests/lib/ippool_test.c b/tests/lib/ippool_test.c index 2af4a38..17f8fed 100644 --- a/tests/lib/ippool_test.c +++ b/tests/lib/ippool_test.c @@ -8,8 +8,8 @@ #include <osmocom/core/application.h> #include <osmocom/core/logging.h> #include <osmocom/core/msgb.h> +#include <osmocom/core/in46_addr.h> -#include "../../lib/in46_addr.h" #include "../../lib/ippool.h" #include "../../lib/syserr.h" diff --git a/tests/testsuite.at b/tests/testsuite.at index 2602a3a..5ba99cb 100644 --- a/tests/testsuite.at +++ b/tests/testsuite.at @@ -15,18 +15,6 @@ cat $abs_srcdir/lib/ippool_v6_test.err > experr AT_CHECK([$abs_top_builddir/tests/lib/ippool_test -v6], [], [expout], [experr]) AT_CLEANUP -AT_SETUP([in46a]) -AT_KEYWORDS([in46a]) -cat $abs_srcdir/lib/in46a_test.ok > expout -AT_CHECK([$abs_top_builddir/tests/lib/in46a_test], [], [expout], []) -AT_CLEANUP - -AT_SETUP([in46a_v6]) -AT_KEYWORDS([in46a_v6]) -cat $abs_srcdir/lib/in46a_v6_test.ok > expout -AT_CHECK([$abs_top_builddir/tests/lib/in46a_test -v6], [], [expout], []) -AT_CLEANUP - AT_SETUP([gtpie]) AT_KEYWORDS([gtpie]) cat $abs_srcdir/gtp/gtpie_test.ok > expout diff --git a/utils/Makefile.am b/utils/Makefile.am new file mode 100644 index 0000000..7ba0ff4 --- /dev/null +++ b/utils/Makefile.am @@ -0,0 +1,3 @@ +bin_PROGRAMS = gtp-echo-responder + +gtp_echo_responder_SOURCES = gtp_echo_responder.c diff --git a/utils/gtp_echo_responder.c b/utils/gtp_echo_responder.c new file mode 100644 index 0000000..390fa25 --- /dev/null +++ b/utils/gtp_echo_responder.c @@ -0,0 +1,470 @@ +/* + * MIT License + * + * Copyright (c) 2021 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de> + * Author: Pau Espin Pedrol <pespin@sysmocom.de> + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* For more info see: + * 3GPP TS 29.060 (GTPv1 and GTPv0) + * 3GPP TS 29.274 (GTPv2C) + */ + +#include "../config.h" + +#include <stdlib.h> +#include <stdbool.h> +#include <stdint.h> +#include <inttypes.h> +#include <unistd.h> +#include <limits.h> +#include <stdio.h> +#include <string.h> +#include <errno.h> +#include <getopt.h> +#include <netinet/in.h> +#include <arpa/inet.h> +#include <sys/select.h> +#include <sys/socket.h> + +#define GTP1C_PORT 2123 +#define GTP_MSGTYPE_ECHO_REQ 1 +#define GTP_MSGTYPE_ECHO_RSP 2 +#define GTP1C_IE_RECOVERY 14 +#define GTP2C_IE_RECOVERY 3 +#define GTP2C_IE_NODE_FEATURES 152 + +struct gtp1_hdr { +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + uint8_t pn:1, s:1, e:1, spare:1, pt:1, version:3; +#else + uint8_t version:3, pt:1, spare:1, e:1, s:1, pn:1; +#endif + uint8_t type; + uint16_t length; + uint32_t tei; + uint16_t seq; + uint8_t npdu; + uint8_t next; +} __attribute__((packed)); + +struct gtp2_hdr { +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + uint8_t reserved:3, t:1, p:1, version:3; +#else + uint8_t version:3, p:1, t:1, reserved:1; +#endif + uint8_t type; + uint16_t length; +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + uint32_t reserved2:8, seq:24; +#else + uint8_t seq:24, reserved2:1; +#endif +} __attribute__((packed)); + +struct gtp_echo_resp_state { + struct { + char laddr[INET6_ADDRSTRLEN]; + uint8_t recovery_ctr; + uint8_t node_features; + } cfg; + struct sockaddr_storage laddr_gtpc; + int fd_gtpc; +}; + +struct gtp_echo_resp_state *g_st; + +static void print_usage(void) +{ + printf("Usage: gtp-echo-responder [-h] [-V] [-l listen_addr]\n"); +} + +static void print_help(void) +{ + printf(" Some useful help...\n" + " -h --help This help text\n" + " -V --version Print the version of gtp-echo-responder\n" + " -l --listen-addr Listend address for GTPCv1 and GTPCv2\n" + " -R --recovery-counter GTP Recovery Counter to transmit in GTP Echo Response message\n" + " -n --node-features GTPCv2 Node Features bitmask to transmit in GTP Echo Response message\n" + ); +} + +static void print_version(void) +{ + printf("gtp-echo-responder version %s\n", PACKAGE_VERSION); +} + +static uint8_t parse_node_features_mask(const char *arg) +{ + unsigned long res; + char *end; + errno = 0; + + res = strtoul(arg, &end, 0); + if ((errno == ERANGE && res == ULONG_MAX) || (errno && !res) || + arg == end || *end != '\0') { + fprintf(stderr, "Failed parsing Node Features bitmask: '%s'\n", arg); + exit(1); + } + if (res > 0xff) { + fprintf(stderr, "Failed parsing Node Features bitmask: '%s' > 0xFF\n", arg); + exit(1); + } + return (uint8_t)res; +} +static void handle_options(int argc, char **argv) +{ + while (1) { + int option_index = 0, c; + static struct option long_options[] = { + { "help", 0, 0, 'h' }, + { "version", 0, 0, 'V' }, + { "listen-addr", 1, 0, 'l'}, + { "recovery-counter", 1, 0, 'R'}, + { "node-features", 1, 0, 'N'}, + { 0, 0, 0, 0 } + }; + + c = getopt_long(argc, argv, "hVl:R:N:", long_options, &option_index); + if (c == -1) + break; + + switch (c) { + case 'h': + print_usage(); + print_help(); + exit(0); + case 'V': + print_version(); + exit(0); + break; + case 'l': + strncpy(&g_st->cfg.laddr[0], optarg, sizeof(g_st->cfg.laddr)); + g_st->cfg.laddr[sizeof(g_st->cfg.laddr) - 1] = '\0'; + break; + case 'R': + g_st->cfg.recovery_ctr = (uint8_t)atoi(optarg); + break; + case 'N': + g_st->cfg.node_features = parse_node_features_mask(optarg); + break; + } + } +} + +static int init_socket(void) +{ + struct in_addr addr; + struct in6_addr addr6; + struct sockaddr_in *saddr; + struct sockaddr_in6 *saddr6; + int family; + + if (inet_pton(AF_INET6, g_st->cfg.laddr, &addr6) == 1) { + family = AF_INET6; + saddr6 = (struct sockaddr_in6 *)&g_st->laddr_gtpc; + saddr6->sin6_family = family; + saddr6->sin6_port = htons(GTP1C_PORT); + memcpy(&saddr6->sin6_addr, &addr6, sizeof(addr6)); + } else if (inet_pton(AF_INET, g_st->cfg.laddr, &addr) == 1) { + family = AF_INET; + saddr = (struct sockaddr_in *)&g_st->laddr_gtpc; + saddr->sin_family = family; + saddr->sin_port = htons(GTP1C_PORT); + memcpy(&saddr->sin_addr, &addr, sizeof(addr)); + } else { + fprintf(stderr, "Failed parsing address %s\n", g_st->cfg.laddr); + return -1; + } + + if ((g_st->fd_gtpc = socket(family, SOCK_DGRAM, 0)) < 0) { + fprintf(stderr, "socket() failed: %s\n", strerror(errno)); + return -2; + } + + if (bind(g_st->fd_gtpc, (struct sockaddr *)&g_st->laddr_gtpc, sizeof(g_st->laddr_gtpc)) < 0) { + fprintf(stderr, "bind() failed: %s\n", strerror(errno)); + return -3; + } + + return 0; +} + +static const char *sockaddr2str(const struct sockaddr *saddr) +{ + static char _rem_addr_str[INET6_ADDRSTRLEN]; + struct sockaddr_in *saddr4; + struct sockaddr_in6 *saddr6; + + switch (saddr->sa_family) { + case AF_INET6: + saddr6 = (struct sockaddr_in6 *)saddr; + if (!inet_ntop(saddr6->sin6_family, &saddr6->sin6_addr, _rem_addr_str, sizeof(_rem_addr_str))) + strcpy(_rem_addr_str, "unknown"); + return _rem_addr_str; + case AF_INET: + saddr4 = (struct sockaddr_in *)saddr; + if (!inet_ntop(saddr4->sin_family, &saddr4->sin_addr, _rem_addr_str, sizeof(_rem_addr_str))) + strcpy(_rem_addr_str, "unknown"); + return _rem_addr_str; + default: + strcpy(_rem_addr_str, "unknown-family"); + return _rem_addr_str; + } +} + +static int write_cb(int fd, const uint8_t *buf, size_t buf_len, const struct sockaddr *rem_saddr) +{ + ssize_t rc; + + rc = sendto(fd, buf, buf_len, 0, rem_saddr, sizeof(struct sockaddr_storage)); + if (rc < 0) { + fprintf(stderr, "sendto() failed: %s\n", strerror(errno)); + return -1; + } + if (rc != buf_len) { + fprintf(stderr, "sendto() short write: %zd vs exp %zu\n", rc, buf_len); + return -1; + } + return 0; +} + +static int gen_gtpc1_echo_rsp(uint8_t *buf, struct gtp1_hdr *echo_req) +{ + int offset = 0; + struct gtp1_hdr *echo_rsp = (struct gtp1_hdr *)buf; + unsigned exp_hdr_len = (echo_req->s || echo_req->pn || echo_req->e) ? 12 : 8; + + memcpy(echo_rsp, echo_req, exp_hdr_len); + echo_rsp->type = GTP_MSGTYPE_ECHO_RSP; + offset = exp_hdr_len; + buf[offset++] = GTP1C_IE_RECOVERY; + buf[offset++] = g_st->cfg.recovery_ctr; + + /* Update Length */ + echo_rsp->length = htons(offset - 8); + return offset; +} + +static int gen_gtpc2_echo_rsp(uint8_t *buf, struct gtp2_hdr *echo_req) +{ + int offset = 0; + struct gtp1_hdr *echo_rsp = (struct gtp1_hdr *)buf; + unsigned exp_hdr_len = 8; + + memcpy(echo_rsp, echo_req, exp_hdr_len); + echo_rsp->type = GTP_MSGTYPE_ECHO_RSP; + offset = exp_hdr_len; + + /* 3GPP TS 29.274 sec 8.5 Recovery (Restart Counter) */ + buf[offset++] = GTP2C_IE_RECOVERY; + buf[offset++] = 0; /* IE Length (high) */ + buf[offset++] = 1; /* IE Length (low) */ + buf[offset++] = 0; /* Spare=0 | Instance=0 (Table 7.1.1-1) */ + buf[offset++] = g_st->cfg.recovery_ctr; + + /* 3GPP TS 29.274 sec 8.83 Node Features */ + if (g_st->cfg.node_features > 0) { + buf[offset++] = GTP2C_IE_NODE_FEATURES; + buf[offset++] = 0; /* IE Length (high) */ + buf[offset++] = 1; /* IE Length (low) */ + buf[offset++] = 0; /* Spare=0 | Instance=0 (Table 7.1.1-1) */ + buf[offset++] = g_st->cfg.node_features; + } + + /* Update Length */ + echo_rsp->length = htons(offset - 4); + return offset; +} + +static int rx_gtpc1_echo_req(struct gtp1_hdr *echo_req, unsigned buf_len, const struct sockaddr *rem_saddr) +{ + int rc; + const size_t tx_buf_len = buf_len + 128; /* Leave some extra room */ + uint8_t *tx_buf = alloca(tx_buf_len); + + printf("Rx GTPCv1_ECHO_REQ from %s, Tx GTPCv1_ECHO_RSP\n", sockaddr2str(rem_saddr)); + + memset(tx_buf, 0, tx_buf_len); + rc = gen_gtpc1_echo_rsp(tx_buf, echo_req); + return write_cb(g_st->fd_gtpc, tx_buf, rc, rem_saddr); +} + +static int rx_gtpc1(struct gtp1_hdr *hdr, unsigned buf_len, const struct sockaddr *rem_saddr) +{ + unsigned exp_hdr_len = (hdr->s || hdr->pn || hdr->e) ? 12 : 8; + unsigned pdu_len; + + if (buf_len < exp_hdr_len) { + fprintf(stderr, "GTPCv1 packet size smaller than header! %u < exp %u\n", buf_len, exp_hdr_len); + return -1; + } + + pdu_len = ntohs(hdr->length); + if (buf_len < 8 + pdu_len) { + fprintf(stderr, "GTPCv1 packet size smaller than announced! %u < exp %u\n", buf_len, 8 + pdu_len); + return -1; + } + + if (hdr->pt != 1) { + fprintf(stderr, "GTPCv1 Protocol Type GTP' not supported!\n"); + return -1; + } + + switch (hdr->type) { + case GTP_MSGTYPE_ECHO_REQ: + return rx_gtpc1_echo_req(hdr, buf_len, rem_saddr); + default: + fprintf(stderr, "Silently ignoring unexpected packet of type %u\n", hdr->type); + return 0; + } +} + +static int rx_gtpc2_echo_req(struct gtp2_hdr *echo_req, unsigned buf_len, const struct sockaddr *rem_saddr) +{ + int rc; + const size_t tx_buf_len = buf_len + 128; /* Leave some extra room */ + uint8_t *tx_buf = alloca(tx_buf_len); + + if (echo_req->t) { + fprintf(stderr, "GTPCv2 ECHO message should contain T=0!\n"); + return -1; + } + + printf("Rx GTPCv2_ECHO_REQ from %s, Tx GTPCv2_ECHO_RSP\n", sockaddr2str(rem_saddr)); + + memset(tx_buf, 0, tx_buf_len); + rc = gen_gtpc2_echo_rsp(tx_buf, echo_req); + return write_cb(g_st->fd_gtpc, tx_buf, rc, rem_saddr); +} + +static int rx_gtpc2(struct gtp2_hdr *hdr, unsigned buf_len, const struct sockaddr *rem_saddr) +{ + unsigned exp_hdr_len = hdr->t ? 12 : 8; + unsigned pdu_len; + + if (hdr->p) { + fprintf(stderr, "GTPCv2 piggybacked message not supported!\n"); + return -1; + } + + if (buf_len < exp_hdr_len) { + fprintf(stderr, "GTPCv2 packet size smaller than header! %u < exp %u\n", buf_len, exp_hdr_len); + return -1; + } + + pdu_len = ntohs(hdr->length); + /* 3GPP TS 29.274 sec 5.5.1: "Octets 3 to 4 represent the Message Length + * field. This field shall indicate the length of the message in octets + * excluding the mandatory part of the GTP-C header (the first 4 + * octets). The TEID (if present) and the Sequence Number shall be + * included in the length count" */ + if (buf_len < 4 + pdu_len) { + fprintf(stderr, "GTPCv2 packet size smaller than announced! %u < exp %u\n", buf_len, 4 + pdu_len); + return -1; + } + + switch (hdr->type) { + case GTP_MSGTYPE_ECHO_REQ: + return rx_gtpc2_echo_req(hdr, buf_len, rem_saddr); + default: + fprintf(stderr, "Silently ignoring unexpected packet of type %u\n", hdr->type); + return 0; + } +} + +static int read_cb(int fd) +{ + ssize_t sz; + uint8_t buf[4096]; + struct sockaddr_storage rem_saddr; + socklen_t rem_saddr_len = sizeof(rem_saddr); + struct gtp1_hdr *hdr1; + + if ((sz = recvfrom(fd, buf, sizeof(buf), 0, (struct sockaddr *)&rem_saddr, &rem_saddr_len)) < 0) { + fprintf(stderr, "recvfrom() failed: %s\n", strerror(errno)); + return -1; + } + if (sz == 0) { + fprintf(stderr, "recvfrom() read zero bytes!\n"); + return -1; + } + + hdr1 = (struct gtp1_hdr *)&buf[0]; + switch (hdr1->version) { + case 1: + return rx_gtpc1(hdr1, sz, (const struct sockaddr *)&rem_saddr); + case 2: + return rx_gtpc2((struct gtp2_hdr *)&buf[0], sz, (const struct sockaddr *)&rem_saddr); + default: + fprintf(stderr, "Rx GTPv%u: not supported (flags=0x%x)\n", hdr1->version, buf[0]); + return -1; + } +} + +static int loop(void) +{ + int rc; + fd_set rfds; + int nfds; + + while (true) { + FD_ZERO(&rfds); + FD_SET(g_st->fd_gtpc, &rfds); + nfds = g_st->fd_gtpc + 1; + rc = select(nfds, &rfds, NULL, NULL, NULL); + if (rc == 0) + continue; + if (rc < 0) { + fprintf(stderr, "select() failed: %s\n", strerror(errno)); + return -1; + } + + if (FD_ISSET(g_st->fd_gtpc, &rfds)) + read_cb(g_st->fd_gtpc); + } +} + +int main(int argc, char **argv) +{ + g_st = calloc(1, sizeof(struct gtp_echo_resp_state)); + + strcpy(g_st->cfg.laddr, "::"); + + handle_options(argc, argv); + + printf("Listening on: %s\n", g_st->cfg.laddr); + + if (init_socket() < 0) + exit(1); + + printf("Socket bound successfully, listening for requests...\n"); + + if (loop() < 0) + exit(1); + + return 0; +} diff --git a/utils/gtp_echo_responder_test.py b/utils/gtp_echo_responder_test.py new file mode 100755 index 0000000..632d23b --- /dev/null +++ b/utils/gtp_echo_responder_test.py @@ -0,0 +1,111 @@ +#!/usr/bin/env python3 +# MIT License +# +# Copyright (c) 2021 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de> +# Author: Pau Espin Pedrol <pespin@sysmocom.de> +# +# SPDX-License-Identifier: MIT +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice (including the next +# paragraph) shall be included in all copies or substantial portions of the +# Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + + +import socket +import argparse +import struct +from ipaddress import ip_address, IPv4Address + +GTP1C_PORT = 2123 +BUF_SIZE = 4096 + +GTP_HDRv1_FLAG_PN = (1<<0) +GTP_HDRv1_FLAG_S = (1<<1) +GTP_HDRv1_FLAG_E = (1<<2) +GTP_HDRv1_PT_GTP = (1<<4) +GTP_HDRv1_VER_GTP1 = (1<<5) + +GTP_HDRv2_FLAG_T = (1<<3) +GTP_HDRv2_FLAG_P = (1<<4) +GTP_HDRv2_VER_GTP2 = (2<<5) + +def gen_gtpc_v1_hdr(flags, type, length, tei, seq=0, npdu=0, next=0): + spare = 0 + if (flags & (GTP_HDRv1_FLAG_PN|GTP_HDRv1_FLAG_S|GTP_HDRv1_FLAG_E)): + #long format + length += 4 + d = struct.pack('!BBHIHBB', flags, type, length, tei, seq, npdu, next) + else: + #short format + d = struct.pack('!BBHI', flags, type, length, tei) + return d + +def gen_gtpc_v2_hdr(flags, type, length, tei=0, seq=0): + spare = 0 + if (flags & (GTP_HDRv2_FLAG_T)): + #long format, with TEI + length += 4 + 4 + d = struct.pack('!BBHIHBB', flags, type, length, tei, seq >> 8, seq & 0xff, spare) + else: + #short format + length += 4 + d = struct.pack('!BBHHBB', flags, type, length, seq >> 8, seq & 0xff, spare) + return d + +def gen_gtpc_v1_echo_req(tei=0, append_flags=0, seq=0, npdu=0, next=0): + return gen_gtpc_v1_hdr(GTP_HDRv1_VER_GTP1 | GTP_HDRv1_PT_GTP | append_flags, 1, 0, tei, seq, npdu, next) + +def gen_gtpc_v2_echo_req(append_flags=0, seq=0, recovery=0, node_features=-1): + length = 0 + payload = b'' + if (recovery > 0): + recovery_ie = struct.pack('!BHBB', 3, 1, 0, recovery) + payload += recovery_ie + length += len(recovery_ie) + if (node_features > 0): + node_features_ie = struct.pack('!BHBB', 152, 1, 0, node_features) + payload += node_features_ie + length += len(node_features_ie) + return gen_gtpc_v2_hdr(GTP_HDRv2_VER_GTP2 | append_flags, 1, length, 0, seq) + payload + +def tx_rx(sk, rem_addr, tx_buf, exp_rx = True): + print('Tx ECHO_REQ to %r: %r' % (repr(rem_addr), repr(tx_buf))) + sk.sendto(tx_buf, rem_addr) + if exp_rx: + rx_buf = sk.recvfrom(BUF_SIZE) + msg = "Message from Server {}".format(rx_buf) + print(msg) + +if __name__ == '__main__': + p = argparse.ArgumentParser(description='Tester for gtp-echo-recorder.') + p.add_argument('-l', '--local-address', default='127.0.0.2', help="Local GTP address") + p.add_argument('-r', '--remote-address', default='127.0.0.1', help="Remote GTP address") + args = p.parse_args() + + print('Binding socket on %r...' % repr((args.local_address, GTP1C_PORT))) + family = socket.AF_INET if type(ip_address(args.local_address)) is IPv4Address else socket.AF_INET6 + sk = socket.socket(family=family, type=socket.SOCK_DGRAM) + sk.bind((args.local_address, GTP1C_PORT)); + + rem_addr = (args.remote_address, GTP1C_PORT) + + tx_rx(sk, rem_addr, gen_gtpc_v1_echo_req()) + tx_rx(sk, rem_addr, gen_gtpc_v1_echo_req(1, GTP_HDRv1_FLAG_S, seq=67)) + tx_rx(sk, rem_addr, gen_gtpc_v2_echo_req(0, seq=300, recovery=-1, node_features=-1)) + tx_rx(sk, rem_addr, gen_gtpc_v2_echo_req(0, seq=20, recovery=99, node_features=-1)) + tx_rx(sk, rem_addr, gen_gtpc_v2_echo_req(0, seq=20, recovery=100, node_features=0xbb)) |