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 ]
  * cosmetic: Fix comment typo
  * netns: Improve error checking
  * sgsnemu: cmdline: Drop unused function cmdline_parser_params_create()
  * sgsnemu: Pass array of in64_addr to in46a_from_eua()
  * sgsnemu: Rename sgsnemu's libgtp cb_conf
  * sgsnemu: Set its default loglevel category to INFO
  * Move icmpv6 and checksum files from ggsn/ dir to lib/
  * netdev_addaddr6: Use prefixlen arg
  * sgsnemu: Avoid adding extra autogenerated local link ipv6 addr to tun iface
  * sgsnemu: Fix ping transmitted statistics output
  * cosmetic: icmpv6.c: fix typo in comment
  * icmpv6.c: Mark internal function as static
  * sgsnemu: Get rid of duplicated options.destaddr
  * sgsnemu: Get rid of duplicated options.net
  * sgsnemu: tun_addaddr: Don't set local addr as dstaddr
  * icmpv6.c: Move code generating ipv6 hdr to its own function
  * Rename netdev_*route to end in route4
  * sgsnemu: Fix build/run against linux < 4.11 (no sysctl addr_gen_mode support)
  * sgsnemu: Handle IPv6 SLAAC in tun iface manually
  * sgsnemu: Implement ping on IPv6 APNs
  * sgsnemu: Fix assumption ipv6 Interface-Identifier of public addr == announced Prefix
  * gtp: queue_test: Fix printf gcc warn under ARM

  [ Andreas Schultz ]
  * add Linux network namespace support for TUN device

  [ Vadim Yanitskiy ]
  * lib/netns: fix open_ns(): return fd from open()

  [ Philipp Maier ]
  * doc: do not use random ip address for dns in default conf
  * doc: use 127.0.0.2 instead of 127.0.0.6 as bind ip.
  * debug: use LOGL_NOTICE instead of LOGL_DEBUG

  [ Eric ]
  * configure.ac: fix libtool issue  with clang and sanitizer

  [ Harald Welte ]
  * lib/netns.c: Add comments to the code, including doxygen API docs
  * lib/netns: OSMO_ASSERT() if user doesn't call init_netns()
  * lib/netns: Fix up error paths
  * example config: use RFC1918 addresses for GGSN pools

  [ Dmitri Kalashnik ]
  * sgsnemu: use real tun device name after the device is up.

  [ Oliver Smith ]
  * osmo-ggsn.spec.in: remove
  * contrib: import RPM spec
  * contrib: integrate RPM spec
  * Makefile.am: EXTRA_DIST: debian, contrib/*.spec.in

 -- Harald Welte <laforge@osmocom.org>  Thu, 13 Aug 2020 12:26:20 +0200

osmo-ggsn (1.5.0) unstable; urgency=medium

  [ Jan Engelhardt ]
  * build: switch AC_CANONICAL_TARGET for AC_CANONICAL_HOST

  [ Pau Espin Pedrol ]
  * libgtp: Remove packets in tx queue belonging pdp being freed
  * libgtp: announce pdp ctx deletion upon CreatePdpCtx being rejected
  * Introduce in46a_is_v{4,6}() helpers
  * ggsn: Move PCO handling code into its own file
  * in46_addr: Improve in46a_ntop documentation
  * ggsn_vty.c: Fix wrong use of in46a_from_eua, print IPv6 euas
  * ggsn: Split application lifecycle related code into ggsn_main.c
  * Move pdp_get_peer_ipv() to lib/util.*
  * gtp-kernel.c: Fix wrong use of in46a_from_eua, print IPv6 euas
  * Introduce LOGTUN log helper
  * ggsn_vty.c: Avoid printing duplicates for pdp context with v4v6 EUAs
  * pdp: constify param in pdp_count_secondary()
  * ggsn_vty.c: Improve output of VTY show pdp-context
  * doc: Update vty reference xml file
  * libgtp: Introduce cb_recovery3
  * ggsn: Implement echo req/resp and recovery
  * cosmetic: fix formatting in if line
  * gtp: Log msg retransmits and timeouts
  * cosmetic: gtp: Drop commented out code calling pdp_freepdp()
  * cosmetic: gtp: Improve documentation of gtp_delete_context_req2()
  * ggsn: rx DeletePdpReq confirmation: Improve documentation and use gtp_freepdp()
  * gtp: Manage queue timers internally
  * ggsn, sgsnemu: Drop use of no-op deprecated gtp_retrans* APIs

  [ Vadim Yanitskiy ]
  * gtp_update_pdp_ind(): fix NULL-pointer dereference
  * gtp_error_ind_conf(): fix: guard against an unknown GTP version
  * gtp/gtp.c: cosmetic: use get_tid() where we need TID
  * manuals/configuration.adoc: fix Network Address without prefix length
  * manuals/configuration.adoc: fix IPv4 address mismatch in <<ggsn_no_root>>
  * contrib/systemd: add systemd-networkd examples from manuals

  [ Harald Welte ]
  * sgsnemu: Fix null-pointer format string argument
  * manual: Fix copy+paste error

 -- Pau Espin Pedrol <pespin@sysmocom.de>  Thu, 02 Jan 2020 20:39:39 +0100

osmo-ggsn (1.4.0) unstable; urgency=medium

  [ Max ]
  * Don't return error on normal shutdown

  [ Harald Welte ]
  * process_pco() const-ify 'apn' argument
  * ggsn: Remove magic numbers from pco_contains_proto()
  * ggsn: const-ify input / read-only arguments of PCO related functions
  * ggsn: Remove magic numbers from ipcp_contains_option()
  * ggsn: Fix build_ipcp_pco() in presence of invalid IPCP content
  * ggsn.c: Refactor PCO processing during PDP activation
  * ggsn: Add minimalistic PAP support
  * ggsn: More logging from PCO handling (e.g. in case of malconfiguration)
  * sgsnemu: Fix format string argument count

  [ Vadim Yanitskiy ]
  * osmo-ggsn: fix VTY command for getting PDP contexts by APN
  * osmo-ggsn: add VTY command to show PDP context by IPv4
  * osmo-ggsn: check result of osmo_apn_to_str()
  * osmo-ggsn: print requested / actual APN in PDP info
  * osmo-ggsn: properly show subscriber's MSISDN in the VTY

  [ Pau Espin Pedrol ]
  * ggsn: Drop unused param force in apn_stop()
  * gtp: Document spec reasoning drop of Rx DeleteCtxReq
  * ggsn: Start gtp retrans timer during startup
  * gtp: Take queue_resp into account to schedule retrans timer
  * gtp: Fix typo dublicate->duplicate
  * pdp: Introduce new API pdp_count_secondary
  * gtp_create_pdp_ind: simplify code by reordering and compacting parsing
  * gtp: Refactor code to use gtp_freepdp(_teardown) APIs
  * cosmetic: gtp: Document free pdp ctx in non-teardown scenario
  * gtp: Re-arrange free pdp ctx code in non-teardown scenario
  * pdp: Drop unused code for haship
  * cosmetic: gtp.h: Remove trailing whitespaces
  * ggsn: Fix undefined behaviour shifting beyond sign bit
  * gtp: Introduce new pdp APIs (and deprecate old ones) to support multiple GSN
  * gtp: Make use of new libgtp APIs with multi-gsn support
  * ggsn_vty_reference.xml: Update from last code changes
  * ggsn: vty: Require ggsn param in <show pdp-context> cmd
  * sgsnemu: Replace use of deprecated libgtp API pdp_newpdp with new one
  * cosmetic: gtp: queue: remove trailing whitespace
  * gtp: Add missing headers
  * gtp: queue.c: Document queue APIs
  * gtp: queue: Add unit test queue_test
  * ggsn: Avoid unaligned mem access reading PCO proto id
  * ggsn: Use structures instead of raw arrays when parsing ipcp_hdr
  * configure.ac: Replace obosolete macro AC_CANONICAL_SYSTEM
  * configure.ac: Use brackets in AC_INIT params
  * configure.ac: Use prefered AC_CONFIG_HEADERS over AM_CONFIG_HEADER
  * configure.ac: some versions of linux/if.h require including sys/socket.h
  * sgsnemu: Fix unaligned pointer access during ip/icmp checksum
  * Remove undefined param passed to {logging,osmo_stats}_vty_add_cmds
  * Require libosmocore 1.1.0

  [ Oliver Smith ]
  * debian: create -doc subpackage with pdf manuals
  * ggsn: Use gtp_delete_context_req2() everywhere
  * contrib/jenkins.sh: run "make maintainer-clean"

  [ Daniel Willmann ]
  * manuals: Add script to regenerate vty/counter documentation

 -- Pau Espin Pedrol <pespin@sysmocom.de>  Wed, 07 Aug 2019 21:28:30 +0200

osmo-ggsn (1.3.0) unstable; urgency=medium

  [ Pau Espin Pedrol ]
  * ggsn: ctrl iface: listen on IP configured by VTY
  * gtp: Log type name of unexpected signalling message
  * gtp: Allow recv DEL CTX REQ in sgsn and DEL CTX RSP in ggsn
  * gtp: Log ignore CTX DEL REQ due to no teardown and only 1 ctx active
  * gtp: Add new API to avoid freeing pdp contexts during DEL CTX REQ
  * gtp: Add new replacement cb_recovery2 for cb_recovery
  * Install systemd services with autotools
  * Install sample cfg file to /etc/osmocom

  [ Stefan Sperling ]
  * fix unaligned access in build_ipcp_pco()
  * fix support for multiple IPCP in PDP protocol configuration options
  * check ioctl() call return value in tun_new()
  * fix allocation of ippool's hash table
  * replace bogus memcpy() call in ippool_newip()
  * initialize local variable addr in ippool_new()
  * fix format string error in ippool_printaddr()
  * fix a format string directives in queue_seqset()
  * properly store IPv6 addresses in struct tun_t

  [ Harald Welte ]
  * debian/rules: Don't overwrite .tarball-version
  * osmo-ggsn.cfg: Ensure well-formed config file example
  * sgsnemu: Fix printing of tun device name
  * ippool.c: Use "%td" format string for ptrdiff_t
  * initial version of OsmoGGSN user manual
  * OsmoGGSN: Add VTY reference manual
  * GGSN: Document how 'ip tuntap' is used for non-root; call netdev 'apn0'
  * vty-ref: Update URI of docbook 5.0 schema

  [ Alexander Couzens ]
  * libgtp: implement gtp_clear_queues to clear req/resp queue

  [ Neels Hofmeyr ]
  * Importing history from osmo-gsm-manuals.git
  * refactor Makefile build rules, don't use the FORCE
  * GGSN: don't say 'NITB'
  * OsmoGGSN: more info on non-root operation / tun creation
  * OsmoGGSN: multiple instances: mention GTP port
  * OsmoGGSN: add Routing section for IP forward and masquerading
  * OsmoGGSN: typo: priveleges
  * OsmoGGSN VTY ref: prep: convert newlines to unix
  * OsmoGGSN vty: update VTY reference
  * OsmoGGSN: fix VTY additions' node IDs
  * OsmoGGSN: update vty reference
  * ggsn: update vty reference

  [ Max ]
  * Expand OsmoGGSN manual

  [ Oliver Smith ]
  * build manuals moved here from osmo-gsm-manuals.git
  * Fix DISTCHECK_CONFIGURE_FLAGS override
  * contrib/jenkins.sh: build and publish manuals
  * contrib: fix makedistcheck with disabled systemd

 -- Harald Welte <laforge@gnumonks.org>  Sun, 20 Jan 2019 21:34:22 +0100

osmo-ggsn (1.2.2) unstable; urgency=medium

  [ Vadim Yanitskiy ]
  * ggsn_vty.c: fix: use CONFIG_NODE as parent by default

  [ Philipp Maier ]
  * ggsn: fix misinterpreted length field in ipcp_contains_option()
  * ggsn: make sure ipcp_option_hdr and and ipcp_hdr are packed

 -- Pau Espin Pedrol <pespin@sysmocom.de>  Thu, 31 May 2018 12:44:54 +0200

osmo-ggsn (1.2.1) unstable; urgency=medium

  * debian/rules: Fix debian packaging after 1.2.0 release

 -- Pau Espin Pedrol <pespin@sysmocom.de>  Fri, 04 May 2018 12:19:58 +0200

osmo-ggsn (1.2.0) unstable; urgency=medium

  [ Neels Hofmeyr ]
  * fix compiler warnings: return 0 in main(), in 3 tests
  * add --enable-sanitize config option
  * sanitize build: ensure uint16/32 alignment in gtpie_test and in46a_test
  * configure: add --enable-werror
  * jenkins.sh: use --enable-werror configure flag, not CFLAGS

  [ Harald Welte ]
  * sgsnemu: Don't leak FILE handle in proc_read()
  * sgsnemu: Fix format string in printing tun-device name
  * sgsnemu: Make sure buffer has space for terminating-NUL
  * sgsnemu: Free strings in error path
  * gtp: Fix buffer overflow in imsi_gtp2str()
  * gtp: Explicit OSMO_ASSERT to ensure pdp variable is set
  * tun: Don't copy 16byte IPv6 address to 'struct in_addr'
  * ippool: Correctly compute size of static pool
  * remove unused argument to alloc_ippool_blacklist()
  * factor out netdev_ip_local_get() from tun_ip_local_get()
  * Properly NULL-out blacklist in alloc_ippool_blacklist()
  * gtp_kernel: Change gtp_kernel_init() function signature
  * gtp-kernel: Re-add support for kernel GTP-U acceleration
  * gtp-kernel: Get rid of hard-coded kernel GTP device name
  * gtp-kernel: shut down kernel GTP device in apn_down()
  * gtp-kernel: Align logging for APN start in kernel-gtp case with that of TUN
  * gtp-kernel: Avoid global state variable
  * gtp-kernel: Make sure repeated calls to gtp_kernel_init() are safe
  * gtp-kernel: proper cleanup in error path
  * gtp-kernel: Get rid of SYS_ERR where not applicable
  * gtp-kernel: Add function name to pdp_debug() function calls
  * gtp-kernel: Add device nime in pdp_debug() log statements
  * contrib/jenkins.sh: Allow jenkins job to specify if kernel GTP is used
  * ggsn.c: Fix byte order of IPCP IPv4 DNS servers
  * ggsn: Ignore PCO with length 0, don't abort processing
  * README.md: Remove misleading sentence on sgsnemu
  * Add talloc context introspection via VTY
  * fix segfault in case of kernel gtp-u
  * lib/tun.c: Generalize tun_sifflags() to netdev_sifflags
  * lib/tun.c: generalize tun_*route() to netdev_*route()
  * lib/tun.c: Generalize tun_{set,add}addr*() functions
  * lib/tun: split generic network device related stuff to lib/netdev
  * lib/netdev.c: Cosmetic changes (coding style / cleanups)
  * ggsn: Don't explicitly use tun_setaddr() API anymore
  * sgsnemu: Convert from tun_setaddr() to tun_addaddr()
  * lib/tun: Remove tun_setaddr() API, as everyone is using tun_addaddr() now
  * Move kernel GTP support from ggsn/ to lib/
  * ggsn: don't use gtp_kernel_tunnel_{add,del}() for userspace tun

  [ Pau Espin Pedrol ]
  * ggsn_vty: Stop using deprecated API vty_install_default
  * contrib/jenkins.sh: Enable Werror in C(PP)FLAGS
  * examples: Add secondary ipv6 google DNS to osmo-ggsn.cfg
  * tun_setaddr6: Fix log typo
  * cosmetic: Reorder tun_addaddr to get rid of decl of tun_setaddr4
  * ggsn.c: Print version of unhandled ip packet
  * Remove unused empty src/Makefile.in
  * tests: Split ipv6 specific tests into a new test group
  * Add support for IPv4v6 End User Addresses
  * contrib: jenkins.sh: Build libgtpnl as dep when building with gtp kernel support
  * cosmetic: sgsnemu.c: Fix trailing whitespace
  * ggsn.c: Improve logging info on link-local ipv6 addr not found
  * tun.c: tun_addaddr: Fix segfault and wrong usage of tun_nlattr
  * Set tun_addaddr ipv agnostic and add support for ipv6
  * ggsn: Add 'ipv6 link-local' vty cmd
  * ggsn_vty.c: Print ipv6 link-local cmd when writing config to file
  * gtp.c: Fix trailing whitespace
  * gtp.c: Determine GTP version from header
  * gtp.c: Log unsupported GTP version number
  * gtp/pdp: Fix trailing whitespace
  * gtp/pdp: Remove unused APIs pdp_ntoeua pdp_euaton
  * gtp.c: gtp_gpdu_ind: Convert ifelse to switch statement
  * gtp.c: gtp_gpdu_ind: Early return to avoid use of uninitialized var
  * gtp/gtp.c: Remove unused function char2ul_t
  * gtp/gtp.c: Mark non exported functions as static
  * gtp/gtp.c: Use uint8_t for version param in static functions
  * ggsn: encaps_tun: Avoid forwarding packet if EUA is unassigned, fix crash
  * ggsn: Validate packet src addr from MS
  * ggsn: Parse PCO_IPCP
  * ggsn: Parse PCO_IPCP for IPv4v6 pdp ctx
  * ggsn: Print all addresses on successful pdp ctx creation
  * ggsn.c: cb_tun_ind: Convert ifelse to switch statement
  * ggsn.c: cb_tun_ind: log dst addr of packet without pdp ctx
  * ggsn.c: cb_tun_ind: Don't drop packets targeting pdp ctx ll addr
  * sgsnemu: Fix bad ptr during context deallocation
  * sgsnemu: listen param is a host, not an interface
  * use osmo_init_logging2

  [ Max ]
  * Log APN and tun names for packets
  * Enable sanitize for CI tests
  * Fix stow-enabled jenkins build failure
  * Add GTP message names

  [ Viktor Tsymbalyuk ]
  * sgsnemu: sgsnemu stopped after recieving "Request accepted" from ggsn
  * sgsnemu: created "pinghost" and "createif" modes for mutual exclusion
  * sgsnemu: fix: no outgoing GTP-U in "createif" mode

  [ Martin Hauke ]
  * build: Remove AC_PROG_CXX, C++ is never used

  [ Stefan Sperling ]
  * remove the -f option from osmo-ggsn.service

 -- Pau Espin Pedrol <pespin@sysmocom.de>  Thu, 03 May 2018 16:05:27 +0200

osmo-ggsn (1.1.0) unstable; urgency=medium

  * libgtp: pdp.h: Addition of new tx_gpdu_seq struct member member
  * libgtp: pdp.h: add LOGPDPX() helper to public API

 -- Harald Welte <laforge@gnumonks.org>  Sat, 28 Oct 2017 19:00:23 +0200

osmo-ggsn (1.0.0) unstable; urgency=medium

  * Transition to OsmoGGSN

 -- Harald Welte <laforge@gnumonks.org>  Wed, 06 Sep 2017 12:19:48 +0200

openggsn (0.94.0) UNRELEASED; urgency=medium

  [ Holger Hans Peter Freyther ]
  * Bump version to ease upgrading from Debian SID.
  * Bump libgtp SO version after ABI change.

  [ Harald Welte ]
  * various documentation / README updates
  * improve error logging and propagation
  * endian-safe definition of IP header
  * IPv6 user plane support

 -- Harald Welte <laforge@gnumonks.org>  Sun, 13 Aug 2017 09:34:20 +0200

openggsn (0.92) precise; urgency=medium

  * Release 0.92

 -- Holger Hans Peter Freyther <holger@moiji-mobile.com>  Mon, 30 Nov 2015 14:05:59 +0100

openggsn (0.91+git34) precise; urgency=medium

  * Non-maintainer upload.

 -- Holger Hans Peter Freyther <holger@freyther.de>  Tue, 23 Sep 2014 16:38:32 +0200

openggsn (0.91+git33) precise; urgency=low

  * Fix init script.

 -- Eric Butler <eric@codebutler.com>  Fri, 24 Aug 2012 21:15:32 -0700

openggsn (0.91+git33) precise; urgency=low

  * Update package for Ubuntu Precise.

 -- Eric Butler <eric@codebutler.com>  Tue, 14 Aug 2012 16:48:59 -0700

openggsn (0.91-2) unstable; urgency=low

  * Switch to source/format (git)

 -- Harald Welte <laforge@gnumonks.org>  Tue, 10 May 2011 17:31:37 +0200

openggsn (0.91-1) unstable; urgency=low

  * Initial release (Closes: #nnnn)  <nnnn is the bug number of your ITP>

 -- Harald Welte <laforge@gnumonks.org>  Tue, 24 Aug 2010 11:23:40 +0200
