osmo-pcu (1.3.0) unstable; urgency=medium

  [ Philipp Maier ]
  * pcuif_proto: move gsm_pcu_if_e1_ccu_ind into right place
  * pcu_l1_if.cpp: handle TLLI based IMMEDIATE ASSIGNMENT confirmation
  * pcu_l1_if: move direct phy l1if functions to dedicated header file
  * lc15/oc2g: fix function signature of l1if_open_pdch()
  * osmo-bts-xyz: include pcu_l1_if_phy.h in phy in l1_if code
  * en/decoding: fix deprecated include path
  * pcu_l1_if: use only the term "direct PHY access"
  * pcu_l1_if_phy: add header file for struct gsmtap_inst
  * pcu_l1_if_phy: add new PHY API function to disconnect PDCH
  * pcu_l1_if_phy: add new PHY API function to initialize PHY
  * pcu_l1_if: cosmetic: remove whitespace after *
  * pcu_l1_if_phy: support multiple BTS (in theory)
  * bts: add IMMEDIATE ASSIGNMENT via PCH transmission
  * support for Ericsson RBS E1 CCU
  * pcu_l1_if: get rid of strange paging group calculation
  * doc: add sample config to illustrate how to use an E1 CCU
  * pcu_l1_if: do not copy IMSI when it is NULL
  * Makefile.am: remove phy specific EXTRA_DIST variables
  * doc: overview: put BTS and PCU on the same rank
  * doc: Add details regarding BSC co-location
  * pdch_ul_controller: log reserved frame numbers
  * pcu_l1_if: cosmetic: reformat comment
  * er_ccu_l1_if: use one ccu_desr per timeslot
  * pcu_l1_if_phy: fix API function names
  * pcu_l1_if: replace magic numbers with IMSI_DIGITS_FOR_PAGING
  * gprs_rlcmac: also use PCU_IF_SAPI_PCH_DT for paging MAC blocks
  * pcu_l1_if: use correct SAPI in PCUIF message PCU_IF_MSG_DATA_CNF_DT
  * neigh_cache: make neigh_cache_lookup_entry static
  * nacc_fsm: Add support for NACC with UTRAN and E-UTRAN cells
  * nacc_fsm: fix uninitialized neigh_key variable
  * pcuif_proto: rename tlli to msg_id
  * bts: get rid of fn parameter in bts_rcv_imm_ass_cnf
  * pcuif_proto: remove unnecessary members from gsm_pcu_if_data_cnf_dt
  * pcuif_proto: get rid of _DT, _dt (Direct TLLI)
  * pcuif_proto: add confirm flag to struct gsm_pcu_if_pch
  * pcu_l1_if: add support for PCU_IF_SAPI_AGCH_2 for PCUIF v.11
  * osmobts_sock: cosmetic: rename osmobts_sock.c to pcuif_sock.c
  * pcuif_sock: improve log output (OsmoBTS/OsmoBSC)

  [ Oliver Smith ]
  * Run struct_endianness.py
  * lc15bts.h: add missing extern keyword
  * debian: set compat level to 10
  * systemd: depend on networking-online.target

  [ Pau Espin Pedrol ]
  * tbf: Increase log level if polling requested in wrong TS
  * tbf_ul_fm: Allow receiving event TBF_EV_MAX_N3105 in state RELEASING
  * osmo_bts_sock.c: Call osmo_fd_unregister() before closing and changing bfd->fd
  * Update libosmogsm deprecated include
  * ms: Fix MS without PTMSI not freed immediatelly
  * ms: Drop setting tlli during ms_alloc()
  * tbf_dl: Avoid attempt scheduling DL ACK/NACK in TS != CTRL TS
  * ms: Drop setting (egprs_)ms_class during bts_alloc_ms()
  * bts: Rename bts_ms_by_{tlli,imsi} -> bts_get_ms_by_{tlli,imsi}
  * ms: Merge ms_storage into bts.cpp
  * ms: store in bts->ms_list during alloc/destroy of ms object
  * Merge bts_alloc_ms() and ms_alloc()
  * ms: Use osmo_use_count to track references
  * ms: Make sure tbf!=NULL in ms_attach_{ul,dl}_tbf()
  * ms: Make ms_{attach,detach}_tbf expectancies more robust
  * ms: Log detaching tbf log line in proper place
  * ms: Rewrite MS release lifecycle
  * tbf: Store initial timestamp during constructor
  * tbf: Move m_ctrs alloc to constructor
  * tbf_ul: Move rate_ctr allocation to constructor
  * tbf: Move enable_egprs() to constructor
  * cosmetic: Fix indentation in comment
  * ms: Hold a reference during ms_alloc
  * dl_tbf: Set BandWidth timestamps to current time directly
  * Add new log category 'ms'
  * ms: Increase log level when scheduling release timer
  * meas: Improve logging formatting
  * ms: Get rid of ms->delay field
  * ms: Rename field timer -> release_timer
  * ms: Log MS active/idle state in 'show ms' VTY commands
  * vty: Several improvements to 'show ms' output format
  * alloc_algo: Pass a struct containing all req params
  * alloc_algo: Move printing outside of update_ms_reserved_slots()
  * Move out of alloc_algo code modifying the data model
  * Move resource allocation outside of tbf allocation
  * ms: Mark ms_reset() as static
  * ms: Fix unsafe iterating freeing items in list
  * cosmetic: ms: fix formatting of function comment
  * tbf: Improve TBF name description in logs
  * cosmetic: tbf_ul_ack_fsm: Clean up use of ul_tbf and tbf pointers
  * Use always RFN when handling RACH indications
  * Error trying to obtain FN from RFN if curr_fn not known
  * bts: use RFN directly to calculate fn416
  * encoding: pass RFN to write_immediate_assignment(_reject)()
  * Derive FN from RFN once and cache it in struct rach_ind_params
  * Use fn_valid() helper in pcu_rx_time_ind()
  * Move call to bts_set_current_frame_number() earlier in the code path
  * Use OSMO_UNLIKELY() in bts_rfn_to_fn()
  * pcu_utils.h: Replace software based bitcount impl with gcc builtin
  * Document pcu_lsb() function
  * Log MS information in error message using usual MS API
  * tbf_dl_fsm: Apply T3193 using FSM infrastructure instead of manually
  * tbf_{ul,dl}_fsm: Remove unneeded asserts
  * tbf_{ul,dl}_fsm: remove impossible dst state transitions
  * Avoid using N3101 in DL TBFs
  * Avoid using N3103 in DL TBFs
  * Avoid using N3105 in UL TBFs
  * tbf_dl_fsm: Remove T3169 references, simplify T3195 set up as consequence
  * tbf_ul_fsm: Remove 3195 references, simplify T3169 set up as consequence
  * Abort UL TBF PACCH Ass based on T3168
  * Remove unused GPRS_RLCMAC_FLAG_TO_MASK
  * Improve logging in bts_snd_dl_ass()
  * tbf_dl_fsm: Fix wrong lchan specified in log line
  * tbf_{ul,dl}_fsm: Abort on unexpected path
  * tbf_{ul,dl}_fsm.c: Rearrange code/logs in mod_ass_type()
  * Move GPRS_RLCMAC_FLAG_TO_DL_ACK from state_fsm to dl_tbf
  * Move GPRS_RLCMAC_FLAG_DL_ACK from state_fsm to dl_tbf
  * tests/tbf: Drop unneeded line re-setting CCCH ass type
  * cosmetic: tbf_dl_fsm: Fix a couple comment typos
  * Move call to bts_snd_dl_ass() from tbf_dl.cpp to tbf_dl_fsm.c
  * Change several log lines to start with capital letter
  * cosmetic: Improve comment
  * Fix DL_TBF PACCH ass done on UL_TBF already scheduled to tx last PKT CTRL ACK
  * bts: Use same default value for T3193 as set in osmo-bts/bsc
  * Store T3192 value received from SI13, do some sanity checks
  * tbf_dl_fsm: Drop impossible event
  * cosmetic: tbf_fsm: Fix typo in comment
  * pdch.cpp: Drop impossible code path
  * Differentiate between T3192 and T3193
  * ms_need_dl_tbf(): Fix state checks and document function
  * tbf_ul: Avoid processing rx UL blocks for UL TBFs in RELEASING state
  * tbf_ul_fsm: Delay moving ul_tbf to FLOW
  * Avoid using UL TBF in RELEASE state to assign DL TBF over PACCH
  * Avoid re-assigning DL TBF over PACCH upon duplicate FinalACKs received
  * tbf_dl_fsm: Ignore DL_ACKNACK_MISS events in WAIT_{RELEASE,REUSE_TFI} states
  * Reestore last LLC frames never completely acked when freeing DL TBF
  * cosmetic: pdch.cpp: Drop wrong comment due to copy-paste error
  * tbf_dl_fsm: Fix '{FLOW}: Event ASSIGN_PCUIF_CNF not permitted'
  * pcuif: Log read() error cause
  * gprs_ms: Constify variable in ms_is_reachable_for_dl_ass()
  * gprs_ms: Update assert condition
  * oc2g: Fix multiple definitions of arrays
  * pcu_l1_if: Document tx_pch empty IMSI scenario
  * gprs_rlc_ul_window: Make sure V(N) array is cleared during reset_state()
  * Split rlc_{dl_,ul_,}window out of rlc.{h,cpp}
  * gprs_rlc_ul_window: Mark received BSNs falling out of the V(N)/RBB when V(R) is raised
  * cosmetic: mslot_class.h: Update spec reference
  * cosmetic: Document foce_two_phase feature based on specs
  * pcu_l1_if.cpp: Fix gsmtap not sent in PCU_IF_SAPI_PCH_DT
  * vty: Allow modifying default msclass

  [ Vadim Yanitskiy ]
  * {src,tests}/Makefile.am: libraries shall not be in AM_LDFLAGS
  * tests/Makefile.am: do not overwrite global LDFLAGS
  * fix pcu_rx(): actually discard malformed container message
  * tests: $(BUILT_SOURCES) is not defined, depend on osmo-pcu
  * copyright: fix typo: sysmocom s/s.m.f.c./s.f.m.c./ GmbH

  [ arehbein ]
  * PCU interface: Log version when starting listener

  [ Max ]
  * gprs_rlcmac: convert from C++ to C
  * ctrl: drop deprecated neighbor resolution interface

 -- Pau Espin Pedrol <pespin@sysmocom.de>  Tue, 12 Sep 2023 16:00:25 +0200

