libosmocore (1.9.0) unstable; urgency=medium

  [ Oliver Smith ]
  * gsm0808_dec_channel_type: add missing len check
  * test_gsm0808_enc_dec_channel_type -> …_speech
  * gsm0808_chan_indicator: add SPEECH_CTM_TEXT_TELEPHONY
  * gsm0808_enc/dec_channel_type: support data
  * Fix typo endianess -> endianness
  * Run struct_endianness.py
  * gsm0808_dec_channel_type: fix dec of ch_rate_type
  * tests: add test_gsm0808_enc_dec_channel_type_sign
  * gsm0808_enc/dec_channel_type: fix transparent flag
  * libosmocore.map: add tall_{ctr/msgb}_ctx
  * rsl: put values for Channel Mode into enums
  * rsl: RSL_CMOD_CSD_T: make enum values consistent
  * gsm0808: make CSD enum values consistent with RSL
  * on_dso_load_select: run after on_dso_load_ctx
  * debian: set compat level to 10
  * debian: depend on liburing-dev for debian >= 11
  * contrib/libosmocore.spec: centos7: disable uring
  * debian: fix build on ubuntu 20.04 without liburing

  [ Neels Hofmeyr ]
  * add contrib/talloc_count.sh
  * add osmo_prim_operation_name()
  * add gsm0808_amr_modes_from_cfg
  * improve test output for gsm0808_sc_cfg_from_gsm48_mr_cfg()
  * fix 'make vty-test' for --disable-gb
  * fix 'make vty-test' for --disable-external-tests --enable-gb
  * contrib/talloc_count.sh: improve hexadecimal masking
  * error log: osmo_sock_init2_multiaddr() v4/v6 mix
  * logging vty: probe 'print' and 'logging timestamp' cmds
  * vty: show bug in implicit go_parent_node
  * vty: fix vty->index for implicit go_parent_node
  * vty: move struct vty_parent_node to private API
  * gsm: add osmo_mobile_identity_decode_from_l3_buf()
  * gsm_04_08_gprs: add IEI "GMM TMSI Based NRI Container"
  * improve API for osmo_routing_area_id

  [ Max ]
  * socket: propagate error in osmo_sock_unix_init() to the caller
  * GSMTAP: fix typo
  * GSMTAP: add gsmtap_source_init*2()
  * GSMTAP: add missing parameter docstrings
  * logging: print talloc report on exit from vty test

  [ Philipp Maier ]
  * i460_mux.c fix apidoc
  * i460_mux: make osmo_i460_subchan_count public
  * gsmtap_util: remove whitespace at the end of line
  * i460_mux: add define constant for maximum number of subchannels
  * codec: add define constants for RFC5993 and TS101318
  * gprs_bssgp_rim: also print NSEI when sending RIM messages
  * gprs_bssgp_rim: allow sending of encoded RIM messages
  * gprs_bssgp_rim: add decoder for RIM ROUTING ADDRESS

  [ Vadim Yanitskiy ]
  * gsm: fix invalid check in gsm48_decode_ssversion()
  * gsm: add missing features to osmo_bts_features_names[]
  * gsm: ensure completeness of osmo_bts_features_{descs,names}[]
  * gsm/{bsslap,bssmap_le}: zero-initialize structs using memset()
  * msgb: use OSMO_ASSERT in msgb_alloc_headroom[_c]()
  * gsm: use OSMO_ASSERT() in osmo_iuup_msgb_alloc_c()
  * debian/control: make libosmocore-doc depend on libosmo{ctrl,gb}-doc
  * debian/control: fix typo
  * doxygen: also generate documentation for libosmo{sim,usb}
  * contrib/struct_endianness.py: simplify file extension check
  * doxygen: remove documentation for non-existent params
  * doxygen: fix various typos in commands \param and \returns
  * gsm0502: add burst length definitions from chapter 5.2
  * coding: clean up Makefile.am
  * utils/Makefile.am: remove duplicate libosmogsm.la
  * utils/Makefile.am: do not overwrite AM_CFLAGS
  * utils/osmo-stat-dummy/Makefile.am: drop empty variables
  * gsmtap: add missing entries to gsmtap_type_names[]
  * tests/v110: assert(user_data_chunk_bits) in test_ra1()
  * isdn: fix identical operands in v110_adapt_IR8000_to_2400()
  * gsm_04_08: document/clarify enum gsm48_chan_mode values
  * gsm_04_08: add more enum gsm48_chan_mode speech values
  * gsm_04_08: add more enum gsm48_chan_mode data values
  * gsm0808: handle new enum gsm48_chan_mode speech/data values
  * tests: make VTY tests depend on the respective binaries
  * fixup (partial revert): "coding: clean up Makefile.am"
  * core: remove unnecessary #include <osmocom/core/talloc.h>
  * libosmocore.map: add missing symbols needed for osmo-qcdiag
  * coding: fix doxygen doc for _xcch_encode_cB()
  * copyright: fix typo: sysmocom s/s.m.f.c./s.f.m.c./ GmbH
  * coding: use GSM_MACBLOCK_LEN gsm0503_tch_fr_decode()
  * coding: gsm0503_tch_f96_[de]interleave() not applicable to TCH/F2.4
  * coding: declare gsm0503_tch_f96_[de]interleave()
  * coding: fix API doc: TCH/H needs 6 bursts, not 8
  * coding: fix API doc: TCH/AFS vs TCH/AHS
  * coding: use gsm0503_tch_hr_decode2() in coding_test
  * gsm: fix convolutional code definition for TCH/F4.8
  * coding: implement TCH/F9.6, TCH/[FH]4.8, TCH/H2.4, TCH/F14.4
  * coding: implement dedicated codec API for FACCH/[FH]
  * coding: test FACCH/[FH] bitstealing in test_csd()
  * coding: fix _tch_csd_burst_map(): do not overwrite FACCH
  * struct osmo_sub_auth_data: remove OSMO_DEPRECATED_OUTSIDE
  * coding: fix a copy-paste bug in gsm0503_tch_afs_decode_dtx()
  * gsm: add gsm0502_fn2ccch_block()
  * gsm0502: cosmetic: use ARRAY_SIZE in gsm0502_fn2ccch_block()
  * ipa: fix a typo in ipa_ccm_rcvmsg_base(): PING -> PONG
  * core: fix pointer access in msgb_l[1-4] macros
  * coding: remove redundant memset()s in gsm0503_tch_fr{96,144}_encode()
  * coding: implement encoding/decoding API for TCH/F2.4
  * lapdm: cosmetic: simplify lapdm_phsap_up(), use OSMO_PRIM[_HDR]
  * gsm_08_08: define GSM0808_SCT_EXT (separately)
  * gsm48_ie: fix gsm48_encode_bearer_cap(): encode bcap->data.transp
  * isdn: mux_timeslot_provide_bits(): remove unused 'count'
  * .gitignore: add include/osmocom/core/socket_compat.h
  * tests/{v110,gsm44021}: change naming: 'test_' -> '_test'
  * gsm_12_21.h: add flags for NM_ATT_IPACC_SUPP_FEATURES
  * gsm_12_21.h: fix typo: NM_IPAC_F_CHANT_P{C->D}CHF

  [ Pau Espin Pedrol ]
  * gsm_04_60.h: Better describe origin of enum osmo_gprs_nmo
  * Move libosmogsm TS 44.060 declarations under include/osmocom/gsm/
  * libosmogb.pc.in: Fix missing dependency on libosmogsm
  * gsm: gsm_gsmtime2fn(): constify param
  * cosmetic: stats_tcp: Fix typo in comment
  * logging: Unregister osmo_fd before closing fd
  * select: Optimize osmo_fd_get_by_fd
  * select.c: Clarify osmo_fd_(un)register() API expectations of registered fd
  * select.c: Clarify osmo_fd_unregister() can only be called on registered osmo_fds
  * configure.ac: Fix logic enabling osmo_fd fd checks
  * configure.ac: Fix typo in enable flag description
  * select.c: osmo_fd_unregister(): Avoid assert hit with old buggy users of the API
  * tests/Makefile.am: Move system libs at the end of list
  * tests/Makefile.am: Drop duplicated libosmogb.la in LDADD
  * tests/Makefile.am: Move LDADD to right position
  * logging.c: Sanitize calls to osmo_fd_unregister()
  * Fix parsing of TLV_TYPE_SINGLE_TV
  * gsm: Add missing TS 24.008 SM layer IEs
  * gsm_04_08_gprs.h: Add missing GMM IEs for T3302 and T3346
  * gsm_04_08_gprs.h: Add enum field for GMM 'P-TMSI type' IE
  * gb: ns2: Rename parameter name in gprs_ns2_nsvc_by_sockaddr_bind()
  * tlv: Show bug in decoded tlv_parsed for type TLV_TYPE_SINGLE_TV
  * Fix 'Fix parsing of TLV_TYPE_SINGLE_TV'
  * ns2: Count transmitted/dropped in each layer implementation
  * cosmetic: codec/Makefile.am: list sources one file per line
  * osmo_io: Make name optional, add _set_name() API
  * socket: Cache errno before calling further functions
  * gsm0502.h: Document spec number
  * gsm: Add missing IE definition for GMM Receive N-PDU Number list
  * exec: osmo_system_nowait2(): Improve logging and error checks
  * sockaddr_str: Introduce macro OSMO_SOCKADDR_STR_FMT_ARGS_NOT_NULL
  * cosmetic: lapdm: Fix typo in comment
  * tlv: Introduce API msgb_tv32_push()
  * lapdm: Track fn of primitives in struct lapdm_msg_ctx
  * gsm: Introduce functions to convert between FN and RFN (Reduced FN)
  * socket: Add osmo_sock_init flag to enable SCTP ASCONF features
  * rsl: Introduce new osmocom extension IE RSL_IE_OSMO_ABS_FRAME_NUMBER
  * lapdm: Append RSL_IE_OSMO_ABS_FRAME_NUMBER to RSLms msgs towards upper layers
  * Revert "lapdm: Append RSL_IE_OSMO_ABS_FRAME_NUMBER to RSLms msgs towards upper layers"
  * Revert "rsl: Introduce new osmocom extension IE RSL_IE_OSMO_ABS_FRAME_NUMBER"
  * lapdm: Update public lapdm_msg_ctx upon CCCH data ind
  * socket: Avoid aborting socket creation if setsockopt for ASCONF fails
  * gsm_12_21.h: Introduce packed structs for NM_ATT_IPACC_RLC_CFG{,_2,_3} values
  * gsm_12_21.h: Introduce packed structs for NM_ATT_IPACC_BSSGP_CFG values
  * gsm_12_21.h: Introduce packed structs for NM_ATT_IPACC_NS_CFG values
  * socket: Remove OSMO_SOCK_F_SCTP_ASCONF_SUPPORTED, add osmo_sock_init2_multiaddr2()
  * socket: Support setsokopt SCTP_INITMSG in osmo_sock_init2_multiaddr2()

  [ Matan Perelman ]
  * gsm0808_enc_channel_type: Add spare byte

  [ Harald Welte ]
  * Implement the XOR-2G authentication algorithm
  * New unit test for XOR-2G authentication
  * Rename OSMO_AUTH_ALG_XOR to OSMO_AUTH_ALG_XOR_3G
  * convolutional coding for CSD
  * Interleaving for CSD
  * libosmocore.map: Add two missing entries for gsmtap*2() API
  * Makefile.am: Make libraries depend on .map files
  * isdn: Add V.110 encoder/decoder
  * gsm: TS 44.021 modified V.110 frame encoding/decoding support
  * gsm_08_58: Document IPAC RTP CSD modes in at least a few words
  * New osmo-gsmtap-logsend utility
  * gsmtap.h: Define a packet type for encapsulation of GSM RLP frames
  * rate_ctr: Add rate_ctr_add2() similar to rate_ctr_inc2()
  * Add osmo_io with initial poll backend
  * Add osmo_gsm48_si1ro_nch_pos_{encode,decode} functions
  * cosmetic: Fix spec reference in RSL header file
  * gsm_08_58.h: Add 'struct rsl_ie_nch_drx_info'
  * libosmogsm: Support authentication with 256-bit K and/or OP/OPc
  * libosmogsm: Add OSMO_ASSERT() to ensure correct algorithm
  * libosmogsm: Ensure MILENAGE + XOR-3G K length is 128 bit
  * osmo-auc-gen: Convert over to osmo_auth_gen_vec*2 API
  * libosmogsm: Allow auth API caller to specify RES length
  * libosmogsm: Factor out the C2 derivation function
  * libosmogsm: Avoid executing MILENAGE crypto twice (for UMTS and GSM)
  * libosmogsm: Add support for TUAK authentication algorithm
  * gsmtap_source_free(): Don't crash if NULL is passed

  [ Daniel Willmann ]
  * Add libosmocore.map
  * Add osmo_sockaddr_size() to return the size of the variant used
  * tests: Add initial osmo_io tests
  * osmo_io: Avoid read of uninitialized variable
  * gpsr_ns2_udp: Use osmo_io_fd instead of osmo_fd
  * osmo_io: Improve handling and documentation of segmentation_cb
  * osmo_io: Support detecting non-blocking connect()
  * osmo_io: Consistency - put read/recv callback first in osmo_io_ops
  * osmo_io: Don't make msg in write_cb const
  * osmo_io: Remove osmo_iofd_read/write_enable/disable
  * socket: Ensure fd is not negative in osmo_sock_get_name_buf()
  * osmo_io: Return early on error in osmo_iofd_register()
  * osmo_io: Use LOGPIO instead of LOGP
  * osmo_io: Use bitfield for various boolean flags
  * osmo_io: Make the test more deterministic between backends
  * osmo_io: Fix write_enable handling in iofd_txqueue
  * osmo_io: Remove missing functions from map file
  * osmo_io: Add osmo_iofd_notify_connected()
  * osmo_io: Document expectation that segmentation_cb() can modify msgb
  * osmo_io: Add function to change the maximum length of the tx_queue
  * cosmetic: Fix doc comment
  * osmo_io(cosmetic): End in a dot for doxygen AUTO_BRIEF
  * osmo_io: Fix length calculation in iofd_handle_segmentation()
  * osmo_io: Ensure correct ownership of msgb when sending
  * osmo_io: Use MSG_NOSIGNAL to avoid SIGPIPE on write
  * osmo_io: Add iofd_handle_recv()
  * osmo_io: Avoid potential double free when sending msgb
  * osmo_io: Add io_uring backend
  * ns2: Add VTY option to change the max write queue size for UDP
  * osmo_io: Change parent of msghdr to iofd (instead of msg)
  * osmo_io: Use local variable to reference msghdr->msg

  [ Eric ]
  * fix _thread order
  * logging: remove log_initialized(void)
  * gsm48_rest_octets: fix wrong value

  [ Mychaela N. Falconia ]
  * codec: add osmo_efr_check_sid() function
  * codec: add SID classification functions per GSM 06.31 & 06.81
  * codec: add SID preening functions for FR & EFR
  * codec: add osmo_{fr,efr}_is_any_sid() inline functions
  * codec: add osmo_gsm611_silence_frame[] datum
  * codec cosmetic: move old FR ECU code to ecu_fr_old.c
  * codec: replace GSM-FR ECU with new implementation
  * coding: fix decoding of EFR triplicated bits
  * gsm0503_tch_hr_decode(): look at all 8 stealing bits
  * gsm0503_tch_hr_encode(): accept both TS101318 and RFC5993 payloads
  * gsm0503_tch_hr_decode2(): new function, emits TS101318 format
  * libosmocoding.map: export gsm0503_tch_hr_decode2()
  * coding cosmetic: gsm0503_tch_{fr,hr}_encode(): remove extra spacing
  * codec: new functions osmo_{fr,efr}_sid_reset()
  * codec: new function osmo_hr_sid_reset()
  * coding: gsm0503_tch_{fr,hr}_encode(): add ability to emit BFI
  * ecu: add is_dtx_pause() method

  [ arehbein ]
  * core: Check return value of osmo_fd_register()
  * core: Add function to update osmo_io_ops field for osmo_io_fd
  * core/osmo_io: Rename variables for readability
  * core/osmo_io: Fix reception of partial packets
  * gsm/ipa: Add segmentation callback
  * Revert "gsm/ipa: Add segmentation callback"
  * select: Prevent negative index lookup on osmo_fd_lookup.table

  [ Andreas Eversberg ]
  * ASCI: Add 3GPP TS 44.068 and 44.069 protocol definitions
  * ASCI: Add IE transcoding according to 3GPP TS 48.008
  * Added generation of include/osmocom/core/socket_compat.h
  * ASCI: Add message definition and encoding according to 3GPP TS 48.008
  * Add support for sending Bter UI frames at lapdm.c
  * Add support for receiving Bter UI frames at lapdm.c
  * Add short L3 header to gsm_04_08.h
  * Fix short L3 header of SI 10 at gsm_04_08.h
  * ASCI: Add Notification/NCH message to gsm_04_08.h
  * lapdm: Do not return an error when enqueuing a frame
  * Add VGCS UPLINK GRANT message structure to gsm_04_08.h
  * ASCI: Also display group/broadcast call message names
  * Allow 'configure <cr>' at VTY to enter config mode
  * ASCI: Add decoding of mobile identity in TALKER INDICATION
  * ASCI: Add missing check for return value of gsm0808_enc_speech_codec_list2()
  * ASCI: Add BCC call state definitions
  * LAPDM: Use correct offset to short header on recevied frame
  * ASCI: Add definition for TALKER INDICATION and UPLINK RELEASE

  [ Sylvain Munaut ]
  * gsm: Fix comment for TCH/F4.8 code
  * gsm: Improve the TCH/H2.4 coding routines

 -- Pau Espin Pedrol <pespin@sysmocom.de>  Tue, 12 Sep 2023 13:15:52 +0200

