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