osmo-pcu (1.2.0) unstable; urgency=medium

  [ Vadim Yanitskiy ]
  * encoding: fix an uninitialized field in gen_freq_params()
  * neigh_cache: fix: properly convert from nanoseconds to microseconds
  * tests/rlcmac: remove unused #includes
  * tests/rlcmac: remove unused printSizeofRLCMAC()
  * tests/rlcmac: make all test functions static
  * tests/rlcmac: cosmetic: fix coding style in arrays
  * tests/rlcmac: use ARRAY_SIZE macro
  * tests: make target 'check-local' depend on 'atconfig'
  * tests: target 'check-local' does not depend on BUILT_SOURCES
  * Makefile.am: generate missing .version file
  * Makefile.am: add 'git-version-gen' to EXTRA_DIST
  * {ms,gprs_pcu}_talloc_destructor(): call osmo_timer_del() unconditionally
  * {src,tests}/Makefile.am: $(COMMON_LA) is not definied
  * fix pcu_l1if_tx_ptcch(): do not send empty blocks to GSMTAP
  * Make linter happy: fix coding style issues
  * bts_set_current_frame_number(): log expected TDMA FN
  * bts: bts_snd_dl_ass(): clarify the meaning of last_rts_fn + 21216
  * bts: bts_snd_dl_ass(): use GSM_TDMA_FN_SUM() macro
  * Makefile.am: drop unneeded '-ldl -pthread' from AM_CXXFLAGS

  [ Pau Espin Pedrol ]
  * nacc_fsm: Fix uninitialized plmn.mnc_3_digits parsing CTRL neigh resolution cmd
  * cosmetic: Add missing spacing between params
  * Use GSM48_MT_RR_IMM_ASS instead of hardcoded 0x3f value
  * Clarify use RR imm_ass msg fields
  * bts_rcv_imm_ass_cnf(): Improve logging
  * cosmetic: Update reference to func renamed in the past
  * gprs_ms: Document functions setting/updating TLLI
  * Call ms_store->get_ms() with GSM_RESERVED_TMSI instead of 0
  * gprs_ms: Move creating string name of object to a function
  * Move LLC enqueuing and retransmit timer to MS object
  * tbf_ul_ack_fsm: Pass ul_tbf instead of generic tbf
  * Rename tbf_alloc_dl_tbf() -> dl_tbf_alloc()
  * tbf_dl: Make dl_tbf_alloc API available in C code
  * Fix mess with struct tbf types passed to LOGPTBF macro
  * Rename as_{dl,ul}_tbf -> tbf_as_{dl,ul}_tbf
  * tbf_ul_ack_fsm: get ul_tbf base class only when needed
  * use new {dl,ul}_tbf_as_tbf(_const) helper functions
  * pdch: Use helper function tbf_as_ul_tbf()
  * rcv_resource_request(): Validate expected message before MS lookup & allocation
  * encoding: Use MT_PACKET_UPLINK_ASSIGNMENT define instead of hardcoded value
  * rcv_resource_request(): Update meas before allocating and assigning new UL TBF
  * Delay ImmAss(PCH, PktDlAss) if waiting for PKT_CTRL_ACK answering UL_ACK_NACK (FinACK=1)
  * Refactor and clarify tbf->triger_ass() code
  * Rename function tbf_dl_request_dl_ack() -> dl_tbf_request_dl_ack()
  * Replace tbf->establish_dl_tbf_on_pacch() refactoring GprsMs functions
  * ul_tbf: Define m_contention_resolution_done as bool
  * tbf_fsm: Identify several events as Dl-TBF only
  * Move UL allocation&assign functions to gprs_ms.c
  * update_ms(): Set TLLI of new MS object before merge with old MS
  * Join ms_merge_and_clear_ms() and ms_merge_old_ms()
  * gprs_ms: Add comment warning the user that a ptr may be freed after call to func
  * Rename tbf_alloc_ul_tbf -> ul_tbf_alloc
  * Rework tbf::update_ms()
  * tbf_fsm: Introduce new event TBF_EV_FIRST_UL_DATA_RECVD
  * Avoid losing DL-TBF during MS merge
  * tbf_fsm: Introduce new event to act upon contention resolution success
  * tbf_ul: Assign DL-TBF if needed after UL-TBF has gone over contenion resolution
  * Improve TBF logging
  * Improve MS logging
  * Disable logging fsm addresses
  * tbf_fsm: Move tbf_fsm_state_chg macro to .c file
  * tbf_fsm: Move osmo_fsm_inst fi out of struct tbf_fsm_ctx
  * tbf: Drop unused function
  * tbf: Add tbf_as_{ul,dl}_tbf_const func helpers
  * Refactor tbf_is_tfi_assigned() to avoid accessing tbf->state_fsm
  * Split tbf_fsm as tbf_{ul,dl}_fsm
  * Convert gprs_debug.cpp to C
  * pdch: Initial support Handling PktResReq with ID_TYPE=UL/DL_TFI
  * pdch_ulc_get_node(): assert if ulc pointer is null
  * Pass gprs_rlcmac_pdch to tbf_is_control_ts
  * Pass pdch ptr to tbf_compute_priority
  * encoding::write_immediate_assignment(): Constify tbf param
  * tbf_ul_fsm_ctx: Properly define tbf backptr as ul_tbf
  * tbf_dl_fsm_ctx: Properly define tbf backptr as dl_tbf
  * Move control_ts explicit checks out of the scheduler implementation
  * sched: Pass pdch to *_create_rlcmac_msg() functions
  * Move first_common_ts from gprs_rlcmac_tbf to GprsMs
  * Get rid of tbf->first_ts
  * Refactor code related to DL-TBF upgrade to multislot
  * Trigger PACCH assignment inside dl_tbf_upgrade_to_multislot()
  * tbf_ul: Fix wrong struct type in field
  * Refactor code rejecting UL-TBF upon rx of PktResourceReq
  * bts: Adapt slot_mask to trx defined array size
  * Convert ms_first_common_ts to struct gprs_rlcmac_pdch
  * Rename gprs_rlcmac_ts_alloc.cpp -> alloc_algo.cpp & create own .h file
  * pdch: Introduce APIs to print PDCH name
  * tbf: Fix typo in define used
  * Convert tbf->control_ts to be a gprs_rlcmac_pdch*
  * tests/tbf: test_tbf_dl_llc_loss(): Fix wrong param passed and wrong expectancies
  * Pass gprs_rlcmac_pdch to create_dl_acked_block()
  * Pass gprc_rlcmac_pdch to tbf_check_polling
  * Pass gprc_rlcmac_pdch to tbf_set_polling
  * bts: Adapt trx check based on bts->trx[] defined array size
  * tests/TbfTest: reproduce buggy corner case: MS with TBFs on 2 TRXs
  * Avoid moving DL-TBF from old_msg to new_ms during ms_merge
  * llc: Mark llc_is_user_data_frame() as static
  * llc: Refactor code checking if PDU expired while dequeueing
  * llc: remove unused reference to msgb address
  * cosmetic: Remove unneeded curly braces
  * Mark several fsm related internal symbols as static
  * rlc.h: Fix typo in param name

  [ Max ]
  * Set working directory in systemd service file
  * Update and document realtime scheduling priority in service file
  * cosmetic: drop unused field from struct pdch_ulc
  * cosmetic: drop duplicated comment
  * constify pdch_ulc_get_next_free_fn() parameter

  [ Philipp Maier ]
  * pcuif_proto: cosmetic: rename struct member "h" to "hopping"
  * pcuif_proto: cosmetic: rename gsm_pcu_if_info_ts to gsm_pcu_if_info_trx_ts
  * pcuif_proto: use define constant to specify nax number of trx
  * bts: refuse to set invalid frame numbers
  * bts: use GSM_TDMA_FN_ macros and uint32_t in bts_rfn_to_fn
  * bts: log FN jump delta in bts_set_current_frame_number()
  * pcuif_proto: add indication to communicate E1 parameters
  * pcu_l1_if: cosmetic: use sizeof instead of constants
  * pcu_l1_if: ignore frame numbers that exceed the valid range
  * pcuif_proto: rename PCU_IF_SAPI_AGCH_DT to PCU_IF_SAPI_PCH_DT

  [ Harald Welte ]
  * update horribly outdated copyright statement on VTY

  [ arehbein ]
  * osmo-pcu:  Transition to use of 'telnet_init_default'

 -- Pau Espin Pedrol <pespin@sysmocom.de>  Tue, 07 Feb 2023 17:10:40 +0100

osmo-pcu (1.1.0) unstable; urgency=medium

  [ Oliver Smith ]
  * treewide: remove FSF address

  [ Pau Espin Pedrol ]
  * Fix assert hit if connecting to SGSN fails
  * llc: Convert to C: s/m_//g
  * llc: Convert to C
  * llc: Move static functions below related object
  * ms: validate codel enabled against proper define
  * ms: Remove unneeded bts!=NULL check
  * gprs_ms_storage: MS always has non NULL ms->bts
  * llc: schedule frames to MS based on SAPI priority
  * pdch is_enabled: Use API getter instead of accessing field directly
  * llc_queue: Refactor to handle codel_state per prio queue internally
  * tests/llc: Add test_llc_meta_pdu_life_expire
  * tests/llc: Add test_llc_codel
  * gprs_ms: Use osmo_timer_setup() API
  * gprs_ms_storage: Use bts_stat_item_inc/dec APIs
  * tests/tbf: Set up pcu timers in prepare_pcu()
  * gprs_pcu: Explicitly free all bts objects in list before freeing pcu
  * bts: Call gprs_bssgp_destroy() in destructor
  * TbfTest: Reset MS timeout to 0 in test_tbf_dl_llc_loss()
  * gprs_ms_stoage: Release all MS in ms_storage cleanup()

  [ Harald Welte ]
  * update git  URLs (git -> https; gitea)

 -- Pau Espin Pedrol <pespin@sysmocom.de>  Wed, 29 Jun 2022 09:48:53 +0200