libosmocore (1.8.0) unstable; urgency=medium

  [ Vadim Yanitskiy ]
  * fix uninitialized err pointer passed to osmo_bssap_le_dec()
  * gsm0408_test: do not return early in test_bearer_cap()
  * gsm0408_test: add a testcase for gsm48_decode_bearer_cap()
  * gsm48_ie: fix coding style: while is not a function
  * gb: fix uninitialized ptr access in bssgp_encode_rim_pdu()
  * fsm: add unit tests verifying state timeout s/ms accuracy
  * fsm: fix state_chg(): pass microseconds to osmo_timer_schedule()
  * tests/tdef: assert pointer returned by osmo_tdef_get_entry()
  * gb/gprs_ns: call osmo_timer_del() unconditionally
  * fsm: osmo_fsm_{event,inst,state}_name(): make *fi pointer const
  * logging: add a new category DLCSN1 for libosmo-csn1
  * {gb,sim,usb}: ensure -no-undefined is present in *_la_LDFLAGS
  * include: use '#pragma once' everywhere
  * gsm0502: use parentheses in GSM_TDMA_FN_{SUM,SUB} macros
  * configure.ac: fix 'AM_CONDITIONAL(ENABLE_GNUTLS, false)' listed twice
  * {gsm,gb}/Makefile.am: drop undefined $GCC_FVISIBILITY_HIDDEN
  * gsm0502: gsm0502_fn_remap(): use GSM_TDMA_FN_SUB() macro
  * */Makefile.am: do not mix up AM_CFLAGS with AM_CPPFLAGS
  * gsm0808: cosmetic: switch is not a function
  * gsm0808: remove unneeded assignment in enc_speech_codec()
  * gsm0808: remove redundant assert() in enc_speech_codec()
  * gsm0808: remove over-defensive assert()s for function parameters
  * gsm0808: add gsm0808_enc_speech_codec[_list]2()
  * gsm0808: use new gsm0808_enc_speech_codec[_list]2() API
  * gsm48_ie: gsm48_decode_freq_list(): make 'cd' argument const

  [ Pau Espin Pedrol ]
  * iuup: Explicitly mark default case as unexpected with assert
  * cbsp: avoid potential msgb write overflow in osmo_cbsp_recv_buffered
  * gsm_23_041.h: Define CBS ETWS Warning Type values
  * cbsp: Return error if decoding any of the cell id lists fail
  * tests: Run smscb/gsm0341_test during make check
  * cbsp: Guard against malformed msgb without l1h,l2h being passed
  * cbsp: Fix decoding of Fail List
  * cosmetic: tlv.h: Fix trailing whistespace
  * tlv.h: Fix TLVP_PRESENT returning a pointer instead of a boolean
  * gsm: Add BTS feature for Osmux
  * gsm: rsl: Define new osmocom extension TLV IE to pass Osmux CID
  * gsm: bts_features: Add missing entries to osmo_bts_features_names
  * utils.h: protect param with parenthesis in OSMO_BYTES_FOR_BITS()
  * vty: Allow using hex representations in cmd numeric ranges
  * socket.h: Reorder sockaddr APIs to have them all together
  * socket: Introduce API osmo_sockaddr_is_any
  * gsm: constify several readonly params
  * ctrl: error if program forgot to initialize the ctr handler before installing cmds
  * socket.h: Introduce API osmo_sockaddr_netmask_to_prefixlen()
  * Move src/*.{c,h} to src/core/
  * src/core/Makefile.am: reformat SOURCES list
  * Split include/Makefile.am content into subdirs
  * Makefile.am: Remove unexsiting all_includes variable
  * Fix all references to config.h
  * Introduce netns API
  * Introduce netdev API
  * Introduce tundev API
  * configure --enable-libmnl: Add libmnl to libosmocore.pc.in Requires
  * netdev: Fix compilation building with --disable-libmnl
  * tun: Fix potential unpaired call to osmo_netns_switch_exit()
  * gprs_ns2_fr: use osmo_netdev to monitor and operate network device
  * debian/rules: Fix moved path crc*gen.c

  [ Mychaela Falconia ]
  * gsm48_ie: fix parsing of Bearer capability IE without octet 3a

  [ Harald Welte ]
  * sim/class_tables: Add GET IDENTITY, SUSPEND UICC, EXCHANGE CAPABILITIES
  * allocate VTY port number 4270 for osmo-isdntap
  * logging.h: Allocate DLM2PA and DLM2UA for libosmo-sigtran
  * Support building with -Werror=strict-prototypes / -Werror=old-style-definition
  * Disable -Wstrict-prototypes for logging_vty_add_cmds()
  * vty/logging.h: Avoid -Werror=pragmas error in C++ code
  * Add -Werror=implicit-int -Werror=int-conversion -Werror=old-style-definition
  * Fix typos in copyright statements.
  * gsmtap.h: Add definitions for various ISDN sub-types
  * create libosmoisdn sub-library
  * isdndlc: Fix documentation

  [ Oliver Smith ]
  * gsm0808_enc_aoip_trasp_addr: add length check
  * utils/osmo-stat-dummy: check for ENABLE_UTILITIES
  * d/control: libosmocore-dev: depend on libmnl-dev
  * gsm_08_08.h: fix typo in GSM0808_DATA_FULL_PREF

  [ Alexander Couzens ]
  * gprs_ns2: add vty `nse <0-65535> restart sns`
  * gb: add bssgp2_enc_flush_ll encode FLUSH-LL

  [ Neels Hofmeyr ]
  * enrich API doc for gsm0808_speech_codec
  * gsm0408_test: do not print errno in expected output
  * comments: gsm_08_08.h: AMR cfg: explain in much more detail
  * osmo_tdef_get(): clarify API doc on val_if_not_present

  [ Max ]
  * Ignore osmo-ns-dummy
  * Add function to guess AF_UNSPEC address
  * Add osmo_sockaddr_strs_to_str()
  * cosmetic: remove trailing space
  * cosmetic: make linter happy with LAPD code
  * LAPD: log unknown format value
  * LAPD: use bool for T200 reset flags
  * msgb: expand copy test
  * doc: correct typo in ticket reference
  * msgb: introduce extended copy functions
  * Add define for unset Frame Number
  * LAPD: move tx_hist code into static functions
  * osmo-ns-dummy: add ctrl interface
  * jenkins_arm.sh: disable external tests
  * vty: fix doc typo
  * telnet_init_dynif: propagate error
  * telnet_init_dynif: don't allow negative port
  * rate_ctr: convert to timerfd
  * rate_ctr: drop rate estimation code
  * osmo-stat-dummy: add rate counters and statsd tester
  * ctrl: add optional port to bind command
  * ASCI: add VBS/VGCS support to BTS features list
  * SI: add RR short PD message types
  * Fixup .gitignore
  * SI: add missing header
  * Add SI10 support

  [ neels ]
  * Revert "Add osmo_sockaddr_strs_to_str()"
  * Revert "Add function to guess AF_UNSPEC address"

  [ Daniel Willmann ]
  * use_count: Return if uc is NULL

  [ Keith Whyte ]
  * Fix LCLS-CONNECT-CONTROL generation
  * Fix Typo in gsm0808_msgt_names[]

  [ Philipp Maier ]
  * msgb: assert msgb->lXh to be not NULL
  * msgb: do not use msgb_l4 instead of msgb_sms
  * bits: fix typo
  * uitils: add floored and euclidian modulo functions
  * gsm0408_test: add unittest for gsm_gsmtime2fn()
  * gsm_utils: improve gsm_gsmtime2fn()

  [ arehbein ]
  * gb/vty: Show if NSVC is blocked locally by O&M/vty or by remote
  * libosmocore: Deprecate APIs telnet_init(_dynip)()
  * libosmocore:  Transition to use of 'telnet_init_default'

  [ Eric ]
  * bitgen test: fix concat macro

 -- Pau Espin Pedrol <pespin@sysmocom.de>  Tue, 07 Feb 2023 11:20:41 +0100

libosmocore (1.7.0) unstable; urgency=medium

  [ Vadim Yanitskiy ]
  * .gitignore: add utils/osmo-aka-verify binary
  * tests/vty: fix use of GNU 'missing =' extension in designator
  * debian/control: minimum version of libtalloc-dev must be >= 2.1.0
  * tests/tdef: rename the binaries to end with '_test'
  * tdef: fix wrong path in documentation: tests/vty -> tests/tdef
  * bitvec_read_field(): indicate errors using errno
  * bitvec_read_field(): fix incorrect bit-shift issue found by UBSan
  * bitvec_read_field(): optimize by expanding bytenum_from_bitnum()
  * tests/testsuite.at: ensure empty stderr for the bitvec_test
  * VTY: enable talloc introspection for OTC_GLOBAL
  * VTY: implement 'no log gsmtap [HOSTNAME]' command
  * contrib/libosmocore.spec.in: mention osmo-config-merge in utils
  * gsm_7bit_encode_n(): use regular malloc() instead of calloc()
  * tests/logging: ensure both stream and wqueue modes are tested
  * tests/logging: also test printing the filename information
  * logging: fix coding style issues in _output_buf()
  * logging: fix printing of '\0' when filename printed last
  * tests/logging: merge both logging_test_{stream,wqueue}.err
  * core/utils.h: add OSMO_LIKELY / OSMO_UNLIKELY macros
  * core/utils.h: wrap OSMO_ASSERT() with do { ... } while (0)
  * core/msgb.h: make use of OSMO_LIKELY / OSMO_UNLIKELY
  * core/utils.h: make use of OSMO_LIKELY in OSMO_ASSERT
  * libosmocodec: osmo_hr_check_sid(): simplify the logic
  * contrib/jenkins_amd64.sh: remove FreeBSD specific quirks
  * bssmap_le: support additional IEs in Perform Location Request
  * Use internal <osmocom/core/talloc.h> everywhere
  * coding: fix comments for detect_afs_sid_{first,update,onset}
  * coding: cosmetic: move 'dtx_prev' to the scope where it's used
  * coding: use switch statement in gsm0503_tch_a[fh]s_decode_dtx()
  * coding: properly handle AFS_SID_UPDATE frames in DTX mode
  * coding: prevent marking FACCH frames as AMR's special DTX frames
  * tests/dtx: test detection/decoding of A[FH]S_SID_UPDATE
  * tests/dtx: test tagging of FACCH/[FH] frames
  * coding: fix decoding of AHS_SID_UPDATE frames (BER ~50%)
  * coding: do not reset codec ID on receipt of DTX frames
  * coding: add gsm0503_detect_a[fh]s_dtx_frame2()
  * coding: separate gsm0503_tch_a[fh]s_decode_inband()

  [ Eric ]
  * fix isdigit taking unsigned as input
  * logging: allow disabling macros using a new define: LIBOSMOCORE_NO_LOGGING

  [ Daniel Willmann ]
  * bssgp_bvc_fsm: Move log message to the correct place
  * bssgp_bvc_fsm: Add a hook to notify when a reset was acknowledged

  [ Harald Welte ]
  * logging: Fix memory leak in case async log write queue overflows
  * write_queue: Document it that caller is responsible if enqueue fails
  * gsmtap: Add gsmtap_sendmsg_free() as alternative to gsmtap_sendmsg()
  * Introduce CRC and FSM for IuUP (user plane) as used in 3G RTP data
  * tcp_stats: fix compilation on CentOS 7
  * iuup: Fix signed/unsigned loop counter control flow issue
  * src/conv.c: Align better with Osmocom coding style
  * bitvec: Fix -Wsign-compare warnings
  * utils: Fix -Wsign-compare warnings
  * log_taget_find() should use enum log_target_type, not int
  * bits.c: Fix -Wsign-compare warnings
  * socket, select: Fix -Wsign-compare warnings
  * msgb: Fix -Wsign-compare warnings
  * osmo_libusb: Fix NULL check in osmo_usb_removed_cb()
  * osmo_libusb: Use libusb_get_pollfds() to get initial file descriptors
  * osmo_libusb: Print log message on libusb initialization error
  * gsm0808: Test if we properly decode a SRVCC cell identifier list
  * usb: Match device by VID/PID without path/addr if it is unique
  * clean-up pkg-config files: Make use of "Requires" as documented
  * debian/control: libosmocore-dev must depend on libsctp-dev and libusb-1.0-0-dev
  * libosmo{gb,vty}.pc.in: Add talloc to 'Requires'
  * libosmocore.spec: Make libosmocore-devel require libsctp
  * libosmovty: Link libosmovty against libpthread
  * vty: Support platforms that don't support pthread_getname_np()
  * vty: Add a 'skip-zero' version of 'show stats' and 'show rate-counters'
  * stats: Functions with no arguments should specify(void)
  * stats: Avoid NULL pointer deref in allocation failure paths.
  * stats: don't try to save unknown stats reporter types
  * fsm_vty: use unsigned int when left-shifting 31 bits!
  * update git URLs (git -> https; gitea)

  [ Eric Wild ]
  * logging: make LIBOSMOCORE_NO_LOGGING work as expected

  [ Oliver Smith ]
  * treewide: remove FSF address
  * select_main: don't poll forever during shutdown
  * Cosmetic: linuxlist.h: fix misleading comment

  [ Philipp Maier ]
  * stats: fix typo
  * stat_item: tolerate NULL pointer argument in osmo_stat_item_group_free
  * select: gather statistics for TCP connections
  * stats_tcp: use a default batch size of 5 instead of 1
  * stats_tcp: fix stats item identifier
  * gsm23003: fix docstring for osmo_plmn_from_bcd()
  * iuup: do not use illegal characters in state/event names.
  * logging: log to stderr when logging is not initialized
  * reader: more meaningful null pointer check in get_sw

  [ Pau Espin Pedrol ]
  * include/: Adapt some headers to match contrib/struct_endianess.py format
  * logging: Fix Not enough tailroom msgb_put in _output_buf callers
  * osmo-release.sh: Use variable containing bumpversion path everywhere
  * iuup: Fix decoding of 1byte-length subflow size fields
  * iuup: Submit RNL-STATUS-Initialization.ind upon rx of Init
  * iuup: Improve CRC checksum error logging
  * gsm: [ABI BREAK] Support CellId SAI, change CellId CGI-PS id number
  * gsm: lapd_core:  Change log line NOTICE->INFO
  * gsm0808_test: Add new unit test showing dec error
  * gsm0808: Fix decoding of IE GSM0808_IE_LCS_CLIENT_TYPE
  * cosmetic: gsm_08_08.h: Add space between assignment sides
  * gsm0808: Add missing IEs in bss_att_tlvdef
  * jenkins: Validate IEs are added to tlv_definition
  * libosmocore.pc.in: put libsctp in Requires.private
  * configure: Support libsctp < 1.0.17 without libsctp.pc
  * rsl: Fix tlv_parse of IPAC_DLCX_IND message
  * jenkins: Validate gsm 08.58 IEs are added to tlv_definition
  * gsm: Introduce helper rach_tx_integer_raw2val()
  * cosmetic: logging.h: fix indentation
  * gsm_12_21.h: Fix abis_nm_avail_state InTest and Failed values
  * gsm_12_21.h: Add header description pointing to TS files
  * coding: Refactor function to avoid gcc false positive warn
  * osmo-arfcn: Fix false positive in gcc 12.1.0
  * coding: Use ARRAY_SIZE macro
  * iuup: Rework API to support RFCI IDs != RFCI index
  * cosmetic: iuup.h: Fix indentation
  * iuup: Fix IPTIs_present not set to 0 if no IPTIs received
  * cbsp: Add enum and value string for Cause
  * iuup: Add missing state to bitmask for st SMpSDU_Data_Transfer_Ready
  * iuup: Drop unused events
  * tests/iuup: Showcase IuUP stack not answering subsequent Init msgs
  * iuup: Fix Handling of subsequent Initialization msgs
  * vty: command.c: Add assert

  [ Sylvain Munaut ]
  * conv: Fix the traceback for tail biting codes
  * build: Disable libusb and libmnl for embedded builds

  [ Neels Hofmeyr ]
  * PFCP: add DLPFCP and osmo-upf port numbers
  * ports.h: add osmo-pfcp-tool ports
  * add osmo_sockaddr_to_str_c(), osmo_sockaddr_to_str_buf2()
  * log: socket.c: rather use the osmo_sockaddr_str _FMT
  * add osmo_quote_str_buf3, osmo_escape_str_buf3
  * add osmo_sockaddr_from/to_octets()
  * follow-up to osmo_sockaddr_from/to_octets()
  * BSSAP: HO Request Ack: add missing Codec List (BSS Supported)
  * add osmo_sockaddr_set_port()
  * osmo_time_cc: rate_ctr presence should not affect counting
  * cosmetic tweak in Makefile.am

  [ Michael Iedema ]
  * stats: use tcp stat names as provided

  [ Karsten Ohme ]
  * APDU parsing support for GlobalPlatform

 -- Pau Espin Pedrol <pespin@sysmocom.de>  Tue, 28 Jun 2022 17:00:51 +0200

libosmocore (1.6.0) unstable; urgency=medium

  [ Pau Espin Pedrol ]
  * osmo-release.sh: Check configure.ac dependency versions match those in rpm *.spec.in
  * osmo-release.sh: Drop repeated DRY_RUN early exit
  * osmo-release.sh: Check LIBVERSION matches rpm *.spec.in
  * osmo-release.sh: Properly rearrange var init and sanity checks
  * tests/gb: Fix printf format errors on ARM 32 bits
  * Skip RPM checks if no *.spec.in available
  * gsm_08_08.h: Add extra field elements defined in other sections
  * cosmetic: tlv_parser: fix typo in func description
  * cosmetic: Fix trailing whitespace
  * gsm: Support Sending Last EUTRAN PLMN Id in Handover Required
  * cosmetic: fix typo in comment
  * gsm0808: Introduce gsm0808_old_bss_to_new_bss_info_att_tlvdef
  * osmo_timer_pending: Make arg const
  * gb: Fix naming and export symbol bssgp_enc_rim_pdu
  * Revert "gb: Fix naming and export symbol bssgp_enc_rim_pdu"
  * gb: Fix missing exporting symbol bssgp_encode_rim_pdu
  * vty: Implement missing public API host_config_file()
  * vty: Introduce API vty_read_config_filep
  * range_enc_determine_range(): Don't dereference array on size=0
  * stat,rate_ctr: Introduce new API to get counter at given index
  * Use new stat item/ctr getter APIs
  * stat,rate_ctr: Allow setting group name and use it at report time
  * ns2: Use NSVC bufid in stats report
  * ipaccess: Add new osmo extension IPAC_PROTO_EXT_PCU
  * bts_feature: Introduce feature to speak to PCU
  * msgb_alloc_headroom: Change size args to be uint16_t
  * ctrl: Pre-calculate required size before allocating msgb
  * ctrl: Support recovering from short write
  * cosmetic: gsm_12_21.h: Fix trailing whitespace
  * Rename osmo dyn ts enums
  * bts_feature: Introduce feature to confiure dyn ts as sdcch8
  * Make gcc 11.1.0 false positivies happy
  * cosmetic: gb/gprs_ns.c: fix trailing whitespace
  * gb/bssgp: Abort clearly if backward-compat API is used in wrong way
  * utils: Fix c++ warn in OSMO_STRBUF_APPEND
  * cosmetic: Fix missing space in comment
  * gsm_08_58.h: Extend IPA Power Control Params IEs to pass C/I params
  * gsm: Mark gsm0858_rsl_ul_meas_enc() pointer param const
  * cosmetic: gsm: meas_rep.h: Fix typo in comment
  * logging: Change LLAPD category color to purple-like one
  * {ctrl,vty}/ports.h: Allocate ports for osmo-hnodeb
  * configure.ac: Depend on talloc 2.1.0
  * logging: Fix double lock of log_tgt_mutex
  * contrib/libosmocore.spec.in: Depends on talloc 2.1.0
  * osmo-release.sh: Blacklist script file from LIBVERS matches

  [ Oliver Smith ]
  * osmo-release.sh: support epoch
  * tests/stats: enable logging in test output
  * stats: log error when missing stats values
  * Revert "stats: log error when missing stats values"
  * stat_item: make next_id argument name consistent
  * stat_item: add comment with struct overview
  * stat_item: make value ids item specific
  * stats_test: restore stat_item_get_next asserts
  * stats: log error when missing stats values (v2)
  * stats: have_value is a bool, not int
  * vty: add "show uptime"
  * vty: add "show pid"
  * vty: add "shutdown"
  * vty: show uptime: use timespecsub
  * vty: clear screen with ^L
  * vty/ports: prepare formatting for a long define
  * vty/ports: move pcap server/client ports
  * tests: add 'make update_exp' target
  * tests/stats: show how last item sent may be wrong
  * stats: send real last value if no new values come

  [ Alexander Couzens ]
  * gprs_bssgp: add support for SGSN oriented RESET
  * gprs_bssgp: use BVCI_SIGNALLING/BVCI_PTM instead of 0/1
  * gprs_ns2: don't OSMO_ASSERT() while freeing NS-VC.
  * gprs_ns2: rework logging of Rx and Tx NS PDU
  * gprs_ns2: always use the same method to print NSVCs
  * gprs_ns2_vty: hide dynamic NSE information when ask for persistant only
  * gprs_ns2_vty: make the `show ns entities` and `show ns binds` look similiar
  * gprs_ns2: dump_nsvc: correct indention
  * gprs_ns2: add vty command `nsvc <nsvci> reset`
  * gprs_ns2: fix memory leaks when receiving SNS or invalid packets
  * gprs_ns2: vty: remove a white space in `show binds`
  * gprs_ns2: nsvc_fsm: reorder notification st_alive_on_enter()
  * gprs_ns2: sns: ensure the sns->alive state is correct
  * gprs_ns2: sns: remove the initial SNS NSVC if it's not part
  * gprs_ns2_vty: print a response to vty `nsvc <nsvci> (block|unblock|reset)
  * gprs_ns2: fix nsvc block and unblock vty command
  * gprs_ns2: SNS: allow transition missing transition GPRS_SNS_ST_UNCONFIGURED
  * gprs_ns2: add functions for SNS add/del/change-weight messages
  * gprs_ns2: sns: fix del bind()
  * gprs_ns2: vty: fix removing a bind from a SNS
  * gprs_ns2: rework id strings of nsvcs
  * gprs_ns2_sns: move selection of the next bind into own function
  * gprs_ns2_sns: bss: improve validation of configuration
  * gprs_ns2_sns: refactor local and remote entries into a struct
  * gprs_ns2_sns: refactor ns2_clear_ipv46_entries_local to use new elems functions
  * gprs_ns2_sns: use struct ns2_sns_elems in add/update/remove remote_elems
  * gprs_ns2_sns: move gss->remote specific check out of add_ip4_elem/add_ip6_elem
  * gprs_ns2_sns: add check for duplicates to add_ip6_elem()
  * gprs_ns2_sns: refactor ip4_weight_sum/ip6_weight_sum
  * gprs_ns2_sns: refactor nss_weight_sum_data -> ip46_weight_sum_data
  * gprs_ns2_sns: replace ns2_sns_type with address family
  * gprs_ns2_sns: bss: set gss->family
  * gprs_ns2: use llist_add_tail to keep order
  * gprs_ns2: fix missing notify towards the NSE when NSVC become blocked
  * gprs_ns2_vc_fsm: reset the ALIVE response time when stopping test
  * gprs_ns2: fix crash when changing the MTU
  * gprs_ns2: fix check of MTU changes for frame relay
  * gprs_ns2: correct mtu value in the log line
  * gprs_ns2: use gprs_ns2_free_bind() to clean up a bind
  * gprs_ns2: fix wrong format string in Tx Size logline
  * gprs_ns2_vty: dump_nsvc: change output depending on NSVCI
  * gprs_ns2: ensure the NSE becomes dead when FR link went down
  * gprs_ns2_udp: don't start the NSVC fsm for SNS
  * gprs_ns2_sns: refactor SNS failures into a function
  * gprs_ns2_sns: free the NSE if the SIZE PDU is not valid
  * gprs_ns2: add recursive anchor to protect against double free
  * gprs_ns2: move sns_event into internal.h to direct emit events
  * gprs_ns2_sns: rework sns clean up
  * gprs_ns2: use an event to free the nsvscs when using SNS
  * gprs_ns2: gprs_ns2_free_bind() should remove itself before removing nsvcs
  * gprs_ns2: don't use llist_for_each when freeing an element
  * gprs_ns2_sns: implement local change weight procedure
  * gprs_ns2_sns: implement outbound SNS ADD procedures
  * gprs_ns2_sns: implement outbound SNS DEL procedures
  * gprs_ns2: also prevent recursive events when SGSN side cleans up
  * gprs_ns2: calculate the nse->*_sums before notifing the sns fsm
  * gprs_ns2: add correct filename/linenr to sns failed log message
  * gprs_ns2: improve reselection protection
  * gprs_ns2_sns: ensure the SNS fsm behave correct when no signalling NSVCs are present
  * gprs_ns2: ensure the incoming NSVC is also the outgoing NSVC
  * ns2: nsvc: reject UNITDATA  when the remote BLOCK'ed
  * ns2: fix a crash when receiving a SIZE while configured
  * gprs_ns2: fix NS STATUS validation
  * gprs_ns2: fix a white space
  * gprs_ns2: nsvc: react on STATUS PDUs with cause code NSVC UNKNOWN/NSVC BLOCKED
  * vty: add vty_out_uptime() print the uptime to the vty
  * ns2: nse: add a uptime/downtime to track the last state change
  * ns2: nsvc: add a uptime/downtime to track the last state change
  * ns2: message: BLOCK/BLOCK ACK allow to use a given NSVCI instead of using the nsvc nsvci
  * ns2: ensure the NSVC is in the correct mode for NSVC UNKNOWN/NSVC BLOCKED cause codes
  * ns2: fsm: add comment don't answer on a STATUS with a STATUS
  * ns2: message: allow to pass a foreign NSVCI to STATUS PDU
  * ns2: correct parse a STATUS PDU which was received over a different NSVC
  * ns2: improve log line when receving a PDU with wrong NSE
  * ns2: don't forward an invalid RESET PDU to the FSM
  * ns2: correct parse a BLOCK PDU which was received over a different NSVC
  * include: add enum for UTRAN cipher

  [ Harald Welte ]
  * cosmetic: ssn: some more comments
  * gprs_ns2: Log all transmitted SNS messages
  * gprs_ns2_sns: Dispatch inbound SNS-ACK to FSM
  * gprs_ns2: Remove any references to DNS; we use DLNS in NS2.
  * gprs_ns2: Pass peer/remote sockaddr argument to ns2_create_vc()
  * TODO-RELEASE: Request increasing _LAST_OSMOVTY_NODE next release
  * gprs_ns2_sns: Implement error log in case no binds found for NSE
  * gprs_ns2_sns: Remove TODO (spec agrees, the correct cause code is used)
  * gprs_ns2_vty: Clarify VTY help string wording
  * gprs_ns2_sns: refactor ns2_sns_st_size_onenter()
  * gprs_ns2_sns: Unify handling of SNS-CONFIG for IPv4 + IPv6
  * gprs_ns2: Encapsulate setting NSE dialect
  * gprs_ns2_sns: Split allstate action in generic and BSS-specific part
  * utils: osmo-aka-verify to verify UMTS AKA (SIM side)
  * osmo-aka-verify: Fix use case with OP and not OPc
  * gprs_ns2_sns: Support for SGSN-side IP-SNS
  * gprs_ns2_sns: Add some more OSMO_ASSERT about BSS role
  * gprs_ns2_sns: Rename BSS-side states to include 'bss' in name
  * gprs_ns2: Introduce gprs_ns2_create_nse2() for SGSN side SNS
  * gprs_ns2_vty: Allow creating NSE in sgsn-role
  * gprs_ns2_sns: Don't clear remote IP endpoints in SGSN role
  * gprs_ns2_sns: Verify mandatory IE presence in incoming SNS-SIZE
  * gprs_ns2_sns: SNS-SIZE contains the actual number of local endpoints
  * gprs_ns2_sns: Assume the SGSN has a very large number of max. NSVC
  * gprs_ns2_sns: Implement checks during processing of inbound SNS-SIZE
  * gprs_ns2_vty: Permit VTY configuration of bind->accept_sns
  * gprs_ns2: dynamic NS-VC + NSE creation for IP-SNS in SGSN role
  * gprs_ns2_sns: Allow VTY configuration of default binds for IP-SNS
  * gprs_ns2: Add comments explaining the nsvc->sns_only field
  * gprs_ns2_vc_fsm: In IP-SNS/ALIVE mode, initial state is ALIVE/UNBLOCKED
  * gprs_ns2: Actually start Tns-test after SNS-CONFIG creates NS-VC
  * gprs_ns2_sns: Compute local endpoints before using them
  * gprs_ns2_sns: remove code duplication in create_missing_nsvcs()
  * gprs_ns2_sns: Don't create NS-VCs for binds outside the NSE
  * gprs_ns2_sns: Fix memory leak when creating ip[46]_local arrays
  * sim: Obtain card ATR when opening the card
  * sim: Remove 'printf' from library code
  * frame_relay: Export osmo_fr_network_free()
  * ns2: Dump frame relay state to VTY during "show ns"
  * socket: Introduce osmo_sock_set_dscp() to set socket DSCP value
  * ns2: Fix setting the DSCP value.
  * socket: Introduce osmo_sock_set_priority() helper function
  * socket: reduce code duplication, introduce socket_helper_tail()
  * socket: QoS support for all our socket init functions
  * socket: IPv6 support for osmo_sock_set_dscp()
  * gprs_ns2: Fix yet another DSCP vs. TOS mix-up
  * gprs_ns2_frgre: Ensure DSCP is sin premitted value range
  * ns2: migrate from osmo_sock_set_dscp() to OSMO_SOCK_F_DSCP()
  * gprs_ns: Fix another DSCP vs. TOS mistake in old NS code
  * ns2: Allow setting the socket priority for a UDP bind
  * Fix ipa_ccm_make_id_resp_from_req
  * Fix ipa_ccm_make_id_resp_from_req to work at all
  * ipa_ccm_make_id_resp: Make it work at all
  * ns2: change the 'priority' setting name to 'socket-priority'
  * osmo_sock_*_ofd(): Mark OSMO_FD_WRITE on non-blocking connect()
  * sim: Add osim_card_{reset,close}() API
  * osmo-auc-gen: Permit specifying the SQN in hex (0x12345) format
  * copy base64 implementation from mbedtls
  * base64: Migrate over to osmocom
  * base64: reformat using Lindent to conform to our coding style
  * osmo-auc-gen: Print RFC3310 IMS HTTP-AKA style base64 nonce/res
  * logging: Change stderr + file target to use non-blocking write
  * logging: Avoid memcpy from stack to msgb in _file_output()
  * logging: Attempt a synchronous, non-blocking write first (file, stderr)
  * rate_ctr: Make it safe to call rate_ctr_init() several times

  [ Daniel Willmann ]
  * stats: Ensure that each osmo_stat_item only reports once per interval
  * tlv: Fix length returned by t{l16,16l}v_put
  * stats_vty: Improve generation of osmo counters
  * ns2: Ignore NSVC with data_weight 0 for data
  * Aggregate NSVC stats inside the NSE
  * ns2: Avoid use-after-free when SGSN-side non-persistent SNS-NSE fails
  * frame_relay, gprs_ns2_fr: Fix log messages, remove unused struct

  [ Vadim Yanitskiy ]
  * utils/osmo-aka-verify: fix swapped CK/IK arguments
  * vty/logging: use consistent quiting in warning messages
  * vty/logging: ensure consistent '%' prefix for warnings
  * vty/logging: logp: properly handle library specific sub-systems
  * protocol/gsm_08_58.h: add RSL_CMOD_SP_{GSM4,GSM5,GSM6}
  * protocol/gsm_08_58.h: add more 'Channel rate and type' values
  * protocol/gsm_08_58.h: add asymmetric CSD data rates
  * gsm/abis_nm: add missing NM_OC_IPAC_* value-string entries
  * rsl: make rsl_dec_chan_nr() more readable, use RSL_CHAN_NR_MASK
  * gsm_08_58.h: add Osmocom specific Bm/Lm CBITs for VAMOS
  * gsm_08_58.h: add mask for Osmocom specific VAMOS C-bits
  * fsm: cosmetic: fix weird spacing in osmo_fsm_inst_alloc()
  * stats_vty: also show rate counter group name (if present)
  * bts_features: add feature for BCCH carrier power reduction mode
  * fix rsl_chan_nr_str_{buf,c}(): enlarge the buffer size
  * utils: remove misleading comments for osmo_hexdump[_nospc]_c()
  * utils: introduce osmo_talloc_replace_string_fmt()
  * gsm_08_58: extend struct abis_rsl_osmo_temp_ovp_acch_cap
  * Revert "Prevent GCR encoder/decoder functions from being used directly"
  * gsm/protocol/gsm_44_004.h: fix missing include of 'endian.h'
  * gsm/protocol/gsm_04_08.h: add gsm48_meas_res_is_valid()
  * tests/stats: add VTY transcript tests
  * stats: use llist_add_tail() in osmo_stats_reporter_alloc()
  * stats: allow configuring reporter's name in the VTY
  * stats: cosmetic: print 'stats interval' before the reporters
  * stats: don't mark reporter as 'disable' beforehand
  * stats: clarify error messages in cfg_no_stats_reporter_{statsd,log}

  [ Neels Hofmeyr ]
  * add BTS_FEAT_VAMOS
  * deprecate osmo_bts_feature_name(), add osmo_bts_features_desc()
  * add osmo_bts_features_names: short BTS feature strings
  * RR: add VAMOS channel modes
  * RR: add missing Extended TSC Set IE
  * gsm48_mr_cfg_from_gsm0808_sc_cfg(): drop bitmask without effect
  * fix default_timeout type of osmo_tdef_fsm_inst_state_chg default_timeout
  * add RSL_IE_OSMO_TRAINING_SEQUENCE
  * add RSL_CMOD_CRT_OSMO_TCH_VAMOS_Bm, RSL_CMOD_CRT_OSMO_TCH_VAMOS_Lm
  * fixup for gsm48_chan_mode_to_non_vamos()
  * osmo_select_shutdown_request(): allow finishing pending writes on SIGTERM
  * add Kc128 to gsm0808 Create Ciphering Command
  * gsm0808: add Kc128 to Handover Request
  * add fixme: enforce 8 byte length of Kc
  * fix api doc of osmo_identifier_sanitize_buf()
  * vty 'stats reset': do not reset stat_items
  * utils: add osmo_str_to_int() and osmo_str_to_int64()
  * add osmo_stat_item_get_group_by_name_idxname()
  * CTRL: expose stat_item groups on CTRL
  * stat_item: cosmetic: s/desc/group_desc in osmo_stat_item_group_alloc()
  * stats_test: assert counter and stat item val counts separately
  * refactor stat_item: get rid of FIFO and "skipped" error
  * refactor stat_item: report only changed values
  * cosmetic: get rid of 3 deprecation warnings
  * revisit some calls of strtol(), stroul(), strtoull()
  * add osmo_time_cc, moved from osmo-bsc

  [ Eric ]
  * kdf: add key derivation functions
  * vty: allow flushing
  * gsmtap: allow 127.0.0.x local listeners

  [ Michael Iedema ]
  * ns2: use same name in ctr_group as stat_item_group

  [ Philipp Maier ]
  * control_cmd: fix typo
  * vty: make function cmd_range_match() public
  * linuxlist: add macro to get last element of a list
  * command: fix sourcecode formatting
  * codec: add missing osmo_amr_type_name function.
  * gsm0503_coding: use ahs tables when encoding ahs codec id
  * rsl: add new RSL IE to signal temporary overpower
  * bts_features: Add new feature to indicate support for temporary overpower
  * gsm_08_58: fix sourcecode formatting
  * gsm_08_58: fix sourcecode formatting

  [ Keith ]
  * GPRS: Add PDP_TYPE_N_IETF_IPv4v6

 -- Pau Espin Pedrol <pespin@sysmocom.de>  Tue, 16 Nov 2021 13:08:22 +0100

libosmocore (1.5.1) unstable; urgency=medium

  [ Pau Espin Pedrol ]
  * osmo-release.sh: Fix rc!=0 on TODO-RELEASE file without comment lines

  [ Harald Welte ]
  * attempt to fix RPM spec file after recent soversion bump

 -- Harald Welte <laforge@osmocom.org>  Wed, 24 Feb 2021 09:35:21 +0100

libosmocore (1.5.0) unstable; urgency=medium

  [ Vadim Yanitskiy ]
  * debian/control: change maintainer to the Osmocom team / mailing list
  * vty/command: cosmetic: simplify conditions in in config_list_cmd
  * vty/command: cosmetic: fix formatting of config_help_cmd
  * vty/command: cosmetic: drop redundant line break
  * vty/command: fix switch / case coding style in vty_go_parent()
  * vty/command: cosmetic: swap i and j in vty_dump_element()
  * gsm0808: add gsm0808_create_sapi_reject_cause()
  * macaddr: fix osmo_get_macaddr(): return -1 if no device is found
  * macaddr: fix osmo_macaddr_parse(): return meaningful error codes
  * lapdm_pad_msgb(): cosmetic: use GSM_MACBLOCK_PADDING
  * lapd_test: fix wrong comment in lapdm_establish()
  * lapd_test: rename func=UA (RR) CM Service Request: s/ua/ua_cm/
  * lapd_test: fix: print all messages to stdout, not stderr
  * lapd_test: add a test checking SAPI0/SAPI3 prioritization
  * lapdm: fix SAPI-0/SAPI-3 frame prioritization on DCCH
  * logging: refactor and simplify log_target_destroy()
  * logging: fix log_target_destroy(): properly close syslog
  * logging: fix memleak in log_target_create_file()
  * vty: fix 'Unsigned compared against 0' generate_cpu_hex_mask()
  * gsm0808: fix: do not encode invalid encryption algorithm
  * vty: add program specific attributes to VTY commands
  * vty: print program specific attributes in the XML reference
  * vty: cosmetic: drop redundant 'break' statements
  * vty: cosmetic: s/width/cmd_width/g in vty_describe_command()
  * vty: cosmetic: fix missing curly braces in vty_describe_command()
  * vty/command: introduce new attribute CMD_ATTR_IMMEDIATE
  * vty/command: reflect global attributes in the XML reference
  * tests: do not ignore stderr of vty_test, also match it
  * vty: check for duplicate flags in application specific attributes
  * vty: check for reserved flags in application specific attributes
  * vty/command: add global command attribute CMD_ATTR_NODE_EXIT
  * vty/command: add CMD_ATTR_LIB_COMMAND and install() API wrappers
  * vty: use install_lib_element() and install_lib_element_ve()
  * vty/command: introduce API for the library specific attributes
  * vty: introduce and use VTY_CMD_USR_ATTR_NUM
  * vty/command: introduce a command to list attributes
  * vty/command: print attribute flags in the output of 'list'
  * tests/vty: verify 'show vty-attributes' / 'list' commands
  * vty/command: assign flags to CMD_ATTR_{IMMEDIATE,NODE_EXIT}
  * vty/command: restrict the use of '.', '!', and '@' as flags
  * vty: fix vty_dump_element(): do not print empty <attributes>
  * socket: make the arguments of osmo_sockaddr_cmp() const
  * gprs_ns2: make struct osmo_sockaddr pointers const
  * rsl: rsl_chan_nr_str_buf(): use ABIS_RSL_CHAN_NR_CBITS_* macros
  * logging: introduce 'systemd-journal' target
  * vty: introduce the expert mode and a command to enable it
  * vty/command: make some 'struct cmd_element' pointers const
  * vty/command: introduce vty_dump_xml_ref_mode()
  * vty/command: add CMD_ATTR_HIDDEN to CMD_ATTR_PUBLIC_MASK
  * application: do not document unrelated forward-declarations
  * vty/command: fix: restrict the expert mode to the current session
  * fix spelling in 'value_string' arrays: existAnt -> existEnt
  * gsm48: add missing RR cause value definitions
  * vty/command: add 'hidden only' VTY reference generation mode
  * bts_features: add missing description for BTS_FEAT_ACCH_REP
  * core/linuxlist: do not use 'new' as a parameter name
  * protocol/gsm_08_58.h: add ip.access Power Control structures
  * protocol/gsm_08_58.h: add Osmocom specific EWMA AVG algo
  * logging: revert color of LGLOBAL category back to white
  * gsm_08_58: fix wrong field order in 'struct ipac_preproc_pc_thresh'
  * gsm_08_58: add flexible array member to 'struct ipac_preproc_ave_cfg'
  * gsmtap_util: SNR can be negative, use a signed integer
  * gprs_ns2_sns: always check rc of osmo_sockaddr_str_from_sockaddr()
  * gprs_ns2_fr: fix resource leaks due to early return in set_ifupdown()
  * gprs_bssgp: fix uninitialized struct fields in bssgp_create_rim_ri()
  * bts_features: s/Repeation/Repetition/ in osmo_bts_features_descs[]
  * gprs_bssgp: abuse gsm48_encode_ra() to encode TAC
  * fixup: configure.ac: fix: do not define HAVE_NEON unconditionally
  * gsm_7bit_encode_n(): test encoding of more than 250 septets
  * gsm_7bit_encode_n(): fix integer overflow in gsm_septets2octets()
  * gsm0808: use msgb_tv16_put() and osmo_store32be()
  * bssgp_bvc_fsm: check return value of osmo_fsm_register()
  * tlv: add msgb_tv32_put(), similar to msgb_tv16_put()
  * tlv: clarify documentation for msgb_tv{16,32}_put()

  [ Eric ]
  * vty cpu sched: do not assert if sched impossible
  * pkgconfig: link to mnl if available

  [ Pau Espin Pedrol ]
  * vty: Fix cpu-sched VTY node name
  * sock: osmo_sock_init2_multiaddr: decouple addr resolution from socket creation
  * socket: multiaddr: Support IPv4 + IPv6 addresses in SCTP associations
  * socket: Log proper getaddrinfo() error
  * osmo_sock_get_ip_and_port(): Support IPv6 sockets
  * l1sap.h: Fix typo in doxygen documentation
  * osmo_sock_inti2_multiaddr: Fix memleak and free uninitialized mem
  * socker: Remove AI_ADDRCONFIG from getaddrinfo flags
  * tests: Split SCTP tests to its own file and run them conditionally
  * ipa: Fix wrong output log formatting
  * socket: Allow binding to :: (IPv6) and connecting to IPv4-only on the remote
  * socket: Add support for AF_INET6 in osmo_sockaddr_to_str_and_uint()
  * socket: Use AF_UNSPEC instead of PF_UNSPEC calling getaddrinfo
  * socket: Fix stack-buffer-overflow in osmo_sock_local_ip()
  * socket: fix wrong ipv6 dst buf size passed in osmo_sock_local_ip
  * socket: Add some osmo_sockaddr print helpers
  * tests: Add test to showcase osmo_sock_init2 bug with AF_UNSPEC
  * socket: Fix bug in osmo_sock_init2(AF_UNSPEC) matching IP versions
  * logging: Avoid printing OSMO_LOGCOLOR_END if no color was used
  * osmo_strlcpy: Avoid calling memcpy with size=0
  * osmo_strlcpy: Clarify length calculation
  * cosmetic: Fix typo in API doc
  * gprs_ns2_udp: Avoid dangling freed struct in list if binding fails
  * vty: Fix left shifting out of range on signed variable
  * cosmetic: vty: Fix trailing whitespace
  * gsm: Fix make distcheck with parallel make
  * contrib: jenkins: Enable parallel make in make distcheck
  * lapdm: Drop log lines printing fmt=B
  * lapdm: Split lapd_rx_u() spaghetti into one function per message type
  * lapdm: Allow SABM L=0 in Timer Recovery State
  * gb: ns2_sns: Fix missing trailing newline char in log line
  * gb: ns2_sns: Add missing value_string entry for GPRS_SNS_EV_NO_NSVC
  * vty: Mark cpu_sched_vty commands with attr immediate
  * tdef: Introduce OSMO_TDEF_US unit
  * tests: Fix tdef_test on 32bit platforms
  * bitvec: Fix left shifting out of range on signed variable
  * cosmetic: serial: Fix typo in comment
  * serial: Fix typo in debug log line
  * serial: Log error if tcgetattr() or tcsetattr() fail
  * serial: Introduce API osmo_serial_speed_t
  * Revert "tests: Fix tdef_test on 32bit platforms"
  * tests: Fix tdef_test on 32bit platforms
  * statsd report: Fix wrong fmt specificier generating wrong stats
  * gsm: Add enum for Network Feature Support IE
  * Include mnl.h iif --enable-libmnl
  * gb: Import mnl.h iif --enable-libmnl
  * bssgp: Remove newly added log line warning about NOOP
  * rest_octets: add Serving Cell Priority Parameters
  * gsm: si13: Fix encode of EGPRS_PACKET_CHANNEL_REQUEST
  * si2quater: fix budget calculation for multiple EARFCNs
  * gsm: append_eutran_neib_cell: Fix SI2quater EARFCN list
  * GPRS Cell Options (SI13): Add REL-4 CCN_ACTIVE bit
  * Revert "rest_octets: fix encoding of 3G Early Classmark Sending Restriction"
  * rest_octets: Fix decoding of SI3 3G Early Classmark Sending Restriction
  * gitignore: Ignore *~
  * ctrl: Allow handling CTRL get/set replies in user defined code
  * Intoduce Packet Switch CGI
  * ctrl: ports.h: Add OSMO_CTRL_PORT_BSC_NEIGH
  * gsm: Add missing osmo_*_cmp symbols to libosmogsm.map
  * gsm: Introduce osmo_{rai,cgi_ps}_cmp() APIs
  * gprs_bssgp_prim.h: Add missing includes
  * Revert "gprs_ns2: drop gprs_ns2_vty, rename vty2 -> vty"
  * ctrl_connection: Initialize write_queue.bfd.fd to -1 during allocation
  * cosmetic: fix typo in comment
  * gsm: Fix wrong length in SI13 GPRS Cell Options IE
  * gsm: bts_features: Introduce BTS_FEAT_CCN
  * Fix struct bitfields on big endian systems
  * cosmetic: Move comment one line below in append_gprs_cell_opt
  * gsm: Fix bitfield order in dtap_header
  * comsetic: gsm0808_test: Fix trailing whitespace
  * gsm: Support converting to cgi-ps in gsm0808_cell_id_from_cgi()
  * gsm0808_utils: Move static function further up in file
  * gsm: Fix encoding of gsm0808_cell_id_list2 with CGI-PS types
  * logging: gsmtap: Fill PID field for each message
  * Introduce osmo_gettid() API
  * logging: gsmtap: Fix fill PID field not stored in network byte order
  * logging: gsmtap: Store TID instead of PID in pkt hdr
  * gsm: Introduce API osmo_gsm48_rest_octets_si13_decode
  * logging: Allow prefixing thread ID to each log line
  * tests: Set print_category values explicitly
  * Drop use of log_set_print_filename() API inside libosmocore
  * logging: Deprecate API log_set_print_filename
  * osmo-release.sh: Omit tab whitespace matching debian/control versions

  [ Harald Welte ]
  * gsmtap: Add definitions for E1/T1 payload (LAPD, TRAU, FR) in GSMTAP
  * Add VTY + CTRL ports for upcoming OsmoSMLC
  * gprs_ns2_sns: Fix compilation on Debian 8
  * ipaccess.h: Add more enum values and 'official' names
  * ns2: Improve/extend doxygen comments for new ns2 implementation
  * ns2: Use NULL and not '0' when returning a NULL-Pointer
  * gprs_ns2: Mark gprs_ns2_validate_* as static
  * write_queue: Add osmo_wqueue_enqueue_quiet()
  * write_queue: use msgb_{en,de}queue_count()
  * write_queue: Re-enqueue msgb if write_cb returns -EAGAIN
  * logging_vty: set osmo_stderr_target to NULL on "no log stderr"
  * logging: Introduce MAX_LOG_SIZE for the magic number 4096
  * bssgp: Don't include RA-ID in BVC-RESET for BVCI=0 (signalling)
  * bssmap_le/bsslap tests: We must use %td for ptrdiff_t printing
  * osmo_float_str_to_int: When using strtoll(), use LLONG_{MAX,MIN}
  * gprs_ns2: Fix parsing of SNS-{ADD,DEL,CHANGE_WEIGHT}
  * gsm48_rest_octets: Add parser for SI4 rest octets
  * [cosmetic] rest_octets: Follow coding style regarding {}
  * ns2: More verbose comments on gprs_ns2_vc_mode
  * select: Introduce osmo_fd_{read,write}_{enable,disable}()
  * select: Migrate over to poll()
  * card_fs_usim.c: Add support for DF.5GS directory
  * Revert "gsm_04_08: add parser for Mobile Station Classmark 3"
  * card_fs_usim: Add definitions of DF.ProSe and DF.ACDC
  * bssgp: Input argument to bssgp_tlv_parse() should be 'const'
  * ns2: permit multiple nsvci in one nse in VTY
  * frame_relay: Fix some spelling/language issues
  * Revert "ns2: permit multiple nsvci in one nse in VTY"
  * gprs_ns2_vty: Fix VTY documentation errors
  * frame_relay: Fix null pointer dereference in DLC/PVC delete
  * frame_relay: Fix error path on ioctl() failure
  * gprs_ns2: Introduce gprs_ns2_lltype_str() for link layer name
  * gprs_ns2_fr: Print Frame Relay 'role' in VTY
  * gprs-ns2: Fix stringification of NS/FR NSVCI
  * gprs_ns2: Don't return an empty string in case of unknown LL
  * cosmetic: frame_relay: Fix typos
  * gprs_ns2: Print link layer and global ALIVE/DEAD state
  * gprs_ns2_vty: Differentiate 'show ns binds' and 'show ns entities'
  * gprs_ns2_vty: Show NSVCI in dump_nsvc()
  * gprs_ns_vty: Unify display of NSVCI on VTY in 'show ns entities'
  * gprs_ns2_vty: Print all relevant data on each NS-VC
  * gprs_ns2_udp.c: Fix typo - it's a DSCP and not a DCSP
  * Integrate libmnl (minimal netlink) library with libosmocore select loop
  * gprs_ns2_fr: Monitor the kernel net-device link state
  * gsm_08_18.h: Update enums for message types and IEs with Release 15
  * gprs_ns2_vty: Re-introduce a 'show ns' command
  * libosmogb: Add missing LIBMNL_CFLAGS
  * mnl: Use mnl_socket_open() insatead of mnl_socket_open2()
  * gprs_ns2_fr: remove include <linux/if.h>
  * bssgp: Use TLVP_PRES_LEN instead of TLVP_PRESENT
  * gprs_ns2: Use TLVP_PRES_LEN instead of TLVP_PRESENT
  * bssgp: Update bssgp_pdu_strings with Release 15
  * bssgp: Fix typo in BSSGP Message Type enum
  * Add hlist and hashtable from Linux kernel
  * Use explicit type-casting in hlist_del() for C++ compatibility
  * gsm_08_18.h: Add some PDU definitions still missing
  * hash/log2: Add generic implementations of fls() and fls64()
  * log2.h: Use uintXX_t instead of kernel specific types
  * log2.h: Avoid redefining __always_inline
  * ns2: Accept NS-UNBLOCK-ACK in UNBLOCKED state
  * Introduce 'osmo_tlv_prot' abstraction for validation of TLV protocols
  * tlv: Introduce enum with error codes for TLV parser functions
  * bssgp: Add osmo_tlv_prot_def for BSSGP
  * gsm_08_18.h: Add #defines for [extended] feature bits
  * tlv.h: Add msgb_tvlv_put_{16,32}be()
  * logging: Introduce DLBSSGP logging constant
  * gb: Add beginnings of a new BSSGP implementation
  * logging: Assing different 8bit colors to built-in subsystems
  * bssgp2: Encoding + Decoding functions for BVC and MS flow control
  * bssgp_bvc_fsm: Add basic BVC flow control rx/tx support
  * gprs_ns2_fr.c: Skip extraneous FIONBIO
  * gprs_ns2_fr: guard against race between socket(AF_PACKET) and bind()
  * gprs_ns2_fr: use ETH_P_HDLC instead of ETH_P_ALL
  * Fix VTY syntax for newly-introduced NS2 timers
  * gors_ns2_vty: Fix saving of new NS2 timers
  * gprs_ns2_fr: Avoid stringop-truncation warning
  * gprs_ns2_fr: Use OSMO_STRLCPY_ARRAY() where possible
  * fsm: Add osmo_fsm_inst_broadcast_children()
  * vty: Fix left shifting out of range on signed variable
  * lapd_core: Don't dereference data link after sending PRIM_DL_REL
  * cbsp: Fix encoding of "ETWS Warning Security Info" IE
  * cbsp: Fix osmo_cbsp_recv_buffered() for KEEP-ALIVE-COMPLETE
  * cbsp: Fix parsing DCS in decode of WRITE-REPLACE
  * Add inter-thread queue
  * tlv_parser: Fix various out-of-bounds accesses
  * gprs_ns2_fr: reduce duplication between gprs_ns2_fr_connect / connect2
  * gprs_ns2: Give NS-VC FSMs a proper name/identifier
  * ns2: delay NS_AFF_CAUSE_RECOVERY until NS-VC for data + sig are unblocked
  * vty/fsm_vty: Add vty_out_fsm2() + vty_out_fsm_inst2() with prefix
  * ns2: Properly indent VTY output
  * ns2: Unify logging context via log macros
  * logging_vty: Fix saving of "logging print file .. last"
  * gprs_ns2_test: Fix compilation on Debian 8
  * Revert "gprs_ns2_vc_fsm: check NSVCI match the NSE"
  * Revert "gprs_ns2_vc_fsm: check NSEI match the NSE"
  * ns2: Use proper return value from write_queue callback function
  * ns2: Log ERROR if we cannot transmit a packet due to ENOBUFS
  * osmo-ns-dummy: Add simple NS traffic generator
  * ns2: Work around AF_PACKET socket ENOBUFS problems
  * ns2: Use named array initializers to avoid mistakes
  * ns2: encapsulate calls to nsvc->bind->send_vc()
  * ns2: Increment Rx and Tx byte / packet counters
  * ns2: Properly report packet drops in FR code
  * ns2: count number of dropped packets / bytes on transmit
  * ns2: Implement more rate counters
  * ns2: Add a rate_ctr for each NS-UNBLOCK
  * ns2: Move to one common/shared ns2_bind_alloc()
  * ns2: Memory allocation failures are ENOMEM, not ENOSPC
  * ns2: Rename nsi->rate_ctr_idx to nsi->nsvc_rate_ctr_idx
  * ns2: Introduce a per-bind stat_item group with backlog length
  * ns2: Fix typos in comments
  * ns2: Print NS-STATUS.ind primitives to the log
  * ns2: cosmetic: fix indent levels
  * frame_relay: Send "Fuil Status" ENQUIRY after link recovers
  * frame_relay: Add status call-backs for link + DLC status changes
  * frame_relay: Discard received messages for DLC not yet active
  * frame_relay: cosmetic: Unify log syntax when discarding Rx packets
  * ns2: Don't automatically re-start FSM at FORCE_UNCONFIGURED
  * ns2: Stop test procedure when going into unconfigured state
  * ns2: Don't start sending NS-RESET until FR DLC is available
  * osmo-ns-dummy: Add "mirror-mode" to mirror back any received packets
  * initial support for static userspace probes via systemtap
  * Enable systemd-journald log target in debian + rpm packaging
  * gb: frame_relay: Factor-out function to set link as dead
  * gb: frame_relay: Detect link outage on "last receive seq nr == 0"
  * frame_relay; Fix Q.933 async STATUS at DLC creation
  * ns2: Name NSVC FSM events consistently
  * ns2: Don't queue Q.933 LMI messages; only store most recent ones
  * ns2: improve backlog handling on interface up/down
  * ns2: Don't try to add packets to the backlog on real errors
  * README.md: Use https everywhere
  * ns2_fr: Fix null pointer deref in error path
  * ns2_fr: Fix heap-use-after-free in error recovery path
  * BVC FSM: Treat overlapping BVC-RESET as implicit ACK
  * support for stats static userspace probes via systemtap
  * CBSP: fix encoding/decoding of keep-alive repetition period
  * CBSP: Fix encoding of warning period

  [ Neels Hofmeyr ]
  * comment: mention spec reference in cbsp.[ch]
  * comment: typo in cbsp.h
  * bitXXgen: ensure not reading/storing past valid size
  * bitXXgen: add bitgen_test.c
  * bitXXgen: add osmo_loadXXbe_ext_2() to get right-adjusted values
  * add osmo_use_count_to_str_c()
  * osmo_use_count_to_str: make robust against unused use_count
  * add osmo_float_str_to_int() and osmo_int_to_float_str_*()
  * add GAD coding for Location Services
  * add BSSLAP coding for Location Services
  * add BSSMAP-LE coding for Location Services
  * add BSSMAP coding for Location Services
  * doc tweaks for osmo_float_str_to_int(), osmo_int_to_float_str*()
  * gad.c: try to workaround warning for "h.type >= 0"
  * gad.c: fix rc for osmo_gad_enc_ell_point_unc_circle()
  * gprs_ns2_fr.c: compiler error: replace strncpy() with OSMO_STRLCPY_ARRAY()
  * fix strncpy bug in gprs_ns2_fr_bind()

  [ Alexander Couzens ]
  * sockaddr_str: add osmo_sockaddr_str_from_str2() which doesn't set the port
  * tests/socket: add testcase test_get_ip_and_port
  * socket: introduce osmo_sock_init_osa & osmo_sock_init_osa_ofd
  * socket: add osmo_sockaddr_cmp()
  * gb/gprs_bssgp: remove superfluous whitespace
  * gb/common_vty: use void *
  * add osmo_sockaddr_local_ip() to determine the local address for a remote.
  * Gb: add a second NS implementation
  * libgb/ns: allow to create NS_ALIVE NSVC
  * gb/gprs_bssgb: check if talloc failed on btsctx->fc
  * gb/gprs_bssgb: ensure the fc timer has been stopped when freeing bssgp_bvc
  * ns2: remove bssgp specific msgb->cb parts
  * ns2: vty: add missing docs for IPv6 address
  * ns2: check the specific bit of NS SDU Control bits
  * ns2: refactor nsvc_by_ functions
  * ns2: ns2_recv_vc: remove unused parameter nsi
  * ns2: vty: fix behavior of vtyvc_by_nsei when vtyvc isn't found
  * ns2: refactor handle_nsip_read/handle_nsfrgre_read
  * ns2: fix a msg leak when receiving REJECTED messages
  * gsm_12_21: add osmo_oml_nsvc_address_type for OML NM_ATT_OSMO_NS_LINK_CFG
  * ns2: parse the return code of gprs_ns2_ip_bind
  * ns2: refactor ns2_prim_status_ind()
  * ns2: status ind: add additional flags (first and persistent)
  * ns2: vty: show all nse
  * ns2: vty: allow the users (pcu/sgsn) to set a default bind
  * ns2: vty: on `show ns` add information of NS binds
  * gprs_ns2_vty_create: remove bind pointer check
  * gprs_ns2: gprs_ns2_free(): add missing talloc_free
  * gprs_ns2: fix SNS_ADD for IPv4
  * gprs_ns2: fix empty prefix in TLV Parse error
  * gprs_ns2: add gprs_ns2_ip_bind_by_sockaddr() to search for binds by sockaddr
  * gprs_ns2: gprs_ns2_ip_bind() check if the bind already exists
  * gprs_ns2: add gprs_ns2_nse_nsei() to get the nsei of a nse
  * gprs_ns2: add gprs_ns2_free_binds() to free all binds
  * gprs_ns2: add gprs_ns2_free_nses() to free all NS-E
  * gprs_ns2: const the return value of gprs_ns2_ip_vc_sockaddr / gprs_ns2_ip_bind_sockaddr
  * gprs_ns2: rename gprs_ns2_ip_vc_sockaddr -> gprs_ns2_ip_vc_remote
  * gprs_ns2: add gprs_ns2_ip_vc_local() return the local sockaddr
  * gprs_ns2: add gprs_ns2_nse_sns_remote() returns the initial SNS address
  * gprs_ns2: gprs_ns2_ip_vc_remote() the nsvc can be also const
  * gprs_ns2: add gprs_ns2_nse_foreach_nsvc()
  * gprs_ns2: Partial revert 48f63867 allow to create NS_ALIVE NSVC
  * gprs_ns2: add gprs_ns2_ip_vc_equal()
  * add osmo_sockaddr_to_str_buf/osmo_sockaddr_to_str
  * gprs_ns2: remove the nsvc fsm timer when cleaning up the fsm
  * ns2: add value strings for ns2_affecting_cause_prim_str & ns2_prim_str
  * gprs_ns2: convert gprs_ns2_cause_str into an static inline
  * libosmocore: change the memory management of NS2
  * ns2: fixup gprs_ns2_prim_strs
  * ns2: check if ns_vc_alloc() fails in bind_connect()
  * ns2: add support for frame relay
  * ns2: implement link sharing selector
  * ns2: move LL into public api
  * ns2: move link layer type into NSE
  * ns2: remove obsolete type GPRS_NS2_LL_E1
  * gprs_ns2_fr: remove include <linux/if.h>
  * gprs_ns2: fix typo in comment
  * gprs_ns2: use switch() case instead of multiple if in ns2_create_vc()
  * gprs_ns2_sns: add missing transistion UNCONFIGURED -> SIZE
  * gprs_ns2_sns: dynamic calculate the maximum NS-VCs
  * gprs_ns2_sns: add missing S() to allow GPRS_SNS_EV_NO_NSVC happen
  * gprs_ns2_sns: fix whitespaces and superflous comment
  * gprs_ns2_sns: correct dynamic calculation
  * gprs_ns2: introduce NS dialects
  * gprs_ns2: move allocation of the SNS fsm into create_nse
  * gprs_ns2: add member name to bind
  * gprs_ns2: rework gprs_ns2_fr_connect*()
  * gprs_ns2: add gprs_ns2_free_nsvcs() to free all NS-VC of a NSE
  * gprs_ns2_sns: rework IP-SNS initial remote
  * gprs_ns2_sns: use different binds for the initial connection
  * gprs_ns2_sns: introduce SNS Size/Config retries
  * gprs_ns2: make nsvc argument const
  * gprs_ns2: add gprs_ns2_fr_bind_role() to retrieve the fr role
  * gprs_ns2: on ns2_create_vc parse the tlv before using it
  * gprs_ns2_vty: udp: fixup dialect changes
  * gprs_ns2: fr: fix crash when frame relay interface doesn't exists
  * gprs_ns2: improve handling of TLV errors on new nsvcs
  * gprs_ns2: don't pass the return code of reject_status_msg
  * gprs_ns2: fr: implement a write queue
  * gprs_ns2: fr: setup the device to correct FR/LMI settings
  * gprs_ns2: add new vty2
  * gprs_ns2: sns: correct log message when no nsvcs available
  * gprs_ns2: sns: don't send duplicated packets on retries
  * gprs_ns2: sns: add log message when size/config retries exhausted
  * gprs_ns2: don't start unconfigured fsm via FORCE_UNCONFIGURED
  * gprs_ns2: fix force-unconfigured for IP-SNS NSE
  * frame_relay: prevent null pointer exception when talloc fails
  * frame_relay: link_alloc: move log message to the end
  * gprs_ns2: rework frame relay load distribution function
  * gprs_ns2_fr: setup_device: allow to setup a new dahdi device
  * gprs_ns2: fr: check the device state before changing state
  * gprs_ns2: use zero initialized memory for vty_binds
  * utils: add osmo-ns-dummy
  * gprs_ns2: call python vty tests
  * gprs_ns2: set transfer cap in NS Status primitive
  * gprs_ns2: check if persistent nsei or nsvc exists when creating dynamic NSE
  * osmo-ns-dummy: allow to create dynamic NSEs
  * gprs_ns2_vc: answer UNBLOCK on unblocked nsvc
  * gprs_ns2: when calling nsvc_force_unconf for a dynamic NSE drop the NSE.
  * gprs_ns2_sns: clear local and remote entries when SNS failed
  * gprs_ns2: flag then NSE as dead in nse_free()
  * gprs_ns2_vc_fsm: fix spaces and remove wrong comment
  * test: gprs_ns2: don't leak the talloc context
  * test: gprs_ns2: replace free_bind() with clear_pdus()
  * test: gprs_ns2: free the nsi after each test
  * gprs_ns2: add assert on most bind calls
  * gprs_ns2: allow to use free_vc() with NULL
  * osmo-ns-dummy: don't leak primitive messages
  * gprs_ns2: implement BLOCK/UNBLOCK of a NSVC by vty
  * gprs_ns2: correct handle BLOCK message on initator
  * gprs_ns2_vc_fsm: rename all event to match RX_ or REQ_
  * gprs_ns2_vc_fsm: ensure all state is resetted via force_unconf
  * gprs_ns2_vc_fsm: in RESET accept RESET as ACK
  * gprs_ns2_vc_fsm: fix transitions for ALIVE state
  * gprs_ns2_message: remove wrong comment
  * gprs_ns2_vc_fsm: check NSEI match the NSE
  * gprs_ns2_vc_fsm: check NSVCI match the NSE
  * tests: gprs_ns2: add unitdata unit test
  * gprs_ns2: always pass a tp to gprs_ns2_vc_rx
  * gprs_ns2_vc_fsm: check NSEI match the NSE
  * gprs_ns2_vc_fsm: check NSVCI match the NSE
  * gprs_ns2: drop GPRS_ prefix of gprs_ns2_cs
  * gprs_ns2: drop prefix of all internal exposed function
  * gprs_ns2: drop the public prefix gprs_ from all static functions/structs/..
  * gprs_ns2: refactor: ensure all enums have GPRS_NS2_
  * gprs_ns2: drop gprs_ns2_vty, rename vty2 -> vty
  * gprs_ns2: drop gprs_ns2_vty, rename vty2 -> vty
  * gprs_ns2: remove api call gprs_ns2_dynamic_create_nse
  * gprs_ns2: introduce gprs_ns2_vty_init_reduced() for the PCU
  * gprs_ns2: correct vty config write
  * gprs_ns2: prevent division by zero in load_sharing
  * gprs_ns2_vc_fsm: reset ALIVE N counter when restarting the test procedure.
  * gprs_ns2_vc_fsm: rename ST_ALIVE -> ST_RECOVERING
  * gprs_ns2: unify the handling of **result when bind already present.
  * gprs_ns2_fr: free_bind(): first do the NULL check before using members
  * frame_relay: fix NULL pointer deref
  * gprs_ns2_frgre: set a correct gre pointer for ipv6
  * gprs_ns2_frgre: check iph/ip6h before passing them to rx functions
  * gprs_ns2_sns: rework tracking of NS-VC unblocked/alive state
  * gprs_ns2_sns: add timeout to ST_CONFIG_SGSN
  * gprs_ns2_sns: reset the N of timeout when entering a new state
  * gprs_ns2: rename vty-command ip-sns -> ip-sns-remote
  * gprs_ns2_vty: fix memory leak of vty_binds
  * gprs_ns2: add signalling & data weights for UDP binds
  * gprs_ns2_vc_fsm: use CLOCK_MONOTONIC for alive elapsed timer
  * gprs_ns2_vc_fsm: reset the alive elapsed timeout everytime
  * gprs_ns2_vty: use strcmp() instead of strncmp()
  * gprs_ns2_vc_fsm: remove debug line of the alive_timer
  * gprs_ns2: fix comment of alive NS-VC
  * gprs_ns2_sns: fix typo in doxygen comment
  * gprs_ns2: inform the NS user (BSSGP) about the MTU of a NSE
  * gprs_ns2: rework IP-SNS binds
  * gprs_ns2_vty: add optional argument signalling and data weights to `nsvc udp`
  * gprs_ns2: implement a simple load sharing for UDP
  * gprs_ns2: fix typo in function name ns2_load_sharing_modulo
  * gprs_ns2: make gprs_ns2_recv_prim() always take msgb ownership
  * gprs_ns2_sns: rename fsm events to include RX or REQ prefix
  * gprs_ns2_fr: pass MTU changes to the NSE
  * gprs_ns2: truncate the NS_STATUS to the MTU
  * gprs_ns2_message: tx_status: move all cause dependent code into the switch/case
  * gprs_ns2: add value_string for GPRS_NS2_AFF_CAUSE_SNS_NO_ENDPOINTS
  * gprs_ns2: ensure no duplicate UDP NSVC can be created
  * gprs_ns2: free_nse: free the SNS fsm early

  [ Daniel Willmann ]
  * gsm_08_16.h: Add missing header
  * gprs_ns2: Make reason const
  * libosmogb: Add a function to tx BVC RESET by nsei/bvci
  * Add exported function btsctx_alloc to public header
  * ns2: Add gprs_ns2_nsvc_state_name() to get the current state of a VC
  * ns2: Send NSVC representation in NS_AFF_CAUSE_VC_* status indication
  * ns2: Improve NSVC output
  * ns2: Split 'initiater' into initiate_{reset,block}
  * ns2: Add a function to set the NSVC FSM back to unconfigured
  * ns2: Add a VTY command to reset NSVC FSM
  * ns2: Fix docs for some NS2 vty commands
  * logging: Calculate LOG_MAX_{CTX,FILTERS} from the enum
  * ns2: Add log filtering by NSE/NSEI, fix NSVC filter on receive
  * ns2: Fix argv index in logging filter VTY commands
  * Declare osmo_ctx_init() in talloc.h
  * bssgp: Add SUSPEND_NACK to osmo_pdef_bssgp
  * logging: Remove duplicate color for DLSMS
  * ns2_frgre: Fix missing break statement for recv from IPV6
  * bssgp_bvc_fsm: Handle block request from application correctly
  * NS2: Fix bind selection of SNS NSVCs
  * ns2: Add sanity check
  * Refactor ns2_nsvc_create_ip*
  * ns2: Fix memory leak in IP-SNS
  * ns2: Fix assert when removing a bind listen
  * ns2: Fix incompatible VTY configs when writing config
  * tests/gb: Add more complex osmo-ns-dummy.cfg
  * bssgp_bvc_fsm: Set/get maximum BSSGP PDU length
  * bssgp2_enc_status: Truncate STATUS message to maximum PDU length
  * bssgp_bvc_fsm: Consistent naming

  [ Philipp Maier ]
  * command: add library command attribute for libosmo-sccp
  * command: add library command attribute for libosmo-abis
  * gsm_08_58: add proprietary IE to signal Repeated ACCH Capability
  * gsm_04_08: add parser for Mobile Station Classmark 3
  * gsm_04_08: add parser for Mobile Station Classmark 3
  * bts_features: add feature BTS_FEAT_ACCH_REP
  * gsm_08_58: add struct for RSL_IE_OSMO_REP_ACCH_CAP
  * gsm_08_58: add rxqual field to RSL_IE_OSMO_REP_ACCH_CAP
  * gprs_bssgp_util: complete bssgp_pdu_strings
  * gprs_bssgp: add IE parser/generator for RIM Routing Information
  * gprs_bssgp: add handling for BSSGP RIM primitives
  * gsm_08_18: add struct to parse RIM PDU Indications
  * bssgp_rim: add encoder/decoder for NACC related RIM containers
  * bssgp_rim: move bssgp_parse_rim_ri and bssgp_create_rim_ri to gprs_bssgp_rim
  * gprs_bssgp: add utilities to send and parse BSSGP rim PDUs
  * gprs_bssgp_rim: Return with EOPNOTSUPP on unsupported containers
  * gprs_bssgp_rim: fix bug in dub_tlvp_header()
  * gprs_bssgp_rim: add value strings for enum bssgp_nacc_cause
  * gprs_bssgp_rim: add value strings for enum bssgp_ran_inf_app_id
  * gprs_bssgp_rim: add value strings for enum bssgp_rim_routing_info_discr
  * gprs_bssgp_rim: add functions to convert a RIM-RI to a string
  * gprs_bssgp_rim: cosmetic: connect routing identifier strings with "-"
  * gprs_bssgp: log source and destination RIM routing information
  * gprs_bssgp: agregate RIM related code in gprs_bssgp_rim.c
  * gsm48: add compare function for struct gprs_ra_id
  * gsm_08_58, gsm_44_004: add struct for l1 information

  [ laforge ]
  * Revert "pkgconfig: link to mnl if available"

  [ Oliver Smith ]
  * tests/*: fix control reaches end of non-void func
  * configure.ac: set -std=gnu11
  * sim: fix gcc 4.9.2 + -std=gnu11 error

 -- Pau Espin Pedrol <pespin@espeweb.net>  Tue, 23 Feb 2021 14:03:31 +0100

libosmocore (1.4.0) unstable; urgency=medium

  [ Pau Espin Pedrol ]
  * bitvec: Fix return value in doc for bitvec_write_field()
  * gb: Fix typo in bssgp_cause_strings description
  * logging_vty.c: Avoid acquiring log tgt lock in logging level cmd when not needed
  * value_string: Switch val from unsigned to int
  * gsm0503_coding: Fix misleading comment UL vs DL
  * gsm0503_coding: Fix USF encoding in MCS1-4
  * gsm0503_tables: Document USF encoding tables
  * tests/coding: Test decoding of DL EGPRS data packet
  * tests/coding_test: Fix test_pdtch() results
  * gsm_04_06.h: Remove repeated egprs header struct definitions
  * configure.ac: Fix HAVE_CLOCK_GETTIME undef when func in -lrt
  * Drop old BSC references in fd check configure option
  * Revert "gsmtap_makemsg_ex: NULL for unknown chan_type"
  * use_count.h: Fix API doc example
  * tests/fsm_test.c: Disable use color in logging output
  * tests: vty: Extend test to do some numeric range validations
  * vty: Allow 64 bit values in numeric ranges if system supports it
  * vty: Don't match negative values on purely positive ranges
  * vty: Introduce support to set cpu-affinity and scheduler policy

  [ Harald Welte ]
  * usb: Use OSMO_STRLCPY where appropriate
  * usb: Add osmo_libusb_find_matching_dev_{path,serial}
  * osmo_libusb: Check return of libusb_get_string_descriptor_ascii()
  * osmo-sim-test: Recurse through subdirectories
  * osmo-sim-test: Fall-back to classic SIM
  * chantype_rsl2gsmtap(): Add entries for CBCH
  * gsmtap.h: Add definitions for voice inside GSMTAP
  * Add GSMTAP_CHANNEL_VOICE to gsmtap_gsm_channel_names[] value_string
  * Add CTRL port number for osmo-mgw
  * gsmtap: Solve TCH / FACCH confusion once and for all
  * fixup depreciation warning
  * socket: Add osmo_sock_mcast_iface_set() to bind multicast to device
  * libosmosim: Build irrespective of PC/SC support
  * sim: card_fs_usim.c: Fix FID of EF.EXT4
  * card_fs_sim: Avoid '/' in file names
  * osmo-sim-test: Use stderr for error messages
  * osmo-sim-test: don't print SW in successful case of dump_file()
  * osmo-sim-test: Optionally dump card files to host filesystem
  * sim: add osim_file_desc_find_aid()
  * sim: re-structure how we support cards + applications
  * osmo-sim-test: Also [attempt to] dump DF.GSM on USIM cards
  * card_fs_{usim,isim}: Update to 15.7.0 / Release 15
  * sim: Add HPSIM application support
  * osmo-sim-test: Avoid double-close
  * ports.h: Add 4268 for UECUPS VTY
  * exec: Introduce osmo_system_nowait2() to allow specify a user
  * select.c: Introduce support for signalfd
  * timerfd: call osmo_fd_unregister() when closing on read error
  * gsm0503_parity: Fix compilation with gcc-10
  * gsm_29_118.h: Fix compilation with gcc-10
  * sim: When decoding SW, take application specific SW into account
  * README.md: fix typo (coore -> core)
  * README.md: We don't build libosmotrau.  The latter is in libosmo-abis.git
  * usb: Add osmo_libusb_find_open_claim() all-in-one API
  * codec: Add functions for AMR s->d bits and d->s bits
  * libosmogsm: add Doxygen docs for gsm0502_hop_seq_gen()
  * Implement ITU-T I.460 multiplex / demultiplex
  * NS: Optionally disable NS-{RESET,BLOCK,UNBLOCK} when using UDP/IP
  * NS: replace use of gprs_nsvc_create() with gprs_nsvc_crate2()
  * lapd/lapdm: print user-defined string name instead of (dl=%p)
  * lapd_core: Fix log line being about LAPD and not LAPDm
  * Revert "add osmo_mobile_identity API"
  * bts_features.h: Introduce BTS_FEAT_PAGING_COORDINATION
  * gsm0808: Add gsm0808_create_common_id()
  * gprs_bssgp: Add bssgp_tx_bvc_reset2()
  * gprs_ns: Set sockaddr_in.sin_family for persistent NSVCs
  * vty/ports.h: Add VTY port for osmo-e1d
  * lapd_core: Ensure we always have some tailroom
  * lapd_core: After calling into L3, check if the state has changed
  * vty: Avoid ultra-long multi-line strings cluttering talloc reports
  * gsm0411_{smc,smr}.c: Work around newlib bug
  * bits.c: Use faster look-up-table approach for osmo_revbytebits_{buf,u8}
  * i460: Add back-pointer from sub-channel to timeslot
  * i460: pass more context to call-back functions
  * i460: Fix bit- and subslots ordering of I.460 mux + demux

  [ Neels Hofmeyr ]
  * add crcXXgen.c.tpl to EXTRA_DIST
  * jenkins.sh: simpler invocation of verify_value_string_...
  * gsm_04_08.h: fix big endian structs
  * add missing endian.h in gsm_23_041.h
  * struct_endianess.py: also recognise unnamed substructs
  * cosmetic: apply changes to match struct_endianess.py output
  * enable vty xml dumping to stdout
  * api doc: clarify 'returns' of gsm48_mi_to_string()
  * api doc: clarify OSMO_NAME_C_IMPL() required FUNC_BUF signature
  * fix osmo_mi_name_c() to always return talloced strings, via osmo_mi_name_buf()
  * add gsm23236: MSC pooling: TMSI and NRI utility functions
  * tlv.h: add msgb_tvl_put() to add a TvLV without the value part
  * osmo_bcd2str: also validate start_nibble parameter
  * add osmo_mobile_identity API
  * add osmo_mobile_identity API
  * gsm0408_test: allow deprecated API
  * api comment: fix example of osmo_mobile_identity_encode_msgb
  * fixup for gsm0808_create_common_id(): add API doc, use new MI API

  [ Philipp Maier ]
  * l1sap: add measurement related struct members
  * osmo-sim-test: check tlv_parsed struct tp before access
  * parity: add amr crc14 definition
  * conv: add convolutional coder for AMR SID UPDATE frames
  * gsm690: Fix amr speech bit length table
  * dtx: add decoding for AMR-DTX frames
  * exec: osmo_system_nowait2: initalize *pw pointer with NULL
  * logging: use LOGL_NOTICE when no loglevel is set
  * logging: do not allow multiple calls of log_init()
  * gsm0505_amr_dtx: add missing value strings
  * gsm0808: fix endieness of call identifier
  * i460_mux: correctly reset subchannels
  * gsm_08_58: add missing RSL error cause codes
  * i460_mux: add callback to notify empty tx queue

  [ Vadim Yanitskiy ]
  * usb/Makefile.am: fix copy-pasted library name: s/libosmosim/libosmousb/
  * gsm/gsm48049.c: fix use of GNU 'missing =' extension in designator
  * tdef_vty: do not enforce enum 'node_type' in osmo_tdef_vty_groups_init()
  * conv: prevent theoretical NULL pointer dereference in osmo_conv_encode()
  * osmo_libusb: check return value of osmo_fd_register()
  * exec: prevent uninitialized memory access in osmo_system_nowait()
  * exec: propogate errors from osmo_environment_[filter|append]
  * bitvec: make bitvec_free() safe against NULL
  * tests/bitvec: add a unit test for bitvec_read_field()
  * bitvec: fix bitvec_unhex(): do not return 1 on success
  * bitvec: fix misleading description of bitvec_spare_padding()
  * bitvec: cosmetic: init i only once in bitvec_[un]pack()
  * bitvec: avoid redundant zero-initialization in bitvec_alloc()
  * tests/coding: check return value of encoding / decoding functions
  * tests/coding: reduce verbosity of 8-bit / 11-bit RACH coding tests
  * tests/coding: cosmetic: use ARRAY_SIZE() macro from utils.h
  * coding: fix documentation of PDTCH encoding functions
  * tests/coding: add 11-bit Access Burst samples from a real phone
  * coding: fix bit ordering in 11-bit RACH coding functions
  * rest_octets: fix encoding of 3G Early Classmark Sending Restriction
  * libosmogsm: cosmetic: add spaces before and after PRIu32
  * bts_features: fix: properly check the result of bitvec_get_bit_pos()
  * bts_features: introduce osmo_bts_unset_feature()
  * gsm0502: add TDMA frame number constants and modular arithmetic
  * utils/gsmtap_logread.py: make it executable
  * src/Makefile.am: add conv_acc_neon_impl.h to EXTRA_DIST
  * configure.ac: clarify description of --enable-neon
  * configure.ac: fix: do not define HAVE_NEON unconditionally
  * configure.ac: print ARM NEON instructions support status

  [ Eric Wild ]
  * pcsc: don't leak memory

  [ Alexander Chemeris ]
  * gb: Fix typos in gprs_ns.c comments
  * gb: Print signalling and data weights on NS-VC creation.
  * select: Fix typo in a comment Osmcoom->Osmocom
  * stats: Move cfg_stats_interval_cmd() function.
  * stats: Fix documentation for osmo_stats_set_interval()
  * stats: Support regular stats flush
  * stats: Change timer to timerfd to make it a true interval timer.
  * gsm0808: Fix encoding of the SAPI_N_REJECT BSSMAP message.
  * gsm0808: Make a function to extract Cause IE publicly available.
  * gsm0808_utils: Fix gsm0808_cause_class() function
  * gsm0808_utils: Add gsm0808_get_cipher_reject_cause() back with a deprecation notice.
  * gsm0808: Implement helper functions for CONFUSION BSSMAP message decoding.

  [ Maksim Aristov ]
  * debian: Change python3 dependency to native arch

  [ Eric ]
  * configure.ac: fix libtool issue  with clang and sanitizer
  * timer.c: make timers thread safe
  * pkgconfig/osmocodec/osmocoding: link to talloc
  * libomsocoding: NEON viterbi acceleration

  [ Kirill Zakharenko ]
  * statsd: fix rendering for groups with idx==0

  [ Sylvain Munaut ]
  * libosmogsm: import hopping sequence generation code

  [ Oliver Smith ]
  * contrib: import RPM spec
  * gsmtap_makemsg_ex: NULL for unknown chan_type
  * contrib: integrate RPM spec
  * Makefile.am: EXTRA_DIST: debian, contrib/*.spec.in

  [ Alexander Couzens ]
  * gprs_ns.h: add missing prototype gprs_ns_rcvmsg()
  * gprs_ns: fix typo in comment
  * gprs_ns_frgre.h: add missing declaration of structs
  * bts_features: add feature BTS_FEAT_IPV6_NSVC
  * socket: osmo_sock_local_ip: correct doxygen comment
  * vty: add a define VTY_IPV46_CMD to require a IPv4/6 address
  * Gb/BSSGP: replace hardcoded Tx into NS library by a callback
  * gsm 12.21: add osmocom specific NM_ATT_OSMO_NS_LINK_CFG
  * osmo_sock_init2: improve support for AF_UNSPEC
  * socket.h: introduce osmo_sockaddr to hold v4 and v6 endpoints

  [ Daniel Willmann ]
  * rate_ctr: Add functions to reset rate counter (groups)
  * stat_item: Add function to reset stat items and groups
  * stats: Add stats commands related to testing

 -- Harald Welte <laforge@osmocom.org>  Thu, 13 Aug 2020 11:06:35 +0200

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
