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