osmo-pcu (1.0.0) unstable; urgency=medium

  [ Pau Espin Pedrol ]
  * Support uplink multi-slot allocations
  * tbf: Log timeslot allocation failure
  * bts: Count TBF TS allocation failure
  * pdch: Standarize and improve logging
  * tbf: Improve logging when TBF being allocated or no TBF avail
  * Remove uneeded ms param from alloc_algorithm_func_t func
  * bts: Add new stats to detect TBF allocation failure reasons
  * llc: use memset to fill llc dummy frame padding
  * tbd_dl: Don't re-initialize class field twice
  * tbf: log keep_open condition status
  * tbf_dl: Fix m_last_dl_drained_fn not set under some conditions
  * tbf_dl: fix FBI not set upon X2031 = 0
  * ms: clarify delayed MS release process related code and logging
  * gprs_ms: Use standarized logging on more messages
  * sched: sched_select_ctrl_msg(): Clean up param list and improve logging
  * sched: sched_select_downlink(): Clean up param list and improve logging
  * TODO-RELEASE: document requirement of master libosmocore
  * tbf: Log N310* counter increments
  * pdch: Silently ignore DATA.ind with len=0
  * direct_phy: Support submitting DATA.ind with len=0 to upper layers
  * pcu_utils.h: Fix trailing whitespace
  * Track TDMA clock with DATA.ind instead of TIME.ind
  * Introduce init() APIs for PDCH and TRX objects
  * tests: rlcmac: Fix C vs C++ linkage of extern symbol
  * pdch.h: Drop uneeded include bts.h
  * Improve DATA.ind logging
  * Improve logging in DATA.req and ACT.req
  * tbf: Fix wrong variable printed in log
  * pdch: Log FN when decoding UL Ctrl block
  * Add new PDCH UL Controller, drop SBAllocator class
  * Replace PollController with newly added PDCH UL Controller
  * sched: Use new PDCH UL Controller
  * bts: Detect FN jumps
  * cosmetic: tests/Makefile.am: Split content into several lines
  * tests: Introduce unit tests for PDCH UL Controller
  * tests: ulc: Show current bug with FN wrap around
  * ulc: Fix FN store order upon wrap around
  * sysmo: fix wrong FN jumps in rx RA.ind
  * direct_phy: Fix condition dropping rx DATA.ind payload in in
  * Fix: left shift cannot be repesented in type int
  * sched: Fix scheduling UL TBF not matching conditions
  * sched: Simplify usf selection code
  * Set matching USF if available when polling a UL TBF
  * pdch: Add mising pdch_ulc_release_node in Rx Cell Change Notif
  * pdch_ulc: Create helper API pdch_ulc_release_node
  * Track scheduled UL blocks through USF
  * Properly implement N3101
  * sba: Document AGCH_START_OFFSET after some experimental tests
  * pdch_ulc: Optimize rbtree FN search
  * Pick unreserved UL FN when allocating an SBA
  * pdch_ulc: Support picking RRBP other than N+13
  * Drop unused function tbf_check()
  * pdch_ulc: Store TBF poll reason
  * tbf: Get rid of unneeded poll_scheduled()
  * tbf: Allow multiple concurrent polls
  * Remove unneeded poll_state check
  * tbf: get rid of poll_state completely
  * Get rid of param 'poll' with constant value
  * tbf: Get rid of attribute poll_fn
  * tbf: Get rid of attribute poll_ts
  * RIM: Improve logging
  * sba: Drop unused function find_sba_rts
  * pdch: rcv_resource_request: Improve robustness
  * pdch: tbf_by_tfi(): Allow returning TBFs in state RELEASING
  * Stop abusing T3169
  * Make use of T3142 received from BTS
  * Use negative numbers for non-spec osmo-specific timers
  * ul_tbf: Clean up handle_tbf_reject()
  * Make WaitIndication T3172 configurable
  * sched: Simplify else-if condition
  * Clarify, document Assignment related timers
  * doc/tbf.txt: Update and improve some information
  * bts: constify arg in func bts_ms_store()
  * sched: Rename func to describe its used only for RLCMAC CTRL blocks
  * rim: Constify param in func
  * Simplify helper function tbf_select_slot_set()
  * alloc_algorithm_b: Rearrange variable initialization
  * Rename function s/tbf_alloc_ul/tbf_alloc_ul_pacch/
  * Split ul_tbf alloc on CCCH into new function
  * Implement T3141
  * tbf_ul: Use is_tlli_valid() API
  * Tx ul ack/nack: Avoid sending invalid/unknown TLLI
  * encoding: Use gsm48_ta_is_valid() API
  * encoding: Encode TA in UL ACK/NACK if available
  * sched: Clean up helper function and improve logging
  * Drop existing tbf->ms() check condition
  * ul_tbf: Simplify function rcv_data_block_acknowledged
  * ul_tbf: Fix accessing zeroed block when checking if transfer is complete
  * sched: Clean up param passing and improve logging
  * pdch: Use llist_first_entry() API
  * RIM: Refactor Rx path to decode stack in proper order
  * Clean false positive in newer GCC version checking guard of else clause
  * Use LOGPDCH macro in bts_add_paging()
  * Optimize PAGING-CS PDCH set selection when target MS is known
  * bts: Use ms_store when calculating set of target PDCHs for Pkt Paging Request
  * tbf: Log error path in setup() failing to assign control TS
  * Move TBF list from BTS to the TRX structure
  * MsTest: Set up tbf talloc destructor
  * tbf: Move existing tbf_state implementation to osmo_fsm
  * cosmetic: Fix typo s/TIMSI/TMSI/
  * gsm_rlcmac.c: Fix arg list of 2 callbacks
  * csn1: Implement CSN_CALLBACK type in encoder
  * bts: Fix typo in field name
  * Use new stat item/ctr getter APIs
  * pdch: Log pdch_ulc reason upon rx of pkt ctrl ack
  * pcuif: Support receiving System Information 2
  * pdch: Fix null MS access gprs_rlcmac_pdch::rcv_control_ack
  * pcuif_proto.h: Add new container message
  * Support proto IPAC_PROTO_EXT_PCU BSC<->PCU
  * pdch: Fix heap-use-after-free in pdch->ulc
  * Make gcc 11.1.0 false positivies happy
  * tbf: Drop impossible paths in create_dl_ass()
  * tests/tbf: Fix null pointer access if slowly stepping with gdb
  * Revert "coverity: fix null deref from recent UL TBF leak fix"
  * Revert "fix: handle NULL return of as_dl_tbf() and as_ul_tbf()"
  * Revert "Revert "Stop abusing T3169""
  * Move NULL and ASSIGN tbf_state transition to tbf_fsm
  * Move FLOW tbf_state transition to tbf_fsm.
  * tests: tbf: Fix dl_tbf polled for data without being in FLOW state
  * Move FINISHED tbf_state transition to tbf_fsm
  * Move WAIT_RELEASE tbf_state transition to tbf_fsm
  * Move RELEASING tbf_state transition to tbf_fsm
  * Move T3169 and T3195 to tbf_fsm
  * Drop duplicate log line
  * Put dl_tbf::cleanup into destructor
  * Drop logging last mas report before freeing TBF
  * Remove duplicate call to gprs_rlcmac_lost_rep
  * Move rate_ctr free to tbf subclass destructor
  * Get rid of tbf_dl:abort()
  * tbf_free: Get rid of uneeded tbf_state transition
  * Replace ul_ass_state with osmocom FSM
  * tbf: Reimplement rlcmac_diag() and make it available from C
  * tbf: Drop unuseful flag GPRS_RLCMAC_FLAG_TO_UL_ASS
  * replace dl_ass_state with osmocom FSM
  * tbf: Drop unuseful flag GPRS_RLCMAC_FLAG_TO_DL_ASS
  * tbf: Drop unuseful flag GPRS_RLCMAC_FLAG_UL_DATA
  * Move timer X2001 to tbf_fsm
  * Get rid of lots of code only used by tests
  * tbf: Merge handle_ack_nack() into rcvd_dl_ack()
  * Fix typos in comments documenting fsm st chg macro
  * tbf: Use type bool for upgrade_to_multislot
  * Move timer X2002 to tbf_fsm
  * tbf_dl: Clarify requirements for DL ACK/NACK
  * tbf.h: Improve documentation on several flags
  * Move tbf ul_ack_state to osmocom FSM
  * Simplify tbf::set_polling()
  * tbf: Move T3193 to tbf_state FSM
  * fix typo 's/dowlink/downlink/g'
  * cosmetic: Fix typo in comment
  * sched: energy saving: Avoid Tx dummy blocks on empty PDCH TS
  * Fix crash with dyn TS when using direct pcu
  * Use LOGPDCH macro to standarize log line
  * cosmetic: sysmo: Drop unneded comment line
  * bts: Use public getter instead of class member
  * sched: Lower log level of RTS on disabled pdch
  * pdch: Make sure pending ImmAssRej scheduled for disabled pdch are dropped
  * Support Neighbor Address Resolution over PCUIF IPA multiplex
  * nacc_fsm: Move logic checking if SI is being waited for to a func helper
  * scheduler: Skip Tx DL idle blocks in TRX0 when not in DIRECT_PHY mode
  * PTCCH: skip Tx DL idle blocks when possible
  * tbf_ul_ass_fsm.c: Fix missing state transition in FSM description
  * tbf: poll_timeout(): Validate expected poll reason
  * nacc: Introduce helper function nacc_fsm_exp_ctrl_ack()
  * tbf: refactor poll_timeout() with a switch statement
  * tests: TbfTest: Fix wrong behavior in test_tbf_dl_reuse()
  * pdch: refactor rcv_control_ack() with a switch statement
  * cosmetic: Fix missing space
  * assert if tbf pointer for POLL event is NULL
  * tbf_fsm: Ignore event DL_ACKNACK_MISS in state RELEASING
  * tests: RLCMACTest: Add one more sample RA capabilities to suite
  * rlcmac: Fix CSN1 definition for DownlinkDualCarrierCapability_r7_t in MS RA cap
  * tbf: Assert if FSM allocation fails
  * sched: Rename function
  * pdch: Only release ULC entry if rx ul block matches the expected one
  * pdch: Validate poll reason matches in rcv_control_(egprs)_dl_ack_nack()
  * pdch: PktResReq: Avoid releasing ULC entry if expecting something else on UL
  * Handle Final UL ACK/NACK Confirmation in tbf_fsm
  * tbf_fsm: rename state NULL -> NEW
  * pdch_ulc: Log POLL reason upon timeout
  * tbf_dl_ass_fsm: Move block msg generation conditions to rts() function
  * tbf_ul_ass_fsm: Fix use of incorrect log macro
  * tbf_fsm: Handle MAX_N3105 in state ASSIGN
  * tbf: Use define to flag control_ts unset special value
  * tbf: Document temporary change of control_ts and move code assigning it back to FSM
  * Return void in tbf_assign_control_ts()
  * pdch: rcv_data_block: Avoid releasing ULC entry if expecting something else on UL
  * tbf: Avoid keeping poll nodes in pdch_ulc of temporary control_ts used during PACCH assignment
  * tbf_ul_ass_fsm: Avoid retrying Pkt Ul Ass if tbf is not in state ASSIGN
  * Abort scheduling of pending Pkt Ul Ass if tbf goes into RELEASE step
  * tbf: Drop pending polls during free also on states != ASSIGN
  * pdch: Simplify code path allocating UL TBF
  * pdch: Log reason of expected POLL when receiving unexpected UL data
  * bts_rcv_rach(): Gather pointers to data objects early and use them later
  * bts_rcv_rach(): Split code paths for Ass and Ass Rej
  * Get rid of tbf tsc field
  * ts_alloc: Rename s/tbf_/tbf/
  * tbf: Update FSM names when TFI change during tbf_update()
  * tbf_fsm: Add assert verifying X2002 only triggers for DL TBF
  * tbf: Assert if update() is called on UL TBF
  * tbf: update(): return negative val on error
  * tbf: Drop unneeded braces in one line condition
  * cosmetic: Fix typo in comment
  * pcuif: Submit data_req with len=0 as idle frames
  * Split csn1.c into common, enc and dec files
  * csn1: Add unit test showing RadioAccess Capability decoding failure
  * csn1: Avoid failing if optional DownlinkDualCarrierCapability_r7 is missing
  * csn1: Avoid storing existence bit as true if content was actually NULL
  * csn1_dec.c: Fix stored bit in CSN_NEXT_EXIST_LH
  * bts: Fix misleading log line in bts_rcv_rach()
  * tbf_ul: Document context where tbf_alloc_ul_ccch() is used
  * bts: Rename 11bit RACH request counter
  * vty: Avoid crash in tbf_print_vty_info with null ptr ctrg
  * vty: Log tbf_state when showing a TBF
  * vty: show tbf: Drop unneeded check for non-null ms
  * bts: Introduce new RACH req counters for one/two phase access
  * bts: Improve logging to clarify RACH req is for 2 phase access
  * bts: Count RACH Request with unexpected content
  * tbf: Increase log level of line about unable to allocate poll for TBF
  * pdch: Improve log line and increase log level
  * tbf_ul: Set first_(common_)ts in handle_tbf_reject
  * tbf: Set m_created_ts in constructor
  * tbf: Mark initial first_(common_)ts with special value
  * tbf: Set tfi to initial special value
  * bts: Add counters for successful 1,2 phase pkt access
  * tbf_ul: Update FSM names for dummy reject TBFs
  * cosmetic: Add parenthesis around expression to clarify it
  * pdch::rcv_resource_request(): Use local var to store bts pointer
  * tbf_ul: Improve documentation of tbf_alloc_ul_pacch()
  * Add counter for successful contention resolution procedures
  * doc: Update counters_generated.adoc using osmo_vty_interact.py
  * bts_pch_timer: Fix timer working only for MI type IMSI
  * tests/alloc: Extend test_bts_pch_timer() to validate MI type TMSI
  * bts_pch_timer: Avoid resend Paging Request over PCUIF if T3113 is armed
  * pdch: Log line detaching TBF at start of the function
  * pdch: Log TS enable/disable transitions
  * pdch: Log DL TBF originating the new UL TBF
  * ts_alloc: Simplify tfi_find_free logic
  * ts_alloc: rename function to clraify what it does
  * ts_alloc: rename variable to clarify meaning
  * pdch: Update ms_reserved_slots in GprsMS when TS becomes disabled
  * pdch: Drop previous UL TBF from MS who sent PktResReq through SBA
  * pdch: Increase log level of line informing about TS control change
  * tbf_ul_ass_fsm: Log both TBFs if old TBF is handling assignment for new one
  * cosmetic: gprs_pcu.h: Fix typo in comment
  * tbf_dl_ass_fsm: Log both TBFs if old TBF is handling assignment for new one
  * tbf_dl_ass_fsm: Fix missing transition to NONE if DL TBF is nonexistent
  * tbf_{dl,ul}_ass_fsm.c: use proper macro to log tbf
  * pcu_main: Mark -r cmdline param as deprecated
  * vty: Introduce command 'gsmtap-remote-host' and 'gsmtap-category enable-all'
  * Fix MS ending up with assigned imsi 000
  * bts: Add counter availablePDCHAllocatedTime
  * tbf_dl_ass_fsm: Drop unsued X2000 timer callback
  * T_defs_pcu: Set default val for X2000 to 0 ms
  * Move T3172 T_defs_bts->T_defs_pcu to have it configurable in VTY

  [ Alexander Couzens ]
  * gprs_bssgp_pcu: rework BSSGP Reset messages to support SGSN originated BSSGP-RESET
  * gprs_bssgp_pcu: ensure only known BVCI can be resetted by the SGSN
  * gprs_bssgp_pcu: add comments to the pcu states

  [ Harald Welte ]
  * pdch_ul_controller: Fix compiler warning on gcc-10.2
  * manual: remove revhistory, as we don't maintain it manually anyyway
  * manual: Update copyright years
  * vty: Add configuration for Gb DSCP and socket priority
  * manual: Include QoS chapter and add osmo-pcu specific example

  [ Vadim Yanitskiy ]
  * gprs_rlcmac_sched: fix incorrect length for CTR_RLC_DL_BYTES
  * PCUIF protocol: add message definition for interference report
  * pcu_l1_if: ignore PDCH interference reports, do not log errors

  [ Oliver Smith ]
  * test: add 'make update_exp' target
  * Add counters: pcu.sgsn.N.rx_paging_{cs,ps}
  * Add counters: pcu.bts.N.pch.requests
  * Add counters: pcu.bts.N.pch.requests.timeout
  * bts: delete pch_timer list in destructor
  * tests: make update_exp: build check_PROGRAMS first
  * debian/control: remove dh-systemd build-depend
  * Add stats: pcu.bts.N.pdch.available/occupied
  * Add stats: pcu.bts.N.pdch.occupied.gprs/egprs
  * pdch: has_gprs_only_tb_attached: use m_num_tbfs

  [ Neels Hofmeyr ]
  * T_defs_bts: remove unit from doc strings
  * Revert "Stop abusing T3169"
  * fix: handle NULL return of as_dl_tbf() and as_ul_tbf()
  * coverity: fix null deref from recent UL TBF leak fix

  [ Daniel Willmann ]
  * gprs_bssgp_pcu: Fix crash when configuring an existing ns bind

 -- Pau Espin Pedrol <pespin@sysmocom.de>  Tue, 16 Nov 2021 16:47:29 +0100

