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
