aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore5
-rw-r--r--Makefile.am12
-rw-r--r--README.md11
-rw-r--r--TODO-RELEASE4
-rw-r--r--configure.ac12
-rw-r--r--contrib/osmo-ggsn.spec.in24
-rw-r--r--contrib/systemd/osmo-ggsn.service5
-rw-r--r--debian/changelog152
-rw-r--r--debian/compat2
-rw-r--r--debian/control26
-rw-r--r--debian/copyright5
-rw-r--r--debian/gtp-echo-responder.install1
-rw-r--r--debian/libgtp6.shlibs2
-rw-r--r--debian/osmo-ggsn.examples1
-rwxr-xr-xdebian/rules5
-rw-r--r--doc/examples/Makefile.am10
-rw-r--r--doc/examples/osmo-ggsn-kernel-gtp.cfg51
-rw-r--r--doc/manuals/Makefile.am6
-rw-r--r--doc/manuals/chapters/configuration.adoc2
-rw-r--r--doc/manuals/chapters/running.adoc49
-rw-r--r--doc/manuals/vty/ggsn_vty_reference.xml1639
-rw-r--r--ggsn/Makefile.am11
-rw-r--r--ggsn/ggsn.c81
-rw-r--r--ggsn/ggsn.h15
-rw-r--r--ggsn/ggsn_main.c46
-rw-r--r--ggsn/ggsn_vty.c39
-rw-r--r--ggsn/pco.c1
-rw-r--r--ggsn/pco.h13
-rw-r--r--ggsn/sgsn.c14
-rw-r--r--ggsn/sgsn.h2
-rw-r--r--gtp/Makefile.am28
-rw-r--r--gtp/gsn.c667
-rw-r--r--gtp/gsn_internal.h14
-rw-r--r--gtp/gtp.c933
-rw-r--r--gtp/gtp_internal.h52
-rw-r--r--gtp/gtpie.c10
-rw-r--r--gtp/queue.h2
-rw-r--r--include/Makefile.am12
-rw-r--r--include/gsn.h2
-rw-r--r--include/gtp.h2
-rw-r--r--include/gtpie.h2
-rw-r--r--include/osmocom/Makefile.am3
-rw-r--r--include/osmocom/gtp/Makefile.am8
-rw-r--r--include/osmocom/gtp/gsn.h189
-rw-r--r--include/osmocom/gtp/gtp.h (renamed from gtp/gtp.h)224
-rw-r--r--include/osmocom/gtp/gtpie.h (renamed from gtp/gtpie.h)0
-rw-r--r--include/osmocom/gtp/pdp.h (renamed from gtp/pdp.h)0
-rw-r--r--include/pdp.h2
-rw-r--r--lib/Makefile.am36
-rw-r--r--lib/gtp-kernel.c114
-rw-r--r--lib/icmpv6.c7
-rw-r--r--lib/icmpv6.h18
-rw-r--r--lib/in46_addr.c377
-rw-r--r--lib/in46_addr.h41
-rw-r--r--lib/ippool.h4
-rw-r--r--lib/netdev.h2
-rw-r--r--lib/tun.c9
-rw-r--r--lib/tun.h5
-rw-r--r--lib/util.c4
-rw-r--r--sgsnemu/Makefile.am14
-rw-r--r--sgsnemu/sgsnemu.c6
-rw-r--r--tests/gtp/Makefile.am9
-rw-r--r--tests/gtp/gtpie_test.c3
-rw-r--r--tests/gtp/queue_test.ok7716
-rw-r--r--tests/lib/Makefile.am21
-rw-r--r--tests/lib/in46a_test.c460
-rw-r--r--tests/lib/in46a_test.ok17
-rw-r--r--tests/lib/in46a_v6_test.ok10
-rw-r--r--tests/lib/ippool_test.c2
-rw-r--r--tests/testsuite.at12
-rw-r--r--utils/Makefile.am3
-rw-r--r--utils/gtp_echo_responder.c470
-rwxr-xr-xutils/gtp_echo_responder_test.py111
73 files changed, 9751 insertions, 4116 deletions
diff --git a/.gitignore b/.gitignore
index 80e4837..12f3c4a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -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
diff --git a/README.md b/README.md
index 583ad3a..98a03d7 100644
--- a/README.md
+++ b/README.md
@@ -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 &lt;0-512&gt;'>
- <params>
- <param name='terminal' doc='Set terminal line parameters' />
- <param name='length' doc='Set number of lines on a screen' />
- <param name='&lt;0-512&gt;' 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&apos;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&apos;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&apos;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&apos;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&apos;t prefix each log message' />
- <param name='1' doc='Prefix each log message with category/subsystem nr in hex (&apos;&lt;000b&gt;&apos;)' />
- </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&apos;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&apos;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&apos;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. &apos;abc:mno:xyz&apos;. Available log categories depend on the specific application, refer to the &apos;logging level&apos; command. Optionally add individual log levels like &apos;abc,1:mno,3:xyz,5&apos;, 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 &apos;no logging level force-all&apos; command. Note: any &apos;logging level &lt;category&gt; &lt;level&gt;&apos; 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 &apos;logging level force-all &lt;level&gt;&apos;' />
- </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&apos;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&apos;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&apos;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 [&lt;0-15&gt;]'>
- <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='[&lt;0-15&gt;]' 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 &lt;0-512&gt;'>
- <params>
- <param name='terminal' doc='Set terminal line parameters' />
- <param name='length' doc='Set number of lines on a screen' />
- <param name='&lt;0-512&gt;' 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&apos;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&apos;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&apos;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&apos;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&apos;t prefix each log message' />
- <param name='1' doc='Prefix each log message with category/subsystem nr in hex (&apos;&lt;000b&gt;&apos;)' />
- </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&apos;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&apos;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&apos;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. &apos;abc:mno:xyz&apos;. Available log categories depend on the specific application, refer to the &apos;logging level&apos; command. Optionally add individual log levels like &apos;abc,1:mno,3:xyz,5&apos;, 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 &apos;no logging level force-all&apos; command. Note: any &apos;logging level &lt;category&gt; &lt;level&gt;&apos; 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 &apos;logging level force-all &lt;level&gt;&apos;' />
- </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&apos;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&apos;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&apos;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 [&lt;0-15&gt;]'>
- <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='[&lt;0-15&gt;]' 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&apos;s network name' />
- <param name='WORD' doc='This system&apos;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&apos;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 &apos;enable&apos; 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) &apos;enable&apos; 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 &lt;0-512&gt;'>
- <params>
- <param name='service' doc='Set up miscellaneous service' />
- <param name='terminal-length' doc='System wide terminal length configuration' />
- <param name='&lt;0-512&gt;' doc='Number of lines of VTY (0 means no line control)' />
- </params>
- </command>
- <command id='no service terminal-length [&lt;0-512&gt;]'>
- <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='[&lt;0-512&gt;]' 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 &lt;2-32700&gt;'>
- <params>
- <param name='log' doc='Configure logging sub-system' />
- <param name='alarms' doc='Logging alarms to osmo_strrb' />
- <param name='&lt;2-32700&gt;' 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 &lt;0-7&gt;'>
- <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='&lt;0-7&gt;' 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 &lt;0-65535&gt;'>
- <params>
- <param name='stats' doc='Configure stats sub-system' />
- <param name='interval' doc='Set the reporting interval' />
- <param name='&lt;0-65535&gt;' 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&apos;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&apos;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&apos;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&apos;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&apos;t prefix each log message' />
- <param name='1' doc='Prefix each log message with category/subsystem nr in hex (&apos;&lt;000b&gt;&apos;)' />
- </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&apos;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&apos;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&apos;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 &apos;no logging level force-all&apos; command. Note: any &apos;logging level &lt;category&gt; &lt;level&gt;&apos; 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 &apos;logging level force-all &lt;level&gt;&apos;' />
- </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 &lt;1-65535&gt;'>
- <params>
- <param name='remote-port' doc='Set the remote port to which we connect' />
- <param name='&lt;1-65535&gt;' doc='Remote port number' />
- </params>
- </command>
- <command id='mtu &lt;100-65535&gt;'>
- <params>
- <param name='mtu' doc='Set the maximum packet size' />
- <param name='&lt;100-65535&gt;' 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 &lt;0-65535&gt;'>
- <params>
- <param name='flush-period' doc='Configure stats sub-system' />
- <param name='&lt;0-65535&gt;' 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 [&lt;0-65535&gt;]'>
- <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='[&lt;0-65535&gt;]' 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 &lt;1-32&gt;'>
- <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='&lt;1-32&gt;' doc='Set the SCHED_RR real-time priority' />
- </params>
- </command>
- <command id='cpu-affinity (self|all|&lt;0-4294967295&gt;|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&apos; threads' />
- <param name='&lt;0-4294967295&gt;' 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 &lt;1-36000&gt;'>
- <params>
- <param name='echo-interval' doc='Gateway GPRS Support NODE (GGSN)' />
- <param name='&lt;1-36000&gt;' 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 &lt;0-1&gt; A.B.C.D'>
- <params>
- <param name='ip' doc='IP information' />
- <param name='dns' doc='Configure DNS Server' />
- <param name='&lt;0-1&gt;' doc='primary/secondary DNS' />
- <param name='A.B.C.D' doc='IP address of DNS Sever' />
- </params>
- </command>
- <command id='ipv6 dns &lt;0-1&gt; X:X::X:X'>
- <params>
- <param name='ipv6' doc='IPv6 Information' />
- <param name='dns' doc='Configure DNS Server' />
- <param name='&lt;0-1&gt;' doc='primary/secondary DNS' />
- <param name='X:X::X:X' doc='IP address of DNS Sever' />
- </params>
- </command>
- <command id='no (ip|ipv6) dns &lt;0-1&gt;'>
- <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='&lt;0-1&gt;' 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);
diff --git a/ggsn/pco.c b/ggsn/pco.c
index e2181e1..c71f07d 100644
--- a/ggsn/pco.c
+++ b/ggsn/pco.c
@@ -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)
{
diff --git a/ggsn/pco.h b/ggsn/pco.h
index 7ebe05a..bedfa8a 100644
--- a/ggsn/pco.h
+++ b/ggsn/pco.h
@@ -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;
+};
diff --git a/gtp/gtp.c b/gtp/gtp.c
index 25eafdf..5843dfe 100644
--- a/gtp/gtp.c
+++ b/gtp/gtp.c
@@ -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
diff --git a/lib/tun.c b/lib/tun.c
index c771b92..cb66fef 100644
--- a/lib/tun.c
+++ b/lib/tun.c
@@ -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)
diff --git a/lib/tun.h b/lib/tun.h
index 07ca04a..394d816 100644
--- a/lib/tun.h
+++ b/lib/tun.h
@@ -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 */
diff --git a/lib/util.c b/lib/util.c
index 6bb0d85..30401d5 100644
--- a/lib/util.c
+++ b/lib/util.c
@@ -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))