libosmocore (1.3.1) unstable; urgency=medium

  * libosmosim: Build irrespective of PC/SC support

 -- Harald Welte <laforge@osmocom.org>  Mon, 16 Mar 2020 11:41:50 +0100

libosmocore (1.3.0) unstable; urgency=medium

  [ Pau Espin Pedrol ]
  * osmo-release.sh: Add DRY_RUN mode
  * osmo-release.sh: Verify debian/rules dh_strip lines match LIBVERSION
  * osmo-release.sh: Verify consistency of dependency versions in configure.ac and debian/control
  * osmo-release.sh: Check patches under debian/patches apply
  * osmo-release.sh: Support releasing openbsc.git
  * vty: Register logp cmd next to logging commands
  * tdef: Introduce API osmo_tdef_set()
  * tdef_vty.h: Add missing header dependencies
  * logging_internal.h: Fix osmo_log_info definition
  * osmo-release.sh: update TODO-RELEASE for non-lib projects too
  * logging: Move extern declaration of osmo_log_target_list from logging.h to logging_internal.h
  * msgb: Allow size==headroom in msgb_alloc_headroom*()
  * tdef: Introduce min_val and max_val fields
  * tdef_test: verify case where osmo_tdef_set returns -EEXIST
  * vty: Optionally Set/replace cfg file during cmd 'write file'
  * logging: Introduce mutex API to manage log_target in multi-thread envs
  * socket.c: Move glibc workarounds to same place in addrinfo_helper()
  * vty: Fix go_parent_cb not called for indented nodes at end of cfg file
  * tdef: Return correct snprintf value for osmo_tdef_range_str_buf()
  * socket: Introduce API osmo_sock_init2_multiaddr()
  * socket: Remove unneeded condition check in osmo_sock_init2_multiaddr()
  * libosmocore.pc.in: Append -lsctp to Libs.private
  * socket.c: build multiaddr socket API helpers only if used by public APIs
  * configure: Introduce --disable-libsctp and error by default if libsctp not found
  * vty: Return error if cmd returns CMD_WARNING while reading cfg file
  * cosmetic: gsm_04_08.h: Fix trailing whitespace
  * gsm_04_08.h: Introduce API osmo_gsm48_rfpowercap2powerclass()
  * gsm: Fix compilation error under some compilers
  * gsm: gsm_utils: Fix return type of API ms_class_gmsk_dbm() and add unit tests
  * gsm: gsm_04_08.h: Allow accessing classmark2 as struct instead of uint32_t
  * Introduce fields related to DTAP DLCI
  * osmo-release.sh: Use set -e before applying changes to prepare release
  * osmo-release.sh: Improve of PKG_CHECK_MODULES from configure.ac
  * Drop empty file debian/patches/series

  [ Harald Welte ]
  * codec/ecu_fr: Mark input TCH frame as 'const' as we only read it
  * context: Add support for [per-thread] global talloc contexts
  * cbsp: Fix endless loop iteration when decoding cell list IEs
  * cbsp: Remove printf() statement from early development/debugging
  * cbsp: Fix decoding of WRITE-REPLACE payload
  * codec/ecu: Introduce new generic Error Concealment Unit abstraction
  * gsm_08_58: Add vendor-specific Message Type for ETWS Primary Warning
  * Introduce BTS_FEAT_ETWS_PN for communicating ETWS PN capability
  * sim/class_tables: Fix typo in comment
  * cosmetic: clarify c_iflag in osmo_serial_init()
  * select: Make file descriptor lists per-thread
  * 04.80: Deprecate gsm0480_create_ussd_resp()
  * Check for osmo_fsm_register() error return value
  * gprs_ns_instantiate(): propagate errors from gprs_sns_init() to caller
  * osmo-arfcn: Fix '-h' option
  * utils: exit(2) on unsupported positional arguments on command line
  * gsup: Introduce OSMO_GSUP_NUM_VECTORS_REQ_IE
  * gprs_bssgp: Work around gcc-9 claiming "error=stringop-overflow"
  * libosmocore libusb integration
  * usb: Import a variety of libusb utility functions from simtrace
  * debian/control: Add missing libusb-1.0-0-dev dependency
  * Introduce helper functions for safe fork+exec of processes

  [ Neels Hofmeyr ]
  * add vty logp command to echo on all log targets
  * osmo_tdef_get(): allow passing -1 as default timeout
  * fix: vty crash by logging during VTY_CLOSED event handling
  * OSMO_SOCKADDR_STR_FMT_ARGS: remove useless condition
  * OSMO_SOCKADDR_STR_FMT_ARGS: guard against NULL pointer
  * tdef: fixup osmo_tdef_set()
  * gsup: add OSMO_GSUP_SUPPORTED_RAT_TYPES_IE and OSMO_GSUP_CURRENT_RAT_TYPE_IE
  * API doc tweaks (mncc.h, gsm_08_08.h)
  * add osmo_fsm_set_dealloc_ctx(), to help with use-after-free
  * fsm: refuse state chg and events after term
  * add osmo_sockaddr_str_is_nonzero()
  * test: add OSMO_SOCKADDR_STR_FMT to sockaddr_str_test.c
  * fix OSMO_SOCKADDR_STR_FMT for IPv6
  * add osmo_sockaddr_str_cmp()
  * utils.c: fix various inaccurate API doc about return values
  * logging.h: define ansi color constants
  * fix DLSMS logging category color: '[1:38m' isn't actually defined
  * cosmetic: logging.h: fix comment s/levels/subsystems
  * osmo_sockaddr_str: API doc: fix 32bit addr mixup of host/network byte order
  * utils.h: add OSMO_NAME_C_IMPL() macro
  * fix osmo_escape_str_c() and osmo_quote_str_c()
  * GSUP: rename E_ROUTING_ERROR to ROUTING_ERROR
  * fsm.h: add missing include of logging.h
  * msgb_put: more elaborate logging of head/tailroom failure
  * utils_test: add osmo_print_n_test()
  * utils: add osmo_strnchr()
  * osmo_sockaddr_str: deprecate osmo_sockaddr_str_*_32n()
  * vty: track parent nodes also for telnet sessions
  * vty_app_info.is_config_node: add OSMO_DEPRECATED
  * add osmo_escape_cstr and osmo_quote_cstr
  * add all missing OSMO_GSUP_TO_MSGT_*() macros

  [ Oliver Smith ]
  * Cosmetic: l1sap.h: change /* !< to /*!<
  * logging.h: add L1 SAPI related context and filter
  * gprs_ns_vty: return success for disabled FR/GRE
  * debian, utils: switch to python 3

  [ Ruben Undheim ]
  * MAXPATHLEN set if not defined
  * No fail if no /proc/cpuinfo

  [ Philipp Maier ]
  * cosmetic: Move comment to the right place
  * cosmetic: Add comment on GSM-FR ECU struct
  * ecu_fr: increase test coverage for FR ECU implementation
  * gsm0508: add functions to calculate beginning of a block

  [ Vadim Yanitskiy ]
  * gsm29205_test: fix error: missing braces around initializer
  * GPRS/BSSGP: introduce bssgp_bvc_ctx_free()
  * logging/vty: do not print deprecated logging commands to stdout
  * logging/vty: use LOG_LEVEL_ARGS in logging_vty_add_deprecated_subsys()
  * logging/vty: fix: actually ignore deprecated logging commands
  * logging/vty: fix vty_read_file(): do not write warnings to stdin
  * logging/vty: fix: do not close stderr in vty_close()
  * libosmovty: properly initialize vty->fd in vty_new()
  * libosmovty: simplify condition checking vty->fd in vty_close()
  * core/defs.h: introduce and use OSMO_DEPRECATED_OUTSIDE

  [ Daniel Willmann ]
  * libosmogsm: add support for XOR authentication

  [ Vasil Velichkov ]
  * Add code coverage support

  [ Eric Wild ]
  * sim: allow opening reader# > 0

 -- Pau Espin Pedrol <pespin@sysmocom.de>  Thu, 02 Jan 2020 18:42:29 +0100

libosmocore (1.2.0) unstable; urgency=medium

  [ Harald Welte ]
  * Add VTY and CTRL port numbers for OsmoCBC (Cell Broadcast Centre)
  * deal with rate_ctr_group_alloc() returning NULL
  * Fix osmo_quote_str_c() for strings larger than 32 bytes
  * Print error message if application fails to call rate_ctr_init()
  * gsm0808_utils: Introduce gsm0808_msgb_put_cell_id_u()
  * Revert "Print error message if application fails to call rate_ctr_init()"
  * osmo_sock_get_name_*: Ensure string is returned in error case
  * Revert "Change GSM48_PDISC_* to enum type"
  * pseudotalloc: turn talloc_steal() into #define
  * TLV: Add one-shot TLV encoder
  * lapdm_rslms_recvmsg: Fix memory leak in error path
  * rsl: Add osmocom-specific extensions to RSL channel numbers for CBCH
  * oap_client: Fix license: GPLv2+ instead of AGPLv3+
  * tdef: Fix license: GPLv2+ instead of AGPLv3+
  * gsm48_rest_octets: Fix license: GPLv2+ instead of AGPLv3+
  * rest_octets: Use correct symbols names for range encoder
  * rest_octets: Actually include gsm48_rest_octets.c in Makefile.am
  * rest_octets: Fix export of osmo_gsm48_rest_octets
  * rest_octets: Suffix encoder functiosn with _encode
  * rest_octets: Add function to parse SI3 rest octets
  * rest_octets: Implement actual SI6 rest octets encoding
  * rest_octets: Remove SI2ter + SI2bis encoders that don't do anything
  * lapdm: Don't truncate L3 payload at 200 bytes length
  * make all library-internal static buffers thread-local
  * gsm0808_utils: Add gsm0808_decode_cell_id_u()
  * lapdm: Allow user to specify T200 values; Use correct N200 values
  * lapd_core: Perform N200 retransmissions, not N200-1
  * fsm: Allow millisecond granularity in osmo_fsm built-in timer
  * fsm: Reduce amount of copy+pasted LOGPFSMSRC() statements
  * fsm.c: Print error message for FSM with allstate_action but no events
  * CBSP (Cell Broadcast Service Protocol; 3GPP TS 48.049) support
  * cbsp: Introduce osmo_cbsp_errstr
  * Add Cell Broadcast related definitions from 3GPP TS 23.041
  * cbsp.c: Remove dead code
  * tdef: remove bogus OSMO_ASSERT(unsigned long >= 0)
  * osmo_get_rand_id(): Avoid dead code by proper #if/#else/#endif
  * avoid gcc format error on embedded builds
  * pseudotalloc: Simplistic wrapper of talloc_named()

  [ Keith ]
  * Add expect script: 'vty' for easy access to all vtys

  [ Kévin Redon ]
  * fix typo in FSM description
  * fix isdigit taking unsigned as input
  * minor: don't redefine macros
  * (minor) fix typo in comments

  [ Omar Ramadan ]
  * Add MO-FALLBACK-VALUE SGsAP IE

  [ Max ]
  * NS: log address:port on error
  * Change GSM48_PDISC_* to enum type

  [ Pau Espin Pedrol ]
  * gsm0808: Introduce Osmocom extensions to announce Osmux support
  * vty: command.c: Get rid of huge indentation block
  * vty: command.c: Fix is_cmd_ambiguous() returning always 0
  * cosmetic: vty: command.c: Use upper case for enum match_type value names
  * vty: command.c: Get rid of huge indentation block
  * logging: Check return error from time() call
  * logging: Use reentrant ctime_r instead of ctime
  * command.c: Improve return check condition in cmd_execut_command_real()
  * vty: command.c: Get rid of big indentation block
  * vty: tests: Verify incomplete optional parameters are passed to vty funcs
  * vty: command.c: Fix: multi-choice args are no longer passed incomplete to vty func
  * vty: command.c: Fix: single-choice optional args are no longer passed incomplete to vty func
  * vty: Remove trailing whitespace in output from show asciidoc
  * gsm: lapd_core: Log timeout used upon start of T200
  * vty: Simplify char escaping in asciidoc output
  * gsm0808_test: Fix wrong use of memcp
  * utils: share static buffer in osmo_str_to{lower,upper}()
  * Get rid of osmo_str_tolower() use inside libosmocore code
  * tests: logging: Remove undefined param passed to logging_vty_add_cmds
  * configure: Autodetect TLS bug on ARM with old gcc and apply workaround
  * configure: Allow disabling workaround for TLS bug in old ARM gcc versions
  * osmo-release.sh: Drop whitespace after = when parsing LIBVERSION

  [ Oliver Smith ]
  * gsm_23_003: add GSM23003_MSISDN_{MIN,MAX}_DIGITS
  * Cosmetic: GSUP: fix too long comment line
  * gsm48_decode_bcd_number2: fix ENOSPC edge case
  * gitignore: add doc/*.tag.prep
  * Makefile.am: don't delete example.xml, vtydoc.xsd
  * contrib/jenkins.sh: run "make maintainer-clean"

  [ Sylvain Munaut ]
  * codec/ecu: Add a bit of precision about the actual frame format used

  [ Daniel Willmann ]
  * Deprecate usage of osmo_counter_*
  * stats_vty: Add verb to sentence for show asciidoc counters

  [ Vadim Yanitskiy ]
  * protocol/gsm_12_21.h: fix copy-pasted struct description
  * gsm0408/gsm0408_test.c: introduce BCD number encoding / decoding test
  * gsm48_decode_bcd_number2(): fix output truncation
  * gsm48_decode_bcd_number2(): fix: return -ENOSPC on truncation
  * gsm48_decode_bcd_number2(): return -EINVAL if LV has too big length
  * gsm48_encode_bcd_number(): clarify optional LHV header initialization
  * vty/command.c: cosmetic: add missing curly brackets
  * socket.c: fix Doxygen doc for osmo_sock_unix_init_ofd()
  * vty_transcript_test.vty: add choice auto-complete tests
  * core/utils: drop meaningless const from return value of osmo_luhn()
  * protocol/gsm_04_08.h: do not check if unsigned is positive
  * Revert "fsm.c: Print error message for FSM with allstate_action but no events"
  * Revert "utils.h: require a semi colon after OSMO_ASSERT"
  * libosmogsm/l1sap.h: extend ph_rach_ind_param with lqual_cb
  * osmo_gsm48_rest_octets_si3_decode(): fix copy-paste error in comment
  * bitvec/bitval2mask(): cosmetic: get rid of temporary int variable
  * gsm/gsm0480.c: parse_ss(): drop needless debug print
  * gsm/gsm0480.c: use DLGLOBAL and LOGL_ERROR for logging
  * gsm/gsm48.h: drop meaningless 'const' from gsm48_mi_to_string()
  * vty/telnet_interface.c: use DLGLOBAL logging sub-system
  * vty/telnet_interface.c: avoid unneeded initialization
  * vty/logging_vty.c: fix writing of 'print category-hex'
  * vty/telnet_interface.c: log connection accept() / close() events
  * vty/vty.c: fix vty_read(): prevent further heap-buffer overrun
  * vty/vty.c: the command buffer can be accessed directly

  [ Alexander Couzens ]
  * utils: add gsmtap_logread.py a gsmtap log reader
  * bitvec: correct comment in bitvec_alloc
  * utils.h: require a semi colon after OSMO_ASSERT

  [ Eric Wild ]
  * add define for magic tmsi constant
  * tell ubsan to ignore SUN_LEN

  [ Ruben Undheim ]
  * Set HTML_TIMESTAMP to NO to make build reproducible

 -- Pau Espin Pedrol <pespin@sysmocom.de>  Tue, 06 Aug 2019 18:02:01 +0200

libosmocore (1.1.0) unstable; urgency=medium

  [ Oliver Smith ]
  * gsm_23_003.h: add GSM23003_IMEI_NUM_DIGITS_NO_CHK
  * GSUP: deprecate osmo_gsup_get_err_msg_type()
  * Revert "signal.c: Make non-exported tall_sigh_ctx static"
  * Revert "ipa_ccm_idtag_parse*: Fix reported length value"
  * GSUP: add inter-MSC handover related msgs and IEs

  [ Harald Welte ]
  * Bump version: 1.0.0 → 1.0.1
  * gsm0408_test: Fix IMEI-SV related tests to use no more than 16 digits
  * constrain gsm48_generate_mid() output array bounds
  * Work around bogus gcc-8.2 array-bounds warning/error
  * Extend gsm_04_08.h with CSFB related definitiosn form 44.018 Rel 15
  * gsm_08_08.h: Add IEI definitions from Release 15
  * bitvec: Add bitvec_bytes_used() function
  * bitvec: Add bitvec_tailroom_bits() function
  * Fix BSSMAP length generated by gsm0808_create_clear_command2()
  * gsm0808: comment about difference of gsm0808_create_clear_command()
  * gsm0808: Add unit tests for test_create_clear_command2()
  * bssgp_tx_bvc_unblock(): Fix log message
  * gprs_ns: Use gprs_ns_tx_alive() instead of gprs_ns_tx_simple()
  * gprs_ns.c: cosmetic whitespace fixes
  * gprs_ns: Declare gprs_ns_tx_alive*() in header file
  * gprs_ns: Add missing NSVCI IE to NS-BLOCK-ACK message
  * select: Call log_reset_context() before calling file descriptor callbacks
  * NS: Don't print information about FR/GRE if not enabled!
  * NS: Add missing NS Cause strings
  * GPRS: Doxygen documentation for 'struct libgb_msgb_cb'
  * gprs_ns: Add code for SNS-SIZE and SNS-CONFIG encoding
  * NS: Factor out gprs_nsvc_start_test() and use it
  * NS: Add support for GPRS NS IP Sub-Network-Service (SNS)
  * gprs_ns.c: Update comment: IP SNS has recently been implemented
  * gprs_ns: Don't use initial IP/port for anything but SNS
  * gprs_ns_sns: Use "correct" remote IP address for local IP endpoint
  * tests: use -no-install libtool flag to avoid ./lt-* scripts
  * ipa_ccm_idtag_parse*: Fix reported length value
  * socket: osmo_sock_get_name() Use "const void *" as talloc context
  * gprs_ns_sns: Properly initialize sockaddr_in in gprs_nsvc_create_ip4()
  * select: Rename BSC_FD_* constants to OSMO_FD_*
  * signal.c: Fix osmo_signal_talloc_ctx_init()
  * signal.c: Make non-exported tall_sigh_ctx static
  * osmo_escape_str_buf: Always copy, don't return input string pointer
  * Add _buf() functions to bypass static string buffers
  * Add _c versions of functions that otherwise return static buffers
  * Re-introduce declaration of gsm0808_create_handover_request_ack()

  [ Neels Hofmeyr ]
  * gsm0808: add BSSMAP Cell Identifier matching API
  * add osmo_hexdump_buf() and test
  * add osmo_classmark_* API
  * osmo_fsm_state_name: make robust against NULL fi
  * build: add missing logging_vty_test.vty to EXTRA_DIST
  * jenkins distcheck: enable external tests
  * osmo_fsm_inst_state_chg(): set T also for zero timeout
  * osmo_fsm_inst_state_chg(): clamp timeout_secs to <= ~68 years
  * add generic vty_transcript_test.c, vty_transcript_test.vty
  * vty: enable optional-multi-choice syntax: ([one]|[two])
  * vty: enable optional-multi-choice syntax: [(one|two)]
  * vty: enable tab-completion for optional-multi-choice args
  * vty telnet: consistently never change nodes upon CTRL-C
  * vty api: add vty_out_va()
  * doxygen: enable cross referencing everywhere
  * doxygen: add source files as dependencies
  * doxygen: allow manual 'make apidoc' even if --disable-doxygen
  * add osmo_tdef API, originally adopted from osmo-bsc T_def
  * platform independence fix: tdef range tests
  * get_value_string(): guard against NULL
  * fix osmo_gsm48_classmark* libosmogsm.map entries
  * add OSMO_STRBUF_PRINTF()
  * enlarge gsm0808 msgb headroom
  * log: fsm: allow logging the timeout on state change
  * fix api doc typo for osmo_plmn_name2()
  * api doc: tweak gsm0808_cell_id_matches_list() doc
  * represent negative T-timers as Osmocom-specific X-timers
  * tdef_test: tweak output to prepare for a fix
  * fix tdef_test.c: do call the function-to-test in all cases
  * fsm: add osmo_fsm_inst_state_chg_keep_or_start_timer()
  * add gsm0808_cell_id_from_cgi(), gsm0808_cell_id_to_cgi()
  * osmo_gsm48_classmark_a5_name(): fix 'no-cm3' label
  * gsm_utils.h: remove unused include of gsm_08_08.h
  * add osmo_sockaddr_str API
  * add osmo_use_count API
  * add fsm_dealloc_test.c
  * fsm: add flag to ensure osmo_fsm_inst_term() happens only once
  * fsm: support graceful osmo_fsm_inst_term() cascades
  * fsm_dealloc_test: no need for ST_DESTROYING
  * make osmo_sockaddr_str_is_set() NULL-safe
  * add osmo_str_startswith()
  * tweak OSMO_STRBUF_APPEND(), add OSMO_STRBUF_APPEND_NOLEN()
  * add osmo_{escape,quote}_str_buf2() for standard args ordering
  * add identifier sanitation for setting FSM instance ids
  * add OSMO_IMSI_BUF_SIZE
  * GSUP: add Message Class IE
  * BSSMAP: tweaks
  * BSSMAP: add messages for inter-BSC and inter-MSC Handover
  * add gsm48_decode_bcd_number2() from osmo-msc
  * add osmo_bssap_tlv_parse2() for multiple identical T
  * add vty_is_active()
  * add comment to gsm_mncc_bearer_cap.speech_ver
  * gsm48_decode_bcd_number2(): fix input len check
  * gsm48_decode_bcd_number2(): allow avoiding deprecation
  * osmo_gsup_decode(): properly check IMSI, avoid deprecation
  * add gsm0808_create_handover_request_ack2 to add AoIP RTP addr

  [ Max ]
  * socket.h: add missing include
  * Enable remote SIM protocol log level
  * Add multipatch capability to osmo-config-merge
  * LCLS: add string dump helpers
  * coding: check gsm0503_rach_*() results
  * rate_ctr_group_free(): guard against empty or NULL input
  * BSSGP: use variable for NSEI

  [ Philipp Maier ]
  * gsm0808: Add CSFB indication IE to BSSMAP CLEAR COMMAND
  * gsm0808_utils: fix gsm48 multirate configuration generator
  * gsm0808_utils: fix gsm48 multirate to S-bit converter
  * gsm_utils: fix use buf_len instead of sizeof in osmo_dump_gsmtime_buf

  [ Sylvain Munaut ]
  * protocol/gsm_04_14: Fix the OPEN LOOP message type
  * gsm_08_08.h: Add constants for Channel Type in signalling mode

  [ Vadim Yanitskiy ]
  * gsm/gsm0480: introduce gsm0480_create_release_complete()
  * vty/tdef_vty.c: drop redundant comparison
  * src/signal.c: cosmetic: use talloc_zero()
  * Doxygen: fix incorrect / missing parameter description
  * core/linuxlist.h: fix and unify Doxygen documentation
  * core/linuxlist.h: fix white-space and inconsistent alignment
  * src/logging.c: fix syntax errors in Doxygen documentation
  * core/msgb.h: fix dead msgb2 reference in msgb_eq_* helpers
  * core/msgb.h: drop meaningless parameter of msgb_eq_* helpers
  * src/msgb.c: fix Doxygen documentation for msgb_printf()
  * core/msgb.h: fix incorrect Doxygen parameter description
  * Doxygen: fix documentation of rate_ctr_for_each_counter()
  * src/rate_ctr.c: drop some incorrect \ref references
  * Doxygen: fix documentation of osmo_timer_setup()
  * logging_gsmtap.c: document all params of log_target_create_gsmtap()
  * src/gsmtap_util.c: fix possible memleak in gsmtap_source_init()
  * gsm_03_40.h: define max SM-TP-UDL (User-Data-Length) values
  * vty/talloc_ctx_vty.c: allocate walk_cb_params on stack, not heap
  * vty/talloc_ctx_vty.c: use REG_NOSUB flag of regcomp()
  * gsm_utils.c: fix Doxygen description for gsm_get_octet_len()
  * Fix incorrect buffer size calculation
  * gb/gprs_ns_sns.c: fix incorrect sizeof() calculation
  * gsm/gsm_utils.c: indicate intentional fall-through
  * application.c: drop wrong \references of osmo_init_ignore_signals()
  * bitcomp.c: fix missing Doxygen group closing tag
  * gsm/gsm_utils.h: fix argument type of gsm_chan_t_name()

  [ Pau Espin Pedrol ]
  * rsl: Support PDCH in rsl_chan_nr_str
  * ipa: Document ipa_ccm_idtag_parse_off and fix ipa_ccm_idtag_parse
  * ipa: Fix ipa_ccm_id_resp_parse on big endian systems

  [ Karl Koscher ]
  * Fix build on non-glibc systems

  [ Alexander Couzens ]
  * add osmo_stat_item_inc/osmo_stat_item_dec to set it relative

 -- Pau Espin Pedrol <pespin@sysmocom.de>  Tue, 07 May 2019 18:36:51 +0200

libosmocore (1.0.1) unstable; urgency=medium

  [ Max ]
  * Rename msgb_wrap_with_TL()

 -- Harald Welte <laforge@gnumonks.org>  Mon, 21 Jan 2019 14:50:42 +0100

libosmocore (1.0.0) unstable; urgency=medium

  [ Kévin Redon ]
  * GSMTAP: add SIM sub_types
  * comp128v23 (minor): update original code site and author

  [ Neels Hofmeyr ]
  * fix strncpy bugs in gsm/ipa.c
  * fix strncpy bugs in socket.c
  * cosmetic: osmo-sim-test.c: use memcpy instead of strncpy
  * use __FILE__, not __BASE_FILE__
  * log: add 'last' option to 'logging print file'
  * gsm0808: inter-bsc HO messages: add missing BSSMAP header, x4
  * api doc: fix osmo_quote_str_*
  * add osmo_str_tolower() and _toupper() with test
  * fix tests linking: don't use system installed libs
  * logging vty: add VTY transcript test
  * gsm0808: implement BSSMAP Classmark Request
  * jenkins: add --enable-external-tests
  * logging vty: rewrite 'logging level' vty cmd generation
  * logging vty: deprecate the 'everything' keyword
  * logging vty: write: check logging levels validity
  * logging vty: deprecate 'all', introduce 'force-all'
  * Revert "gsm0808: add function to convert amr gsm0408 setings to gsm0808"
  * logging vty: add 'logging level set-all <level>'
  * vty reference: fix deprecation bit evaluation
  * vty list: fix deprecation/hidden bit logic
  * vty: omit HIDDEN from vty reference
  * vty logging: fix crash when missing 'logging enable'
  * jenkins: print gcc version in log
  * gsm_44_318.h: remove #if 0 from struct gan_cch_desc_ie
  * add contrib/struct_endianess.py
  * gsm0408_test: test encoding and decoding Mobile Identity
  * api doc: gsm48_mi_to_string(): warn of return value implementation
  * add osmo_bcd2str()
  * gsm48_mi_to_string: use osmo_bcd2str(), fix some corner cases
  * gsm48_generate_mid(): mask out ODD flag from mi_type
  * gsm48_mi_to_string(): guard against zero length output buffer
  * gsm48_mi_to_string(): do not read from zero length input buffer
  * fix api doc for osmo_bcd2str()
  * add to osmo_sock_get_name*() API
  * add/clean big-endian packed structs (struct_endianess.py)
  * define LOGPFSM fmt only once, in LOGPFSMLSRC
  * add API doc for LOGPFSM* macros
  * LOGPFSM*: guard against fi == NULL
  * add LOGPFSMSL(), LOGPFSMSLSRC()
  * gsm_utils: add enum osmo_rat_type, from osmo-msc enum ran_type
  * osmo_rat_type: add OSMO_RAT_EUTRAN_SGS
  * fix typo in enum BSS_MAP_MSG_TYPE: BSS_MAP_MSG_ASSIGMENT*
  * add osmo_mi_name(), for MI-to-string like "IMSI-123456"
  * add osmo_lu_type_names[], osmo_lu_type_name()
  * change GSM48_CMSERV_* to enum type, add names
  * comments: update/fix three 3GPP spec references

  [ Alexander Couzens ]
  * ctrl/vty: fsm: use correct element when iterating over fsm->proc.children
  * bssgp: introduce flush queue functions
  * configure.ac: check clock_gettime for glib < 2.17

  [ Harald Welte ]
  * gsm0480: Factor out msgb allocation helper function
  * USSD: Introduce gsm0480_gen_ussd_resp_7bit()
  * 04.80: New gsm0480_gen_{reject,return_error}() functions
  * import oap_client into libosmogsm
  * oap_client: Rename symbols with osmo_ prefix
  * import oap_client_test from osmo-sgsn
  * cosmetic: More context / naming / comment for test_idtag_parsing()
  * Deprecate ipa_ccm_idtag_parse() with ipa_ccm_id_{get,resp}_parse()
  * jenkins_arm.sh: Use same Werror related options as on other builds
  * re-introduce ipa_ccm_idtag_parse_off()
  * debian/rules: Don't overwrite .tarball-version
  * Add RSPRO support to IPA and logging definitions
  * Add new osmo-config-merge utility
  * logging_vty: Ensure writing well-formed config files
  * osmo-config-merge: Don't use C99 'for' loop initial declarations
  * Revert "osmo-config-merge: Add manual page"
  * osmo-config-merge: fclose() what we fopen()
  * timerfd_create(): Fix error handling of osmo_fd_register()
  * telnet_interface: avoid double-close of fd()
  * vty.c: Set vty->fd to -1 after closing the FD
  * SGsAP protocol definitions (header + C file)
  * gsm23003: Add MME domain name related helper functions
  * Fix VTY documentation error introduced  in "bind" VTY port change

  [ Vadim Yanitskiy ]
  * vty/vty.c: remove dead unused tall_bsc_ctx
  * gsm/gsm0480.c: prevent NULL-pointer dereference
  * gsm/gsm0480.c: use the local msgb allocator
  * libosmogsm: (re)introduce gsm48_push_l3hdr()
  * core/utils.h: drop duplicate '<stdbool.h>' include
  * core/utils.h: move includes to the top
  * vty/command.h: document and prettify CMD_ATTR_* flags
  * utils/osmo-config-merge: explicitly return from main()
  * libosmogsm/gsup.c: fix error code in osmo_gsup_encode()
  * gsm/gsup.h: cosmetic: use tab for comment alignment
  * core/msgb.h: introduce msgb_l4len() helper
  * gsm0480: fix copy-pasted note for gsm0480_gen_return_error()
  * GSUP/SMS: introduce MO-/MT-FORWARD-SM messages
  * GSUP/SMS: introduce READY-FOR-SM message
  * tests/gsm0808: use new msgb comparison API
  * logging/gsmtap: fix buffer overflow in _gsmtap_raw_output()
  * tests/gsup_test.c: drop session IEs from MO-ForwardSM Error

  [ Philipp Maier ]
  * socket: check return code of setsockopt
  * socket: do not set SO_REUSEADDR for IPPROTO_UDP
  * socket: add flag to enforce SO_REUSEADDR on UDP sockets
  * gsmtap_util: make sure SO_REUSEADDR is applied for GSMTAP
  * gsm0808: fix wrong codec defaults for OFR_AMR_WB
  * gsm0808: add function to convert amr gsm0408 setings to gsm0808
  * gsm0808: add function to convert amr gsm0408 setings to gsm0808
  * gsm0808_utils: constify parameter
  * gsm_utils: add function to get value strings for gsm48_chan_mode
  * gsm0808: add function to convert AMR S15-S0 to gsm0408 settings
  * gsm0808: allow decoding of zero length speech codec lists.
  * gsm0808: fix doxygen apidoc
  * gsm0808: cosmetic: rename parameter "reason" to "cause"
  * gsm48: correct apidoc for gsm48_generate_mid()
  * gsm_29_118: add missing include to header file
  * gsm29118: add value strings for SGSAP IEI
  * fsm: fix apidoc of osmo_fsm_state_name()
  * gsm0808: add message generator for BSSMAP HANDOVER PERFORMED
  * gsm_29_118: add missing extern for struct value_string decl.
  * cosmetic apn: correct whitespace error
  * gsm_29_118.h: Add constant for default port
  * gsm29118: add generator functions for GSM29118 messages
  * gsm0808: add encoder for cause codes and use it

  [ Mykola Shchetinin ]
  * vty/vty.c: fix bug in vty_config_write

  [ Pau Espin Pedrol ]
  * signal: Introduce API osmo_signal_talloc_ctx_init
  * msgb: Introduce msgb_{de,en}queue_count APIs
  * vty: Makefile: Fix LIBVERSION typo introduced in 0.12.0 release
  * ipa: Document ipa_msg_recv* functions
  * osmo-release.sh: Add quotes to string to fix shellcheck warning
  * osmo-release.sh: Allow forcing release without LIBVERSION bump
  * osmo-release.sh: Add checks to help avoid libversion debian major mismatch
  * gsm_08_58.h: Introduce struct abis_rsl_link_id
  * gsm_08_58.h: Introduce struct abis_rsl_chan_nr
  * gsm48: gsm48_decode_freq_list: Improve documentation of paramter f
  * gsm: Deprecate buggy gsm_arfcn2band API and introduce gsm_arfcn2band_rc
  * timer: Fix clockid_t undefined on MacOS < 10.12
  * stats.h: Fix build on MacOS

  [ Stefan Sperling ]
  * properly handle mandatory cli param of gsm0808_create_paging2
  * Properly deal with sockaddr_un socket path length limitations.
  * ensure unix socket paths are NUL-terminated for bind/connect
  * fix error handling gprs_ns_nsip_listen()
  * add support for ipaccess messages on the ctrl interface
  * stop printing group description in vty_out_rate_ctr_group_fmt()
  * make 'show rate-counters' show group index
  * send NS_POUT_UNBLOCK_ACK before signalling S_NS_UNBLOCK
  * document unblock-ack vs. signalling in gprs_ns_process_msg()
  * rename CELL_IDENT_LAI_AND_LAC to CELL_IDENT_LAI
  * port arfcn range encode support from osmo-bsc
  * port rest octets encoding code from osmo-bsc

  [ Keith ]
  * Add CC_CAUSE value_string array

  [ Alexander Chemeris ]
  * coding: Correctly count bits when decoding EDGE bursts with MCS >= 7.
  * coding: Always initialize bit counters in gsm0503_pdtch_egprs_decode().

  [ Daniel Willmann ]
  * osmo-config-merge: Fix some small issues
  * osmo-config-merge: Add manual page
  * stats_statsd: Send all stat_items as gauges

  [ Shinjo Park ]
  * GSMTAP: add definitions for new LTE RRC channels
  * GSMTAP: add definitions for LTE NAS subtypes
  * GSMTAP: fix typos in comments

  [ Max ]
  * vty: adjust telnet log
  * Update cipher reject function
  * Fix deprecation warning in gsm0808_test
  * Add helper wrapper for BSSAP TLV parsing
  * Update 3GPP TS 08.08 Cause handling
  * Update GSM0808_LCLS enums
  * Move msgb_push helpers to public header
  * Support cipher mode reject with extended cause
  * Add missing header include
  * LCLS: add 48.008 parameter structure
  * Update gsm0808_create_ass() doxygen
  * ctrl: print textual error on IPA parsing failure
  * Move BSSMAP_MSG_* defines to header file
  * Update msgb Lx helpers
  * ctrl: use #define for TRAP id
  * Add msgb_tl_put() helper
  * LCLS: update osmo_lcls struct
  * Allow log_init() with NULL log_info
  * Add osmo_sockaddr_in_to_str_and_uint()
  * Constify llist_count() parameter
  * msgb: add test helpers
  * LCLS, TS 29.205: add GCR routines
  * LCLS, TS 48.008: add GCR IE encoding/decoding
  * LCLS: add gsm0808_create_ass2()
  * Fix typos in SS opcode names
  * LCLC: fix doc to match type signature
  * Use define for key buffers
  * TLV: fix doc copy-paste error
  * TLV: add convenience function for 1-byte values
  * LCLS: enc/dec entire parameter set instead of GCR
  * Streamline glibc version check
  * Automatically disable GnuTLS fallback
  * LCLS: fix LCLS-CONNECT-CONTROL encoder
  * msgb: fix debug print
  * LCLS: use proper types for value_string wrappers
  * LCLS: expand enc/dec tests
  * LCLS: add GCR comparison helper

  [ Oliver Smith ]
  * cosmetic: fix typo (soocket -> socket)
  * add osmo_sock_get_{local,remote}_ip{,_port}()
  * socket.c: fix IP and port buffer sizes
  * merge_doc.xsl: move to osmo-gsm-manuals.git
  * GSUP: fix missing osmo_gsup_get_err_msg_type()s
  * GSUP: add end marker to enum osmo_gsup_iei
  * GSUP: add CHECK-IMEI message
  * Cosmetic: GSUP: note "on wire" for imei_result
  * gsm23003: add osmo_imei_str_valid()

  [ Martin Hauke ]
  * gsm/protocol/gsm_08_58.h: Fix typo

  [ Holger Hans Peter Freyther ]
  * vty: The telnet interface is TCP only. Fix the comments
  * vty: Make TCP port configurable and introduce telnet_init_default

 -- Harald Welte <laforge@gnumonks.org>  Sat, 19 Jan 2019 21:59:07 +0100

libosmocore (0.12.0) unstable; urgency=medium

  [ Pau Espin Pedrol ]
  * control_if: Avoid heap-use-after-free in osmo_wqueue_bfd_cb
  * configure: Check separately for lib implementing dlopen and dlsym
  * tests: bitrev_test: Fix dynamic-stack-buffer-overflow
  * tests: gea_test: Use correct max size for key in buffer
  * tests: a5_test: Print wrong buffer correctly on error
  * gsm: kasumi: Fix dynamic-stack-buffer-overflow on out buffers not multiple of 64 bits
  * gsm: lapdm.c: Add missing new line char in notice log string
  * ctrl: Log CMD TYPE on invalid ID number
  * ctrl: Fix parsing of ERROR recvd msgs with id=err
  * gsm0808: Add value_string for encryption algorithms
  * ctrl: Introduce ctrl_cmd_parse3 API
  * ctrl: ctrl_handle_msg: Avoid sending back received ERROR msgs
  * tests: ctrl: Test received ERROR messages are handled correctly
  * libosmocoding: clarify return values for TCH decoding functions
  * libosmocodec: FR err concealment: Fix too many silent frames generated
  * tests: codec: ecu_fr: Print XMAXC fields
  * tests: codec: ecu_fr: Add buffer with unequal XMAXC values
  * rate_ctr: Improve logging
  * logging: log_vty_command_string: Fix undercount of buf alloc size
  * logging_vty: Simplify code in config_write_log_single
  * logging.c: Fix whitespace typo

  [ Harald Welte ]
  * lapdm: Fix back-pointer from lapdm_entity to lapdm_channel
  * lapdm: Implement SABM related constraints
  * lapdm: cleanup: send_rslms_rll_l3_ui(): Use msgb_tv_push()
  * lapdm: send_rslms_rll_l3_ui(): Don't include B4/SACCH IE unless needed
  * lapdm: don't enforce contention resolution on SAPI0/DCCH
  * Add osmo_timerfd_* functions for osmo_fd-wrapped timerfd
  * import isdn4linux HDLC code from linux kernel
  * isdnhdlc: Port from kernel to userspace
  * mncc: properly export osmo_mncc_name()
  * cosmetic: Whitespace fixes in control_if.c
  * ctrl: Introduce libosmoctrl.map to avoid unintended exports
  * ctrl: Add doxygen API documentation; generate html from it
  * debian: Add libosmoctrl-doc sub-package
  * gsm_08_08.h: Add enum for LCLS config, control and status
  * gsm0808: Add encoding functions for LCLS BSSMAP messages
  * gsm0808: Add value_string for LCLS related IEs
  * tlv: Add TLVP_VAL_MINLEN() to obtain value _if_ length is >= minimum
  * Add osmo_isqrt32() to compute 32bit integer square root
  * fsm: Change semantics of LOGPFSML() log-level
  * vty: Don't dump deprecated commands in XML export
  * vty: Add logging_vty_add_deprecated_subsys
  * gsup: Add osmo_gsup_get_err_msg_type() function
  * gsup: Add value_string for Session State IE
  * gsm 04.80: Add value_string for component type and op code
  * Fix embedded (arm-none-eabi) builds
  * jenkins_arm.sh: Don't run 'make check' on embedded builds
  * jenkins_arch.sh: Accept "arm-none-eabi" as alias for "arm"
  * jenkins_arch.sh: Exit with error on unknown architecture
  * Don't call abort() directly, always use osmo_panic()
  * osmo_panic(): Annotate as __attribute__ ((noreturn))
  * gprs_ns.h: Declare gprs_ns_cause_str() which already existed in c file

  [ Stefan Sperling ]
  * define a constant for the max length of called party BCD IE
  * introduce vty_out_rate_ctr_group_fmt() function
  * Add a 'show rate-counters' VTY command.
  * remove unused argument from pad_append_ctr() helper function
  * check bssgp_tlv_parse() return code in bssgp_rcvmsg()
  * return error to sender upon bssgp_tlv_parse() failure

  [ Neels Hofmeyr ]
  * add gsm0808 channel enum to IE val conversion functions
  * add gsm0808_cell_id_to_list()
  * add support for gsm0808 HANDOVER REQUIRED message
  * add gsm0808_create_handover_request_ack()
  * add osmo_fsm_inst_state_chg_keep_timer()
  * fix gsm0808_permitted_speech(): don't return HR3 for TCH_F + AMR
  * add and tweak inter-BSC HO API
  * vty/command.c: talloc from tall_vty_cmd_ctx, not NULL
  * vty: cosmetic: cmd_deopt(): use talloc_strndup(), not memcpy()
  * vty: fix use-after-free and memleaks in is_cmd_ambiguous()
  * utils_test: fix isqrt_test calculation range
  * utils_test: check stderr to catch sanitizer issues
  * add osmo_sockaddr_to_str_and_uint()

  [ Philipp Maier ]
  * fsm: guard action callback
  * gsm_04_08: add function to get value string
  * gsm_08_08: gsm0808_permitted_speech does not have value strings

  [ Thorsten Alteholz ]
  * fix spelling

  [ Keith ]
  * Add enum gsm48_cause_coding from GSM 04.08 Section 10.5.4.11
  * Add enum gsm48_progress_desc

  [ Daniel Willmann ]
  * ports.h: Add ctrl port for osmo-gbproxy
  * Add function gprs_nsvc_state_append
  * stats_vty: Add asciidoc sections between the different counters

  [ Vadim Yanitskiy ]
  * gsm0480: fix: don't overwrite the data of RELEASE_COMPLETE
  * GSUP: implement TCAP-like session management
  * GSUP: introduce new messages for SS/USSD payloads
  * Doxygen: gitignore generated files for libosmoctrl
  * gsm/gsm0480.c: introduce gsm0480_extract_ie_by_tag()
  * gsm/gsm0480: refactor and expose gsm0480_parse_facility_ie()
  * Don't enforce Python 2 for utilities

  [ Alexander Chemeris ]
  * coding: Fix (E)GPRS BER calculation to correctly account for puncturing.
  * coding: Documentation typo fix.

  [ Alexander Couzens ]
  * vty: initialize termios before using it
  * stats_statsd: sanitize statsd name

 -- Pau Espin Pedrol <pespin@sysmocom.de>  Fri, 27 Jul 2018 17:31:46 +0200

libosmocore (0.11.0) unstable; urgency=medium

  [ Max ]
  * Enable GnuTLS fallback
  * Ctrl: add rate counter group introspection
  * ctrl: log incorrect interval values
  * Improve get_rate_ctr() error handling
  * ctrl: make response easier to parse
  * coding test: cosmetic cleanup
  * coding test: enable debug output
  * coding test: move bit dump into functions
  * coding test: use OSMO_ASSERT
  * Fix embedded build
  * embedded: fix tests
  * Embedded: fix sercomm test
  * Add functions for extended RACH coding
  * Do not allocate already existing counter group
  * Fix incorrect spec reference
  * Use 127.0.0.1 for GSMTAP logging by default
  * coding: move eB adjustement to appropriate place
  * Add function to properly encode RAI
  * Use existing function for TLLI encoding
  * log: print loginfo assertions source
  * Allow multiple 'log gsmtap' sinks
  * Deprecate gsm48_construct_ra()
  * Log lapd_datalink state on errors
  * jenkins: add dispatcher script
  * Embedded: disable stats test
  * Embedded: add sercomm stubs
  * GSUP: don't fail test on first error
  * jenkins: remove obsolete scripts
  * jenkins: move make invocation into shared function
  * utils: add helper wrapper for osmo_strlcpy()
  * GSUP: change osmo_gsup_encode() return type
  * Use python 3 for utilities
  * Add test for gsm48_generate_mid_from_imsi()
  * Add generic Mobile Identity encoder
  * Add function to encode classmark

  [ Niro Mahasinghe ]
  * gsm0503_coding.c: Fix tch_efr_unreorder() of one bit
  * gsm0503_coding.c: Use majority vote in tch_efr_unreorder()

  [ Harald Welte ]
  * debian: build now depends on libgnutls
  * Fix/Update copyright notices; Add SPDX annotation
  * Print /proc/cpuinfo before executing testsuite
  * conv_acc: Our code requires SSSE3, not just SSE3
  * ports.h: Use same VTY port number for osmo-mgw and osmo-bsc_mgcp
  * gsmtap.h: Introduce new GSMTAP type for LTE NAS messages
  * gsm0808_create_cipher_reject: Fix encoding of Cause IE
  * rate_ctr: print proper error message if rate_ctr already exists
  * timer: fixup whitespace issues
  * control_if: Close control connection socket/fd on read/write == 0
  * control_if: Log the disconnect of a CTRL client
  * CTRL: Ensure peer/connection info is always printed the same way
  * MNCC: Add MNCC to string dumper
  * gsm48_pdisc_names: Use conscise, short names
  * SMS: Add value_string for TS 04.11 CP and RP state
  * gsm_04_08.h: Clearly annotate timers that don't have a 3GPP Default value
  * gsm_04_08.h: Reduce T310 default to 30s.
  * gsm48_hdr_msg_type[_r99]: Fix bit-masks
  * gsm48_hdr_msg_type(): SS is in the same group as MM/CC
  * tlv_parser: Report *first* occurrence of repeated IEs
  * msgb: Add msgb_hexdump_{l2,l3}() to dump l2 or l3 part of message buffer
  * Revert "Use python 3 for utilities"
  * Revert "fsm: do not terminate child FSMs early"
  * osmo_msgbdump_{l2,l3}(): Proper typecast
  * debian/control: Fix Vcs-Browser URL
  * Add GSM 04.08 type-of-number / numbering-plan-id definitions
  * talloc_ctx_vty: Fix help strings (missing \n at end of line)
  * Revert "Add function to encode classmark"
  * rate_ctr: Add rate_ctr_inc2() as convenience wrapper
  * coding: Add BER-reporting RACH decode functions
  * l1sap: Add RSSI, BER and quarter-bit accurate timing to PH-RACH.ind
  * l1sap: Add fields for higher-precision timing offset values
  * abis_nm: Introduce abis_nm_dump_foh()
  * VTY: Don't welcome the user to the "control" interface, if it's VTY
  * prevent integer underflow in ipa_ccm_make_id_resp_from_req()
  * RSL/LAPDm: Not all RLL message are "transparent"

  [ Neels Hofmeyr ]
  * vty: deprecate now empty node commands
  * memleak: osmo_config_list_parse: getline() needs free also on error
  * abis_test: sanitize: fix msgb memleak
  * lapd_test: sanitize: fix msgb memleaks
  * gsm0408_test: sanitize: cleanup msgb
  * gsm0808_test: sanitize: fix msgb memleak
  * msgb: add inline msgb_queue_free()
  * rate_ctr: fix mem leak for mangled desc
  * bssgp_fc_test: remove rounding to deciseconds
  * bssgp_fc_test: clarify by outputting ok / failure messages
  * bssgp_fc_test: sanitizer: free msgb context when done
  * gprs_bssgp: bssgp_fc_in(): fix mem leak on queue overflow
  * bssgp_fc_test: sanitize: free fc struct when done
  * tlv_put: guard against NULL val and 0 len
  * sercomm_test: sanitize: fix msgb mem leak
  * osmo_strlcpy: sanitize: don't memcpy from NULL src even if len is 0
  * fsm_tmr_cb: don't set T=0, the fi may no longer exist
  * vty XML export: avoid repeating common node commands for each node
  * VTY reference: do not list empty nodes
  * VTY reference: use node names as section names
  * vty: set name for VIEW+ENABLE nodes, for VTY reference
  * vty reference: merge_doc.xsl: do not omit description tag
  * comment: utils: more accurately describe OSMO_STRINGIFY macro
  * logging vty: describe 'logging set-log-mask' command, add OSMO_STRINGIFY_VAL()
  * fix osmo_identifier_valid(): only allow printable characters
  * utils: add osmo_separated_identifiers_valid()
  * add osmo_auth_c3() (separate from gsm_milenage())
  * utils: add osmo_escape_str()
  * ctrl_test.c: replace print_escaped() with new osmo_escape_str()
  * ctrl: prep test: separate new ctrl_handle_msg() from handle_control_read()
  * ctrl_test: expand to test message handling and detect mem leaks
  * ctrl_test: show memleak when receiving GET_REPLY and SET_REPLY commands
  * ctrl: fix mem leak when handling GET_REPLY and SET_REPLY
  * ctrl_test: add two more current parsing bugs to prep for fix
  * add ctrl_cmd_parse2() to return parsing errors
  * ctrl: on parse errors, return a detailed message to sender
  * rate_ctr: fix osmo-sgsn DoS: don't return NULL on already used index
  * ports: define proper VTY and CTRL ports for OsmoHNBGW
  * ctrl: tighten CTRL input parsing
  * ctrl: separate handling of GET_REPLY, SET_REPLY and TRAP
  * jenkins: add 'make V=1' for more verbose build logs
  * logging vty: tweak general 'logging' command doc
  * gsm: add gsm0808_speech_codec_type_names
  * logging-gsmtap: send only basename of source file
  * logging: add ability to log the log-level with API and vty
  * logging: color the log level
  * logging: color the log category according to level
  * fix -Werror build: logging.c: always use literal with snprintf
  * cosmetic: logging: if color is disabled, don't print ""
  * logging: separate the '<000b>' subsys from filename logging
  * logging: allow to log only the basename of each source
  * logging vty: add 'logging print file (0|1|basename)' cmd
  * vty: fix 'logging print file' output
  * gsmtap_sendmsg(): clarify API doc concerning msgb ownership
  * memleak: gsmtap_sendmsg(): don't return 0 when no data was written
  * memleak: fix all libosmocore callers of gsmtap_sendmsg() to free on failure
  * memleak: _gsmtap_raw_output(): free msg in case of vsnprintf failure
  * cosmetic: gsm0408_test: RA test cases as array-of-struct
  * gsm0408_test: cosmetically re-order MCC to come before MNC
  * gsm0408_test: include BCD and leading zeros in test output
  * gsm0408_test: RA test: include min/max value cases
  * gsm0408_test: also test gsm48_generate_lai() and gsm48_decode_lai()
  * implement support for 3-digit MNC with leading zeros
  * gsm0408_test: check for new mnc_3_digits flag
  * gsm0408_test: test new gsm48_{decode,generate}_lai2() functions
  * gsm0408_test: add test cases for MNC with leading zeros
  * gsm: add osmo_mnc_from_str(), osmo_mnc_cmp(), osmo_plmn_cmp() for 3-digit MNC
  * introduce GSM_MCC_MNC_INVALID
  * gsm23003_test: fix: compare members instead of bcmp
  * fix osmo_mnc_from_str(): don't try to parse NULL
  * gsm23003: add osmo_mcc_from_str()
  * configure: add --enable-werror
  * jenkins_amd64.sh: use --enable-werror configure flag, not CFLAGS
  * gsm0808_test: cosmetic: re-arrange struct init; print hexdump on failure
  * gsm0808_test: cosmetic: test non-hex MCC
  * show failure in gsm0808_enc_cell_id_list2() in gsm0808_test
  * fix gsm0808_enc_cell_id_list2 for leading-zero MNC
  * cosmetic: gsm0808_test: drop extraneous assertion
  * contrib/fsm-to-dot: add -h option to print basic instructions
  * contrib/fsm-to-dot: allow transition from and to the same state
  * contrib/fsm-to-dot: don't match on event names in comments
  * contrib/fsm-to-dot: warn and draw unallowed state transitions
  * contrib/fsm-to-dot: add default edge label '-'
  * contrib/fsm-to-dot: mark arrows that feed events
  * contrib/fsm-to-dot: less false positives on event parsing
  * contrib/fsm-to-dot: mark illegal states in red
  * contrib/fsm-to-dot: warn about identically named FSMs
  * vty/command.c: write_config_file(): sanely compose temp path
  * fix logging talloc ctx: add osmo_init_logging2()
  * ctrl: test deferred cmd, show current failure
  * ctrl: fix deferred commands (and hence fix osmo-bts-sysmo 'clock-info' cmd)
  * cosmetic: flatten ctrl_handle_msg()
  * fix ctrl_test sanitizer issues
  * use osmo_init_logging2() with proper talloc ctx
  * add osmo_quote_str(),osmo_quote_str_buf() and test
  * fsm_test: terminate the main loop instead of exit on timeout
  * osmo_fsm_inst_find_by_name(): guard against strcmp(NULL)
  * fsm_test: more thoroughly test FSM inst ids and names
  * fsm: id: properly set name in case of NULL id
  * cosmetic: osmo_fsm_inst_update_id(): don't log "allocate"
  * add osmo_fsm_inst_update_id_f()
  * add gsm48_reject_value_names
  * deprecate PLMN de-/coding functions incapable of 3-digit MNC with leading zeros
  * avoid warning in gsm0808_create_layer3
  * add osmo_cgi_name()
  * add gsm0808_cell_id_list_add() to combine two cell identifier lists
  * add tlv_parse2(), capable of multiple instances of the same IE
  * add gsm0808_{enc,dec}_cell_id
  * test_gsm0808_enc_dec_cell_id_list_lac(): validate encoded bytes
  * test_gsm0808_enc_dec_cell_id_list_lac(): populate all LACs
  * test_gsm0808_enc_dec_speech_codec_with_cfg: initialize properly
  * cosmetic: log: fix typo, clarify msg for rate_ctr name mangling
  * tlv: add TLV_GET() and TLV_GET_MINLEN()
  * add gsm0808_cell_{id,id_list}_name() and friends
  * gsm0808_test: fix more missing inits (address sanitizer issues)
  * gsm0808_test: silence deprecation: use gsm0808_create_layer3_2()

  [ Philipp Maier ]
  * vty: add port number for osmo-mgw
  * libosmocodec: add FR bit offset definitions
  * libosmocodec: implement ECU (Error Concealment Unit) for FR
  * fsm: fix double llist_del in osmo_fsm_inst_term()
  * socket: fix socket leak in osmo_sock_local_ip()
  * socket: use inet_ntop() instead of inet_ntoa() in osmo_sock_local_ip()
  * fsm: add functions for unlinking and changing parents
  * fsm: do not terminate child FSMs early
  * fsm: allow graceful exit on FSM termination
  * features: move bts feature related functionality to libosmocore
  * features: define osmo_bts_*_feature() as static inline
  * gsm_08_08: correct speech codec defaults
  * gsm0808: Add value strings for BSSMAP cause codes

  [ Pau Espin Pedrol ]
  * vty: Fix bad use of vector_slot()
  * gsm: Use correct include for getrandom
  * utils: Fix false positive in compiler warning
  * cosmetic: Fix trailing whitespace
  * Fix malformed Abis/RSL messages with extra L3 Information field
  * tests: coding_test: Fix compilation with -O0
  * tests: utils_test: Fix test failure when compiling with -O0
  * ports.h: Add VTY and CTRL ports for osmo-trx
  * core: Add timespec helper macros and make timer_compat.h public
  * core/logging.h: Add logging category for jitter buffer
  * timer: Introduce osmo_clock_gettime to override clock_gettime
  * timer: Document osmo_gettimeofday API
  * osmo-release.sh: Set correct version when generating the changelog
  * socket.c: osmo_sock_init2: bind: Several logic fixes and log improvements
  * socket.c: osmo_sock_init2: connect: Several logic fixes and log improvements
  * socket.c: osmo_sock_init: Several logic fixes and log improvements
  * msgb: msgb_get: Drop unneeded tmp var
  * msgb: msgb_pull: Abort when pulling more than avail size
  * osmo_get_macaddr: Fix buffer read out of bounds
  * osmo_sockaddr_is_local: Fix memleak
  * gsm_08_58.h: Add Ericsson vendor-specific RSL message types
  * osmo-release.sh: Remove temporary file TODO-RELEASE.entries after use
  * osmo-release.sh: Exit with error if no description for new changelog entry provided
  * osmo-release.sh: Fix error condition no LIBVERSION modified
  * osmo-release.sh: Always generate entire commit changelog
  * osmo-release.sh: Allow user to add extra information to the release commit
  * debian: libosmoctrl: Use correct library version in pkg name
  * debian/changelog: Fix typo in maintainer e-mail

  [ Holger Hans Peter Freyther ]
  * logging: Extend the LOGPSRC macro to put cont in it as well
  * license: Fix the license to GPL

  [ Alexander Couzens ]
  * counters: add osmo_counters_count() returns the amount of counters
  * vty: show asciidoc counters: don't create an empty table for osmo_counters
  * gsm_08_58.h: introduce RSL_IE_ERIC_PAGING_GROUP
  * gsm_utils: call gnutls_global_init() as constructor

  [ Jean-Francois Dionne ]
  * Fix LAPD UA msgb memory leak.

  [ Vadim Yanitskiy ]
  * libosmocodec: add FR/HR/EFR frame length definitions
  * ussd_test.c: fix rc / len debug output confusion
  * gsm0480: fix USSD OCTET STRING length confusion
  * gsm0480: clean up the parse_process_uss_req() code
  * gsm0480: handle UnstructuredSS Request with DSC != 0x0F
  * gsm0480: parse GSM0480_MTYPE_FACILITY separately
  * gsm0480: handle GSM0480_CTYPE_RETURN_RESULT
  * gsm0480: handle USS_NOTIFY and USS_REQUEST with PROCESS_USS_REQ
  * gsm0480: handle GSM0480_OP_CODE_PROCESS_USS_DATA
  * gsm0480: add specification reference to SS message type
  * gsm0480: pass exact GSM 04.80 payload length to parse_ss()
  * gsm0480: move SS request length check to parse_ss()
  * gsm0480: refactor gsm0480_decode_ss_request
  * gsm0480: correct parse_ss_info_elements() declaration
  * tests/ussd: fix wrong GSM 04.80 payload length
  * gsm0480: parse all SS info elements in a message
  * gsm0480: parse optional IEs for RELEASE COMPLETE message
  * tests/ussd: prevent uninitialized memory access
  * libosmocoding: fix typo in library documentation
  * libosmocoding: use frame length definitions from codec.h
  * src/msgb.c: cosmetic: fix spelling mistakes
  * src/msgb.c: remove dead includes from OpenBSC
  * src/msgb.c: print an error if msgb allocation failed
  * src/msgb.c: avoid using internal talloc API
  * gsm0480: document the 'ss_request' structure
  * gsm0480: copy the raw USSD data, its DCS and length
  * gsm0480: drop messages with incorrect data length
  * protocol/gsm_04_08.h: drop incorrect GSM48_PDISC_USSD
  * gsm/gsm48.c: add call independent SS message names

  [ Stefan Sperling ]
  * TLVP_PRESENT() should not return TRUE after tlv_parse() fails.
  * Add helper functions for ACC bit flags in rach control IE.
  * ensure that osmo_fsm vty commands are only installed once
  * print BIG FAT ERROR message if osmo_fsm lacks event names
  * ensure VTY commands don't segfault if an FSM has no event names
  * support for more cell ID list types in libosmocore
  * fix a cell identifier parsing bug in libosmocore
  * fix cell identifier decoding in libosmocore
  * use gsm48_decode_lai2() in gsm0808_dec_cell_id_list()
  * fix bug in parse_cell_id_ci_list()
  * fix parse_cell_id_lac_and_ci_list()
  * add a test for CELL_IDENT_WHOLE_GLOBAL cell identifier lists
  * add a regression test for TLV parsing with repeated IEs

  [ Sergey Kostanbaev ]
  * gsm0480: skip length check for 'RELEASE COMPLETE' message

  [ allesklar2 ]
  * gsmtap.h: define TETRA DMO mode channels

  [ Martin Hauke ]
  * build: Ensure all .pc files are installed

  [ Daniel Willmann ]
  * fsm: Add a function to change the FSM instance ID later
  * contrib/jenkins_arch.sh: Fix script comparison and arm support
  * fsm: Update the name as well if the id is updated and accept NULL

  [ Thorsten Alteholz ]
  * fix spelling
  * fix issue on big endian architecture

 -- Pau Espin Pedrol <pespin@sysmocom.de>  Thu, 03 May 2018 15:47:11 +0200

libosmocore (0.10.2) unstable; urgency=medium

  * Revert "vty: Fix bad use of vector_slot()"
  * New upstream release of libosmocore

 -- Harald Welte <laforge@gnumonks.org>  Thu, 02 Nov 2017 18:51:02 +0100

libosmocore (0.10.1) unstable; urgency=medium

  * New upstream release of libosmocore

 -- Harald Welte <laforge@gnumonks.org>  Sun, 29 Oct 2017 10:46:47 +0100

libosmocore (0.10.0+nmu1) UNRELEASED; urgency=medium

  * Non-maintainer upload.
  * New upstream release of libosmocore

 -- Harald Welte <laforge@gnumonks.org>  Fri, 27 Oct 2017 19:45:00 +0200

libosmocore (0.9.6) unstable; urgency=medium

  * doc: osmocom-authn-protocol.txt: fix numbering, mark unused sync msgs
  * New upstream release of libosmocore.

 -- Max <msuraev@sysmocom.de>  Tue, 13 Dec 2016 18:23:56 +0100

libosmocore (0.9.5) unstable; urgency=medium

  * fix: DLGSUP logging category "unusable"
  * New upstream release of libosmocore.
  * ph_data_param struct changed / Extend L1SAP PH-DATA with measurement information
  * size of ph_tch_param struct changed / Extend with RTP Marker
  * size of struct log_target changed / Extend with GSMTAP

 -- Max <msuraev@sysmocom.de>  Tue, 13 Dec 2016 18:22:56 +0100

libosmocore (0.9.4) unstable; urgency=medium

  * New upstream release of libosmocore.
  * Internal API for GPRS cipher implementors updated to accommodate for arbitrary key lengths
  * external talloc dependency / internal talloc removal
  * size of ph_data_param struct changed / Extend L1SAP PH-DATA with presence information

 -- Max <msuraev@sysmocom.de>  Tue, 13 Dec 2016 18:21:56 +0100

libosmocore (0.9.3) unstable; urgency=medium

  * Send all stats values after re-configuration.
  * Fix using an empty prefix.
  * Fix sending timing values.

 -- Holger Hans Peter Freyther <holger@moiji-mobile.com>  Mon, 09 Nov 2015 21:34:37 +0100

libosmocore (0.9.2) unstable; urgency=medium

  * Fix the counter index after the NS reset.

 -- Holger Hans Peter Freyther <holger@moiji-mobile.com>  Wed, 04 Nov 2015 14:47:48 +0100

libosmocore (0.9.1) unstable; urgency=medium

  * Fix rate_ctr attribute for GPRS NS counters.

 -- Holger Hans Peter Freyther <holger@moiji-mobile.com>  Wed, 04 Nov 2015 10:23:39 +0100

libosmocore (0.9.0) unstable; urgency=medium

  * StatsD support
  * Disable building of static libraries
  * GTP Hub and OAP ports/identifiers assigned

 -- Holger Hans Peter Freyther <holger@moiji-mobile.com>  Tue, 03 Nov 2015 09:31:41 +0100

libosmocore (0.8.3) unstable; urgency=medium

  * Prepare new release

 -- Holger Hans Peter Freyther <holger@moiji-mobile.com>  Sun, 23 Aug 2015 17:38:55 +0200

libosmocore (0.8.2) unstable; urgency=medium

  * Add endian header
  * GPRS flow control changes
  * Add APN format routines to libosmocore.

 -- Holger Hans Peter Freyther <holger@moiji-mobile.com>  Sat, 01 Aug 2015 20:18:45 +0200

libosmocore (0.8.0) unstable; urgency=medium

  * New upstream release of libosmocore.

 -- Holger Hans Peter Freyther <holger@freyther.de>  Sun, 18 Jan 2015 19:04:10 +0100

libosmocore (0.7.0) unstable; urgency=medium

  * New upstream release of libosmocore.

 -- Harald Welte <laforge@gnumonks.org>  Thu, 21 Aug 2014 15:52:00 +0200

libosmocore (0.6.6) UNRELEASED; urgency=medium

  * New upstream release of libosmocore.

 -- Holger Hans Peter Freyther <holger@freyther.de>  Mon, 31 Mar 2014 15:37:33 +0200

libosmocore (0.6.5) unstable; urgency=medium

  * New upstream release of libosmocore

 -- Holger Hans Peter Freyther <holger@freyther.de>  Mon, 20 Jan 2014 10:37:23 +0100

libosmocore (0.6.4+git3) unstable; urgency=low

  * GPRS fix NS connections to a SGSN when configured via VTY

 -- Jacob Erlbeck <jerlbeck@sysmocom.de>  Thu, 07 Nov 2013 16:07:20 +0100

libosmocore (0.6.4+git2) unstable; urgency=low

  * GPRS related changes, some GSM encoding/decoding changes
  * GPRS correctly determine routable NSVC.
  * Update with GPRS changes

 -- Holger Hans Peter Freyther <holger@freyther.de>  Thu, 10 Oct 2013 14:16:37 +0200

libosmocore (0.6.3+git1-1) unstable; urgency=low

  * New upstream release with new primitives, USSD fixes.
  * Split libosmocore into several package. One lib per package.

 -- Holger Hans Peter Freyther <holger@freyther.de>  Fri, 09 Aug 2013 17:47:30 +0200

libosmocore (0.6.2) unstable; urgency=low

  * New upstream release with NS UDP DSCP ABI changes

 -- Holger Hans Peter Freyther <holger@freyther.de>  Wed, 26 Jun 2013 08:01:55 +0200

libosmocore (0.5.3+git1-6) unstable; urgency=low

  * Build new package with the new API required for osmo-bts/openbsc
  * Package the arfcn utility.
  * Add the SOCK_RAW work-around for glibc.
  * Re-enable the debug packages thanks to Jan.

 -- Holger Hans Peter Freyther <holger@freyther.de>  Fri, 04 Jan 2013 09:54:55 +0100

libosmocore (0.5.3+git1-2) unstable; urgency=low

  * New upstream version

 -- Holger Hans Peter Freyther <holger@freyther.de>  Mon, 05 Nov 2012 21:35:57 +0100

libosmocore (0.5.3+git1-1) precise; urgency=low

  * Fix issue with package version.

 -- Eric Butler <eric@codebutler.com>  Tue, 14 Aug 2012 20:43:17 -0700

libosmocore (0.5.3+git1) precise; urgency=low

  * Updated debian package.

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

libosmocore (0.3.0) natty; urgency=low

  * New upstream version of libosmocore

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

libosmocore (0.1.27) natty; urgency=low

  * New upstream version of libosmocore.

 -- Holger Hans Peter Freyther <holger@freyther.de>  Thu, 13 Jan 2011 18:07:36 +0800

libosmocore (0.1.17-1) unstable; urgency=low

  * Initial release

 -- Harald Welte <laforge@gnumonks.org>  Tue, 24 Aug 2010 10:55:04 +0200