osmo-pcu (0.9.0) unstable; urgency=medium

  [ Pau Espin Pedrol ]
  * Pass paging group instead of imsi where later is not needed
  * Allow Gb PAGING-PS without P-TMSI
  * Support Gb PAGING-CS
  * Support PAGING-CS and PAGING-PS on on PTP-BVCI
  * tests/rlcmac: print test name at the start
  * tests/rlcmac: Memzero decoded struct
  * tests/rlcmac: Fix missing commas with unexpected results
  * tests/rlcmac: Use osmo_hexdump to print buffers
  * tests/rlcmac: Don't check stderr output
  * tests/rlcmac: Add test to showcase that decode_gsm_ra_cap() fails
  * csn1: Extend CSN_SERIALIZE to allow 0 bit of length
  * csn1: Allow CHOICE elements to re-process the bits used for the choice
  * csn1: Fix pedantic compiler warnings in csn.1 dissectors
  * csn1: Drop format_p union from CSN_DESCR
  * gsm_rlcmac.cpp: Fix trailing whitespace
  * cosmetic: csn1.cpp: Fix whitespace
  * csn1.cpp: Rework ProcessError() function to print errors
  * rlcmac: Return error code from csn1 encoder/decoder
  * Check return code of rlcmac decode/encode functions
  * rlcmac: Transform a few LOGPC messages to LOGP
  * Fix trailing newline mess with LOGP(C) in rlcmac/csn1
  * llc_queue::{dequeue,enqueue}() refactor
  * gsm_rlcmac: fix Packet_Resource_Request_t: s/Slot/I_LEVEL_TN/
  * tests/llc: Change unrealistic time jump to avoid runtime error under ARM
  * Use clock_gettime(CLOCK_MONOTONIC) and timespec everywhere
  * Use downlink BSSGP RA Cap IE
  * tests/RLCMACTest: free allocated bitvectors
  * tests/RLCMACTest: Several fixes and improvements to RAcap tests
  * rlcmac: Don't pass array element to CSN1 descriptors
  * csn1: Validate recursive array max size during decoding
  * rlcmac: Fix bug receiving RA cap
  * rlcmac: Log names of de/encoded rlcmac packet types
  * rlcmac: Introduce MS Radio Access Capabilities 2 to fix related spare bits
  * cosmetic: rlcmac: Fix comment typo and whitespace introduced recently
  * rlcmac: Rename field to MS RA Cap2 in Additional_MS_Rad_Access_Cap_t
  * pcu_l1_if.cpp: Add missing header ctype.h
  * gsm_rlcmac: Use 'struct bitvec' instead of 'bitvec'
  * cosmetic: Do not indent header includes inside extern C block
  * gsm_rlcmac.cpp: Avoid declaring variable in for loop
  * csn1.h: Fix trailing whitespace
  * tbf.cpp: Include c++ <new> header required for new operator's replacement type
  * gsm_rlcmac: Disable unused CSN1 descriptors
  * Move gsm_rlcmac.cpp -> .c
  * rlcmac: support decode FDD_CELL_INFORMATION of "UTRAN FDD Description
  * rlcmac: add dissection of 2G->3G/4G PS handover
  * csn1: Fix Several typos & whitespace
  * csn1: verify enough bits present to decode whole CSN_UINT_ARRAY
  * csn1: Properly verify CSN_BITMAP length
  * csn1: Remove code block from CSN_NEXT_EXIST_LH
  * pcu_l1_if: Don't use GSMTAP_CHANNEL_PACCH when sending unknown gsmtap blocks
  * pdch: Avoid sending GSMTAP_CHANNEL_UNKOWN for rejected UL EGPRS data block
  * tbf: Avoid crash: don't set TBF window size if setup failed
  * bts: Rename mslot_class_from_ra
  * bts: Fix Decoding EGPRS MultislotClass from 11-bit EGPRS PACKET CHANNEL REQUEST
  * bts: Return uint8_t in egprs_mslot_class_from_ra()
  * Use OSMO_FD_* instead of deprecated BSC_FD_*
  * Expect ms object to exist before calling tbf_alloc_ul_tbf()
  * Expect ms object to exist before calling tbf_alloc_dl_tbf()
  * pdch: rcv_resource_request(): Clarify tbf_free only needed if MS used to exist beforehand
  * Drop unneeded arg 'ta' in tbf_alloc_ul()
  * bts: Drop specific functions to increase counters
  * bts: Drop specific functions to add values to counters
  * bts: Drop specific functions to add values to stats
  * pcu: tbf_ul: Clean up maybe_schedule_uplink_acknack()
  * sysmo: femtobts.h: Avoid redefining global variables
  * rlc: Drop unused function gprs_rlc_data::put_data
  * rlc: Move prepare() function out of gprs_rlc_data struct
  * tbf_ul: Fix UL ACK not sent to MS if intermediate UL block is lost
  * Get rid of class GprsCodingScheme
  * gsmtap: Set signal level and SNR fields
  * gprs_ms: Small clean ups in IMSI storage related code
  * gprs_ms: Transfer known EGPRS MS class when mergling old MS
  * tbf: Drop unneeded method set_tlli_from_ul
  * pdch.cpp: Fix logging line format in rcv_block wrong length
  * Set correct GSMTAP channel type for PDTCH messages returning error
  * decoding.cpp: Improve logging in malformed UL data parsing
  * tbf_dl: uint8_t is enough to store a TA value
  * encoding: Encode TA as unsigned and check validty against GSM48_TA_INVALID
  * encoding.cpp: Fix missing spacing in function param
  * pdch.cpp: Avoid dropping existing DL TBF during rcv_resource_request
  * pdch.cpp: Avoid resetting (egprs_)ms_class to unknown if not found in MS RadioAccCap
  * pdch.cpp: Fix wrong annoying log line about non-scheduled ResourceReq received
  * pdch.cpp: Store TLLI promptly on newly created TLLI in rcv_resource_request
  * Fix typo in log message
  * pdch: Drop unneeded notice log message in rcv pkt meas report
  * Introduce log macro helper LOGPMS
  * configure.ac: Fix trailing whitespace
  * doc: Update VTY reference xml file
  * Support setting rt-prio and cpu-affinity mask through VTY
  * pdch: rcv pkt meas rep: Allocate MS object early in path and use it
  * Fix recent typo preventing MS from registering
  * gitignore: Add __pychache__ dir
  * tbf: Don't log rlcmac_diag() output in separate lines
  * gprs_ms_storage.h: Set pointer to NULL instead of 0
  * Free all MS TBFs when receiving GPRS Suspension Request
  * cosmetic: fix indentation alignment
  * vty: Add 'show bts pdch' command
  * cosmetic: Fix indentation of for loops
  * cosmetic: Fix typo in comment
  * Fix crash accessing NULL tbf->pdch[first_ts]
  * contrib/jenkins: Enable parallel make in make distcheck
  * Improve debug logging for alloc algos
  * Fix several calls to LOGPAL
  * Move gprs_rlcmac_ul_tbf::window to correct file
  * Move constructor gprs_rlcmac_dl_tbf::BandWidth to correct file
  * tbf: Make window() available to tbf base class
  * tbf: Implement enable_egprs() once
  * tbf: Set MS during constructor time
  * Move ul_tbf allocation code to correct file
  * Move dl_tbf allocation code to correct file
  * tbf: Drop unused function disable_egprs()
  * tests: ms: Pass correct pointer in constructor instead of NULL
  * tbf: Clean up gprs_rlcmac_dl_tbf::handle()
  * alloc_algo_b: Select TRX with least assigned TFIs during TBF alloc
  * bts: define egprs_enabled as bool
  * cosmetic: Fix ws between if keyword and parenthesis
  * tbf_dl: Update (egprs_)ms_class for already known MS
  * cosmetic: tests: pcu_emu: fix trailing whitespace
  * gprs_ms: Use proper function to get CS
  * Move BTS initial values inside bts.cpp
  * pcuif: Improve BTS-supported CS/MCS handling
  * Move EGPRS MS mode set to gprs_ms.cpp
  * Take into account BTS supported (M)CS values when retrieving the maximum
  * Enable egprs support through PCUIF from BTS/BSC
  * pdch: Process received CS1-4 data blocks regardless of egprs_enabled
  * tbf_dl: Don't fake EGPRS MS class when no related info is available
  * tbf_ul: Allow non-egprs phones if EGPRS is enabled
  * Get rid of bts->egprs_enabled
  * Fix configuration of initial_(m)cs
  * Fix mcs_is_valid(): UNKNOWN value is not a valid (M)CS
  * gprs_ms: Avoid enabling EGPRS if no MCS are supported
  * tbf_ul: Log mismatching TLLI on log message
  * Fix ctr reports: Remove ctr description from already removed counter
  * encoding: Fix duplicate word in log str
  * sched: Fix sending GSMTAP DL data blocks with unset USF
  * sched: Use correct GMSTAP category for EGPRS DL data blocks
  * Support multiplexing of GPRS and EGPRS TBFs in one PDCH
  * pdch: packet_paging_request: Put back non-fitting paging entry where where it was
  * pdch: Log hexdump of decde failure for dl rlcmac block
  * csn1: Fix readIndex pointer change in CSN_VARIABLE_ARRAY
  * csn1: Log CSN_VARIABLE_ARRAY values as hex
  * main: generate coredump and exit upon SIGABRT received
  * tbf: Log previous TS when changing Control TS
  * Implement downgrade to DL MCS1-4 when USF for GPRS_only MS
  * Dl TBF: Get rid of LLC UI dummy blocks following other data
  * rlcmac: Fix typo in MT_PACKET_CELL_CHANGE_NOTIFICATION value_string
  * gprs_rlcmac_sched: Use helper structure to store several tbf pointer params
  * sched: Convert code handling next_list array to be size independant
  * Convert GprsMS and helpers classes to C
  * tbf: Fix wrong verb used in log message
  * .gitignore: ignore files ending with ~
  * doc: Improve CS/MCS GPRS/EGPRS considerations in User Manual
  * tbf: remove 'software error' logs from tbf_free
  * ms: Replace struct var with rate_ctr
  * AllocTest: Avoid queuing tons of to-be-freed ms
  * gprs_ms: Mark ms_ctrg_desc static
  * Workaround ASan false positive runtime errors under some platforms
  * Split PCU global PCU object from BTS object
  * Move T_defs_pcu from BTS to PCU object
  * Move force_two_phase field from BTS to PCU
  * Move alpha,gamma fields from BTS to PCU
  * Move dl_tbf_preemptive_retransmission field from BTS to PCU
  * Move dl_arq_type field from BTS to PCU
  * Move cs_adj* fields from BTS to PCU
  * Move cs_downgrade_threshold field from BTS to PCU
  * Move (m)cs_lqual_ranges fields from BTS to PCU
  * Move ns_dialect field from BTS to PCU
  * Move fc_* fields from BTS to PCU
  * tests/tbf: Allocate PCU per test instead of globally
  * Move ws_* fields from BTS to PCU
  * Move llc_* fields from BTS to PCU
  * Fix configuration mess of initial_cs/mcs between PCUIF and VTY
  * Unify BTS into a C usable structure
  * Get rid of bts singletons
  * Rename 'bts_data' leftovers to 'bts'
  * bts: combine bts_{init,cleanup} into consturctor/destructor methods
  * Get rid of unused gsm_timer.{cpp,h}
  * Convert gprs_bssgp_pcu.cpp to C
  * Move tbf::free_all static methods to proper object files
  * Convert osmo_bts_sock.cpp to C
  * Allow multiple bts objects in PCU
  * bts: Store RAC+CI from info_ind
  * Get rid of singleton gprs_bssgp_pcu_current_bctx()
  * Initial handling support for RIM messages
  * gprs_pcu: Use libosmocore osmo_cgi_ps_cmp API
  * ms: Drop always-false check
  * sched: Check if egprs is enabled in TBF rather than MS being egprs capable
  * tbf: Drop always-true condition checking for MS
  * encoding: fix typos in comment
  * ms: Set proper initial MCS values setting mode EGPRS_GMSK
  * ms: Properly handle EGPRS_GMSK mode in ms_max_cs_dl/ul()
  * Fix Dl EGPRS data blocks being generated occasionally on GPRS TBFs
  * sched: Avoid picking TBF with nacked dl blocks when GMSK is required
  * tbf: Make tbf_ms() param const
  * Introduce NACC support
  * NACC: Fix crash freeing struct if CTRL conn was refused during alloc
  * NACC: delay CTRL conn socket init until it's needed
  * NACC: allow setting keep time for entries in neigh and si cache
  * NACC: Configure neighbor and SI resolution timeout values
  * NACC: Send only Pkt Cell Chg Continue if SI retrieve fails
  * doc: Mark PCU node red in network node diagram
  * doc: Introduce section documenting NACC support
  * nacc: Improve log line failing to establish CTRL neigh conn
  * Update TS 04.60 references to new TS 44.060
  * Drop comment about an already implemented TODO
  * Move src/tbf.txt to doc/
  * encoding: Fix comment description of S/P field
  * tbf: Reuse stored result in variable in check_polling()
  * tbf: Constify some methods
  * nacc: Fix typo in function name
  * nacc: Implement Pkt Cell Change Continue retransmission
  * nacc: Avoid RIM procedures targeting cells under same PCU
  * rlc.h: Fix struct bit fields on big endian systems
  * cosmetic: fix typo in comment
  * nacc_fsm: Move code filling struct to helper function
  * nacc_fsm: Remove NACC_EV_RX_SI from in_event_mask of some states
  * nacc_fsm: Support receiving Pkt Cell Change Notify in state WAIT_RESOLVE_RAC_CI
  * nacc_fsm: nacc_fsm: Support receiving Pkt Cell Change Notify in state WAIT_REQUEST_SI
  * nacc_fsm: Support receiving Pkt Cell Chg Notif while in some advanced states
  * nacc_fsm: Improve log when sending RIM RAN-INFO to gather SI from remote cell
  * vty: Write 'neighbor resolution' config to file
  * cosmetic: fix line indentation
  * sched: Avoid selecting TBF to tx NACC Dl msg if no TFI is assigned
  * tests: Explicitly drop category from log
  * tests: Replace deprecated API log_set_print_filename
  * Use NULL as default value for pointer type
  * find_multi_slots: Avoid calling mslot_class_get_tx() on each iteration
  * find_multi_slots: Avoid multiple calls to mslot_class_get_rx()
  * find_multi_slots: Mark mslot_class properties const
  * find_multi_slots: Avoid multiple calls to mslot_class_get_type()
  * Use ALPHA value received in SI13 from PCUIF

  [ Vadim Yanitskiy ]
  * pcu_l1_if.cpp: fix NULL-pointer dereference in imsi2paging_group()
  * gsm_timer: fix comparison of constant LONG_MAX with an integer
  * encoding: fix log_alert_exit(): do not treat error as format string
  * tests/alloc: fix implicit conversion from 'double' to 'int8_t'
  * gprs_bssgp_pcu: fix invalid use of non-static data member 'frame'
  * gprs_bssgp_pcu: fixup: fix length check in gprs_bssgp_pcu_rx_dl_ud()
  * csn1: fix csnStreamDecoder(): avoid conditional calls to bitvec_read_field()
  * VTY: get rid of pcu_vty_go_parent() / pcu_vty_is_config_node()
  * VTY: install talloc context introspection commands
  * pcu_sock: fix memleak, allocate pcu_sock_state on stack
  * pcu_sock: cosmetic: fix typo in a comment message
  * tbf: cosmetic: fix spacing in gprs_rlcmac_tbf::create_ul_ass()
  * tbf: fix NULL pointer dereference in create_[ul|dl]_ass()
  * encoding: assert return value of bitvec_set_u64()
  * csn1: fix some mistaken CSN.1 error names
  * csn1: fix csnStreamDecoder(): catch unknown CSN_CHOICE values
  * tests/rlcmac: mark Packet Polling Request as malformed
  * csn1: fix existNextElement(): use bitvec_get_bit_pos()
  * tests/rlcmac: additionally match debug output of the CSN.1 codec
  * csn1: get rid of C++ specific code, compile with GCC
  * csn1: fix csnStreamDecoder(): do not subtract no_of_bits twice
  * csn1: fix csnStreamDecoder(): always keep remaining_bits_len updated
  * csn1: fix csnStreamDecoder(): update bit_offset in CSN_EXIST{_LH}
  * csn1: bitvec_get_uint() may return a negative, use %d
  * csn1: use proper format specifier for unsigned integers
  * gsm_rlcmac: fix misleading LOGP statement in decode_gsm_ra_cap()
  * tests/rlcmac: fix malformed MS RA capability in testRAcap()
  * tests/rlcmac: also verify encoding of MS RA Capability
  * tests/rlcmac: add a new test vector for Packet Resource Request
  * csn1: fix csnStreamDecoder(): skip bits unhandled by serialize()
  * tests/rlcmac: also enable logging for DRLCMACDATA category
  * rlcmac: fix encode_gsm_*(): do not suppress encoding errors
  * csn1: fix: do not return 0 if no bits left in the buffer
  * BSSGP: cosmetic use OSMO_IMSI_BUF_SIZE from libosmocore
  * BSSGP: fix: properly encode P-TMSI in RR Paging Request
  * pdch: fix packet_paging_request(): properly print paging MI
  * pdch: cosmetic: use GSM_MI_TYPE_* constants from libosmocore
  * fix: properly include pure C headers from C++ code
  * l1if: fix pcu_rx_rach_ind(): use proper format string specifiers
  * sba: fix possible memleak in SBAController::alloc()
  * TBF/UL: fix rcv_data_block_acknowledged(): print the actual TLLI
  * fix egprs_mslot_class_from_ra(): multislot class may not be present
  * l1if: fix: s/pcu_rx_rach_ind_pdtch/pcu_rx_rach_ind_ptcch/g
  * csn1: fix M_CHOICE: restirct maximum length of the choice list
  * csn1: fix csnStreamEncoder(): also check length of the choice list
  * csn1: fix csnStreamEncoder(): always check the choice index
  * csn1: fix: never use enumerated types in codec structures
  * encoding: cosmetic: use RLC_MODE_ACKNOWLEDGED where possible
  * RLC/MAC: implement decoding of EGPRS Packet Channel Request
  * encoding: fix write_ia_rest_egprs_uplink_sba(): add missing CHECK(rc)
  * doc/manuals: fix typo in overview.adoc: s/Omsocom/Osmocom/g
  * bts: refactor handling and parsing of RACH.ind
  * BTS::parse_rach_ind(): properly handle EGPRS Packet Channel Request
  * bts: add send_gsmtap_rach(), also send PTCCH/U over GSMTAP
  * bts: fix send_gsmtap_rach(): properly pack 11 bit RA
  * bts: cosmetic: use DUMMY_VEC for padding where possible
  * encoding: drop log_alert_exit(), use OSMO_ASSERT() instead
  * encoding: assert() presence of Downlink TBF
  * direct-phy: fix handle_ph_ra_ind(): handle PH-RA.ind on PRACH SAPI
  * debian/control: change maintainer to the Osmocom team / mailing list
  * pcu_l1_if: use proper format specifier for PCUIF version
  * pcu_l1_if: constify the argument of pcu_rx_info_ind()
  * pcu_l1_if: cosmetic: rename both 'trx'/'ts' to 'trx_nr'/'ts_nr'
  * pcu_l1_if: cosmetic: move struct 'gprs_rlcmac_pdch' into the for loop
  * pcu_l1_if: cosmetic: correct error message in pcu_rx_info_ind()
  * gsm_rlcmac: use consistent naming for [Extended] Packet Timing Advance
  * tbf: cosmetic: use GSM_MACBLOCK_LEN where possible
  * tbf: allocate the bitvec on stack in create_{dl,ul}_ass()
  * encoding: constify 'tbf' in UL/DL assignment functions
  * encoding: do not encode out of range Timing Advance values
  * encoding: fix RRBP field in write_packet_uplink_assignment()
  * encoding: use bool for use_egprs in write_packet_uplink_assignment()
  * encoding: pass pdch slot directly to encoding functions
  * encoding: clarify docstring for write_packet_downlink_assignment()
  * encoding: use CSN.1 codec to generate Packet Uplink Assignment
  * encoding: implement handing of hopping parameters
  * encoding: fix gen_freq_params(): do not check pdch twice
  * pcuif_proto: version 10: add frequency hopping parameters
  * pcu_l1_if: cosmetic: use ARRAY_SIZE() in pcu_rx_info_ind()
  * pcu_l1_if: correct logging level in pcu_rx_info_ind()
  * pcu_l1_if: cosmetic: make {local,remote}_sockaddr scoped variables
  * pcu_l1_if: use proper format string specifiers: %d -> %u
  * pcu_l1_if: print NSVC address in more common format
  * gprs_bssgp_pcu: make osmo_sockaddr local/sgsn arguments const
  * gprs_bssgp_pcu: fix possible memleak in gprs_nsvc_create_and_connect()
  * struct gprs_rlcmac_bts: remove unused 'nsei' field
  * gprs_bssgp_pcu: fix: do not crash on receipt of subsequent INFO.ind
  * doc/manuals: (re-)generate XML VTY reference automatically
  * fix tbf_select_slot_set(): use LOGP() instead of LOGPC()
  * main: remove line breaks in print_help(), increase spacing
  * main: add --vty-ref-mode, use vty_dump_xml_ref_mode()
  * BSSGP: use tlvp_val8() in gprs_bssgp_pcu_rx_paging_cs()
  * BSSGP: constify argument 'tp' of gprs_bssgp_pcu_rx_paging_{cs,ps}
  * TLLI 0x00000000 is a valid TLLI, use 0xffffffff instead
  * gprs_rlcmac_sched: fix incorrect SBA frame number assignment
  * bts: fix uninitialized memaccess in BTS::send_gsmtap_rach()
  * bts: fix uninitialized memaccess in BTS::send_gsmtap()
  * tests/rlcmac: add more test vectors for Packet Resource Request
  * contrib/osmo-pcu.spec.in: require libosmo* version 1.4.0
  * contrib/osmo-pcu.spec.in: add missing libosmoctrl dependency
  * vty: register libosmocore's FSM introspection commands

  [ Anders Broman ]
  * csn1: Update M_NULL CSN_DESCR to match wireshark
  * csn1: packet-csn1.c:179: warning: 'pui8' may be used uninitialized in this function
  * csn1: Fix warning with -Wmissing-prototypes
  * csn1: Try to fix cast discards '__attribute__((const))' qualifier from pointer target type
  * gsm_rlcmac.cpp: hanged all M_BIT macros to M_UINT, as M_BIT does not use the referenced hf.

  [ Jeff Morriss ]
  * csn1: shuffle decrements of remaining_bits_len

  [ Pascal Quantin ]
  * csn1: Fix an infinite loop in CSN.1 dissector when having more than 255 padding bits
  * gsm_rlcmac.h: Remove Uplink messages from the RlcMacDownlink_t structure
  * gsm_rlcmac: Enhance dissection of PSI1
  * gsm_rlcmac.cpp: Do not skip too many lines of the CSN_DESCR when the field is missing
  * gsm_rlcmac.cpp: fix an out of bounds access
  * gsm_rlcmac.cpp: fix another global-buffer-overflow error reported by ASAN
  * gsm_rlcmac.cpp: fix global-buffer-overflow error reported by ASAN

  [ Guy Harris ]
  * csn1: Don't cast away constness

  [ Alexis La Goutte ]
  * csn1: fix this statement may fall through [-Werror=implicit-fallthrough=] found by gcc7

  [ Bill Meier ]
  * gsm_rlcmac.h: #if 0 unused stuff

  [ Gerald Combs ]
  * gsm_rlcmac.h: Make sure we have a corresponding 'u' member to RlcMacDownlink_t for every call

  [ Vincent Helfre ]
  * gsm_rlcmac: add dissection of NAS container
  * gsm_rlcmac: improve dissection of MS RA Capability IE

  [ AndersBroman ]
  * gsm_rlcmac: Update : PACKET RESOURCE REQUEST to Release 14.0.0

  [ Keith ]
  * Send UL-CTRL Packet to GSMTAP even if we fail to decode.
  * Don't check ul_control_block before decoding into it.

  [ Harald Welte ]
  * csn1.c: Almost all of the logging is DEBUG, not NOTICE
  * TODO: remove those that have obviously been implemented 5+ years ago
  * bts.cpp: Increase constructor priority
  * Use osmo_fd_setup() whenever applicable
  * Use osmo_fd_*_{disable,enable}
  * gb manual: 08.16 -> 48.016 / 08.18 -> 48.018
  * gb manual: NS is implemented in libosmogb, not libosmocore
  * manuals/gb/ns.adoc: Update documentation regarding SNS capability
  * migrate to DLBSSGP as log sub-system for BSSGP

  [ Eric ]
  * configure.ac: fix libtool issue  with clang and sanitizer
  * tbf: add virtual destructor

  [ Philipp Maier ]
  * gprs_debug: Use only LOGL_NOTICE as default loglevel
  * vty: add attributes to VTY commands indicating when they apply
  * pcu_main: add commandline option --vty-ref-xml
  * gprs_bssgp_rim: add serving BSS NACC application

  [ Oliver Smith ]
  * contrib: import RPM spec
  * contrib: integrate RPM spec
  * Makefile.am: EXTRA_DIST: debian, contrib/*.spec.in
  * contrib/jenkins: don't build osmo-gsm-manuals
  * configure.ac: set -std=gnu11

  [ Neels Hofmeyr ]
  * use new osmo_mobile_identity api (avoid deprecation)
  * paging: pass struct osmo_mobile_identity, not encoded IE bytes

  [ Alexander Couzens ]
  * pcuif_proto: version 0xa: add support for IPv6 NSVCs
  * Revert "pcuif_proto: version 0xa: add support for IPv6 NSVCs"
  * pcuif_proto: version 10: add support for IPv6 NSVCs
  * Use the new NS2 lib
  * Rework NS configuration over the info indication
  * pcu_l1_if: fix misaligned assignment of remote address
  * NS2: follow the change of ownership
  * gprs_bssgp_pcu: follow ns2 library changes
  * NS2: rework handling of unknown primitive
  * ns2: follow ns2 dialect changes
  * ns2: follow changes to add a unique name to all binds
  * ns2: follow ns2 sns api changes
  * gprs_ns2: set default dialect to ipaccess
  * gprs_rlcmac_sched: don't leak a sched_dummy()
  * gprs_rlc_ts_alloc: ensure no rolling slots are allocated
  * follow gprs_ns2 API enum changes
  * gprs_ns2: migrate to the new vty syntax
  * gprs_bssgp: rework and rename ns_create_nsvc -> ns_configure_nse
  * gprs_bssgp: rename gprs_ns_config -> gprs_ns_update_config
  * gprs_bssgp: use gprs_ns2_sns_add_bind() to allow the NSE to use the binds for IP-SNS configuration

 -- Pau Espin Pedrol <pespin@sysmocom.de>  Tue, 23 Feb 2021 14:41:00 +0100

osmo-pcu (0.8.0) unstable; urgency=medium

  [ Alexander Couzens ]
  * tests: test encoding of egprs ul ack/nacks
  * tbf_dl: add comments to the scheduler
  * encoding: fix space, tabs

  [ Vadim Yanitskiy ]
  * osmobts_sock.cpp: pcu_sock_cb(): use libosmocore's socket API
  * osmobts_sock.cpp: pcu_sock_read(): use stack buffer, not heap
  * osmobts_sock.cpp: pcu_sock_read(): further simplify the code
  * osmobts_sock.cpp: do not print the same debug message twice
  * VTY: refactor pcu_vty_show_ms_all(): use show_ms()
  * VTY: fix command 'show tbf all': properly filter TBFs
  * BSSGP: do not reject SUSPEND ACK / NACK messages
  * BSSGP: properly print BVCI for signalling messages (BVCI=0)
  * tests/tbf: suspend warnings about the link quality measurements
  * GprsMs::update_cs_ul(): clarify the meaning of old_link_qual
  * gprs_bssgp_destroy(): fix memleak and NULL-pointer dereference
  * PTCCH: implement basic message codec and API
  * PTCCH: properly handle RTS.req for PCU_IF_SAPI_PTCCH
  * pcuif_proto.h: extend RACH.ind with TRX / TS numbers
  * PTCCH: properly handle RACH.ind for PCU_IF_SAPI_PTCCH
  * VTY: add warning about changing PCU socket path at run-time
  * VTY: cosmetic: use osmo_talloc_replace_string()

  [ Pau Espin Pedrol ]
  * cosmetic: tbf: Rename T and N arrays
  * Use proper API osmo_timer_setup() to set up timer struct
  * Introduce osmo_tdef infra and timer VTY commands
  * bts.cpp: Fix osmo_tdef initialization on older g++ compilers
  * Use osmo_tdef for BSSGP T1 and T2
  * Use osmo_tdef to implement T3190
  * tests: TbfTest: Unify stderr and stdout to ease debugging
  * Use osmo_tdef to implement ms-idle-time
  * Use osmo_tdef to implement dl-tbf-idle-time
  * pdch.cpp: Refactor bitvec param passing in rcv_control_block
  * pdch.cpp: Use pcu_l1_meas previously filled by lower layers
  * cosmetic: fix whitespace
  * Move out tbf subclasses from tbf.h to their own headers
  * Move tbf_{dl,ul} child constructors to respective .cpp files
  * tbf_dl: Setup m_llc_timer in constructor using osmocom API
  * tbf_dl.cpp: Remove dup call to tbf_update_ms_class() in state GPRS_RLCMAC_WAIT_RELEASE
  * vty: Fix osmo_tdef timers not listed in write config
  * Log RACH Requests using GSMTAP
  * Log AGCH and PCH blocks using GSMTAP
  * pcu_l1_if.cpp: Fix GSMTAP Imm Assign PCH wrong encoding
  * pcu_l1_if.cpp: Drop unneeded byte in Imm Ass PCH buffer
  * pcu_l1_if.cpp: Imm Assign PCH: clarify size of different items
  * pcu_l1_if.cpp: Replace value 23 with libosmocore's GSM_MACBLOCK_LEN
  * Fix assertion hit upon CCCH Paging Request
  * doc: vty: Update osmo-pcu_vty_reference.xml
  * Clarify (M)CS related VTY attributes
  * Remove dash from name used in VTY cmd prompt
  * tbf_dl.cpp: Fix typo in log line
  * pcu_l1_if: Check pag_req id_lv len fits buffer
  * prs_bssgp_pcu.cpp: Mark priv funcs as static and remove trailing whitespace
  * Fix trailing whitespace
  * fix typo in log message
  * Log BVCI PTP value upon msg recv
  * Split identity_lv param into mi+mi_len

  [ Oliver Smith ]
  * doc: update generated VTY reference
  * tbf_dl: make preemptive retransmission optional
  * Forward ETWS Primary Notification to MS
  * tests/app_info: fix compiling with older g++
  * configure.ac: set C and C++ dialects

  [ Harald Welte ]
  * manual: Fix copy+paste error
  * manual: Fix documentation missing "-D" command line option
  * manual: Add missing documentation for '-i' command line option

 -- Pau Espin Pedrol <pespin@sysmocom.de>  Fri, 03 Jan 2020 19:40:02 +0100

osmo-pcu (0.7.0) unstable; urgency=medium

  [ Rafael Diniz ]
  * Added support for daemonize to osmo-pcu.
  * Fix help message formatting of osmo-pcu.

  [ Max ]
  * Don't install pcuif_proto.h header
  * Move C include to proper place
  * Add define for dummy burst string
  * Add encoding tests for Immediate Assignment
  * Clarify write_immediate_assignment() signature
  * Restructure IA Rest Octets encoders
  * Rewrite Packet Downlink Assignment
  * Rewrite EGPRS Packet Uplink IA Rest Octets for MBA
  * Rewrite EGPRS Packet Uplink IA Rest Octets for SBA
  * MCS: internalize 'family' parameter
  * EDGE tests: reduce code duplication
  * MCS: remove dead code
  * EDGE tests: remove no-op check
  * Use msgb_eq_data_print() in tests
  * Tighten lqual table limits check
  * Enable LGLOBAL logging for TBF tests
  * Log (M)CS UL update errors
  * MCS: move Coding Scheme enum outside of class definition
  * Make get_retx_mcs() into regular function
  * MCS: remove unused function
  * Debian: bump copyright year
  * Use unique NSEI/BVCI/NSVCI in TBF tests
  * MS store: move test helper to unit test
  * Explicitly clean up BTS singleton
  * MCS: move HeaderType enum outside of class definition
  * MCS: use value_string for conversion
  * TBF-DL: log MCS as string
  * Fix TA index encoder
  * MCS: move Mode enum outside of class definition
  * MCS: add mcs_is_*() helpers
  * MCS: add Channel Coding Command encoder
  * Fix Channel Coding Command for MCS
  * Rewrite Packet Uplink IA Rest Octets for MBA
  * Rewrite Packet Uplink IA Rest Octets for SBA
  * Use Timing Advance Index in UL assignments
  * TBF: update MCS counters
  * TBF-DL: cosmetic update for helper routines
  * Update IA Rest Octets encoding
  * TS alloc: expand tests log
  * vty: add commands to show TBF of a certain kind
  * Update MCS selection for retransmission
  * cosmetic: use const pointer for bts_data
  * Add test for MS mode and (M)CS settings
  * Use libosmocore for IMSI parsing

  [ Harald Welte ]
  * Mark gprs_ns_reconnect() as static (not used outside of C file)
  * Optionally Use the NS Sub-Network-Service (SNS) on Gb
  * pcu_l1_if: Fix erroneous endian-swapping of the CellID
  * Forward GPRS SUSPEND REQ from BTS to SGSN using BSSGP
  * gprs_debug: Use named initializers and explicit array indicies
  * bssgp: Fix dead code: PDUT_STATUS can never reach this part

  [ JF Dionne ]
  * encoding: Fixes TMSI vs MI bit selection in repeated page info

  [ Oliver Smith ]
  * tests: use -no-install libtool flag to avoid ./lt-* scripts
  * debian: create -doc subpackage with pdf manuals
  * contrib/jenkins.sh: run "make maintainer-clean"

  [ Daniel Willmann ]
  * Include pdch.h in bts.h even if we're not compiling C++
  * oc2g: Remove custom alarms
  * oc2g: Change log type (Litecell15->Oc2g)
  * jenkins.sh: Add oc2g build support
  * manuals: Add script to regenerate vty/counter documentation
  * manuals: Update VTY documentation

  [ Jean-Francois Dionne ]
  * Initial commit for OC-2G support.

  [ Minh-Quang Nguyen ]
  * OC-2G: Fix missing header
  * OC-2G: Fix TA adjustment
  * OC-2G: Always use positive TA information provided in PH-RA-IND

  [ Alexander Couzens ]
  * gprs_bssgp_pcu: make gprs_bssgp_ns_cb public
  * gprs_bssgp_pcu: explicit allocate & initialize bssgp_nsi instance
  * encoding: correct encoding of CRBB in ACK/NACK when not byte aligned
  * encoding: use `/* */` for comments instead of `#if 0 #endif`
  * egprs_rlc_compression: fix white spaces
  * tests/BitcompTest: fix wording in log message
  * rlc: replace int with uint16_t
  * Encoding: drop struct gprs_rlcmac_bts* from all functions
  * decompress_crbb: add length argument for search_runlen
  * Encoding: write_packet_ack_nack_desc_egprs: don't use a reference for rest_bits
  * bts.cpp: ensure left-shift operation does not exceed uint32_t
  * Encoding: use uint16_t when interacting with the window object
  * Encoding: ACK/NACK: always encode with length field present

  [ Keith ]
  * Cosmetic: Osmcoom -> Osmocom

  [ Vadim Yanitskiy ]
  * src/pcu_l1_if.cpp: fix: properly pass measurements from PCUIF
  * gprs_bssgp_pcu_rx_dl_ud(): fix: BSSGP_IE_IMSI is optional
  * gprs_bssgp_pcu.cpp: check return code of gsm48_mi_to_string()
  * gprs_bssgp_pcu_rx_dl_ud(): use OSMO_IMSI_BUF_SIZE

  [ Thorsten Alteholz ]
  * fix spelling errors detected by lintian

  [ Eric Wild ]
  * ubsan: fix shift

  [ Pau Espin Pedrol ]
  * Remove undefined param passed to {logging,osmo_stats}_vty_add_cmds
  * Require newer libosmocore to avoid compile failures

 -- Pau Espin Pedrol <pespin@sysmocom.de>  Wed, 07 Aug 2019 21:09:53 +0200

