osmo-bsc (1.7.0) unstable; urgency=medium

  [ Harald Welte ]
  * Introduce nm_fail_rep_signal_data for "SS_NM, S_NM_FAIL_REP" signal
  * OM2000: Add some more message types and IEs we now understand
  * remove 'NAT' log category
  * handorer.h: Fix compilation with gcc-10
  * gsm_data.h: Comment the 'nokia' BTS fields
  * bts_nokia_site: Fix LAPD segfault during reset procedure
  * [cosmetic] system_information: Values are not guesses; more comments
  * bs11_config: Print "Not Equipped" for MBCCU (TRX) that don't exist
  * Count RSL DELETE INDICATION received from BTS
  * system_information: Set BSS_PAGING_COORDINATION in SI13 for osmo-bts
  * vty/bts_resend_cmd: Use gsm_bts_set_system_infos() to increment changemark
  * osmo-bsc.spec.in: Use %config(noreplace) to retain current config file
  * abis_nm: Avoid various "Unhandled message" errors on BS-11 startup
  * Bring timeslot FSMs on BS-11 out of NOT_INITIALIZED state
  * Don't print 'bogus channel load sample' message if total == 0
  * bts_nokia_site: Clean up logging
  * Add example configuration files for E1 BTS
  * remove examples/osmo-bsc/ericsson/osmo-bsc.cfg
  * osmo-bsc.spec.in: Package E1 config files
  * osmo-bsc.spec.in: Add missing directories to package
  * debian: Package E1 configuration file examples
  * lchan_fsm: silently ignore LCHAN_EV_RLL_ERR_IND
  * Add example config files for Ericsson DUG20 based BTS
  * acc.c: Don't use C99 constructs, this breaks builds on Debian 8
  * BS-11: Fix "CONNECT TERRESTRIAL TRAFFIC"
  * Implement support for receiving BSSMAP CommonID from MSC
  * osmo_bsc_sigtran.c: Remove unused #defines
  * use osmo_fd_setup() whenever applicable
  * debian/control: Recommend installation of osmo-mgw
  * Use osmo_fd_*_{disable,enable}
  * fix some size-t format string characters
  * update aoip-mgw-options document with reality of 2020
  * abis_om2000: Force TRX NM state to UNLOCKED once TRX is up
  * osmobsc-usermanual: Add Chapter with AoIP message flow examples
  * OM2K: Permit transition from WAIT_CONF_RES -> WAIT_ENABLE_ACCEPT
  * OM2K: Skip the entire CON MO if there are no connection groups
  * Add a bts_model->bts_init() and trx_init() call-back function
  * abis_om2000: make om2k_mo_name() an exported function
  * [cosmetic] abis_om2000: Re-format to use longer lines
  * abis_om2000: Mark om2k_mo_fsm_start() as static
  * abis_om2000: keep OM2K FSMs around, don't terminate
  * om2000: Add "show bts 0 om2k-mo" command
  * abis_om2000: Handle DP object in get_om2k_mo()
  * smscb: Avoid scheduler array overflow
  * smscb: Fix adding of SMSCB messages when no message with lower period exists
  * select_best_cipher(): Prefer A5/1 over A5/2
  * BS-11: Send proprietary MRPCI message after assignment + HO complete
  * hide the "smscb-command" vty command; people should use osmo-cbc
  * CBSP: document rate counters and their mapping to basic/extended CBCH

  [ Philipp Maier ]
  * bsc_main: use higher default loglevels.
  * lchan_rtp_fsm: fix out_state_mask
  * vty: check with is_ipaccess_bts() before using IPACC
  * lchan_rtp_fsm: make _fsm_timer_cb and _fsm_cleanup static
  * lchan_rtp_fsm: use E1 endpoints if the BTS is not ipaccess type
  * e1: encode line number as trunk number in MGCP endpoint
  * gsm_04_08_rr: block EMERGENCY SETUP when EMERGENCY CALLS are denied
  * abis_rsl.c: make sure emergency calls are rejected early
  * lchan_fsm: merge lchan_mr_config()
  * lchan_fsm: make internal functions static.
  * lchan_fsm: make rsl mode-modify working again
  * abis_rsl: prioritize emergency calls over regular calls
  * abis_rsl.c: flush channel request queue on RSL bootstrap
  * abis_rsl: inform user when expired channel requests get tossed
  * abis_rsl: fix memleak in rach dos reduction function
  * bsc_vty: improve manual activation of lchans (debug / labtest)
  * bsc_vty: fix manual channel activation
  * bsc_vty: fix wrong else-if statement
  * gsm_08_08: fix unreachable code in parse_powercap()
  * osmo_bsc_bssap: actually check for lchan
  * bts: add repeated acch mode flags + vty config
  * abis_rsl: parse cm3 and indicate ACCH repetition cap to BTS
  * bsc_vty: mark repeated ACCH value of 1.9% to 2.7% BER as default
  * bsc_vty: fix acch_repetition ber threshold strings
  * abis_rsl: check if emergency calling is disabled before premption
  * bsc_vty: mark repeat rxqual 4 (BER >= 1.6) as default
  * bts.adoc: describe ACCH repetition settings

  [ Vadim Yanitskiy ]
  * VTY: fix writing of custom timer values to a configuration file
  * vty: fix: restore removed DNAT category as deprecated
  * doc/manuals: remove deprecated DNAT from the VTY reference
  * rest_octets: cosmetic: fix alignment in gprs_cell_options
  * vty: 'gprs 11bit_rach_support_for_egprs': drop redundant check
  * vty: 'gprs 11bit_rach_support_for_egprs': clarify error message
  * vty: clarify EGPRS Packet Channel Request message support
  * A-bis: fix logging level mismatch in abis_nm_rcvmsg_fom()
  * bsc_subscr_find_or_create_by_{imsi,tmsi}(): fix NULL pointer dereference
  * doc/manuals: regenerate the VTY reference file
  * gsm_data: cosmetic: mark argument of is_*_bts() as const
  * bts_unknown: fix: properly initialize the feature vector
  * bts_sysmobts: fix: properly zero-initialize the feature vector
  * bsc_bts_alloc_register(): fix possible NULL-pointer dereference
  * handover_test: use 'unknown' BTS type instead of 'sysmobts'
  * abis_nm: cosmetic: add curly braces to complex 'if' statements
  * abis_nm: cosmetic: use sizeof() for printing buffer size
  * abis_nm: fix: properly truncate feature vector reported by BTS
  * abis_nm: fix ARFCN list encoding in Set Channel Attributes
  * abis_nm: fix length indicator in Set Channel Attributes
  * fix crashes due to OSMO_ASSERT(conn->lchan)
  * abis_rsl: Mobile Allocation IE in CHANnel ACTIVation shall be empty
  * system_information: publicly declare generate_cell_chan_list()
  * system_information: constify bitvec in freq. list encoding API
  * generate_ma_for_ts(): constify per cell/timeslot ARFCN bit-vectors
  * gsm_04_08_rr: fix hopping parameters in RR Assignment Command
  * doc/examples: remove deprecated 'dyn_ts_allow_tch_f'
  * vty: ensure that all warning messages are prefixed with '%%'
  * vty: fix missing comma in a warning message
  * vty: introduce and use GPRS_CHECK_ENABLED() macro
  * vty: allow enabling freq. hopping regardless of the feature vector
  * debian/control: change maintainer to the Osmocom team / mailing list
  * vty: fix copy-pasted 'no gprs control-ack-type-rach' description
  * fix bsc_sapi_n_reject(): dlci is unsigned, use uint8_t
  * bsc_subscr_conn_fsm: fix a memleak in rll_ind_cb()
  * bsc_subscr_conn_fsm: use proper cause values in SAPI N REJECT
  * abis_rsl: fix IAR Rest Octets in rsl_send_imm_ass_rej()
  * vty: add a command to clear hopping ARFCN list
  * gsm_04_08_rr: fix hopping parameters in RR Handover Command
  * SI Type 4: fix missing CBCH Mobile Allocation IE
  * generate_ma_for_ts(): use OSMO_BYTES_FOR_BITS() macro
  * generate_ma_for_ts(): fix: properly encode ARFCN 0 (corner case)
  * SI Type 4: prevent potential buffer overflow
  * vty: propagate result of gsm_bts_set_system_infos()
  * fix bootstrap_rsl(): check result of gsm_bts_trx_set_system_infos()
  * abis_om2000: check result of gsm_bts_trx_set_system_infos()
  * vty: clarify NM state owner printed by 'show trx N' command
  * abis_nm: fix erroneous use of LOGPC() instead of LOGP()
  * abis_nm: fix msgb memleak in _abis_nm_sendmsg()
  * abis_nm: LOGPFOH()/DEBUGPFOH(): remove redundant context info
  * abis_nm: abis_nm_get_ts(): use LOGPFOH() instead of generic LOGP()
  * abis_nm: use btstype2str() in abis_nm_rcvmsg_manuf()
  * abis_nm: use DEBUGPFOH() in abis_nm_rx_sw_act_req()
  * abis_nm: use LOGPFOH()/DEBUGPFOH() in parse_attr_resp_info_unreported()
  * abis_nm: improve logging message in abis_nm_get_attr()
  * generate_ma_for_ts(): simplify MA bit-mask computation
  * vty: fix unreacheable code / wrong check in lchan_act_all_trx()
  * RSL/BSSAP: fix: properly convert between RSL Link ID and DLCI
  * vty: add attributes to VTY commands indicating when they apply
  * bts: move rate counter / stat item definitions from *.h to *.c
  * main: add --vty-ref-mode, use vty_dump_xml_ref_mode()
  * vty: add reminder messages about the radio link timeout
  * gsm_08_08: fix NULL pointer dereference in bsc_cm_update()
  * NM FSMs: fix DISABLED_NOTINSTALLED -> DISABLED_NOTINSTALLED
  * vty: add new attribute for vendor-specific commands
  * abis_rsl: turn rsl_msgb_alloc() a macro and move it to header
  * power_control: add new structures and default parameters
  * power_control: add encoding/init API to 'struct gsm_bts_model'
  * power_control: send default parameters from bootstrap_rsl()
  * power_control: add encoder for ip.access nanoBTS and OsmoBTS
  * power_control: make use of MS/BS parameters in RSL messages
  * power_control: add VTY commands for per-BTS configuration
  * power_control: add VTY command for re-sending default parameters
  * power_control: add VTY command to set static / maximum BS Power
  * power_control: reflect MS/BS Power difference in the VTY prompt
  * vty: cosmetic: make all 'struct cmd_node' definitions static
  * power_control: encoding of H_REQAVE and H_REQT for ip.access
  * power_control: fix swapped lower/upper RxQual threshold values
  * power_control: enable dynamic MS power control for osmo-bts
  * power_control: vty: some commands are not vendor specific
  * vty: fix NULL-pointer dereference in cfg_bts_rep_dl_facch()
  * power_control: vty: do not print 'no (rxlev-avg|rxqual-avg)'
  * vty: join UL/DL SACCH repetition commands together
  * vty: fix wrong attributes for UL/DL ACCH repetition commands
  * ericsson_rbs2000: fix unreachable code in inp_sig_cb()
  * power_control: add documentation on available configuration params
  * manuals: fix a duplicate line in the description of DTXu
  * manuals: fix a typo: s/DTS/DTX/
  * power_control: cosmetic changes and fixes to the documentation
  * power_control: add increase / reduce step size recommendations
  * vty: use 'const' for *nsvc in config_write_bts_gprs()
  * vty: fix writing empty IP address for unconfigured NSVCs
  * power_control: fix: properly initialize per-lchan BS power
  * vty: fix 'codec-list' command: check all given arguments first
  * gsm_data: return early if MS Power class remains the same
  * assignment_fsm: assert the result of conn_get_bts()
  * power_control: check BTS model in cfg_power_ctrl_avg_osmo_ewma()
  * power_control: enable Uplink DPC by default if format is known
  * power_control: make P_CON_INTERVAL parameter configurable
  * abis_nm: enrich debug messages with contextual info

  [ Pau Espin Pedrol ]
  * bssap: Avoid logging error if no optional Global Call Ref IE received
  * bsc: Allow setting negative nominal tx power through VTY
  * Avoid selecting channels from administratively locked trx
  * bsc_main: Improve log line on Lost E1 link
  * bsc_main: Use LOG_TRX in log line
  * ipaccess_sign_link_up: Log sign_link type
  * Use OSMO_FD_* instead of deprecated BSC_FD_*
  * gsm_data.h: Drop duplicated include stdint.h
  * Fix trailing whitespace in several files
  * ipaccess_nanobts: Log ipaccess_sign_link_down event
  * Move struct gsm_bts: gsm_data.* => bts.*
  * bts: Drop duplicated function to get trx by number
  * Move struct gsm_bts_trx: gsm-data.* => bts_trx.*
  * Move gsm_bts_{trx_}set_system_infos APIs to bts{_trx}.*
  * Move acc_ramp_init inside gsm_bts_alloc
  * configure.ac: Fix trailing whitespace
  * doc: Copy {bsc,bts}.adoc from osmo-gsm-manuals
  * {bts,bsc}.adoc: Drop deprecated OsmoNITB references
  * rename files acc_ramp.* -> acc.c*
  * Introduce support for ACC subset rotation
  * Introduce support for ACC ramping during whole BTS life cycle
  * Support setting rt-prio and cpu-affinity mask through VTY
  * Change default SCTP conn NULL->127.0.0.1 to localhost->localhost
  * ctrl: Fix CTRL TRAP for {msc.X,msc_)connection_status not sent
  * acc_test: Print allowed ACC from t2 and t3
  * acc: Fix ACC rotate barring highest ACCs too quickly during wraparound
  * tests: acc_test: Test more rotating scenarios
  * Allow storing IPv6 address strings in BSSAP structs
  * vty: Hide show running-config ACC ramping params if not enabled
  * Fail on invalid IP addresses passed to IPACC MDCX
  * Fix creating MGCP proxy socket if MGW listens on an IPv6 address
  * lchan_rtp_fsm: Deferr IPACC MDCX after BTS side MGCP MDCX
  * oml: Fix premature Opstart to Radio Carrier
  * bssap: Use new DTAP DLCI helper fields from libosmocore
  * abis_nm: Log Rx Change Administrative State ACK
  * abis_nm: Log no state change detected
  * abis_nm: Remove duplicated log line
  * cosmetic: tests/ctrl_test_runner.py: Fix trailing whitespace
  * ipa oml: tx OPSTART after unlocking, not before
  * contrib/jenkins: Enable parallel make in make distcheck
  * Set all NM OML objects to Locked by default
  * Introduce NM BTS Site Manager FSM
  * Introduce NM BTS FSM
  * Introduce NM BaseBand Transceiver FSM
  * Introduce NM RadioCarrier FSM
  * Introduce Radio Channel FSM
  * OML: Stay compatible with older osmo-bts versions
  * abis_nm: Log Opstart NACK with error loglevel
  * ipa: Fix use of null pointer in log macro
  * nm_channel_fsm: Fix innocuous transition not permitted log error
  * main: generate coredump and exit upon SIGABRT received
  * ipaccess-proxy: generate coredump and exit upon SIGABRT received
  * Store GPRS MOs directly under BTS SiteMgr object
  * nm_bts_sm_fsm: Fix peer_has_no_avstate_offline not applied for nanobts
  * Introduce NM GPRS NSE FSM
  * Introduce NM GPRS CELL FSM
  * abis_nm: Simplify param passing to abis_nm_rx_get_attr_resp()
  * Handle BTS/BBTRANSC Get Attributes (Ack) in NM FSMs
  * Fix typo in function nanobts_attr_nsvc_get
  * oml: Delay configuring NSVC until BTS features are negotiated
  * gsm_lchan_name: assert on NULL lchan
  * Use rest_octets functionalities from libosmocore
  * gitignore: Ignore *~
  * doc: handover: Fix malformed table
  * Introduce Neighbor Resolution Service
  * cosmetic: doc: wrap line too long
  * cosmetic: bts-sysmo: Fix whitespace indentation
  * Allow configuring SI13 CCN_ACTIVE bit from VTY, enable by default on osmo-bts
  * Introduce VTY cmd to configure Alpha in SI13
  * Move bts_ident_key to neighbor_ident.c
  * Fix neigh resolution service on local neighbours
  * SI13: Enable sending GPRS Cell Options Extension Information on GPRS-only BTS
  * tests: Explicitly drop category from log
  * tests: Replace deprecated API log_set_print_filename

  [ Oliver Smith ]
  * tests/Makefile.am: allow running only one VTY test
  * osmo-bsc/bsc_vty: set default gprs cell bvci to 2
  * osmo-bsc/bsc_vty: fail on get_amr_from_arg error
  * osmo-bsc-minimal.cfg: fix codec-list
  * main: exit on mutually exclusive codecs settings
  * abis_nm.c: rx_fail_evt_rep: fix sd.bts
  * abis_nm: move fail report parsing to extra func
  * VTY: add show bts failure report
  * VTY: let all descriptions end in \n
  * VTY: regenerate bsc_vty_reference.xml
  * timers: T->X: 23002, 23004, 23005, 23006
  * contrib: import RPM spec
  * contrib: integrate RPM spec
  * Makefile.am: EXTRA_DIST: debian, contrib/*.spec.in
  * lchan_fsm, lchan_rtp_fsm: make all timers configurable
  * contrib/jenkins: don't build osmo-gsm-manuals
  * configure.ac: set -std=gnu11

  [ Neels Hofmeyr ]
  * manual: add "Multiple Instances" section, akin to other manuals
  * manual: add SCCP/M3UA section from common chapters
  * manual: add SCCPlite section
  * manual: fix config example typo 'msc-addr'
  * manuals: update bsc_vty_reference.xml
  * deprecate 'msc' / 'ip.access rtp-base <port>'
  * cosmetic: put comment back at proper place in bsc_vty.c
  * drop IMSI filter and libfilter completely
  * drop CC 'local-prefix' feature
  * code cleanup: absorb complete_layer3() into bsc_compl_l3()
  * drop all BSC originated USSD notification features
  * doc/examples: remove deprecated ussd text config
  * drop MSC types "local" vs "normal"
  * flatten: move network->bsc_data->* to network->*
  * CTRL: determine MSC connection status from RESET-ACK, not AS_ACTIVE
  * create only one SCCP user per SCCP instance
  * cosmetic: tweak rc type of is_cm_service_for_emerg()
  * is_cm_service_for_emerg(): return false, not 0
  * gsm0408_test.c: drop test_mi_functionality()
  * refactor bsc_find_msc()'s round-robin
  * add osmo-bsc --vty-ref-xml: dump VTY ref XML to stdout
  * manuals: generate vty reference xml at build time
  * osmo-bsc main: exit on cmdline option error
  * remove extract_sub(), add bsc_subscr_find_or_create_by_mi()
  * use osmo_mobile_identity API everywhere
  * tweak log category for Compl L3 error
  * MSC pooling: make NRI mappings VTY configurable
  * MSC pooling: implement NAS node selection by NRI from TMSI
  * MSC pooling: LU: ignore TMSI NRI from a different PLMN
  * MSC pooling: add 'no allow-attach' for MSC off-loading
  * mscpool: add user manual chapter
  * vty: add 'mscpool roundrobin next' for ttcn3 tests
  * log: add MSC number to bsc_subscr_conn_fsm id
  * debug: log about matching Paging Response to earlier Paging
  * MSC pooling: add rate counters
  * merge files: absorb osmo_bsc_vty.c into bsc_vty.c
  * vty: hide 'mscpool roundrobin next'
  * fix segfault introduced by recent segfault fix
  * create ASP+AS only once per cs7 instance
  * si2quater: fix budget calculation for multiple EARFCNs
  * SI2quater: allow storing 48 EARFCNs
  * RR Release Cell selection IE: fix repeated EARFCNs encoding
  * RR Channel Release: pass Cause code from BSSMAP Clear to the BTS
  * propagate RSL error cause codes to RR Channel Release cause
  * fix CBSP server: actually open the srv_link
  * handover_test.c: add test case 29: TCH/F -> TCH/H
  * handover_test.c: typo s/more/less in test 19 description
  * hodec2: fix logging of requirements flags
  * hodec2 congestion: consider only congested pchan types
  * hodec2: do not keep candidates with zero requirements met
  * hodec2: log requirements of best candidate, log rxlev in dBm
  * cosmetic: bscon: use GSM48_RR_CAUSE_NORMAL instead of 0
  * gscon timeout: use proper cause code for lchan release
  * debug log: add RR Release cause code to the log
  * info, error log: show MSC nr for new conn
  * mscpool: fix refcount leak for unusual case of no bts
  * CBSP: on RESET, also clear the etws_timer, and stop ETWS PN broadcast
  * CBSP: log CBSP RESET on NOTICE
  * CBSP: rewrite the CBSP link setup and 'cbc' VTY section
  * CBSP: add local bind to client mode
  * cosmetic: use local var in handover_start_intra_bsc()
  * cosmetic: dissolve error-goto with single source in handover_start()
  * ho counters: count invalid target cell as 'error', not 'no_channel'
  * fix 'handover:*' counters: add missing / move increments
  * fix 'handover:*' counters: remove bogus increments
  * fix HO inter-BSC-IN target bts for counters
  * add {BTS,BSC}_CTR_INTER_BSC_HO_OUT_FAILED for RR HO Failure
  * bssap: do not send a Clear Request after a Clear Command
  * handover_fsm: signal Clear from gscon, for proper HO result counts
  * handover: fix detection for ambiguous HO neighbor ident
  * CBSP: fix link startup when enabled in config file
  * drop some unused members and function decls
  * CBSP: adjust manual to reflect new 'cbc' VTY config
  * CBSP VTY: re-add legacy cbc config for backwards compat
  * dissolve bsc_grace_paging_request()
  * drop bsc_subscr.lac
  * drop unused Tdef for 992427
  * add timer.vty
  * clean up timer definitions: introduce groups, move some T to X
  * tests: add missing *.vty to EXTRA_DIST
  * log MSC nr for opening new A conn
  * remove unused signature gsm48_handle_paging_resp()
  * gscon_bssmap_clear(): guard against NULL msc
  * compl l3: separate paging handling from bsc_scan_bts_msg()
  * compl l3: parse Mobile Identity once
  * compl l3: cosmetics around Create Layer 3
  * compl l3: allocate conn in gsm_08_08.c, not gsm_04_08_rr.c
  * compl l3: populate conn's bsc subscr from MI
  * compl l3: move Paging Response handling out of bsc_find_msc()
  * compl l3: move all message parsing out of bsc_find_msc()
  * refactor paging: introduce bsc_paging_params
  * refactor paging: introduce bsc_paging_start()
  * refactor paging: add bsc_subscr to bsc_paging_params
  * LCS: add paging reason, return in paging_request_stop()
  * introduce osmo_use_count for bsc_subscr
  * bsc_subscr_name: print both IMSI and TMSI
  * cosmetic: fix naming of GSCON_EV_A_CONN_REQ -> GSCON_EV_MO_COMPL_L3
  * LCS: implement re-use of existing A-interface conn
  * LCS: SCCP next conn id: prepare Lb-interface
  * LCS: implement the bulk of Location Services
  * LCS: allow RSL EST IND during GSCON_ST_ACTIVE
  * remove unused osmo_bsc_reset.h
  * add doc/location_services_ta.msc
  * BSSMAP RESET: generalize a_reset FSM
  * BSSMAP RESET: move cancel-paging call to osmo_bsc_sigtran_reset()
  * BSSMAP RESET: move RESET-ACK into reset fsm
  * BSSMAP RESET: tweak logging
  * BSSMAP RESET: also accept conn cfm events during ST_DISC
  * LCS: disable Lb interface by default, add vty 'smlc' / 'enable'
  * add smlc.vty test
  * LCS: add proper BSSMAP-LE RESET re-using new generalized reset FSM
  * LCS: Lb startup: no need to re-use existing SCCP user
  * drop features 'core-location-area-code' and 'core-cell-identity'
  * manual: describe LCS and Lb interface
  * fix missing RR release when there is no MSC
  * add fixme comment for OS#3833
  * minor code dup: smlc_set_cs7_instance()
  * handover vty doc: explain rxqual values
  * handover_test: fix comment
  * handover_test prep: move arfcn into create_bts()
  * handover_test prep: move generate_si() into create_bts()
  * handover_test prep: allow arbitrary timeslots in create_bts() code
  * handover_test prep: allow configuring several trx in create_bts()
  * handover_test prep: rename 'create-bts' to 'create-n-bts'
  * handover_test cosmetic: eliminate bts array and bts_num from main()
  * handover_test: allow arbitrary timeslot config and multiple TRX
  * handover test: fix dyn ts: set pchan_is on act / rel
  * handover test: add 'expect-ts-use' to clarify tests
  * handover_test: add 'set-ts-use'
  * handover_test: change 'meas-rep' params to bts-trx-ts-ss nr
  * handover_test: drop secondary array of lchans
  * handover test: add test 30: de-congest TCH/F by moving to dyn TS TCH/H
  * handover_test: add test 31: TCH/H: re-use dyn TS
  * fix TCH/H allocation: use half occupied dyn TS instead of switching more dyn TS
  * hodec 2: prep: common pick_better_lchan_to_move() function
  * hodec 2: favor moving dyn TS
  * handover test 30: play through filling up all lchans
  * handover_test: add test 32: half used TCH/H on dyn TS
  * fix AMR start-mode auto: reflect proper ICMI in MultiRate Config IE
  * AMR start-mode: send proper smod bits
  * AMR start-mode auto: send smod bits as zero
  * ctrl_test_runner.py: remove per-test startup delay
  * hodec 2: prefer moving TCH/H from half-used dyn TS
  * handover_test: implement as VTY shell
  * handover_test: log sending ho complete
  * handover_test: send ho detection
  * handover_test: adjust logging for reproducability
  * handover_test: set a fake osmo_mgcpc_ep_ci pointer
  * handover_test: rename test scripts from numbers to names
  * handover_test: gitignore
  * tweak handover_tests.sh
  * handover_test: cosmetic cfg simplifications in 5 tests
  * handover_test: fix test_congestion.ho_vty meas-rep
  * handover_test.c: properly release lchans in set-ts-use
  * hodec2: cosmetic: add dBm unit to rxval logging
  * hodec2: code dup / cosmetics
  * handover_test: add 'meas-rep repeat N'
  * handover_test: add test_congestion_favor_best_target_rxlev.ho_vty
  * handover_test: add AMR TCH/H->/F tests, showing a bug
  * handover_test: show ineffective intra-cell choice
  * handover_test: add test_congestion_intra_vs_inter_cell.ho_vty
  * hodec2: clarify current and target rxlev per candidate
  * hodec2: cosmetic: clarify afs_bias, simplify pick_better_lchan_to_move()
  * hodec2: fix candidate choices in congestion check
  * handover_test: include ack-chan in expect-chan
  * handover_test: safeguard against unhandled chan req
  * handover_test: saner chan act handling
  * handover_test: saner ho request handling
  * handover_test: vty echo
  * handover_test: show a bug: add test_congestion_no_oscillation.ho_vty
  * hodec2: cosmetic: clarify ho_candidate.{current,target}
  * hodec2: reduce check_requirements() args
  * hodec2: add ho_candidate.{current,target}.free_tch
  * handover_test: add lchan wildcards to meas-rep cmd
  * handover_test: show bug: add test_balance_congestion_tchf_tchh.ho_vty
  * hodec2: fix congestion oscillation bug
  * handover_test: add test_balance_congestion_by_percentage.ho_vty
  * hodec2: to balance congestion, use overload percent
  * handover_test: enhance test_balance_congestion_by_percentage.ho_vty
  * handover_tests.sh: update stdout/stderr only on capital -U arg
  * fix for test_dyn_ts_favor_moving_half_used_tch_h.ho_vty
  * cosmetic: in a ho test, use '*' instead of pdch
  * show bug: add test_dyn_ts_congestion_tch_f_vs_tch_h.ho_vty
  * fixate test_dyn_ts_congestion_tch_f_vs_tch_h.ho_vty
  * hodec2: fix congestion resolution on dyn TS
  * add test_dyn_ts_congestion_tch_f_vs_tch_h_2.ho_vty
  * lchan_avail(): omit logging for handover decision 2
  * show bug: add test_dyn_ts_balance_congestion.ho_vty
  * hodec2: fix congestion balancing on dyn TS
  * show bug: add test_dyn_ts_amr_tch_{f,h}_to_{h,f}_congestion_assignment_2.ho_vty
  * hodec2: fix intra-cell congestion balancing with source lchan on dyn TS
  * lchan assignment when RTP is set up: don't break on Mode Modify
  * rename lchan->rqd_ta to last_ta
  * lchan activation: indicate whether TA is known

  [ Keith ]
  * Meas Tools: Avoid OSMO_ASSERT due to uninitialised logging.
  * Meas Tools: Avoid unusable terminal in case of error on osmo_sock_init
  * Meas Tools, Avoid compiler format warnings
  * Disallow changing the type of an existing BTS from the vty

  [ Eric ]
  * configure.ac: fix libtool issue  with clang and sanitizer

  [ Sylvain Munaut ]
  * om2k: Add definitions for the TG object
  * om2k: Allow TG and MCTR to be manipulated via VTY
  * om2k: Allow the CON configuration request to be triggered via VTY
  * om2k: Add VTY command to allow TX of arbitrary message for testing
  * om2k: Don't use slashes in FSM IDs and use dashes instead
  * om2k: Fix TS channel config payload for non-superchannel case
  * om2k: Fix type of msg_type in abis_om2k_tx_simple
  * om2k: Acknowledge the HW Infos Reports
  * om2k: Acknowledge the unknown MCTR messages we get from time to time
  * om2k: Properly name message 0x0136, found to be MCTR Statistics Report
  * om2k: Use the "from config" TS config to setup OM objects
  * om2k: Dispatch TS_EV_OML_READY to TS FSM only when it's actually ready
  * om2k: Fix the frequency specifier for TX/RX/TS conf requests
  * bts_ericsson_rbs2000: Init all the TRX, not just C0
  * bts_ericsson_rbs2000: Whitelist the E1d input driver
  * om2k: Add option to limit OML version during negotiation
  * om2k: Rename MCTR config request constants for consistency
  * om2k: Add support for MCTR configuration
  * om2k: Properly update the 'fake' 12.21 states using OM2000 status
  * om2k: Wait for OM TRX links to stabilize before trying to bring up TRX
  * chan_alloc: Don't re-invent trx_is_usable and use existing helper
  * gsm_data: Update trx_is_usable for ericsson BTS
  * om2k: Fix invalid use of linked list when building hopping freq list
  * bts_nokia_site: Fake 12.21 OM objet state as "OK" when boot is done

  [ Alexander Chemeris ]
  * ctrs: Correctly count load total for dynamic timeslots.
  * stats: Report per channel type load to statsd counters.
  * stats: Remove dots from the end of stats descriptions.
  * Fix indent whitespace and log message.
  * stats: Fix stat group index for BTS stats.
  * Fix a comment for the handle_unitdata_from_msc() function.
  * chan_alloc: Add comments for the *_chan_load() functions.
  * osmo_bsc_sigtran: Fix a SSCP-> SCCP typo in a comment
  * stats: Add a stats gauge for the MSC links count.
  * stats: report a number of configured BTS to a stats gauge.
  * stats: Add counters for received BSSMAP messages.
  * stats: Export connected OML/RSL links count per BTS.
  * a_reset: Rename SIGTRAN connection to BSSMAP MSC assocation in log messages
  * stats: Fix Rx DTAP error stat description
  * bsc_subscr_conn_fsm: Fix a typo in the comment life->live
  * lchan: Allow transition from BORKEN state to WAIT_RF_RELEASE_ACK
  * timeslot_fsm: Allow PDCH_ACT_ACK in BORKEN state.
  * stats: Only dereference a connection pointer after checking for NULL.
  * handover_test: Properly allocate MSC data struct.
  * stats: Add counters for Tx BSSMAP messages.
  * stats: Rename BSSMAP Rx message counters to match Tx ones.
  * bsc_vty: Coding style fix - brackets around a complex if/else
  * log: Fix "Paging request failed" logging level
  * log: Adjust "new SIGTRAN connection" logging level
  * bssmap: Ignore repeated BSSMAP RESET ACK messages.
  * log: Demote "CHAN RQD: reason" to INFO
  * log: Demote "SAPI=%u ESTABLISH CONFIRM" message from ERROR to DEBUG.
  * borken: Recover from more TS borken states.
  * stats: Add counters and gauges for BORKEN lchans/TS
  * stats: Add a BTS/BSC counter PAGING_NO_ACTIVE_PAGING.
  * stats: Correctly count lchans under BORKEN TS.
  * bssap: Handle BSSMAP CONFUSION message.
  * Fix crash in bsc_patch_mm_info()
  * bsc_patch: Don't even parse MM INFO if TZ patching is not enabled.
  * bsc_subscr_conn_fsm: Fix crash in gscon_forget_lchan()
  * stats: Count paging requests flushed due to MSC Reset.
  * Return 0 from gsm0408_rcvmsg() if SCCP link is already closed.
  * paging: Remove obsolete comment.
  * chan_alloc: Fix typo in a comment.
  * timeslot_fsm: Name TS FSM instances on allocation.

  [ Daniel Willmann ]
  * osmo-bsc: Use designated initializer in bts_stat_desc
  * gsm_data.h: Remove period at end of counter description
  * abis_rsl: Count successful channel requests
  * Count assignment rates per BTS as well
  * Remove punctuation in counter description
  * Count handover per BTS as well as per BSC
  * Count intra-cell and intra-bsc handover separately
  * Add bts counters to count BTS events where we don't have a bts
  * configure.ac: Require python3 for ext_tests

  [ Alexander Couzens ]
  * gsm_data: always set spare bits in channel description
  * gsm 04.08: encode the LTE neighbors measurement bandwindth in Channel Release
  * gsm 04.08: correct calculate the Cell Selection Indicator after release of all TCH and SDCCH
  * osmo-bsc: fix a crash when receiving a RACH LOAD IND with 0
  * abis_nm: abis_nm_perform_test: fix a potential null deref
  * pcu_sock: use tn as variable name to improve readability
  * pcuif_proto: protocol 9: add missing fields
  * oml: encode IPv6 NSVC using the new OML attribute NM_ATT_OSMO_NS_LINK_CFG
  * pcuif_proto: version 10: add frequency hopping parameters
  * pcuif_proto: version 10: add support for IPv6 NSVCs
  * bsc_vty: cfg_bts_gprs_nsvc_rip: add missing breaks
  * bsc_vty: parse the return code to make coverity happy
  * bts_ipaccess_nanobts: check if msgb_alloc fails
  * sysmobts: expect feature IPV6_NSVC
  * Introduce NM GPRS NSVC FSM

  [ Michael Iedema ]
  * stats: Add granularity to SDCCH/TCH/LU activity.
  * stats: Add granularity to chan:rf_fail stat.
  * cosmetic: shorten deref chains where possible
  * stats: add SIGN/SPEECH assignment subcategories

 -- Pau Espin Pedrol <pespin@sysmocom.de>  Tue, 23 Feb 2021 18:43:04 +0100

osmo-bsc (1.6.0) unstable; urgency=medium

  [ Philipp Maier ]
  * bsc_msc_data: remove unused member is_authenticated
  * gsm_08_08.c: always pick first msc for unsolicit paging responses

  [ Neels Hofmeyr ]
  * add vty 'no neighbors' to remove all HO targets
  * neighbor config: allow re-using ARFCN+BSIC pairs
  * fsm: use deferred deallocation

  [ Vadim Yanitskiy ]
  * abis_nm.c: use LOGP() macro instead of LOGPC()
  * lchan_select.c: tune log level in lchan_select_by_type()
  * VTY: also print the active phan config in ts_dump_vty()
  * osmo_bsc_main.c: verify the physical channel mapping at startup
  * osmo_bsc_main.c: simplify computation of CCCH_CONFIG
  * osmo_bsc_main.c: fix CCCH_CONF computation: use pchan_from_config
  * abis_nm.c: fix error message in verify_chan_comb()
  * abis_nm.c: replace magic numbers with NM_CHANC_* constants
  * abis_nm.c: fix RSL connection timeout for trx->nr > 0

  [ Harald Welte ]
  * Cell Broadcast: CBSP and CBCH scheduling support
  * doc: update bsc_vty_reference.xml
  * manual: Update statements regarding SCCPlite
  * SMSCB: Send ETWS primary warning message via all dedicated channels
  * SMSCB: Send ETWS Primary Notifiation via RSL to BTS
  * check for osmo_fsm_register() error return value
  * check for osmo_ss7_init() error return value
  * manual: Fix copy+paste error
  * Move a_reset_fsm regstration to __attribute__((contructor))
  * exit(2) on unsupported positional arguments on command line
  * gsm_04_80: Avoid using deprecated API

  [ Pau Espin Pedrol ]
  * a_reset.c: Don't wait 2 seconds to send first BSSMAP RESET
  * bsc: gsm_08_08.c: Remove repeated conn not null check
  * bsc_subscr_conn_fsm: Cleanly clear BSSAP conn if associated channel closed during WAIT_CC
  * gsm_08_08.c: Mark func bsc_find_msc() static
  * sigtran: Set default remote ip to localhost instead of null
  * bsc_vty: Fix typo in 'no depends-on-bts' cmd
  * rsl: Send IE MS Power Param during CHAN ACT and MS PWR CTRL messages
  * rsl.c: Clean up some repeated use of long chains of pointers
  * rsl: Send IE MS Power Param to osmocom BTS models only
  * Remove unused API classmark_is_r99()
  * gsm_data.h: Remove unused field classmark from gsm_subscriber_connection
  * gsm_data.h: Remove unused func declarations
  * bsc: Adapt maximum MS Power Ctrl level based on band and MS Power class
  * cosmetic: bs11_config: clean trailing whitespace
  * bsc: Send MS Power Control msg upon max MS power change

  [ Martin Hauke ]
  * Fix some typos

  [ Oliver Smith ]
  * doc: osmux: use generated svg instead of pychart
  * debian, osmoappdesc.py, tests: switch to python 3

 -- Pau Espin Pedrol <pespin@sysmocom.de>  Fri, 03 Jan 2020 18:24:51 +0100

osmo-bsc (1.5.0) unstable; urgency=medium

  [ Max ]
  * LCLS: constify helper parameters
  * LCLS: use libosmocore function to add status
  * nanobts: use libosmocore's osmo_store*() for OML attr. patching

  [ Philipp Maier ]
  * lchan_select: dont allow half rate EFR to be selected
  * lchan_select: Do not unsolicitedly select a TCH/F
  * bsc_vty: add vty command to display all lchans
  * bsc_vty: add features to disable specific lchans via vty
  * assignment_fsm: fix channel allocator preferences
  * assignment_fsm: use activate.info.s15_s0 for ASS. COMPL.
  * handover_fsm: copy old S15_S0 to new lchan
  * osmo_bsc_msc: Use meaningful amr rate configuration on BTS level
  * codec_pref: fix special handling for AMR rate configuration  (S15-S0)
  * lchan_fsm: make sure multi rate configuration is valid
  * lchan_fsm: do not include 12.2k in active set on HR channels
  * AMR: Signal usage of octet-aligned or bandwith-efficient mode to MSC
  * lchan_fsm: add missing header file.
  * osmo_bsc_bssap: check bssmap length field
  * rest_octets: add Serving Cell Priority Parameters

  [ Neels Hofmeyr ]
  * abis_rsl: Fix TCH-as-SDCCH allocation on Channel Request
  * handover_fsm: do not access conn->assignment.req, it may be outdated
  * comments: clarify usage of conn.assignment and .handover scopes
  * cosmetic: drop unused struct mgcp_ctx shadow
  * incoming connect: don't crash if calling addr is missing
  * log N-CONNECT from MSC
  * Revert "assignment_fsm: Properly support assigning signalling mode TCH/x"
  * fix log line end in assignment_fsm.c
  * avoid use-after-free: on MGW endpoint dealloc, also forget it in conn->ho.*
  * lchan activation: add explicit encryption info to activation
  * Handover Request: also parse Chosen Algorithm IE, pass to lchan activation
  * fix inter-BSC-HO-incoming for AoIP (1/2)
  * use libosmocore osmo_tdef
  * move mgw endpoint FSM to osmo-mgw.git
  * fix inter-BSC-HO-incoming for AoIP (1/2)
  * fix inter-BSC-HO-incoming for AoIP (2/2)
  * abis_rsl.c: missing newlines on log lines
  * doc/manuals: review and tweak handover docs
  * make bsc_clear_request() static
  * doc/manuals, vty doc: more handover doc clarifications
  * remove double BSSMAP Clear on HO failure
  * comment and VTY doc tweaks
  * silence error for "invalid enum handover_scope value: none"

  [ Harald Welte ]
  * gsm_data: Add gsm_bts_name() just like we have gsm_{trx,ts,lchan}_name()
  * manual: It's not "A over SCCP" but "BSSAP over SCCP"
  * manual: Add sections on 3G/4G neighbor cells
  * manual: Re-order chapters in more logical order
  * manual: s/OsmoNITB/OsmoBSC/ in examples; remove E1 based BTSs
  * manual: Remove bogus "Control interface" sub-section in overview
  * Implement CSFB "Fast Return" Handling at RR RELEASE
  * OML: Fix encoded length value of OML GET ATTRIBUTES
  * Make sure to default to AMR octet-aligned mode
  * abis_rsl: Add support for extended CBCH to rsl_sms_cb_command()
  * abis_rsl: Avoid "Unimplemented" log message for every CBCH LOAD IND
  * abis_rsl: Fix log message about unimplemented common channel msg
  * smscb: Allow transmit of SCHEDULE and DEFAULT SMSCB
  * chan_alloc: Don't include CBCH channels in load computation
  * keep per-BTS stat_items about RACH busy / RACH access percentage
  * vty: Dump per-bts stat_item group in 'show bts' output
  * Allow VTY to set the CCCH Load Indication Threshold
  * rx_fail_evt_rep(): Don't recycle variable
  * Re-introduce support for IPA-encapsulated MGCP
  * logging: introduce LOG_BTS and LOG_TRX and use it everywhere
  * vty: Fix typo in VTY command descrption -> description

  [ Pau Espin Pedrol ]
  * ipaccess/Makefile.am: Remove unneeded libmgcp-client dep
  * Move LCLS references from gsm_data to osmo_bsc_lcls
  * Move msc related code from gsm_data to bsc_msc
  * ipaccess/Makefile.am: Remove unneeded libosmo-sigtran dep
  * net_init.c: remove unneeded header
  * configure.ac: Add flag to enable/disable build of ipaccess related utils
  * src/utils/Makefile.am: Drop unneeded sigtran and mgcp-client deps
  * fix another log line end in assignment_fsm.c
  * Drop unused old osmux leftover code
  * vty: Add option to enable osmux towards MSC
  * bssap: Detect MSC Osmux support on RESET (ACK) recv
  * bssap: Announce Osmux support on RESET (ACK) send
  * bssap: Parse Osmux CID on BSSAP Assign Req recv and use it in MGCP
  * bssap: Feed Assign Complete with Osmux CID retrieved from MGW
  * lcls: Fix MDCX with garbage on LCLS loop break
  * Introduce msc_is_{sccplite,aoip}() helpers
  * bsc: Append Osmux Support IE only on AoIP
  * Remove extern declarations of libosmovty symbols
  * bsc_subscr_conn_fsm: Use gscon_bssmap_clear() helper on send failure
  * bsc_subscr_conn_fsm: Log Tx of BSSMAP Clear Request with cause
  * doc: Add Osmux documentation to User Manual
  * Remove undefined param passed to logging_vty_add_cmds

  [ Sylvain Munaut ]
  * assignment_fsm: Properly support assigning signalling mode TCH/x
  * assignment_fsm: Properly support assigning signalling mode TCH/x

  [ Vadim Yanitskiy ]
  * abis_nm.c: use proper format specifiers for BTS / TRX number
  * abis_nm.c: also print TRX number in abis_nm_get_attr()
  * abis_nm.c: use abis_nm_ipa_magic from libosmocore
  * abis_nm.c: use msgb_lv_put() to put abis_nm_ipa_magic
  * abis_nm.c: fix broken logging in abis_nm_rx_ipacc()
  * gsm_data.c: use REG_NOSUB flag of regcomp()
  * osmo_bsc_lcls.c: cosmetic: make Coverity happy
  * ipaccess-config: use POSIX regex for Unit ID format check
  * handover_fsm.c: fix: prevent possible buffer overflow

  [ Daniel Willmann ]
  * doc: Add generic counter chapter in manual
  * manuals: Fix example config to reflect OsmoBSC commands
  * Change comments/strings from OpenBSC to OsmoBSC
  * gsm_data.h: Remove unused variable from OpenBSC times
  * Revert "fix inter-BSC-HO-incoming for AoIP (1/2)"
  * manuals: Update generated VTY reference and counters
  * manuals: Add script to update vtr/counter documentation from docker

  [ Oliver Smith ]
  * debian: create -doc subpackage with pdf manuals
  * contrib/jenkins.sh: run "make maintainer-clean"
  * contrib/jenkins.sh: "maintainer-clean" after "publish"
  * osmo-bsc.cfg: work with osmo-bts example cfg

  [ Eric Wild ]
  * vty: adjust config name for unit-id
  * turn -Werror=null-dereference into a warning

  [ Ruben Undheim ]
  * Fix some spelling errors found by lintian

 -- Pau Espin Pedrol <pespin@sysmocom.de>  Wed, 07 Aug 2019 20:42:06 +0200

osmo-bsc (1.4.0) unstable; urgency=medium

  [ Neels Hofmeyr ]
  * inter-BSC HO: add neighbor_ident API to manage neighbor-BSS-cells
  * inter-BSC HO: neighbor_ident API: drop 9bit BSIC
  * doc: update/fix FSM charts
  * fix / clarify rsl dtap cache
  * rename gsm_04_08_utils.[hc] to gsm_04_08_rr
  * cosmetic: move RR functions from bsc_api.c to gsm_04_08_rr.c
  * add gsm_timers, for Tnnn definitions usable by FSMs
  * large refactoring: use FSMs for lchans; add inter-BSC HO
  * fix nanobts: timeslot FSM: use flags to remember OML,RSL status
  * fix: dispatch TS_EV_RSL_DOWN when losing RSL
  * timeslot FSM: fix infinite recursion on failure to send PDCH ACT
  * timeslot FSM: permit entering broken state from anywhere
  * cosmetic: FSMs: allow ignorable events
  * fix BSC_CTR_ASSIGNMENT doc strings
  * lchan_fsm: split off lchan_rtp_fsm, establish RTP a bit earlier
  * lchan_fsm: add in_release_handler flag
  * allocate larger lchans if no SDCCH are available
  * create separate logging categories for lchan,ts,as FSMs
  * cosmetic: constify gsm_bts_num() net arg
  * vty: 'handover any': pick more random chans, use lchan_select_by_type()
  * cosmetic: dissolve bsc_api.c
  * cosmetic: reduce bsc_api.h
  * cosmetic: rename bsc_api.h to gsm_08_08.h
  * cosmetic: rename osmo_bsc_api.c to gsm_08_08.c
  * cosmetic: gscon: don't re-enter ST_CLEARING
  * use __FILE__, not __BASE_FILE__
  * fix lchan_rtp_fsm: missing event handling
  * MGCP: add 'X-Osmo-IGN: C' for SCCPlite by default
  * cosmetic: neighbor_ident_vty.c: add and use common string defs
  * neighbor_ident_vty.c: fix CI format, should be 16bit
  * inter-BSC HO incoming: continue despite missing Classmark
  * inter-BSC HO incoming: drop old/wrong RTP port code
  * lchan_fsm: lchan_fail_to(): store target state early
  * cosmetic: lchan_fsm failure: log about state transitions
  * lchan_fsm: safer 'concluded' flag
  * log: lchan_rtp_fsm: add missing '\n'
  * log: 'sending BSSMAP HO Request ACK'
  * inter-BSC HO: send failure msg directly
  * log: tweaks and more context in osmo_bsc_sigtran_send()
  * fix dependency bug: include mgcp_client/, not mgcp/
  * cosmetic: lchan activ: no need to clear mr again
  * cosmetic: lchan activ: drop todo comments
  * lchan: pick proper power and ta values
  * SCCPlite Assignment Complete: include Speech Codec (Chosen)
  * inter-BSC HO incoming: send BSSMAP HO Complete directly
  * inter-BSC HO outgoing: fix L3 forwarding
  * ho fsm: handle RR HO Failure for inter-BSC outgoing
  * lchan_fsm: allow late RTP release events without erroring
  * ts,lchan_fsm: do not attempt to allocate CBCH subslots
  * Implement RR Classmark Enquiry
  * fix LCLS during Assignment: actually use new TCH lchan
  * cosmetic: drop param from send_assignment_complete()
  * vty: add SCCP related vty commands
  * make: allow vty-tests without configure
  * test neighbor ident vty docs
  * neighbor vty: drop keyword 'add'
  * neighbor vty: rather 'no neighbor', not 'neighbor del'
  * neighbor vty: allow setting local neighbors by CGI
  * vty: write local neighbors by bts nr, not lac-ci
  * fix counters for inter-BSC outgoing
  * gscon_forget_lchan(): no Clear Request after Clear Command
  * gscon_forget_lchan(): Clear Request iff no lchans remain
  * subscr conn: properly forget lchan before release
  * lchan_fsm: fix failure handling: notify conn when released
  * handover_decision_2.c: tweak comments
  * handover_decision_2.c: tweak ho candidate logging
  * handover_decision_2.c: find_alternative_lchan: drop goto
  * handover_decision_2.c: drop redundant debug_candidate() args
  * lchan_fsm: notify conn of released lchan upon RF Release
  * handover_fsm: adjust inter-BSC HO failure handling to spec
  * remote-BSS neighbors: allow only one cell ID
  * handover_decision_2.c: refactor trigger_*()
  * handover_decision_2.c: implement HO to remote BSS
  * abis_rsl.c: fix uninitialized RSL cause issues
  * handover_fsm: fix missing newline for log statement
  * handover_fsm: fix failure logging of uninitialized chan mode
  * fix build: revert bad neighbor_ident.vty change
  * vty doc: drop "(HO algo 2 only)" strings
  * lchan_fsm_cleanup: drop redundant 'forget_lchan' call
  * lchan: rf release: make sure conn is NULL
  * dbug log: verbosely detach conn<->lchan
  * fix: send RR Release (e.g. after BSSMAP Clear Cmd)
  * abis_rsl.c: drop unused enum sacch_deact
  * lchan: release in error: fix missing messages / events
  * lchan release: always Deact SACCH
  * cosmetic: lchan: introduce sub-struct lchan->release.*
  * cosmetic: abis_rsl.c: drop uneccesary braces
  * lchan: set cause for 4 instances of release_in_error = true
  * coverity: gscon_forget_lchan: squelch forward-null
  * always directly send BSSMAP Clear Request
  * send Immediate Assignment Reject only before Immediate Assignment
  * Importing history from osmo-gsm-manuals
  * minor tweak
  * make clean: also remove generated image files
  * add 'make check' target
  * OsmoBSC+NITB/running: fix title levels, one too deep
  * OsmoBSC: include bts-examples.adoc from OsmoNITB
  * fix 'make clean': shell glob, ignore failure
  * refactor Makefile build rules, don't use the FORCE
  * OsmoBSC: update overview to explain both SCCPlite and SCCP/M3UA
  * common / OsmoBSC: drop unused alink.adoc
  * OsmoBSC: update VTY reference
  * bsc: document handover
  * bsc: handover: clarify default of all-cells-are-neighbors
  * bsc: handover: mention the need to resend SI for telnet neighbor cfg
  * author info: add "former" to Holger's job title
  * OsmoBSC: update VTY reference
  * follow-up: logging tweak for Immediate Assignment
  * set gscon FSM instances' log level to DEBUG
  * make sure early lchan act failure resets the lchan
  * comments: describe some lchan details
  * use mgcp-client configured endpoint domain name

  [ Philipp Maier ]
  * endpoint_fsm: add missing return in mgcp_pick_codec
  * gscon: use BSS-common payload types on BSS side
  * sigtran: fix memleak in osmo_bsc_sigtran_send()
  * GSCON: avoid sending connection oriented data when not connected
  * GSCON: call api of a_reset.c with msc object directly
  * lcls: do not LCLS call legs with different codecs
  * doc: update mgw settings in example config file
  * assignment: remove unnecessary call to gsm0808_speech_codec_from_chan_type()
  * codec_pref: fix typo in comment
  * codec_pref: add AMR configuration bits to make_scl_config() in unit-test
  * codec_pref: fix missing breaks in switch-case statement
  * LCLS: fix codec mismatch detection
  * gsm_data: remove unused struct member full_rate.
  * gsm_data: remove unused struct member chan_mode
  * assignment_fsm: only include speech codec (choosen) on AoIP networks
  * gsm_data.c: Set reasonable AMR codec defaults in gsm_bts_alloc()
  * codec_pref: Add Codec List to COMPLETE LAYER 3 INFORMATION
  * lcls: log channel type and lchan names on LCLS codec mismatch
  * codec_pref: handle S0-S15 in ASSIGNMENT REQUEST
  * gsm_08_08: abort complete L3 3 msg gen when no codecs are set
  * osmo_bsc_msc: Set reasonable codec list defaults
  * codec_pref: check codec configuration before start
  * codec_pref: cosmetic: seperate half/full rate determination
  * codec_pref: also check physical channels
  * gsm_08_08: allow zero length speech codec lists in compl l3 info.
  * gsm_08_08: do not include zero length speech codec list.
  * gsm_data: set meaningful default values for amr modes
  * codec_pref: also check amr codec rates in check_codec_pref()
  * gsm_04_08: improve gsm48_multirate_config()
  * bsc_vty: check amr mode parameters
  * lchan_fsm: generate proper multirate configuration IE on RSL
  * gsm_data: make cgi_for_msc available for other modules
  * handover_fsm: send HANDOVER PERFORMED msg on internal ho
  * paging: fix nullpointer deref
  * chan_alloc: remove references to lchan_alloc()

  [ Harald Welte ]
  * Migrate from osmo_ipa_idtag_parse() to ipa_ccm_id_resp_parse()
  * handover_fsm.c: Fix -Werror=format-security errors
  * cbch: Don't send cell-broadcast command on BTS without CBCH channel
  * gsm48_lchan2chan_desc() belongs to gsm_data.h
  * Introduce gsm48_lchan2chan_desc_as_configured()
  * CBCH: Fix SI4 CBCH IE generation
  * CBCH: Fix gsm_bts_get_cbch()
  * nanoBTS: Allow BCCH with CBCH on TS0
  * range_enc_determine_range(): Don't dereference array on size=0
  * handover_start_inter_bsc_in(): Uninitialized variable
  * ipaccess-config: Fix open() return value checking
  * bssmap_handle_cipher_mode(): Don't sent reject if !conn
  * subscr_conn_fsm: Fix null-pointer deref / N-CONNECT.ind from unknown MSC
  * acc_ramp: An unsigned int is always >= 0
  * ipaccess-proxy: Add error handling to IAP CCM ID RESP parsing
  * initial checkin of manuals to public repo
  * Add link to Asciidoc source code of manual
  * add Ericsson OM2000 message sequence charts (one for each MO)
  * OM2000 message sequence charts: specify MO in node name
  * OM2000 MSC: Fix spelling
  * Add chapter on Cell Broadcast Support in Osmocom (to BSC+NITB manual)
  * BSC: Add series of message sequence charts about MGCP handling
  * mgw: Fix endpoint names for new MGW
  * MGW: Include MGCP endpoint naming scheme of old IPA/SCCPlite approach
  * add message sequence chart MS/BTS/BSC/MSC for 3GPP aoIP MO call
  * vty-ref: Update URI of docbook 5.0 schema

  [ Pau Espin Pedrol ]
  * bsc: Use libosmocore API to track osmo_signal structs
  * abis_nm: Fix heap-use-after-free in abis_nm_set_channel_attr
  * abis_nm: Fix trailing whitespacing
  * Fix heap-use-after-free due to OML link destruction
  * abis_nm_ipaccess_rsl_connect: Log bts and trx nr
  * codec_pref: Log unsupported codec name used
  * codec_pref: Log HR2 specifically as never specified
  * codec_pref.c: Add comment in expected switch case without break
  * Install systemd services with autotools
  * Install sample cfg file to /etc/osmocom
  * osmo-bsc: Add default case for switch(enum)
  * abis_nm_get_ts: Return TS of correct TRX, not always TRX0
  * ipaccess-config: Use enum value for OML IP
  * abis_nm: Rename m_id_len to ease review of forthcoming patches
  * abis_nm: Split handling of Attribute Response Info into its own func
  * abis_nm: Split reported attr list parsing from Attribute Response Info into its own func
  * abis_nm: Allow sending and receiving Get Attributes (Response) against nanoBTS
  * abis_nm: Add support to parse some nanoBTS Attribute Response attributes
  * abis_nm: Add support to parse OML IP and Unit Id in Get Attributes
  * abis_nm: Support parsing nanoBTS format for Get Attributes Info
  * abis_nm: parse_attr_resp_info_unreported: Fix offset calculation
  * examples: Remove neighbor-list invalid for default setup
  * bsc: bts_alloc: Use enum value during neigh_list_manual_mode initialization
  * bsc: vty: Use enum value in neighbor-list check
  * bsc: gsm0808: Fix return code in bsc_compl_l3
  * osmo-bsc: gsm_timers_vty: Set global T_defs during vty_init
  * bsc: Prefix log string with related SI type during call to list_arfcn
  * bsc: si: Fix SI2bis L2 pseudo length
  * bsc: si: Fix SI2ter L2 pseudo length
  * bsc: Enable force-combined-si on nanoBTS by default
  * bsc: band_compatible: Return band non-compatible for invalid arfcn
  * bsc: vty: Verify and warn on invalid arfcn passed
  * abis_nm: Introduce new signal S_NM_GET_ATTR_REP
  * ipaccess-config: Fix whitespace
  * ipaccess-config: Add -G cmdl opt to query OML IP and Unit ID
  * ipaccess-config: cosmetic: Remove unneeded comment with hex values
  * gsm0408_rcvmsg: Release lchan if L3 fails to complete
  * ipaccess-config: Introduce -q quiet param
  * Add osmux-reference document
  * osmux-reference: Use packetdiag to draw packet header structures
  * osmux-reference: Add sequence charts
  * osmux-reference: Add traffic saving plot
  * osmux-reference-docinfo: Add latest changes to revhistory
  * osmux: Fix description for Dummy frames FT field
  * Allow easily disabling GFDL references
  * cosmetic: bsc: timeslot_fsm: Clean uneeded scope brackets
  * bsc: lchan_select: Avoid returning a TCH/H lchan when TCH/F is requested
  * bsc: ts_as_pchan_for_each_lchan: reorder and improve documentation
  * bsc: ts_for_each_lchan: Improve documentation
  * bsc: Add define for ts_as_pchan_for_each_lchan with ts->pchan_on_init
  * bsc: Fix lchan iteration for dyn TS during PDCH Deact
  * bsc: timelost_fsm: Remove unneeded set of out variable on failure
  * bsc: timeslot_fsm: Fix ts_is_lchan_waiting_for_pchan
  * bsc: ts_is_pchan_switching: Return correct IPA dyn TS target_pchan
  * bsc: timeslot_fsm: Fix possible skip of some lchans in ts_terminate_lchan_fsms
  * bsc: timeslot_fsm: Fix count in ts_lchans_waiting
  * bsc: lchan_rtp_fsm: Avoid duplicate LCHAN_EV_RTP_RELEASED event
  * bsc: lchan_fsm: Add missing transition WAIT_TS_READY->WAIT_RLL_RTP_RELEASED
  * bsc: timeslot_fsm: Handle and ignore tear down of lchan during PDCH DEACT
  * bsc: lchan_fsm: Fix invalid duplicated transition
  * paging: Add VTY options to calculate T3113 timeout dynamically
  * paging: fix whitespace
  * paging: Properly enclose logging imsi filter scope
  * bsc_main: filter_fn: Compare imsi values instead of subscr pointers
  * bsc: Set subscr log context during complete_layer3
  * bsc: rsl: Set subscr log context during meas report
  * bsc: dtap: Set subscr log context
  * bsc: bssap: Set subscr log context during paging
  * Add VTY option to avoid sending empty Full BCCH Info for disabled SI

  [ Stefan Sperling ]
  * check for overlong unix socket paths
  * fix unaligned access in abis_nm_rx_ipacc()
  * re-order condition checks for clarity
  * show dynamic timeslot details in 'show timeslot' vty command
  * check return value of gsm48_multirate_config()
  * add missing 'break' in switch statement
  * unlink socket path correctly in rf_create_socket()

  [ Martin Hauke ]
  * cosmetics: Fix typo in bsc_vty.c
  * ipaccess-config: Generate valid JSON output when using the -G parameter
  * ipaccess-config: Fix indentation of the usage output

  [ Oliver Smith ]
  * osmo_bsc_main.c: initialize rate counters
  * vty 'show bts'/'show trx': display IPs and ports
  * cosmetic: fix spec ref for gsm0808_cipher_mode()
  * cipher mode reject: send proper cause codes
  * vty: add 'show rejected-bts'
  * ipaccess_sign_link_reject: fix: use osmo_strlcpy() to safely copy IP
  * copy NITB's osmobsc-usermanual.adoc to OsmoBSC
  * build manuals included from osmo-gsm-manuals.git
  * Fix DISTCHECK_CONFIGURE_FLAGS override
  * contrib/jenkins.sh: build and publish manuals
  * contrib: fix makedistcheck with disabled systemd

  [ Daniel Willmann ]
  * debian: Require libcdk and install meas_vis osmo-bsc-meas-utils
  * OsmoBSC/HLR/MSC: Fix default config file name
  * gsm_04_08: Free GSM subscr conn if paging response can't be matched
  * VTY: Allow logging filter imsi statements for IMSIs we haven't seen yet

  [ Max ]
  * vty: don't show GPRS details if not configured
  * LCLS: move MGCP MDCX into separate function
  * Make IP address helper accessible via header file
  * constify rsl_tx_ipacc_*cx() parameters
  * LCLS: expand logging to print the name of the mode in use
  * LCLS: tighten GCR check
  * LCLS: explicitly check for mode before closing the loop
  * LCLS: move mode check into separate function
  * LCLS: make config and control redable in 'sh conns'
  * RSL: restructure MDCX functions
  * LCLS: add bts-loop variant
  * vty: add command to show TRX selectively
  * Add OsmoBSC control interface description
  * Add OsmoBSC control interface description
  * OsmoBSC: update CTRL docs
  * LCLS: update parameter representation
  * LCLS: log config/control update
  * IPA: log OML/RSL link drop reason
  * LCLS: use enum values instead of magic numbers
  * Print BTS number on GPRS options error
  * Log MDCX ACK for established lchan

  [ Jonathan Brielmaier ]
  * fix various typos across all manuals

  [ Ivaylo Kostov ]
  * BSC,BTS: add diagrams of PCU-BTS-NITB-SGSN relationships

  [ Alexander Couzens ]
  * OsmoBSC: add rate counter documentation

  [ Vadim Yanitskiy ]
  * osmo_bsc_bssap.c: fix incorrect link_id assignment

 -- Harald Welte <laforge@gnumonks.org>  Sun, 20 Jan 2019 21:21:24 +0100

osmo-bsc (1.3.0) unstable; urgency=medium

  [ Philipp Maier ]
  * a_reset: cleanup + remove dead code
  * gscon: remove dead code
  * gscon: pick suitable payload type / encoding name for MGCP
  * lcls: set codec info when performing MGW operation
  * codec_pref: move match_codec_pref() to separate c-file and add unit-test
  * codec_pref: check bts codec support
  * chan_alloc: reset rtp voice related bits in lchan_free()
  * rsl: use 3GPP assigned payload type constants from libosmo-netif

  [ Stefan Sperling ]
  * show all global counters of osmo-bsc in vty
  * add counter for connection attempts from BTS with unknown unit id
  * fix misaligned memory write access in abis_nm_ipaccess_rsl_connect()
  * increment 'paging responded' counter for active paging only
  * fix handling of invalid pchan names in vty

  [ Pau Espin Pedrol ]
  * nat: Add jitter buffer on the uplink receiver
  * acc_ramp: Increase log level of some messages
  * chan_alloc: Print bts nr on chan alloc failure
  * abis_rsl.c: Fix whitespace
  * abis_rsl: rsl_rx_chan_rqd: Format bts log string as in everywhere else
  * pcu_sock: Log event pcu_sock created
  * osmo-bsc: Clean help description of cmd line parameters
  * osmo-bsc: Add -V param to print version
  * debian: Move meas related binaries into new package osmo-bsc-meas-utils
  * bsc-filter: Remove unused func barr_adapt and set barr_find static
  * bsc_vty: Write access list entries when storing bsc config
  * Init access_lists before passing it as a parameter
  * Rename bsc_msg_acc_lst_vty_init to have more uniform prefix
  * filter: vty: Print policy list in cmd show access-list
  * filter: Replace '.' in counter names with ':'
  * filter: Allocate each ctr group with a different idx
  * ctrl: Avoid sending back received ERROR msgs

  [ Neels Hofmeyr ]
  * bsc_api.c: actually log with context
  * abis_rsl.h: drop unused rsl_chan_activate() declaration
  * cosmetic: bsc_dyn_ts.c: make local functions static
  * cosmetic: define TCH_F_PDCH_PENDING_MASK as actual bitwise or
  * cosmetic: logging and ordering in handle_ass_compl()
  * doc: add msc charts on Assignment/Handover internals
  * tests: remove bssap_test
  * tests: remove channel_test
  * bsc_test: drop "scan to MSC" code path
  * dissolve libbsc: move all to src/osmo-bsc, link .o files
  * remove struct bsc_api
  * cosmetic: magic number: use RSL_ACT_ constant for chan act
  * cosmetic: gscon: undup code: add common assignment_failed()
  * assignment: signal assignment failure on chan act nack
  * log: fix logging in rsl_rx_chan_act_nack()
  * log: assignment: add two logs on unexpected lchan release
  * use libosmocore's gsm0808_permitted_speech(), gsm0808_chosen_channel()
  * cosmetic: penalty timers: constify, tweak doc
  * cosmetic: bsc_subscr_alloc: log initial get
  * gscon: put subscriber a little later
  * try to pick up subsrc IMSI on l3-compl
  * store subscriber identity on paging
  * cosmetic: handover_test: add IMSI to subscr for logging
  * doc: tweak msc charts on Assignment/Handover: act_timer
  * doc: add lchan-release.msc
  * doc: add ms-channel-request.msc
  * doc: charts: illustrate new plan for ts and lchans
  * cosmetic: gscon: drop odd use of OSMO_STRINGIFY
  * HO: introduce T7, T8, T101 timers
  * drop dead code: conn->T10, handled by gscon instead
  * make T10 configurable like the rest of them
  * fix dyn TS init: properly identify BTS on OML OPSTART ACK
  * cosmetic / linking: move str_to_imsi() out of abis_rsl.c
  * cosmetic: name osmo-bsc's root ctx 'osmo-bsc', not 'openbsc'
  * call osmo_xua_msg_tall_ctx_init()
  * fix handover start: dealloc ho if event not permitted
  * ho cfg: fix unit strings
  * hodec2 log: less verbose, more concise logging
  * various logging: fix missing/extra newlines
  * BTS codec pref legacy compat: allow all codecs per default

  [ Harald Welte ]
  * bsc: Fix check for MSC-side FSM allocation failure
  * vty: Permit selection of other ASP protocol than M3UA
  * bsc: Add mgcp_port_to_cic() to determine CIC from RTP Port
  * bsc: Use correct MGCP endpoint name for IPA/SCCPlite
  * bsc: Don't reject ASSIGNMENT for Audio in IPA/SCCPlite case
  * bsc: Don't include AoIP IEs in ASSIGNMENT COMPLETE over SCCPlite
  * bsc: Don't create MSC-side MGCP connection in IPA/SCCPlite case
  * remove remaining bits of osmo-bsc_nat
  * Remove 'struct bsc_msc_connection' + fix IPA-encapsulated CTRL
  * move 'extern struct gsm_network *bsc_gsmnet" to header file
  * VTY: Print some more information in "show conns"
  * Add initial 3GPP LCLS support to OsmoBSC
  * LCLS: add VTY config to enable/disable LCLS on per-MSC basis
  * Reject ASSIGNMENT REQ with CIC but no AoIP transp addr in AoIP case
  * Ignore "dest" command in MSC node
  * Explicitly register CTRL-over-IPA callback with libosmo-sigtran
  * Remove unused logging subsystems DCC and DMGCP
  * remove traces of osmo-bsc_nat in python test (osmoappdesc/test_runner)
  * Add missing event string name for GSCON_EV_LCLS_FAIL
  * bsc_subscr_conn_fsm: BSC must not release SCCP connection
  * absi_rsl: Fix segfault in rsl_rx_conn_fail()

  [ Daniel Willmann ]
  * git-version-gen: Don't check for .git directory

 -- Pau Espin Pedrol <pespin@sysmocom.de>  Fri, 27 Jul 2018 19:25:05 +0200

osmo-bsc (1.2.1) unstable; urgency=medium

  [ Philipp Maier ]
  * bsc_api/GSCON: prevent unnecessary channel mode modifications

  [ Neels Hofmeyr ]
  * resurrect meas_feed.c: vty, vty-test
  * dyn ts, bts_ipaccess_nanobts.c: init PDCH on Chan OPSTART ACK
  * dyn TS, assignment: set lchan state to LCHAN_S_ACT_REQ in the proper place
  * dyn TS, assignment: allow switch from PDCH with associated conn
  * dyn TS: init only when both RSL and the Channel OM are established
  * dyn TS: allow any pchan type changes, fix for gprs mode none
  * debug log: verbosely log all lchan alloc choices
  * deprecate dyn_ts_allow_tch_f and by default allow all TCH
  * fix default fallbacks in audio_support_to_gsm88()
  * log: indicate hr/fr in audio_support_to_gsm88() error
  * cosmetic: dyn ts init: undup logging for gprs = none

  [ Vadim Yanitskiy ]
  * osmo_bsc_vty.c: fix: write MGW configuration

 -- Pau Espin Pedrol <pespin@sysmocom.de>  Tue, 15 May 2018 14:10:38 +0200

osmo-bsc (1.2.0) unstable; urgency=medium

  [ Neels Hofmeyr ]
  * vty: skip installing cmds now always installed by default
  * bssap: paging: page entire BSS for unimplemented cell id list
  * fix build: bssap test broke by undefined references
  * osmo-bsc RESET FSM: use distinct struct names
  * osmo-bsc: SCCP addrs: default only if unset, reject invalid
  * osmo-bsc vty: be fatal for addressbook entry errors
  * use osmo_sccp_inst_addr_name() instead of looking up ss7
  * add --enable-sanitize config option
  * bsc_init: fix Werror: define rc for 2quater with si2q_count == 0
  * bsc filter: don't ignore imsi-allow on "global" filter level
  * compiler warnings: drop some unused variables
  * compiler warnings: constify in abis_nm.c
  * cleanup: drop unused gsm_bts.role
  * compiler warnings: add includes in abis_rsl.h, gsm_data_shared.h
  * cosmetic: handover.h: use "#pragma once", declare structs, comments
  * examples: add osmo-bsc-minimal.cfg
  * HO prep: pass gsm_network to gsm_bts_alloc() already
  * fix segfault upon release paging on BSSMAP Reset: init llist
  * log typo fix in gsm0808_cipher_mode()
  * debug log: log Cipher Mode info upon sending down RSL/A-bis
  * fix bssmap_handle_cipher_mode()'s encryption decision
  * abisip-find: add getopt option parsing in preparation for a new option
  * abisip-find: add -l to list base stations instead of streaming replies
  * abisip-find: update copyright
  * abisip-find: add timeout option
  * abisip-find: add --interval option
  * vty: fix 'show lchan ...' arg [lchan_nr] to [<0-7>]
  * vty: change handover command's arg LCHAN_NR to <0-7>
  * vty: cosmetic: use common BTS, TRX, TS, LCHAN strings
  * vty: add various manual handover and assignment trigger commands
  * osmo_bsc_mgcp: cosmetic: introduce mgcp_init(), soak up fsm init
  * HO: fix recovery from failed handover
  * HO prep: introduce per-BTS handover config, with defaults on net node
  * HO: add indicators for inter-cell and async ho, use for chan act type
  * cosmetic: explicitly init ho_ref start value
  * fixup: neigh_meas_avg: detect invalid window size as <=0, log if invalid
  * fixup: neigh_meas_avg: fix condition to reduce window size
  * HO: enable handover by initializing at startup; rename init function
  * HO: add handover algo 2 parameters; skip HO 1 if HO 2 is configured
  * HO: rename gsm_bts_neighbor() to bts_by_arfcn_bsic()
  * HO: make bts_by_arfcn_bsic() public
  * libcommon: eliminate bsc_version.c
  * libcommon: eliminate common_vty.c
  * libcommon: eliminate debug.c
  * libcommon: eliminate socket.c
  * libcommon: eliminate talloc_ctx.c
  * ipaccess-proxy: don't redefine tall_bsc_ctx
  * libcommon: join gsm_data_shared.* into gsm_data.*
  * drop libcommon completely, move remaining files to libbsc
  * libcommon-cs: move a_reset.c into libbsc
  * libcommon-cs: move gsm_network_init() into bsc_network_init()
  * gsm_network: drop unused trans_list
  * libcommon_cs: move gsm48 bits to libbsc
  * libcommon-cs: move vty bits to libbsc/bsc_vty.c
  * common_cs.h: mv gsm_encr to gsm_data.h
  * drop libcommon-cs completely
  * drop unused common.h
  * gsm_network: drop unused subscr_epxire_timer
  * vty: 'show bts': write '(none)' if none are found.
  * vty: 'show bts': fix indenting
  * bts chan_load: ignore unusable BTS
  * handover_logic.c: always do inter-cell channel activation
  * handover_logic.c: on HO command, send new lchan's MS power
  * HO: process_meas_rep: guard against modulo zero
  * HO: cosmetic: bsc_handover_start(): "fix" memcpy for AMR config
  * HO: add new_lchan_type arg to bsc_handover_start()
  * HO: cosmetic: bsc_handover_start_lchan_change(): tweak local vars
  * HO: always do async handover
  * HO: bsc_handover_start_lchan_change(): set MS to max power on handover
  * HO: logging: more logs, and more concise logging
  * HO: move penalty timers to own file as proper API
  * HO: store speech codec list from BSSMAP Assignment in conn
  * HO: cfg: tweak vty write
  * vty: 'show bts': list the TRXs' ARFCNs
  * vty: 'show bts': print neighbor cells
  * HO: cfg: separate hodec1 from hodec2 parameters
  * HO: lchan: store last seen measurement report nr, tweak log
  * HO: clearly mark conn penalty timer member for hodec2
  * HO: cosmetic: handover_decision.c: make process_meas_rep() return void
  * HO: introduce ho decision callbacks
  * HO: cosmetic: getting a chan activ nack on a non-ho lchan is not an error
  * HO: Implement load based handover, as handover_decision_2.c
  * HO: vty: rename ho decision 1 vty to 'handover1' with 'handover' alias
  * cosmetic: adjust copyrights on handover_cfg.c,_vty.c
  * HO: vty: clearly mark 'handover foo' as legacy alias for 'handover1 foo'
  * drop unused libbsc/meas_proc.c
  * HO: fix minor issues found by coverity
  * bsc_api.c: fix log string format
  * fix build: gprs_ra_id_by_bts(): ensure to init all values
  * compiler warning: chan_compat_with_mode(): clearly handle all enum vals
  * add test for gsm48_ra_id_by_bts()
  * add test for abis_nm_ipaccess_cgi()
  * ctrl_test_runner: add tests for 3-digit MNC
  * gsm48_ra_id_by_bts(): struct gsm48_ra_id* instead of buf
  * cosmetic: bsc_network_init(): imply default 001-01 PLMN
  * implement support for 3-digit MNC with leading zeros
  * gsm48_parse_meas_rep(): set num_cell=0 if no neighbor cells are reported
  * cosmetic: hodec2: log nr of neighbors in meas report
  * cosmetic: typo in log: handover_decision2.c: 'measuements'
  * handover_test: explicitly wrap abis_rsl_sendmsg()
  * pcu_if: implement support for 3-digit MNC
  * configure: add --enable-werror
  * cosmetic: abis_nm: use osmo_cell_global_id, parse 3-digit MNC
  * fixup: apply mnc3 change also in ipaccess/network_listen.c
  * vty: drop unused vty definitions (*_NODE, msc_*)
  * gsm0408_test: drop LAI encoding test
  * range_enc_arfcns: avoid runtime error on zero size
  * fix gsm0408_test: properly free bts struct after each test
  * move init from gsm_bts_alloc_register() to gsm_bts_alloc(); fix gsm0408_test
  * cosmetic: gsm0408_test: drop unused arg from bts_init()
  * ctx cleanup: use non-NULL talloc ctx for osmo_init_logging2()
  * vty: re-add 'timeout-ping' and 'timeout-pong' as dummy commands
  * resurrect meas_feed.c from openbsc.git history
  * resurrect meas_feed.c: make it compile, add logging

  [ Max ]
  * Check OML state per-BTS
  * OML: consider administrative state when reporting
  * cosmetic: remove obsolete ROLE_BSC
  * cosmetic: tighten function type signatures
  * cosmetic: drop unused include
  * cosmetic: mark gsm_objclass2mo as static
  * OML: expand status reporting checks
  * Generate SI2ter Rest Octets
  * Generate SI2bis Rest Octets
  * Fix tests after rate_ctr change
  * Remove unneeded .py scripts
  * Enable sanitize for CI tests
  * Migrate from OpenSSL to osmo_get_rand_id()
  * Add optional profiling support
  * Fix .deb builds
  * Check and handle SMS encoding failure
  * Remove obsolete ./configure option
  * cosmetic: remove duplicated code
  * RSL: print link state per-TRX
  * vty: fix OML link state printing
  * cosmetic: log prim operation as text

  [ Philipp Maier ]
  * mgcp: use osmo-mgw to switch RTP streams
  * cosmetic: remove distracting newline
  * cosmetic: reorder case list
  * cosmetic: replace term MGCP-GW with MGW
  * mgcp: add missing out state
  * mgcp: remove unused variable
  * reset: remove name variable from reset context
  * doc: add example configuration for osmo-mgw
  * auth: remove obsolete VTY commands
  * bssap: remove libosmo-legacy-mgcp dependancy
  * sccp-lite: remove obsolete VTY commands
  * auth: remove unused structs
  * auth: remove obsolete VTY commands
  * mgcp: use hexadecimal digits in endpoint names
  * mgcp: use mgw assigned connection identifiers
  * mgcp: add missing switch case
  * mgcp: do not fail silently on snprintf()
  * cosmetic: remove duplicate logging
  * cosmetic: do not cast void pointer
  * cosmetic: add missing log prefix
  * cosmetic: correct sourcecode formatting
  * cosmetic: use fsm pointer from parameter list
  * mgcp: cosmetic fixups
  * paging: paging_flush_bts: be sure pending_requests is initalized
  * cosmetic: osmo_bsc_mgcp: improve comments
  * mgcp: cancel transactions on timeout
  * mgcp: validate rtp connection data in MGW response (ip/port)
  * mgcp: log file and line of calls to handle_error()
  * cosmetic: mgcp: remove duplicate logging
  * abis_rsl: permit first EstablishInd only on SAPI=0
  * abis_rsl: do not allow SACCH in MF mode on SAPI=0
  * SIGTRAN: correct wrong log category
  * bsc_api: drop unknown RR messages.
  * paging: page all bts when no cell is associated
  * paging: fix paging attemt rate counter
  * a_reset: Add FSM event names
  * gsm_data: use feature list from libosmocore
  * bsc_vty: display bts features in show bts
  * cosmetic: remove unused enum members
  * cosmetic: fix typo
  * cosmetic: fix argument order of forward_dtap()
  * cosmetic: remove needless fixme note.
  * cosmetic: fix incomplete sentence in comment.
  * Cosmetic: fix missing semicolon after osmo-assert
  * cosmetic: remove dead code and obsolete fixmes
  * cosmetic: remove old, already commented-out code
  * ipaccess: make ipaccess-config build again
  * bs11: make bs11_config build again
  * cosmetic: remove dead code: osmo_bsc_reset.c
  * gscon: fix illegal state transitions
  * cosmetic: remove dead code
  * cosmetic: Add fixme note for OS#3112
  * inform A-RESET FSM about MSC CR timeouts
  * gscon: fix assignment of signalling channels
  * cosmetic: Add note about libosmo-legacy-mgcp to configure.ac

  [ Harald Welte ]
  * debian: Add dependency to libosmo-mgcp-client-dev
  * debian: Increase required libosmo-legacy-mgcp-dev version
  * configure.ac/debian: Require libosmo-mgcp-client-dev >= 1.2.0
  * osmo-bsc: Print NOTICE message on unimplemented BSSMAP UDT
  * Move many counters from BSC-global to per-BTS granularity
  * rate_ctr: Use ':' as separator, not '.'
  * Remove 'msc' counter group from BSC
  * Change T3101 default from 10s to 3s.
  * paging.c: add more documentation on what the functions actually do
  * paging: Remove obsolete paging call-back support
  * paging: Stop all paging if MSC sends us BSSMAP RESET
  * Fix per-BTS counter group index
  * libbsc: paging: more reasonable (and detailed) paging statistics
  * Reduce T3113 default from 60s to 10s
  * Add per-BTS rate_ctr for total + failed number of RSL CHAN_ACT
  * Add new per-BTS "rsl:unknown" counter to count unknown RSL messages
  * Add a new counter "rsl:ipa_nack" to count number of IPA related NACKs
  * Add new "chan:mode_modify_nack" counter to count RSL MODE MODIFY NACK
  * Remove dead code left over from NITB split
  * Remove unused RRLP options/codec
  * Remove bogus vty config for LU reject cause
  * Remove bogus MM INFO configuration
  * Remove some more dead code
  * remove libosmo-sccp dependency for osmo-bsc
  * osmo_bsc_bssap.c: Spelling fixes in comment
  * Remove unused struct osmo_bsc_sccp_con member sccp_queue_size
  * osmo_bsc.h: document every field in 'struct osmo_bsc_sccp_con'
  * osmo-bsc: Move user plane/voice related bits into sub-structure
  * gsm_data.h: Document all fields of gsm_subscriber_connection
  * remove unused 'lac' member of 'struct gsm_subscriber_connection'
  * BSC: Add "show subscriber all" command
  * BSC: Fix bsc_subsc leak on paging
  * bsc_test.c: Use proper network/bts/lchan structures
  * cosmetic: Hide all accesses to conn->bts behind conn_get_bts()
  * Reduce T3109 default from 19s to 5s
  * Make libcommon, libcommon-cs, libfilter, utils depend on mgcp/sigtran
  * cosmetic: Remove data/len variables in bssmap_handle_assignm_req()
  * bssmap_handle_assignm_req(): Decode channel type as first step
  * remove obsolete gsm_subscriber_connection.bts member
  * update.gitignore with 'tags' files and 'deps' directory
  * gsm_data_shared.h: Remove unused sacch_deact member field
  * vty: print RTP IP of lchan if actually bound; print remote (mgw) IP
  * osmo-bsc: Add talloc context introspection via VTY
  * Structural reform: Get rid of osmo_bsc_sccp_con
  * vty: Permit codec-list containing both full-rate and half-rate codecs
  * logging: Remove obsolete log categories
  * Permit set of multiple different A5 ciphers
  * bssmap_handle_assignm_req(): Use proper cause values
  * bssmap_handle_assignm_req(): Use more conscise error/log message texts
  * bssmap_handle_assignm_req(): Don't print log statemens in malloc failure case
  * chan_compat_with_mode: signalling works over all channel types
  * osmo-bts/nanobts: Set RACH_Busy Threshold to -90 dBm
  * Align syntax of "handover" + "assignment"  command with that of lchan act/deact
  * Revert "Generate the S_L_INP_TEI_UP signal earlier."
  * bsc_vty: Merge more VTY documentation string #defines
  * sysinfo: Fix regression causing missing L2 Pseudo-Length in SI5/SI6
    (Closes: #3059)
  * introduce an osmo_fsm for gsm_subscriber_connection
  * cosmetic: Fix infinite number of formatting errors in gscon_fsm_states
  * abis_nm: Improve and fix OML logging
  * paging: Unify formatting of log messages with (bts=%d) prefix
  * RR: Send RR STATUS in case of unsupported/unknown message
  * BSSAP: Fix test_codec_pref() implementation for AMR
  * BSSAP: document match_codec_pref() more thoroughly
  * GSCON FSM: Fix argument order when calling gsm0808_assign_req()
  * bssmap: State correct speech codec in ASSIGNMENT COMPLETE
  * Start Dynamic PDCH Initialization after RSL is up
  * "show timeslot": Show dynamic PDCH state also for Osmocom-style dyn PDCH

  [ Alexander Couzens ]
  * debian: remove doublicated project name in example files
  * use _NUM_CHREQ_T to define the size of ctype_by_chreq
  * pcuif_proto.h: fix whitespaces and indention
  * pcuif_proto.h: add features of version 7 (txt indication)

  [ Pau Espin Pedrol ]
  * tests: Fix selection of python version
  * Use type bool for boolean fields in gsm48_si_ro_info
  * vty: Add cmd to configure 3g Early Classmark Sending
  * cosmetic: bsc_vty: Fix trailing whitespace
  * cosmetic: bsc_vty: Document bvci reserved values
  * osmo_bsc_bssap.c: Fix discard of const qualifier in assignment
  * debian: Move abisip-find from osmo-bsc to its own package
  * abisip-find: Add option to bind to a specific source address
  * abisip-find: Force stdout buffer flush
  * abisip-find: Add --format-json option
  * ipaccess-config: Enable logging all categories to print errors
  * ipaccess-config: Add missing path with log error
  * ipaccess-config: Improve handling of last parameter
  * abisip-find: Improve use information output
  * ipaccess-config: Check cmdlie arg unit-id format
  * bsc_api.c: bsc_handle_lchan_signal: Remove unused variable
  * bsc_subscr_conn_fsm.c: Fix wrong param list passed to LOGPFSML
  * tests: handover_test.c: Add missing header
  * pcu_sock.c: Avoid breaking strict-aliasing on ptr derreference
  * contrib: jenkins.sh: Add --enable-werror flag
  * contrib: osmo-bsc.service: Update description
  * contrib: osmo-bsc.service: Fix osmo-mgw.service dependency
  * libbsc: nokia_site: Fix uninitialized return val
  * bsc_vty: Fix uninitialized var false positive on gcc 7.3.1
  * paging: paging_request_bts: Fix wrong return value
  * bssap: Log non handled paging requests
  * libbsc: set_net_mcc_mnc_apply: Fix memleak on parsing incorrect mcc mnc
  * bsc_nat: ctrl: fix memleak on reply receival
  * bsc_nat: forward_to_bsc: remove one level of indentation
  * bsc_nat: forward_to_bsc: Fix memleak on send failure
  * bsc_nat: Drop redundant ccon ptr in bsc_cmd_list
  * bsc_nat: ctrl: Fix crash on receveing bsc reply
  * use osmo_init_logging2
  * chan_alloc.c: Fix log var formatting issues
  * abis_rsl.c: abis_rsl_rx_cchan: Print msg type name for unimplemented messages received
  * abis_rsl.c: Clean ericsson specific imm assign code
  * gsm_data_shared.h: Remove unused enum gsm_paging_event

  [ Stefan Sperling ]
  * Fix "CTRL GET msc_connection_status" response.
  * Support control connection status query for a particular MSC.
  * Implement support for paging by LAI.
  * Add TAGS files (produced by 'make tags') to .gitignore file.
  * Implement support for CELL_IDENT_NO_CELL.
  * Implement support for paging based on CI (cell identifier).
  * Move BTS selection for paging from osmo_bsc_grace.c into osmo_bsc_bssap.c.
  * Implement support for paging based on a Cell Global Identifier.
  * Implement support for paging based on LAC and CI.
  * Show the BTS number for outgoing paging commands in debug log.
  * Split paging cases in bssmap_handle_paging() off into helper functions.
  * Remove an unused variable.
  * Improve an error message in page_lai_and_lac()
  * Make "waiting indicator" of IMMEDIATE ASSIGN REJECT dynamic.
  * Add stat items for the BTS's channel load average and T3122.
  * Make RSL connection attempts time out.
  * fix handover_test link error
  * Add support for Access Control Class ramping.
  * Generate the S_L_INP_TEI_UP signal earlier.
  * use libosmocore to parse cell identifiers in osmo-bsc
  * fix an error message in bssmap_handle_paging()
  * change return type of page_subscriber() to void
  * Generate the S_L_INP_TEI_UP signal earlier.
  * fix a format string error in bts_update_t3122_chan_load()
  * fix initialization of acc ramping
  * only log actual access control class ramping changes
  * ensure that acc_ramp_init() is only called once
  * trigger acc ramping based on trx rf-locked state
  * rename helper functions in the acc ramp code to avoid confusion
  * trigger acc ramping on state-changed-event reports
  * only trigger acc ramping if trx 0 is usable and unlocked
  * fix handling of state changes in acc ramping
  * properly skip paging is OML link is down
  * extend documentation of paging_flush_bts()
  * flush paging when RSL link is dropped

  [ Vadim Yanitskiy ]
  * bsc/gsm_04_80.h: use '#pragma once' instead of includes
  * bsc/gsm_04_80.h: clean up useless declarations
  * libbsc/bsc_vty.c: prevent uninitialized access
  * doc/examples: use NECI = 1 by default

  [ Ivan Kluchnikov ]
  * handover_decision: Fix condition for power budget handover attempt
  * handover_decision: log HO causes more accurately

  [ Andreas Eversberg ]
  * HO: Send Channel Mode and Multirate IE along with handover command
  * HO: Add function to count currently ongoing handovers to a given BTS
  * Fix: If paging for half rate was requested, use hr, if supported by MS
  * HO: Assign SDCCH on channel request
  * Fix of checking TCH rate at chan_compat_with_mode
  * HO: Count the actual meas.rep. get_meas_rep_avg fails if not reached
  * HO: Count neighbor measurements and reduce window of neigh_meas_avg
  * HO: Changed availablilty of ts_is_usable() from static to extern
  * HO: Always update rqd_ta after receiving measurement report
  * HO: If handover logic is used to do assignment, signal assignment result
  * HO: Add handover decision debugging category
  * Do not perform assignment, if the new channel equals the current one
  * Allow assignment to TCH channel with signalling only mode
  * Correctly set T3105 for ipaccess BTS type
  * HO: fix: increase the number of measurement report history to 10
  * HO: Change debug category at handover decision: DHO -> DHODEC
  * HO: Count number of free timeslot on a given BTS
  * HO: add queue to cache DTAP messages during handover/assignment
  * Fix: meas_rep.c will only use valid DL measurement reports
  * HO: Add a penalty timer list to the subscriber connection entity

  [ Keith ]
  * Cosmetic: Fix typo: Siganlling->Signalling

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

osmo-bsc (1.1.2) unstable; urgency=medium

  * Debian: depend on libosmo-sigtran (bsc) and libosmo-sccp (bsc-nat)
  * debian/control: Specify versions of packages we depend upon

 -- Harald Welte <laforge@gnumonks.org>  Sun, 29 Oct 2017 09:03:33 +0100

osmo-bsc (1.1.1) unstable; urgency=medium

  [ Neels Hofmeyr ]
  * jenkins: use osmo-clean-workspace.sh before and after build

  [ Harald Welte ]
  * Debian: re-introduce missing build dependency to libssl-dev

 -- Harald Welte <laforge@gnumonks.org>  Sat, 28 Oct 2017 21:49:00 +0200

osmo-bsc (1.1.0) unstable; urgency=medium

  [ Alexander Couzens ]
  * Initial release.
  * debian/rules: show testsuite.log when tests are failing

  [ Neels Hofmeyr ]
  * jenkins: fix build: osmo-mgw from master, not pre_release
  * drop files unrelated to osmo-bsc
  * rename openbsc.pc to osmo-bsc.pc
  * rewrite README
  * move include/openbsc to include/osmocom/bsc
  * drop MGCP client from osmo-bsc
  * fix vty tests: vty no longer goes to parent node implicitly
  * doc/examples: tweak osmo-bsc.cfg, add osmo-bsc_custom-sccp.cfg
  * add ';' after OSMO_ASSERT()

  [ Harald Welte ]
  * configure.ac: No more libosmogb dependency
  * configure.ac: remove --enable-osmo-bsc, --enable-nat
  * configure.ac: remove smpp_mirror, which has no relation to a BSC
  * contrib/jenkins.sh: MGCP is unconditional now
  * configure.ac: Remove --enable-mgcp-transcoding
  * configure.ac: Remove --enable-iu
  * configure.ac: Remove checks for libgtp + c-ares
  * configure.ac: Remove check for GMTOFF
  * configure.ac: Package is now called osmo-bsc, not openbsc
  * libbsc: document arguments of generate_bcch_chan_list()
  * Make sure BA-IND in all SI2xxx is '0' and in all SI5xxx is '1'
  * gsm0408_test: Verify that BA-IND is 0 in SI2xxx and 1 in SI5xxx
  * .gitignore: Update to post-NITB-split realities
  * Remove any references to RANAP and Iu
  * Fix nanobts_omlattr unit test
  * nanobts_omlattra_test: Initialize logging before executing tests
  * osmo-bsc: Initialize logging before initializing rate_ctr
  * Rename osmo_fsm to avoid illegal space in name + more meaningful name

  [ Max ]
  * Make TRX rf locking more visible
  * SI13: drop PBCCH-related bits
  * Wrap channel state assignment in macro
  * Further cleanup leftovers from BSC/MSC split
  * CTRL: cleanup write-only command functions
  * Show OML link uptime in vty
  * Fix repo split aftermath
  * SI2q: cleanup UARFCN addition
  * OML: consider RSL link state
  * SI2q: fix generation for multiple UARFCNs
  * Remove pkg-config file
  * ctrl: add oml-uptime command
  * SI1q: fix EARFCN appender

  [ Pau Espin Pedrol ]
  * Remove unneeded dbi dependency
  * bsc_api: Fix NULL secondary_lchan access in handle_ass_fail
  * libbsc: Use correct printf formatting for uint64_t
  * bsc_vty: Improve description of mid-call-text cmd

 -- Harald Welte <laforge@gnumonks.org>  Sat, 28 Oct 2017 11:19:03 +0200

osmo-bsc (0.1.0) UNRELEASED; urgency=low

  [ Alexander Couzens ]
   * Initial release.

 -- Alexander Couzens <lynxis@fe80.eu>  Tue, 08 Aug 2017 01:12:56 +0000