osmo-pcu (0.6.0) unstable; urgency=medium

  [ Harald Welte ]
  * debian/rules: Don't overwrite .tarball-version
  * gprs_rlcmac_received_lost(): Fix regression / uninitialized now_tv
  * initial checkin of manuals to public repo
  * Add link to Asciidoc source code of manual
  * Initial place-holder for the new Gb/IP interface documentation
  * Gb message sequence chart: flip sides (SGSN should be right)
  * Gb message sequence chart: Add notion of PCU unix domain socket
  * Gb: Various spelling fixes
  * gb: Some language improvements, formatting changes
  * consistently use '3GPP TS' not sometimes 3GPP TS and sometimes TS.
  * gb/NS: Clarify the language regarding the UDP port numbers / socket
  * vty-ref: Update URI of docbook 5.0 schema

  [ Pau Espin Pedrol ]
  * Cleanup of systemd service files
  * configure.ac: Set CXXFLAGS during --enable-sanitize
  * Install systemd services with autotools
  * Move examples/ to doc/examples/
  * Install osmo-pcu.cfg to docdir/examples
  * Allow easily disabling GFDL references

  [ Stefan Sperling ]
  * check for overlong unix socket paths

  [ Max ]
  * deb: add missing copyright file
  * OsmoPCU: fix Gb documentation front page
  * OsmoPCU: expand NS documentation
  * OsmoPCU: expand BSSGP documentation
  * OsmoPCU: add MSC chart

  [ Neels Hofmeyr ]
  * Importing history from osmo-gsm-manuals.git
  * make clean: also remove generated image files
  * add 'make check' target
  * fix 'make clean': shell glob, ignore failure
  * refactor Makefile build rules, don't use the FORCE

  [ Jonathan Brielmaier ]
  * fix various typos across all manuals

  [ Philipp ]
  * configuration: fixing typos

  [ Alexander Couzens ]
  * OsmoPCU: add rate counter documentation

  [ Daniel Willmann ]
  * Change OpenBSC mentions to OsmoBSC where applicable

  [ Oliver Smith ]
  * build manuals moved here from osmo-gsm-manuals.git
  * Fix DISTCHECK_CONFIGURE_FLAGS override
  * contrib/jenkins.sh: build and publish manuals
  * contrib: fix makedistcheck with disabled systemd

 -- Harald Welte <laforge@gnumonks.org>  Mon, 21 Jan 2019 19:03:52 +0100

osmo-pcu (0.5.1) unstable; urgency=medium

  [ Harald Welte ]
  * Don't register SIGHUP handler without actually handling SIGHUP

  [ Pau Espin Pedrol ]
  * tbf: Fix memset(0) on object with no trivial copy-assignment
  * rlc: Fix memset(0) on object with no trivial copy-assignment
  * jenkins.sh: use flag --enable-werror for sysmo and none
  * tbf: Use incrementing id for rate_ctr_group_alloc
  * tbf: Replace '.' in counter names with ':'

  [ Stefan Sperling ]
  * fix a one-byte stack buffer overrun in osmo-pcu
  * read monotonic clock with clock_gettime() instead of gettimeofday()
  * fix time-delta calculations for measurement reports
  * change log level of "DL packet loss" log messages
  * check bssgp_tlv_parse() return code in gprs_bssgp_pcu_rcvmsg()

 -- Pau Espin Pedrol <pespin@sysmocom.de>  Fri, 27 Jul 2018 21:56:38 +0200

osmo-pcu (0.5.0) unstable; urgency=medium

  [ Neels Hofmeyr ]
  * jenkins: use osmo-clean-workspace.sh before and after build
  * vty: skip installing cmds now always installed by default
  * implement support for 3-digit MNC with leading zeros
  * configure: add --enable-werror
  * mslot_class: find_free_tfi(): use uint32_t to shift 1 << 31
  * mslot_class: two more: use uint32_t to shift 1 << 31
  * Revert "Use Timing Advance Index in UL assignments"
  * Revert "Rewrite Packet Uplink Assignment"
  * Revert "Rewrite Packet Downlink Assignment"
  * configure: fix --enable-sysmocom-dsp and --with-sysmobts flags
  * configure: properly quote CFLAGS in lc15 check
  * Revert "Rewrite EGPRS Packet Uplink Assignment"
  * use osmo_init_logging2() with proper talloc ctx

  [ Minh-Quang Nguyen ]
  * PCU: Fix TA adjustment
  * PCU: display TA information in TBF stats

  [ Max ]
  * Remove unused parameter
  * Move multislot table to separate file
  * Replace '.' in counter names with ':'
  * Fix compiler warning
  * TBF: log timer override
  * TBF: fix compiler warning in test
  * TBF: expand timer logging
  * vty: print class and TBFs for each MS
  * DL window: constify resend_needed() function
  * TBF: move EGPRS enablement into (U|D)L-TBF
  * TBF-DL: fix misleading idle time check
  * TBF: remove unused variable
  * Remove unused includes and forward declarations
  * Fix tests after rate_ctr change
  * Introduce LOGTBF* for consistent logging
  * TBF: implement independent T31xx timers
  * TBF: add N3101 counter
  * Fix warnings
  * Add function to get max supported MS class
  * Add --enable-sanitize configure option
  * Enable sanitize for CI test
  * Add tests for pcu_lsb()
  * Add optional profiling support
  * TBF: unify timer handling
  * TBF: log timer invocation source
  * TBF: bail out for unknown timers
  * Fix llc_queue_size() type
  * TBF-DL: mark rcvd_dl_ack() parameters as boolean
  * window: move encoding into functions
  * cosmetic: clarify coding scheme and puncturing
  * Make TBF state private
  * TBF: cleanup state flag handling
  * Clarify RACH-related interfaces
  * TBF-UL: add simpler test helper
  * Avoid code duplication in TBF test
  * TBF: move window parameters to UL/DL level
  * TBF-DL: move priority computation into function
  * TBF: unify EGPRS window calculation
  * Don't access TBF internals in vty functions
  * Fix jenkins.sh to match jenkins job axis filter
  * Allocate global context for TypesTest
  * Fix sanitizer build
  * Rewrite EGPRS Packet Uplink Assignment
  * Rewrite Packet Downlink Assignment
  * Rewrite Packet Uplink Assignment
  * Use Timing Advance Index in UL assignments
  * Allow specifying sysmocom headers explicitly
  * TBF: log source of state transitions
  * jenkins.sh: Disable building doxygen for deps
  * Set V_N and V_B to known initial state
  * TBF: add dedicated log categories
  * TBF: make UL/DL state internal
  * TBF: make UL ack state internal
  * TBF: make poll state internal
  * TBF: adjust test log levels
  * Add tests for find_multi_slots()
  * AllocTest: adjust test_alloc_b()
  * AllocTest: expand test output
  * AllocTest: remove assumption on max MS class
  * Add multislot classes from latest spec
  * cosmetic: fix whitespace issue with include files
  * TBF: decrease L1 logging verbosity in test
  * TBF: override send function via linker option
  * Simplify TS alloc: adjust allocator signatures
  * Simplify TS alloc: fix allocation calls
  * Simplify TS alloc: avoid TS reassignment
  * Simplify TS alloc: use defines for constants
  * Simplify TS alloc: adjust function signatures
  * TS alloc: print suggested TRX on allocation errors
  * Simplify TS alloc: internalize TRX check
  * TBF: decrease logging verbosity for traffic
  * TBF: add helpers for assignment type handling
  * TBF: show assignment kind in vty
  * vty: drop unused function
  * RACH: improve single block detection
  * TBF: move common test code into functions
  * emu: use libosmocore definitions
  * Use explicit type for pcu_lsb()
  * Move paging generation into PDCH
  * Move include guard to the top
  * Update header includes
  * Simplify TS alloc: split off RX mask computation
  * Simplify TS alloc: separate capacity computation
  * Simplify TS alloc: split allocation
  * Simplify TS alloc: split USF/UL allocation
  * Move PDCH-related functions into separate files
  * Simplify TS alloc: don't use PDCH for free TFI
  * Simplify TS alloc: constify max dl slot func
  * TBF: make network counters internal
  * Simplify TS alloc: move slot assignment
  * Simplify TS alloc: move slot check into functions

  [ Pau Espin Pedrol ]
  * Print error cause of pcu socket connect failure
  * gprs_bssgp_pcu.cpp: Comment unused function parse_ra_cap

  [ Stefan Sperling ]
  * Make osmo-pcu wait for BTS to become available at start-up time.
  * improve documentation of Encoding::write_paging_request()

  [ Alexander Couzens ]
  * pcuif_proto.h: fix whitespaces and indention
  * pcuif_proto: add version 8 features

  [ Philipp Maier ]
  * cosmetic: remove runaway semicolon
  * pcu_l1_if: add frame number to log output
  * tbf: add frame number to log output

 -- Pau Espin Pedrol <pespin@sysmocom.de>  Thu, 03 May 2018 16:20:00 +0200

osmo-pcu (0.4.0) unstable; urgency=medium

  [ Holger Hans Peter Freyther ]
  * Initial release.

  [ Max ]
  * Use value string check from osmo-ci
  * cosmetic: tighten direct-phy related code
  * Support receiving SI13 from BTS
  * Move gsmtap and accounting into separate function
  * cosmetic: convert explicit warnings to fixme/todo
  * Assert valid CS
  * TBF-DL: extend index check for RLC block copy
  * TS alloc: properly count UL slots
  * cosmetic: reformat multislot classes table

  [ Philipp Maier ]
  * gb: allow only packets from a specific SGSN

  [ Harald Welte ]
  * tests: Don't use private version of log_info but global gprs_log_info
  * Call osmo_init_logging() before static BTS constructor
  * Forward GPRS SUSPEND REQ from BTS to SGSN using BSSGP
  * Debian: Cosmetic changes to control file; add better Description
  * Debian: print test results in case of failure + clean-up autotest
  * Debian: migrate from DEB_BUILD_HARDENING to DEB_BUILD_MAINT_OPTIONS
  * Debian: upgrade to debhelper 9 / Standards 3.9.8

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

osmo-pcu (0.3.0) UNRELEASED; urgency=medium

  * Initial release.

 -- Holger Hans Peter Freyther <holger@moiji-mobile.com>  Fri, 01 Apr 2016 18:59:00 +0200
