aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--TODO-RELEASE2
-rw-r--r--configure.ac10
-rw-r--r--contrib/osmo-pcu.spec.in10
-rw-r--r--debian/changelog298
-rw-r--r--debian/control4
-rw-r--r--doc/manuals/chapters/configuration.adoc68
-rw-r--r--doc/manuals/chapters/counters_generated.adoc306
-rw-r--r--doc/manuals/chapters/running.adoc8
-rw-r--r--src/bts.cpp84
-rw-r--r--src/bts.h20
-rw-r--r--src/bts_pch_timer.c49
-rw-r--r--src/bts_pch_timer.h9
-rw-r--r--src/coding_scheme.c4
-rw-r--r--src/coding_scheme.h4
-rw-r--r--src/csn1.c4
-rw-r--r--src/csn1.h4
-rw-r--r--src/csn1_dec.c6
-rw-r--r--src/csn1_enc.c4
-rw-r--r--src/cxx_linuxlist.h4
-rw-r--r--src/decoding.cpp4
-rw-r--r--src/decoding.h4
-rw-r--r--src/encoding.cpp4
-rw-r--r--src/encoding.h4
-rw-r--r--src/gprs_bssgp_pcu.c33
-rw-r--r--src/gprs_bssgp_pcu.h4
-rw-r--r--src/gprs_bssgp_rim.c4
-rw-r--r--src/gprs_bssgp_rim.h4
-rw-r--r--src/gprs_codel.c4
-rw-r--r--src/gprs_codel.h4
-rw-r--r--src/gprs_debug.cpp4
-rw-r--r--src/gprs_debug.h4
-rw-r--r--src/gprs_ms.c16
-rw-r--r--src/gprs_ms.h10
-rw-r--r--src/gprs_ms_storage.cpp10
-rw-r--r--src/gprs_ms_storage.h4
-rw-r--r--src/gprs_pcu.c19
-rw-r--r--src/gprs_pcu.h6
-rw-r--r--src/gprs_rlcmac.cpp6
-rw-r--r--src/gprs_rlcmac.h4
-rw-r--r--src/gprs_rlcmac_meas.cpp4
-rw-r--r--src/gprs_rlcmac_sched.cpp4
-rw-r--r--src/gprs_rlcmac_ts_alloc.cpp34
-rw-r--r--src/gsm_rlcmac.c4
-rw-r--r--src/gsm_rlcmac.h4
-rw-r--r--src/llc.cpp4
-rw-r--r--src/llc.h4
-rw-r--r--src/mslot_class.c4
-rw-r--r--src/mslot_class.h4
-rw-r--r--src/nacc_fsm.c4
-rw-r--r--src/nacc_fsm.h4
-rw-r--r--src/neigh_cache.c4
-rw-r--r--src/neigh_cache.h4
-rw-r--r--src/osmobts_sock.c4
-rw-r--r--src/pcu_l1_if.cpp4
-rw-r--r--src/pcu_l1_if.h4
-rw-r--r--src/pcu_main.cpp44
-rw-r--r--src/pcu_utils.h4
-rw-r--r--src/pcu_vty.c57
-rw-r--r--src/pcu_vty_functions.cpp21
-rw-r--r--src/pcu_vty_functions.h4
-rw-r--r--src/pdch.cpp81
-rw-r--r--src/pdch.h5
-rw-r--r--src/pdch_ul_controller.c4
-rw-r--r--src/pdch_ul_controller.h4
-rw-r--r--src/rlc.cpp4
-rw-r--r--src/rlc.h4
-rw-r--r--src/sba.c4
-rw-r--r--src/sba.h4
-rw-r--r--src/tbf.cpp27
-rw-r--r--src/tbf.h7
-rw-r--r--src/tbf_dl.cpp18
-rw-r--r--src/tbf_dl.h4
-rw-r--r--src/tbf_dl_ass_fsm.c22
-rw-r--r--src/tbf_dl_ass_fsm.h4
-rw-r--r--src/tbf_fsm.c12
-rw-r--r--src/tbf_fsm.h4
-rw-r--r--src/tbf_ul.cpp25
-rw-r--r--src/tbf_ul.h4
-rw-r--r--src/tbf_ul_ack_fsm.c4
-rw-r--r--src/tbf_ul_ack_fsm.h4
-rw-r--r--src/tbf_ul_ass_fsm.c13
-rw-r--r--src/tbf_ul_ass_fsm.h4
-rw-r--r--src/wireshark_compat.h4
-rw-r--r--tests/alloc/AllocTest.cpp23
-rw-r--r--tests/alloc/AllocTest.err81
-rw-r--r--tests/alloc/MslotTest.cpp4
-rw-r--r--tests/app_info/AppInfoTest.cpp4
-rw-r--r--tests/app_info/AppInfoTest.err18
-rw-r--r--tests/ms/MsTest.err48
-rw-r--r--tests/rlcmac/RLCMACTest.cpp4
-rw-r--r--tests/tbf/TbfTest.cpp2
-rw-r--r--tests/tbf/TbfTest.err262
-rw-r--r--tests/ulc/PdchUlcTest.err42
93 files changed, 1235 insertions, 793 deletions
diff --git a/TODO-RELEASE b/TODO-RELEASE
index 5b2720b9..cbfda241 100644
--- a/TODO-RELEASE
+++ b/TODO-RELEASE
@@ -7,5 +7,3 @@
# If any interfaces have been added since the last public release: c:r:a + 1.
# If any interfaces have been removed or changed since the last public release: c:r:0.
#library what description / commit summary line
-libosmocore struct bssgp_bvc_ctx->is_sgsn field used available only on libosmocore >1.5.1
-libosmocore gprs_ns2_ip_bind_set_priority function used available only on libosmocore >1.5.1
diff --git a/configure.ac b/configure.ac
index 31ead007..31ef1891 100644
--- a/configure.ac
+++ b/configure.ac
@@ -82,11 +82,11 @@ then
fi
dnl checks for libraries
-PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 1.5.0)
-PKG_CHECK_MODULES(LIBOSMOVTY, libosmovty >= 1.5.0)
-PKG_CHECK_MODULES(LIBOSMOCTRL, libosmoctrl >= 1.5.0)
-PKG_CHECK_MODULES(LIBOSMOGSM, libosmogsm >= 1.5.0)
-PKG_CHECK_MODULES(LIBOSMOGB, libosmogb >= 1.5.0)
+PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 1.6.0)
+PKG_CHECK_MODULES(LIBOSMOVTY, libosmovty >= 1.6.0)
+PKG_CHECK_MODULES(LIBOSMOCTRL, libosmoctrl >= 1.6.0)
+PKG_CHECK_MODULES(LIBOSMOGSM, libosmogsm >= 1.6.0)
+PKG_CHECK_MODULES(LIBOSMOGB, libosmogb >= 1.6.0)
AC_MSG_CHECKING([whether to enable direct DSP access for PDCH of sysmocom-bts])
AC_ARG_ENABLE(sysmocom-dsp,
diff --git a/contrib/osmo-pcu.spec.in b/contrib/osmo-pcu.spec.in
index 96e94810..eec0ce20 100644
--- a/contrib/osmo-pcu.spec.in
+++ b/contrib/osmo-pcu.spec.in
@@ -28,11 +28,11 @@ BuildRequires: pkgconfig >= 0.20
%if 0%{?suse_version}
BuildRequires: systemd-rpm-macros
%endif
-BuildRequires: pkgconfig(libosmocore) >= 1.5.0
-BuildRequires: pkgconfig(libosmogb) >= 1.5.0
-BuildRequires: pkgconfig(libosmogsm) >= 1.5.0
-BuildRequires: pkgconfig(libosmovty) >= 1.5.0
-BuildRequires: pkgconfig(libosmoctrl) >= 1.5.0
+BuildRequires: pkgconfig(libosmocore) >= 1.6.0
+BuildRequires: pkgconfig(libosmogb) >= 1.6.0
+BuildRequires: pkgconfig(libosmogsm) >= 1.6.0
+BuildRequires: pkgconfig(libosmovty) >= 1.6.0
+BuildRequires: pkgconfig(libosmoctrl) >= 1.6.0
%{?systemd_requires}
%description
diff --git a/debian/changelog b/debian/changelog
index dc42c0c1..600969ce 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,301 @@
+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 ]
diff --git a/debian/control b/debian/control
index 0e12f2e8..b332ad6d 100644
--- a/debian/control
+++ b/debian/control
@@ -6,8 +6,8 @@ Build-Depends: debhelper (>= 9),
dh-autoreconf,
autotools-dev,
pkg-config,
- libosmocore-dev (>= 1.5.0),
- osmo-gsm-manuals-dev (>= 1.1.0)
+ libosmocore-dev (>= 1.6.0),
+ osmo-gsm-manuals-dev (>= 1.2.0)
Standards-Version: 3.9.8
Homepage: http://osmocom.org/projects/osmopcu
Vcs-Git: git://git.osmocom.org/osmo-pcu
diff --git a/doc/manuals/chapters/configuration.adoc b/doc/manuals/chapters/configuration.adoc
index d7789297..ca3963d7 100644
--- a/doc/manuals/chapters/configuration.adoc
+++ b/doc/manuals/chapters/configuration.adoc
@@ -422,3 +422,71 @@ encoded in CS1, so in case any control block is sent from time to time it's
accomplished and there's no penalty. However, if only EGPRS downlink data is sent
over that time frame, then the scheduler will force sending a RLCMAC Dummy
Block.
+
+[[gsmtap]]
+=== Configuring GSMTAP tracing
+
+In addition to being able to obtain pcap protocol traces of the NS/BSSGP
+communication and the text-based logging from the OsmoPCU software, there is
+also the capability of tracing all communication on the radio interface related
+to PS. To do so, OsmoPCU can encapsulate MAC blocks (23-155 byte messages at the
+L2-L1 interface depending on coding scheme) into _GSMTAP_ and send them via
+UDP/IP. At that point, they can be captured with utilities like *tcpdump* or
+*tshark* for further analysis by the *wireshark* protocol analyzer.
+
+In order to activate this feature, you first need to make sure to specify
+the remote address of _GSMTAP_ host in the configuration file. In most
+cases, using 127.0.0.1 for passing the messages over the loopback (`lo`)
+device will be sufficient:
+
+.Example: Enabling GSMTAP Um-frame logging to localhost
+----
+pcu
+ gsmtap-remote-host 127.0.0.1 <1>
+----
+<1> Destination address for _GSMTAP_ Um-frames
+
+NOTE: Changing this parameter at run-time will not affect the existing
+_GSMTAP_ connection, full program restart is required.
+
+NOTE: Command line parameters `-i` and `--gsmtap-ip` have been deprecated.
+
+OsmoPCU can selectively trace such messages based on different categories, for
+both Ul and Dl. For a complete list of cateogry values, please refer to the
+_OsmoPCU VTY reference manual_ <<vty-ref-osmopcu>>.
+
+For example, to enable GSMTAP tracing for all DL EGPRS rlcmac data blocks, you
+can use the `gsmtap-category dl-data-egprs` command at the `pcu` node of the
+OsmoPCU VTY.
+
+.Example: Enabling GSMTAP for for all DL EGPRS rlcmac data blocks
+----
+OsmoPCU> enable
+OsmoPCU# configure terminal
+OsmoPCU(config)# pcu
+OsmoPCU(pcu)# gsmtap-category dl-data-egprs
+OsmoPCU(trx)# write <1>
+----
+<1> the `write` command will make the configuration persistent in the
+configuration file. This is not required if you wish to enable GSMTAP
+only in the current session of OsmoPCU.
+
+De-activation can be performed similarly by using the `no gsmtap-category
+dl-data-egprs` command at the `pcu` node of the OsmoPCU VTY.
+
+It may be useful to enable all categories with a few exceptions, or vice versa
+disable everything using one command. For this purpose, the VTY provides
+`gsmtap-category enable-all` and `gsmtap-category disable-all` commands.
+
+.Example: Enabling all categoriess except _dl-dummy_
+----
+pcu
+ gsmtap-category enable-all <1>
+ no gsmtap-category dl-dummy <2>
+----
+<1> Enable all available SAPIs
+<2> Exclude DL RLCMAC blocks
+
+From the moment they are enabled via VTY, GSMTAP messages will be
+generated and sent in UDP encapsulation to the IANA-registered UDP port
+for GSMTAP (4729) of the specified remote address.
diff --git a/doc/manuals/chapters/counters_generated.adoc b/doc/manuals/chapters/counters_generated.adoc
index 2ee425e7..ac7d16a6 100644
--- a/doc/manuals/chapters/counters_generated.adoc
+++ b/doc/manuals/chapters/counters_generated.adoc
@@ -1,178 +1,208 @@
+
// autogenerated by show asciidoc counters
-These counters and their description based on Osmo-PCU 0.4.0.4-8d55 (Osmo-PCU).
+These counters and their description are based on OsmoPCU 0.9.0.244-de96 (OsmoPCU).
+
+=== Rate Counters
// generating tables for rate_ctr_group
-// rate_ctr_group table BSSGP Peer Statistics
-.bssgp:bss_ctx - BSSGP Peer Statistics
-[options="header"]
-|===
-| Name | Reference | Description
-| packets:in | <<bssgp:bss_ctx_packets:in>> | Packets at BSSGP Level ( In)
-| packets:out | <<bssgp:bss_ctx_packets:out>> | Packets at BSSGP Level (Out)
-| bytes:in | <<bssgp:bss_ctx_bytes:in>> | Bytes at BSSGP Level ( In)
-| bytes:out | <<bssgp:bss_ctx_bytes:out>> | Bytes at BSSGP Level (Out)
-| blocked | <<bssgp:bss_ctx_blocked>> | BVC Blocking count
-| discarded | <<bssgp:bss_ctx_discarded>> | BVC LLC Discarded count
-| status | <<bssgp:bss_ctx_status>> | BVC Status count
-|===
// rate_ctr_group table NSVC Peer Statistics
-.ns:nsvc - NSVC Peer Statistics
+.ns:nsvc - NSVC Peer Statistics
[options="header"]
|===
| Name | Reference | Description
| packets:in | <<ns:nsvc_packets:in>> | Packets at NS Level ( In)
| packets:out | <<ns:nsvc_packets:out>> | Packets at NS Level (Out)
+| packets:out:drop | <<ns:nsvc_packets:out:drop>> | Dropped Packets (Out)
| bytes:in | <<ns:nsvc_bytes:in>> | Bytes at NS Level ( In)
| bytes:out | <<ns:nsvc_bytes:out>> | Bytes at NS Level (Out)
-| blocked | <<ns:nsvc_blocked>> | NS-VC Block count
-| dead | <<ns:nsvc_dead>> | NS-VC gone dead count
+| bytes:out:drop | <<ns:nsvc_bytes:out:drop>> | Dropped Bytes (Out)
+| blocked | <<ns:nsvc_blocked>> | NS-VC Block count
+| unblocked | <<ns:nsvc_unblocked>> | NS-VC Unblock count
+| dead | <<ns:nsvc_dead>> | NS-VC gone dead count
| replaced | <<ns:nsvc_replaced>> | NS-VC replaced other count
-| nsei-chg | <<ns:nsvc_nsei-chg>> | NS-VC changed NSEI count
-| inv-nsvci | <<ns:nsvc_inv-nsvci>> | NS-VCI was invalid count
-| inv-nsei | <<ns:nsvc_inv-nsei>> | NSEI was invalid count
-| lost:alive | <<ns:nsvc_lost:alive>> | ALIVE ACK missing count
-| lost:reset | <<ns:nsvc_lost:reset>> | RESET ACK missing count
+| nsei-chg | <<ns:nsvc_nsei-chg>> | NS-VC changed NSEI count
+| inv-nsvci | <<ns:nsvc_inv-nsvci>> | NS-VCI was invalid count
+| inv-nsei | <<ns:nsvc_inv-nsei>> | NSEI was invalid count
+| lost:alive | <<ns:nsvc_lost:alive>> | ALIVE ACK missing count
+| lost:reset | <<ns:nsvc_lost:reset>> | RESET ACK missing count
+|===
+// rate_ctr_group table NSE Peer Statistics
+.ns:nse - NSE Peer Statistics
+[options="header"]
|===
-// rate_ctr_group table NSVC Peer Statistics
-.ns:nsvc - NSVC Peer Statistics
+| Name | Reference | Description
+| packets:in | <<ns:nse_packets:in>> | Packets at NS Level ( In)
+| packets:out | <<ns:nse_packets:out>> | Packets at NS Level (Out)
+| packets:out:drop | <<ns:nse_packets:out:drop>> | Dropped Packets (Out)
+| bytes:in | <<ns:nse_bytes:in>> | Bytes at NS Level ( In)
+| bytes:out | <<ns:nse_bytes:out>> | Bytes at NS Level (Out)
+| bytes:out:drop | <<ns:nse_bytes:out:drop>> | Dropped Bytes (Out)
+| blocked | <<ns:nse_blocked>> | NS-VC Block count
+| unblocked | <<ns:nse_unblocked>> | NS-VC Unblock count
+| dead | <<ns:nse_dead>> | NS-VC gone dead count
+| replaced | <<ns:nse_replaced>> | NS-VC replaced other count
+| nsei-chg | <<ns:nse_nsei-chg>> | NS-VC changed NSEI count
+| inv-nsvci | <<ns:nse_inv-nsvci>> | NS-VCI was invalid count
+| inv-nsei | <<ns:nse_inv-nsei>> | NSEI was invalid count
+| lost:alive | <<ns:nse_lost:alive>> | ALIVE ACK missing count
+| lost:reset | <<ns:nse_lost:reset>> | RESET ACK missing count
+|===
+// rate_ctr_group table SGSN Statistics
+.pcu:sgsn - SGSN Statistics
[options="header"]
|===
| Name | Reference | Description
-| packets:in | <<ns:nsvc_packets:in>> | Packets at NS Level ( In)
-| packets:out | <<ns:nsvc_packets:out>> | Packets at NS Level (Out)
-| bytes:in | <<ns:nsvc_bytes:in>> | Bytes at NS Level ( In)
-| bytes:out | <<ns:nsvc_bytes:out>> | Bytes at NS Level (Out)
-| blocked | <<ns:nsvc_blocked>> | NS-VC Block count
-| dead | <<ns:nsvc_dead>> | NS-VC gone dead count
-| replaced | <<ns:nsvc_replaced>> | NS-VC replaced other count
-| nsei-chg | <<ns:nsvc_nsei-chg>> | NS-VC changed NSEI count
-| inv-nsvci | <<ns:nsvc_inv-nsvci>> | NS-VCI was invalid count
-| inv-nsei | <<ns:nsvc_inv-nsei>> | NSEI was invalid count
-| lost:alive | <<ns:nsvc_lost:alive>> | ALIVE ACK missing count
-| lost:reset | <<ns:nsvc_lost:reset>> | RESET ACK missing count
+| rx_paging_cs | <<pcu:sgsn_rx_paging_cs>> | Amount of paging CS requests received
+| rx_paging_ps | <<pcu:sgsn_rx_paging_ps>> | Amount of paging PS requests received
+|===
+// rate_ctr_group table BSSGP Peer Statistics
+.bssgp:bss_ctx - BSSGP Peer Statistics
+[options="header"]
+|===
+| Name | Reference | Description
+| packets:in | <<bssgp:bss_ctx_packets:in>> | Packets at BSSGP Level ( In)
+| packets:out | <<bssgp:bss_ctx_packets:out>> | Packets at BSSGP Level (Out)
+| bytes:in | <<bssgp:bss_ctx_bytes:in>> | Bytes at BSSGP Level ( In)
+| bytes:out | <<bssgp:bss_ctx_bytes:out>> | Bytes at BSSGP Level (Out)
+| blocked | <<bssgp:bss_ctx_blocked>> | BVC Blocking count
+| discarded | <<bssgp:bss_ctx_discarded>> | BVC LLC Discarded count
+| status | <<bssgp:bss_ctx_status>> | BVC Status count
|===
// rate_ctr_group table BTS Statistics
-.bts - BTS Statistics
+.bts - BTS Statistics
[options="header"]
|===
| Name | Reference | Description
-| tbf:dl:alloc | <<bts_tbf:dl:alloc>> | TBF DL Allocated
-| tbf:dl:freed | <<bts_tbf:dl:freed>> | TBF DL Freed
-| tbf:dl:aborted | <<bts_tbf:dl:aborted>> | TBF DL Aborted
-| tbf:ul:alloc | <<bts_tbf:ul:alloc>> | TBF UL Allocated
-| tbf:ul:freed | <<bts_tbf:ul:freed>> | TBF UL Freed
-| tbf:ul:aborted | <<bts_tbf:ul:aborted>> | TBF UL Aborted
-| tbf:reused | <<bts_tbf:reused>> | TBF Reused
-| tbf:alloc:algo-a | <<bts_tbf:alloc:algo-a>> | TBF Alloc Algo A
-| tbf:alloc:algo-b | <<bts_tbf:alloc:algo-b>> | TBF Alloc Algo B
-| tbf:failed:egprs-only | <<bts_tbf:failed:egprs-only>> | TBF Failed EGPRS-only
-| rlc:sent | <<bts_rlc:sent>> | RLC Sent
-| rlc:resent | <<bts_rlc:resent>> | RLC Resent
-| rlc:restarted | <<bts_rlc:restarted>> | RLC Restarted
-| rlc:stalled | <<bts_rlc:stalled>> | RLC Stalled
-| rlc:nacked | <<bts_rlc:nacked>> | RLC Nacked
-| rlc:final_block_resent | <<bts_rlc:final_block_resent>> | RLC Final Blk resent
-| rlc:ass:timedout | <<bts_rlc:ass:timedout>> | RLC Assign Timeout
-| rlc:ass:failed | <<bts_rlc:ass:failed>> | RLC Assign Failed
-| rlc:ack:timedout | <<bts_rlc:ack:timedout>> | RLC Ack Timeout
-| rlc:ack:failed | <<bts_rlc:ack:failed>> | RLC Ack Failed
-| rlc:rel:timedout | <<bts_rlc:rel:timedout>> | RLC Release Timeout
-| rlc:late-block | <<bts_rlc:late-block>> | RLC Late Block
-| rlc:sent-dummy | <<bts_rlc:sent-dummy>> | RLC Sent Dummy
-| rlc:sent-control | <<bts_rlc:sent-control>> | RLC Sent Control
-| rlc:dl_bytes | <<bts_rlc:dl_bytes>> | RLC DL Bytes
-| rlc:dl_payload_bytes | <<bts_rlc:dl_payload_bytes>> | RLC DL Payload Bytes
-| rlc:ul_bytes | <<bts_rlc:ul_bytes>> | RLC UL Bytes
-| rlc:ul_payload_bytes | <<bts_rlc:ul_payload_bytes>> | RLC UL Payload Bytes
-| decode:errors | <<bts_decode:errors>> | Decode Errors
-| sba:allocated | <<bts_sba:allocated>> | SBA Allocated
-| sba:freed | <<bts_sba:freed>> | SBA Freed
-| sba:timedout | <<bts_sba:timedout>> | SBA Timeout
-| llc:timeout | <<bts_llc:timeout>> | Timedout Frames
-| llc:dropped | <<bts_llc:dropped>> | Dropped Frames
-| llc:scheduled | <<bts_llc:scheduled>> | Scheduled Frames
+| tbf:dl:alloc | <<bts_tbf:dl:alloc>> | TBF DL Allocated
+| tbf:dl:freed | <<bts_tbf:dl:freed>> | TBF DL Freed
+| tbf:dl:aborted | <<bts_tbf:dl:aborted>> | TBF DL Aborted
+| tbf:ul:alloc | <<bts_tbf:ul:alloc>> | TBF UL Allocated
+| tbf:ul:freed | <<bts_tbf:ul:freed>> | TBF UL Freed
+| tbf:ul:aborted | <<bts_tbf:ul:aborted>> | TBF UL Aborted
+| tbf:reused | <<bts_tbf:reused>> | TBF Reused
+| tbf:alloc:algo-a | <<bts_tbf:alloc:algo-a>> | TBF Alloc Algo A
+| tbf:alloc:algo-b | <<bts_tbf:alloc:algo-b>> | TBF Alloc Algo B
+| tbf:alloc:failed | <<bts_tbf:alloc:failed>> | TBF Alloc Failure (any reason)
+| tbf:alloc:failed:no_tfi | <<bts_tbf:alloc:failed:no_tfi>> | TBF Alloc Failure (TFIs exhausted)
+| tbf:alloc:failed:no_usf | <<bts_tbf:alloc:failed:no_usf>> | TBF Alloc Failure (USFs exhausted)
+| tbf:alloc:failed:no_slot_combi | <<bts_tbf:alloc:failed:no_slot_combi>> | TBF Alloc Failure (No valid UL/DL slot combination found)
+| tbf:alloc:failed:no_slot_avail | <<bts_tbf:alloc:failed:no_slot_avail>> | TBF Alloc Failure (No slot available)
+| rlc:sent | <<bts_rlc:sent>> | RLC Sent
+| rlc:resent | <<bts_rlc:resent>> | RLC Resent
+| rlc:restarted | <<bts_rlc:restarted>> | RLC Restarted
+| rlc:stalled | <<bts_rlc:stalled>> | RLC Stalled
+| rlc:nacked | <<bts_rlc:nacked>> | RLC Nacked
+| rlc:final_block_resent | <<bts_rlc:final_block_resent>> | RLC Final Blk resent
+| rlc:ass:timedout | <<bts_rlc:ass:timedout>> | RLC Assign Timeout
+| rlc:ass:failed | <<bts_rlc:ass:failed>> | RLC Assign Failed
+| rlc:ack:timedout | <<bts_rlc:ack:timedout>> | RLC Ack Timeout
+| rlc:ack:failed | <<bts_rlc:ack:failed>> | RLC Ack Failed
+| rlc:rel:timedout | <<bts_rlc:rel:timedout>> | RLC Release Timeout
+| rlc:late-block | <<bts_rlc:late-block>> | RLC Late Block
+| rlc:sent-dummy | <<bts_rlc:sent-dummy>> | RLC Sent Dummy
+| rlc:sent-control | <<bts_rlc:sent-control>> | RLC Sent Control
+| rlc:dl_bytes | <<bts_rlc:dl_bytes>> | RLC DL Bytes
+| rlc:dl_payload_bytes | <<bts_rlc:dl_payload_bytes>> | RLC DL Payload Bytes
+| rlc:ul_bytes | <<bts_rlc:ul_bytes>> | RLC UL Bytes
+| rlc:ul_payload_bytes | <<bts_rlc:ul_payload_bytes>> | RLC UL Payload Bytes
+| decode:errors | <<bts_decode:errors>> | Decode Errors
+| sba:allocated | <<bts_sba:allocated>> | SBA Allocated
+| sba:freed | <<bts_sba:freed>> | SBA Freed
+| sba:timedout | <<bts_sba:timedout>> | SBA Timeout
+| llc:timeout | <<bts_llc:timeout>> | Timedout Frames
+| llc:dropped | <<bts_llc:dropped>> | Dropped Frames
+| llc:scheduled | <<bts_llc:scheduled>> | Scheduled Frames
| llc:dl_bytes | <<bts_llc:dl_bytes>> | RLC encapsulated PDUs
-| llc:ul_bytes | <<bts_llc:ul_bytes>> | full PDUs received
-| rach:requests | <<bts_rach:requests>> | RACH requests
-| 11bit_rach:requests | <<bts_11bit_rach:requests>> | 11BIT_RACH requests
-| spb:uplink_first_segment | <<bts_spb:uplink_first_segment>> | First seg of UL SPB
-| spb:uplink_second_segment | <<bts_spb:uplink_second_segment>> | Second seg of UL SPB
-| spb:downlink_first_segment | <<bts_spb:downlink_first_segment>> | First seg of DL SPB
-| spb:downlink_second_segment | <<bts_spb:downlink_second_segment>> | Second seg of DL SPB
-| immediate:assignment_UL | <<bts_immediate:assignment_UL>> | Immediate Assign UL
-| immediate:assignment_rej | <<bts_immediate:assignment_rej>> | Immediate Assign Rej
-| immediate:assignment_DL | <<bts_immediate:assignment_DL>> | Immediate Assign DL
-| channel:request_description | <<bts_channel:request_description>> | Channel Request Desc
-| pkt:ul_assignment | <<bts_pkt:ul_assignment>> | Packet UL Assignment
-| pkt:access_reject | <<bts_pkt:access_reject>> | Packet Access Reject
-| pkt:dl_assignment | <<bts_pkt:dl_assignment>> | Packet DL Assignment
-| ul:control | <<bts_ul:control>> | UL control Block
-| ul:assignment_poll_timeout | <<bts_ul:assignment_poll_timeout>> | UL Assign Timeout
-| ul:assignment_failed | <<bts_ul:assignment_failed>> | UL Assign Failed
-| dl:assignment_timeout | <<bts_dl:assignment_timeout>> | DL Assign Timeout
-| dl:assignment_failed | <<bts_dl:assignment_failed>> | DL Assign Failed
-| pkt:ul_ack_nack_timeout | <<bts_pkt:ul_ack_nack_timeout>> | PUAN Poll Timeout
-| pkt:ul_ack_nack_failed | <<bts_pkt:ul_ack_nack_failed>> | PUAN poll Failed
-| pkt:dl_ack_nack_timeout | <<bts_pkt:dl_ack_nack_timeout>> | PDAN poll Timeout
-| pkt:dl_ack_nack_failed | <<bts_pkt:dl_ack_nack_failed>> | PDAN poll Failed
-| gprs:downlink_cs1 | <<bts_gprs:downlink_cs1>> | CS1 downlink
-| gprs:downlink_cs2 | <<bts_gprs:downlink_cs2>> | CS2 downlink
-| gprs:downlink_cs3 | <<bts_gprs:downlink_cs3>> | CS3 downlink
-| gprs:downlink_cs4 | <<bts_gprs:downlink_cs4>> | CS4 downlink
-| egprs:downlink_mcs1 | <<bts_egprs:downlink_mcs1>> | MCS1 downlink
-| egprs:downlink_mcs2 | <<bts_egprs:downlink_mcs2>> | MCS2 downlink
-| egprs:downlink_mcs3 | <<bts_egprs:downlink_mcs3>> | MCS3 downlink
-| egprs:downlink_mcs4 | <<bts_egprs:downlink_mcs4>> | MCS4 downlink
-| egprs:downlink_mcs5 | <<bts_egprs:downlink_mcs5>> | MCS5 downlink
-| egprs:downlink_mcs6 | <<bts_egprs:downlink_mcs6>> | MCS6 downlink
-| egprs:downlink_mcs7 | <<bts_egprs:downlink_mcs7>> | MCS7 downlink
-| egprs:downlink_mcs8 | <<bts_egprs:downlink_mcs8>> | MCS8 downlink
-| egprs:downlink_mcs9 | <<bts_egprs:downlink_mcs9>> | MCS9 downlink
-| gprs:uplink_cs1 | <<bts_gprs:uplink_cs1>> | CS1 Uplink
-| gprs:uplink_cs2 | <<bts_gprs:uplink_cs2>> | CS2 Uplink
-| gprs:uplink_cs3 | <<bts_gprs:uplink_cs3>> | CS3 Uplink
-| gprs:uplink_cs4 | <<bts_gprs:uplink_cs4>> | CS4 Uplink
-| egprs:uplink_mcs1 | <<bts_egprs:uplink_mcs1>> | MCS1 Uplink
-| egprs:uplink_mcs2 | <<bts_egprs:uplink_mcs2>> | MCS2 Uplink
-| egprs:uplink_mcs3 | <<bts_egprs:uplink_mcs3>> | MCS3 Uplink
-| egprs:uplink_mcs4 | <<bts_egprs:uplink_mcs4>> | MCS4 Uplink
-| egprs:uplink_mcs5 | <<bts_egprs:uplink_mcs5>> | MCS5 Uplink
-| egprs:uplink_mcs6 | <<bts_egprs:uplink_mcs6>> | MCS6 Uplink
-| egprs:uplink_mcs7 | <<bts_egprs:uplink_mcs7>> | MCS7 Uplink
-| egprs:uplink_mcs8 | <<bts_egprs:uplink_mcs8>> | MCS8 Uplink
-| egprs:uplink_mcs9 | <<bts_egprs:uplink_mcs9>> | MCS9 Uplink
-|===
+| llc:ul_bytes | <<bts_llc:ul_bytes>> | full PDUs received
+| pch:requests | <<bts_pch:requests>> | PCH requests sent
+| pch:requests:timeout | <<bts_pch:requests:timeout>> | PCH requests timeout
+| rach:requests | <<bts_rach:requests>> | RACH requests received
+| rach:requests:11bit | <<bts_rach:requests:11bit>> | 11BIT_RACH requests received
+| rach:requests:one_phase | <<bts_rach:requests:one_phase>> | One phase packet access with request for single TS UL
+| rach:requests:two_phase | <<bts_rach:requests:two_phase>> | Single block packet request for two phase packet access
+| rach:requests:unexpected | <<bts_rach:requests:unexpected>> | RACH Request with unexpected content received
+| spb:uplink_first_segment | <<bts_spb:uplink_first_segment>> | First seg of UL SPB
+| spb:uplink_second_segment | <<bts_spb:uplink_second_segment>> | Second seg of UL SPB
+| spb:downlink_first_segment | <<bts_spb:downlink_first_segment>> | First seg of DL SPB
+| spb:downlink_second_segment | <<bts_spb:downlink_second_segment>> | Second seg of DL SPB
+| immediate:assignment_UL | <<bts_immediate:assignment_UL>> | Immediate Assign UL
+| immediate:assignment_ul:one_phase | <<bts_immediate:assignment_ul:one_phase>> | Immediate Assign UL (one phase packet access)
+| immediate:assignment_ul:two_phase | <<bts_immediate:assignment_ul:two_phase>> | Immediate Assign UL (two phase packet access)
+| immediate:assignment_ul:contention_resolution_success | <<bts_immediate:assignment_ul:contention_resolution_success>> | First RLC Block (PDU) on the PDTCH from the MS received
+| immediate:assignment_rej | <<bts_immediate:assignment_rej>> | Immediate Assign Rej
+| immediate:assignment_DL | <<bts_immediate:assignment_DL>> | Immediate Assign DL
+| channel:request_description | <<bts_channel:request_description>> | Channel Request Desc
+| pkt:ul_assignment | <<bts_pkt:ul_assignment>> | Packet UL Assignment
+| pkt:access_reject | <<bts_pkt:access_reject>> | Packet Access Reject
+| pkt:dl_assignment | <<bts_pkt:dl_assignment>> | Packet DL Assignment
+| pkt:cell_chg_notification | <<bts_pkt:cell_chg_notification>> | Packet Cell Change Notification
+| pkt:cell_chg_continue | <<bts_pkt:cell_chg_continue>> | Packet Cell Change Continue
+| pkt:neigh_cell_data | <<bts_pkt:neigh_cell_data>> | Packet Neighbour Cell Data
+| ul:control | <<bts_ul:control>> | UL control Block
+| ul:assignment_poll_timeout | <<bts_ul:assignment_poll_timeout>> | UL Assign Timeout
+| ul:assignment_failed | <<bts_ul:assignment_failed>> | UL Assign Failed
+| dl:assignment_timeout | <<bts_dl:assignment_timeout>> | DL Assign Timeout
+| dl:assignment_failed | <<bts_dl:assignment_failed>> | DL Assign Failed
+| pkt:ul_ack_nack_timeout | <<bts_pkt:ul_ack_nack_timeout>> | PUAN Poll Timeout
+| pkt:ul_ack_nack_failed | <<bts_pkt:ul_ack_nack_failed>> | PUAN poll Failed
+| pkt:dl_ack_nack_timeout | <<bts_pkt:dl_ack_nack_timeout>> | PDAN poll Timeout
+| pkt:dl_ack_nack_failed | <<bts_pkt:dl_ack_nack_failed>> | PDAN poll Failed
+| gprs:downlink_cs1 | <<bts_gprs:downlink_cs1>> | CS1 downlink
+| gprs:downlink_cs2 | <<bts_gprs:downlink_cs2>> | CS2 downlink
+| gprs:downlink_cs3 | <<bts_gprs:downlink_cs3>> | CS3 downlink
+| gprs:downlink_cs4 | <<bts_gprs:downlink_cs4>> | CS4 downlink
+| egprs:downlink_mcs1 | <<bts_egprs:downlink_mcs1>> | MCS1 downlink
+| egprs:downlink_mcs2 | <<bts_egprs:downlink_mcs2>> | MCS2 downlink
+| egprs:downlink_mcs3 | <<bts_egprs:downlink_mcs3>> | MCS3 downlink
+| egprs:downlink_mcs4 | <<bts_egprs:downlink_mcs4>> | MCS4 downlink
+| egprs:downlink_mcs5 | <<bts_egprs:downlink_mcs5>> | MCS5 downlink
+| egprs:downlink_mcs6 | <<bts_egprs:downlink_mcs6>> | MCS6 downlink
+| egprs:downlink_mcs7 | <<bts_egprs:downlink_mcs7>> | MCS7 downlink
+| egprs:downlink_mcs8 | <<bts_egprs:downlink_mcs8>> | MCS8 downlink
+| egprs:downlink_mcs9 | <<bts_egprs:downlink_mcs9>> | MCS9 downlink
+| gprs:uplink_cs1 | <<bts_gprs:uplink_cs1>> | CS1 Uplink
+| gprs:uplink_cs2 | <<bts_gprs:uplink_cs2>> | CS2 Uplink
+| gprs:uplink_cs3 | <<bts_gprs:uplink_cs3>> | CS3 Uplink
+| gprs:uplink_cs4 | <<bts_gprs:uplink_cs4>> | CS4 Uplink
+| egprs:uplink_mcs1 | <<bts_egprs:uplink_mcs1>> | MCS1 Uplink
+| egprs:uplink_mcs2 | <<bts_egprs:uplink_mcs2>> | MCS2 Uplink
+| egprs:uplink_mcs3 | <<bts_egprs:uplink_mcs3>> | MCS3 Uplink
+| egprs:uplink_mcs4 | <<bts_egprs:uplink_mcs4>> | MCS4 Uplink
+| egprs:uplink_mcs5 | <<bts_egprs:uplink_mcs5>> | MCS5 Uplink
+| egprs:uplink_mcs6 | <<bts_egprs:uplink_mcs6>> | MCS6 Uplink
+| egprs:uplink_mcs7 | <<bts_egprs:uplink_mcs7>> | MCS7 Uplink
+| egprs:uplink_mcs8 | <<bts_egprs:uplink_mcs8>> | MCS8 Uplink
+| egprs:uplink_mcs9 | <<bts_egprs:uplink_mcs9>> | MCS9 Uplink
+|===
+=== Osmo Stat Items
+
// generating tables for osmo_stat_items
NSVC Peer Statistics
// osmo_stat_item_group table NSVC Peer Statistics
-.ns.nsvc - NSVC Peer Statistics
+.ns.nsvc - NSVC Peer Statistics
[options="header"]
|===
| Name | Reference | Description | Unit
| alive.delay | <<ns.nsvc_alive.delay>> | ALIVE response time | ms
|===
-NSVC Peer Statistics
-// osmo_stat_item_group table NSVC Peer Statistics
-.ns.nsvc - NSVC Peer Statistics
+NS Bind Statistics
+// osmo_stat_item_group table NS Bind Statistics
+.ns.bind - NS Bind Statistics
[options="header"]
|===
| Name | Reference | Description | Unit
-| alive.delay | <<ns.nsvc_alive.delay>> | ALIVE response time | ms
+| tx_backlog_length | <<ns.bind_tx_backlog_length>> | Transmit backlog length | packets
|===
BTS Statistics
// osmo_stat_item_group table BTS Statistics
-.bts - BTS Statistics
+.bts - BTS Statistics
[options="header"]
|===
| Name | Reference | Description | Unit
-| ms.present | <<bts_ms.present>> | MS Present |
+| ms.present | <<bts_ms.present>> | MS Present |
+| pdch.available | <<bts_pdch.available>> | PDCH available |
+| pdch.occupied | <<bts_pdch.occupied>> | PDCH occupied (all) |
+| pdch.occupied.gprs | <<bts_pdch.occupied.gprs>> | PDCH occupied (GPRS) |
+| pdch.occupied.egprs | <<bts_pdch.occupied.egprs>> | PDCH occupied (EGPRS) |
|===
-// generating tables for osmo_counters
-// ungrouped osmo_counters
-.ungrouped osmo counters
-[options="header"]
-|===
-| Name | Reference | Description
-|===
-
-
+// there are no ungrouped osmo_counters
diff --git a/doc/manuals/chapters/running.adoc b/doc/manuals/chapters/running.adoc
index 5daecf8f..c7639746 100644
--- a/doc/manuals/chapters/running.adoc
+++ b/doc/manuals/chapters/running.adoc
@@ -21,15 +21,7 @@ options:
Specify the file and path name of the configuration file to be
used. If none is specified, use `osmo-pcu.cfg` in the current
working directory.
-*-r, --realtime 'PRIO'*::
- Enable use of the Linux kernel realtime priority scheduler with
- the specified priority.
- It is recommended you use this option on low-performance
- embedded systems or systems that encounter high non-GSM/GPRS
- load.
*-m, --mcc 'MCC'*::
Use the given MCC instead of that provided by BTS via PCU socket
*-n, --mnc 'MNC'*::
Use the given MNC instead of that provided by BTS via PCU socket
-*-i, --gsmtap-ip 'A.B.C.D'*::
- Send Um interface trace via GSMTAP to specified IP address
diff --git a/src/bts.cpp b/src/bts.cpp
index 50df92e2..5c870afb 100644
--- a/src/bts.cpp
+++ b/src/bts.cpp
@@ -79,10 +79,23 @@ void bts_trx_free_all_tbf(struct gprs_rlcmac_trx *trx)
static struct osmo_tdef T_defs_bts[] = {
{ .T=3142, .default_val=20, .unit=OSMO_TDEF_S, .desc="Wait Indication used in Imm Ass Reject during TBF Establishment (CCCH)", .val=0, .min_val = 0, .max_val = 255 }, /* TS 44.018 10.5.2.43, TS 44.060 7.1.3.2.1 (T3172) */
{ .T=3169, .default_val=5, .unit=OSMO_TDEF_S, .desc="Reuse of USF and TFI(s) after the MS uplink TBF assignment is invalid", .val=0 },
- { .T=3172, .default_val=5000,.unit=OSMO_TDEF_MS, .desc="Wait Indication used in Imm Ass Reject during TBF Establishment (PACCH)", .val=0, .min_val = 0, .max_val = 255000 }, /* TS 44.060 7.1.3.2.1 */
{ .T=3191, .default_val=5, .unit=OSMO_TDEF_S, .desc="Reuse of TFI(s) after sending (1) last RLC Data Block on TBF(s), or (2) PACKET TBF RELEASE for an MBMS radio bearer", .val=0 },
{ .T=3193, .default_val=100, .unit=OSMO_TDEF_MS, .desc="Reuse of TFI(s) after reception of final PACKET DOWNLINK ACK/NACK from MS for TBF", .val=0 },
{ .T=3195, .default_val=5, .unit=OSMO_TDEF_S, .desc="Reuse of TFI(s) upon no response from the MS (radio failure or cell change) for TBF/MBMS radio bearer", .val=0 },
+ { .T = -16, .default_val = 1000, .unit = OSMO_TDEF_MS,
+ .desc = "Granularity for *:all_allocated rate counters: amount of milliseconds that one counter increment"
+ " represents. See also X17, X18" },
+ { .T = -17, .default_val = 0, .unit = OSMO_TDEF_MS,
+ .desc = "Rounding threshold for *:all_allocated rate counters: round up to the next counter increment"
+ " after this many milliseconds. If set to half of X16 (or 0), employ the usual round() behavior:"
+ " round up after half of a granularity period. If set to 1, behave like ceil(): already"
+ " increment the counter immediately when all channels are allocated. If set >= X16, behave like"
+ " floor(): only increment after a full X16 period of all channels being occupied."
+ " See also X16, X18" },
+ { .T = -18, .default_val = 60000, .unit = OSMO_TDEF_MS,
+ .desc = "Forget-sum period for *:all_allocated rate counters:"
+ " after this amount of idle time, forget internally cumulated time remainders. Zero to always"
+ " keep remainders. See also X16, X17." },
{ .T=0, .default_val=0, .unit=OSMO_TDEF_S, .desc=NULL, .val=0 } /* empty item at the end */
};
@@ -92,6 +105,7 @@ static struct osmo_tdef T_defs_bts[] = {
* the code below.
*/
static const struct rate_ctr_desc bts_ctr_description[] = {
+ { "pdch:all_allocated", "Cumulative counter of seconds where all enabled PDCH resources were allocated"},
{ "tbf:dl:alloc", "TBF DL Allocated "},
{ "tbf:dl:freed", "TBF DL Freed "},
{ "tbf:dl:aborted", "TBF DL Aborted "},
@@ -134,14 +148,21 @@ static const struct rate_ctr_desc bts_ctr_description[] = {
{ "llc:dl_bytes", "RLC encapsulated PDUs"},
{ "llc:ul_bytes", "full PDUs received "},
{ "pch:requests", "PCH requests sent "},
+ { "pch:requests:already", "PCH requests on subscriber already being paged"},
{ "pch:requests:timeout", "PCH requests timeout "},
{ "rach:requests", "RACH requests received"},
- { "11bit_rach:requests", "11BIT_RACH requests received"},
+ { "rach:requests:11bit", "11BIT_RACH requests received"},
+ { "rach:requests:one_phase", "One phase packet access with request for single TS UL"}, /* TS 52.402 B.2.1.49 */
+ { "rach:requests:two_phase", "Single block packet request for two phase packet access"}, /* TS 52.402 B.2.1.49 */
+ { "rach:requests:unexpected", "RACH Request with unexpected content received"},
{ "spb:uplink_first_segment", "First seg of UL SPB "},
{ "spb:uplink_second_segment", "Second seg of UL SPB "},
{ "spb:downlink_first_segment", "First seg of DL SPB "},
{ "spb:downlink_second_segment","Second seg of DL SPB "},
{ "immediate:assignment_UL", "Immediate Assign UL "},
+ { "immediate:assignment_ul:one_phase", "Immediate Assign UL (one phase packet access)"}, /* TS 52.402 B.2.1.50 */
+ { "immediate:assignment_ul:two_phase", "Immediate Assign UL (two phase packet access)"}, /* TS 52.402 B.2.1.50 */
+ { "immediate:assignment_ul:contention_resolution_success", "First RLC Block (PDU) on the PDTCH from the MS received"}, /* TS 52.402 B.2.1.51 */
{ "immediate:assignment_rej", "Immediate Assign Rej "},
{ "immediate:assignment_DL", "Immediate Assign DL "},
{ "channel:request_description","Channel Request Desc "},
@@ -224,6 +245,8 @@ static int bts_talloc_destructor(struct gprs_rlcmac_bts* bts)
bts->ms_store->cleanup();
delete bts->ms_store;
+ osmo_time_cc_cleanup(&bts->all_allocated_pdch);
+
if (bts->ratectrs) {
rate_ctr_group_free(bts->ratectrs);
bts->ratectrs = NULL;
@@ -293,6 +316,16 @@ struct gprs_rlcmac_bts* bts_alloc(struct gprs_pcu *pcu, uint8_t bts_nr)
bts->statg = osmo_stat_item_group_alloc(tall_pcu_ctx, &bts_statg_desc, 0);
OSMO_ASSERT(bts->statg);
+ osmo_time_cc_init(&bts->all_allocated_pdch);
+ struct osmo_time_cc_cfg *cc_cfg = &bts->all_allocated_pdch.cfg;
+ cc_cfg->gran_usec = 1*1000000,
+ cc_cfg->forget_sum_usec = 60*1000000,
+ cc_cfg->rate_ctr = rate_ctr_group_get_ctr(bts->ratectrs, CTR_PDCH_ALL_ALLOCATED),
+ cc_cfg->T_gran = -16,
+ cc_cfg->T_round_threshold = -17,
+ cc_cfg->T_forget_sum = -18,
+ cc_cfg->T_defs = T_defs_bts,
+
llist_add_tail(&bts->list, &pcu->bts_list);
INIT_LLIST_HEAD(&bts->pch_timer);
@@ -880,7 +913,7 @@ int bts_rcv_rach(struct gprs_rlcmac_bts *bts, const struct rach_ind_params *rip)
bts_do_rate_ctr_inc(bts, CTR_RACH_REQUESTS);
if (rip->is_11bit)
- bts_do_rate_ctr_inc(bts, CTR_11BIT_RACH_REQUESTS);
+ bts_do_rate_ctr_inc(bts, CTR_RACH_REQUESTS_11BIT);
/* Determine full frame number */
uint32_t Fn = bts_rfn_to_fn(bts, rip->rfn);
@@ -894,15 +927,24 @@ int bts_rcv_rach(struct gprs_rlcmac_bts *bts, const struct rach_ind_params *rip)
/* Parse [EGPRS Packet] Channel Request from RACH.ind */
rc = parse_rach_ind(rip, &chan_req);
- if (rc) /* Send RR Immediate Assignment Reject */
+ if (rc) {
+ bts_do_rate_ctr_inc(bts, CTR_RACH_REQUESTS_UNEXPECTED);
+ /* Send RR Immediate Assignment Reject */
goto send_imm_ass_rej;
+ }
- if (chan_req.single_block)
- LOGP(DRLCMAC, LOGL_DEBUG, "MS requests single block allocation\n");
- else if (bts->pcu->vty.force_two_phase) {
- LOGP(DRLCMAC, LOGL_DEBUG, "MS requests single block allocation, "
- "but we force two phase access\n");
- chan_req.single_block = true;
+ if (chan_req.single_block) {
+ bts_do_rate_ctr_inc(bts, CTR_RACH_REQUESTS_TWO_PHASE);
+ LOGP(DRLCMAC, LOGL_DEBUG, "MS requests single block allocation "
+ "(two phase packet access)\n");
+ } else {
+ bts_do_rate_ctr_inc(bts, CTR_RACH_REQUESTS_ONE_PHASE);
+ LOGP(DRLCMAC, LOGL_DEBUG, "MS requests single TS uplink transmission "
+ "(one phase packet access)\n");
+ if (bts->pcu->vty.force_two_phase) {
+ LOGP(DRLCMAC, LOGL_DEBUG, "Forcing two phase access\n");
+ chan_req.single_block = true;
+ }
}
/* TODO: handle Radio Priority (see 3GPP TS 44.060, table 11.2.5a.5) */
@@ -925,6 +967,7 @@ int bts_rcv_rach(struct gprs_rlcmac_bts *bts, const struct rach_ind_params *rip)
sb_fn = sba->fn;
LOGP(DRLCMAC, LOGL_DEBUG, "Allocated a single block at "
"SBFn=%u TRX=%u TS=%u\n", sb_fn, pdch->trx->trx_no, pdch->ts_no);
+ bts_do_rate_ctr_inc(bts, CTR_IMMEDIATE_ASSIGN_UL_TBF_TWO_PHASE);
} else {
GprsMs *ms = bts_alloc_ms(bts, 0, chan_req.egprs_mslot_class);
tbf = tbf_alloc_ul_ccch(bts, ms);
@@ -936,6 +979,7 @@ int bts_rcv_rach(struct gprs_rlcmac_bts *bts, const struct rach_ind_params *rip)
tbf->set_ta(ta);
pdch = &tbf->trx->pdch[tbf->first_ts];
usf = tbf->m_usf[pdch->ts_no];
+ bts_do_rate_ctr_inc(bts, CTR_IMMEDIATE_ASSIGN_UL_TBF_ONE_PHASE);
}
trx = pdch->trx;
@@ -1019,10 +1063,11 @@ int bts_rcv_ptcch_rach(struct gprs_rlcmac_bts *bts, const struct rach_ind_params
return 0;
}
-void bts_snd_dl_ass(struct gprs_rlcmac_bts *bts, struct gprs_rlcmac_tbf *tbf, uint16_t pgroup)
+void bts_snd_dl_ass(struct gprs_rlcmac_bts *bts, struct gprs_rlcmac_tbf *tbf)
{
uint8_t trx_no = tbf->trx->trx_no;
uint8_t ts_no = tbf->first_ts;
+ uint16_t pgroup = ms_paging_group(tbf_ms(tbf));
int plen;
LOGPTBF(tbf, LOGL_INFO, "TX: START Immediate Assignment Downlink (PCH)\n");
@@ -1352,3 +1397,20 @@ uint8_t bts_get_ms_pwr_alpha(const struct gprs_rlcmac_bts *bts)
* B.2 Closed loop control */
return 0;
}
+
+/* Used by counter availablePDCHAllocatedTime, TS 52.402 B.2.1.45 "All available PDCH allocated time" */
+bool bts_all_pdch_allocated(const struct gprs_rlcmac_bts *bts)
+{
+ unsigned trx_no, ts_no;
+ for (trx_no = 0; trx_no < ARRAY_SIZE(bts->trx); trx_no++) {
+ const struct gprs_rlcmac_trx *trx = &bts->trx[trx_no];
+ for (ts_no = 0; ts_no < ARRAY_SIZE(trx->pdch); ts_no++) {
+ const struct gprs_rlcmac_pdch *pdch = &trx->pdch[ts_no];
+ if (!pdch_is_enabled(pdch))
+ continue;
+ if(!pdch_is_full(pdch))
+ return false;
+ }
+ }
+ return true;
+}
diff --git a/src/bts.h b/src/bts.h
index d9a86ebb..d2b1f9fd 100644
--- a/src/bts.h
+++ b/src/bts.h
@@ -13,10 +13,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#pragma once
@@ -32,6 +28,7 @@ extern "C" {
#include <osmocom/core/rate_ctr.h>
#include <osmocom/core/stat_item.h>
#include <osmocom/core/tdef.h>
+#include <osmocom/core/time_cc.h>
#include <osmocom/gprs/gprs_ns2.h>
#include <osmocom/gsm/l1sap.h>
#include <osmocom/gsm/protocol/gsm_04_08.h>
@@ -84,6 +81,7 @@ void bts_update_tbf_ta(struct gprs_rlcmac_bts *bts, const char *p, uint32_t fn,
enum {
+ CTR_PDCH_ALL_ALLOCATED,
CTR_TBF_DL_ALLOCATED,
CTR_TBF_DL_FREED,
CTR_TBF_DL_ABORTED,
@@ -126,14 +124,21 @@ enum {
CTR_LLC_DL_BYTES,
CTR_LLC_UL_BYTES,
CTR_PCH_REQUESTS,
+ CTR_PCH_REQUESTS_ALREADY,
CTR_PCH_REQUESTS_TIMEDOUT,
CTR_RACH_REQUESTS,
- CTR_11BIT_RACH_REQUESTS,
+ CTR_RACH_REQUESTS_11BIT,
+ CTR_RACH_REQUESTS_ONE_PHASE,
+ CTR_RACH_REQUESTS_TWO_PHASE,
+ CTR_RACH_REQUESTS_UNEXPECTED,
CTR_SPB_UL_FIRST_SEGMENT,
CTR_SPB_UL_SECOND_SEGMENT,
CTR_SPB_DL_FIRST_SEGMENT,
CTR_SPB_DL_SECOND_SEGMENT,
CTR_IMMEDIATE_ASSIGN_UL_TBF,
+ CTR_IMMEDIATE_ASSIGN_UL_TBF_ONE_PHASE,
+ CTR_IMMEDIATE_ASSIGN_UL_TBF_TWO_PHASE,
+ CTR_IMMEDIATE_ASSIGN_UL_TBF_CONTENTION_RESOLUTION_SUCCESS,
CTR_IMMEDIATE_ASSIGN_REJ,
CTR_IMMEDIATE_ASSIGN_DL_TBF,
CTR_CHANNEL_REQUEST_DESCRIPTION,
@@ -271,6 +276,8 @@ struct gprs_rlcmac_bts {
/* List of struct bts_pch_timer for active PCH pagings */
struct llist_head pch_timer;
+
+ struct osmo_time_cc all_allocated_pdch;
};
#ifdef __cplusplus
@@ -294,7 +301,7 @@ uint32_t bts_rfn_to_fn(const struct gprs_rlcmac_bts *bts, int32_t rfn);
struct gprs_rlcmac_dl_tbf *bts_dl_tbf_by_tfi(struct gprs_rlcmac_bts *bts, uint8_t tfi, uint8_t trx, uint8_t ts);
struct gprs_rlcmac_ul_tbf *bts_ul_tbf_by_tfi(struct gprs_rlcmac_bts *bts, uint8_t tfi, uint8_t trx, uint8_t ts);
-void bts_snd_dl_ass(struct gprs_rlcmac_bts *bts, struct gprs_rlcmac_tbf *tbf, uint16_t pgroup);
+void bts_snd_dl_ass(struct gprs_rlcmac_bts *bts, struct gprs_rlcmac_tbf *tbf);
void bts_set_current_frame_number(struct gprs_rlcmac_bts *bts, uint32_t frame_number);
void bts_set_current_block_frame_number(struct gprs_rlcmac_bts *bts, int frame_number);
@@ -374,6 +381,7 @@ void bts_set_max_mcs_ul(struct gprs_rlcmac_bts *bts, uint8_t mcs_ul);
bool bts_cs_dl_is_supported(const struct gprs_rlcmac_bts *bts, enum CodingScheme cs);
const struct llist_head* bts_ms_list(struct gprs_rlcmac_bts *bts);
uint8_t bts_get_ms_pwr_alpha(const struct gprs_rlcmac_bts *bts);
+bool bts_all_pdch_allocated(const struct gprs_rlcmac_bts *bts);
#ifdef __cplusplus
}
#endif
diff --git a/src/bts_pch_timer.c b/src/bts_pch_timer.c
index 20373ac8..d7211551 100644
--- a/src/bts_pch_timer.c
+++ b/src/bts_pch_timer.c
@@ -26,8 +26,22 @@
#include <gprs_debug.h>
#include <gprs_pcu.h>
#include <bts_pch_timer.h>
+#include <gprs_ms.h>
-static struct bts_pch_timer *bts_pch_timer_get(struct gprs_rlcmac_bts *bts, const char *imsi)
+static struct bts_pch_timer *bts_pch_timer_get_by_ptmsi(struct gprs_rlcmac_bts *bts, uint32_t ptmsi)
+{
+ struct bts_pch_timer *p;
+ OSMO_ASSERT(ptmsi != GSM_RESERVED_TMSI);
+
+ llist_for_each_entry(p, &bts->pch_timer, entry) {
+ if (p->ptmsi != GSM_RESERVED_TMSI && p->ptmsi == ptmsi)
+ return p;
+ }
+
+ return NULL;
+}
+
+struct bts_pch_timer *bts_pch_timer_get_by_imsi(struct gprs_rlcmac_bts *bts, const char *imsi)
{
struct bts_pch_timer *p;
@@ -57,29 +71,42 @@ static void T3113_callback(void *data)
bts_pch_timer_remove(p);
}
-void bts_pch_timer_start(struct gprs_rlcmac_bts *bts, const char *imsi)
+void bts_pch_timer_start(struct gprs_rlcmac_bts *bts, const struct osmo_mobile_identity *mi_paging,
+ const char *imsi)
{
- if (bts_pch_timer_get(bts, imsi))
- return;
-
struct bts_pch_timer *p;
+ struct osmo_tdef *tdef;
+
p = talloc_zero(bts, struct bts_pch_timer);
llist_add_tail(&p->entry, &bts->pch_timer);
- osmo_strlcpy(p->imsi, imsi, sizeof(p->imsi));
p->bts = bts;
+ OSMO_STRLCPY_ARRAY(p->imsi, imsi);
+ p->ptmsi = (mi_paging->type == GSM_MI_TYPE_TMSI) ? mi_paging->tmsi : GSM_RESERVED_TMSI;
- struct osmo_tdef *tdef = osmo_tdef_get_entry(the_pcu->T_defs, 3113);
+ tdef = osmo_tdef_get_entry(the_pcu->T_defs, 3113);
OSMO_ASSERT(tdef);
osmo_timer_setup(&p->T3113, T3113_callback, p);
osmo_timer_schedule(&p->T3113, tdef->val, 0);
- LOGP(DPCU, LOGL_DEBUG, "PCH paging timer started for IMSI=%s\n", p->imsi);
+ if (log_check_level(DPCU, LOGL_DEBUG)) {
+ char str[64];
+ osmo_mobile_identity_to_str_buf(str, sizeof(str), mi_paging);
+ LOGP(DPCU, LOGL_DEBUG, "PCH paging timer started for MI=%s IMSI=%s\n", str, p->imsi);
+ }
}
-void bts_pch_timer_stop(struct gprs_rlcmac_bts *bts, const char *imsi)
+void bts_pch_timer_stop(struct gprs_rlcmac_bts *bts, const struct GprsMs *ms)
{
- struct bts_pch_timer *p = bts_pch_timer_get(bts, imsi);
-
+ struct bts_pch_timer *p = NULL;
+ uint32_t tlli = ms_tlli(ms);
+ const char *imsi = ms_imsi(ms);
+
+ /* First try matching by TMSI if available in MS */
+ if (tlli != GSM_RESERVED_TMSI)
+ p = bts_pch_timer_get_by_ptmsi(bts, tlli);
+ /* Otherwise try matching by IMSI if available in MS */
+ if (!p && imsi[0] != '\0')
+ p = bts_pch_timer_get_by_imsi(bts, imsi);
if (p)
bts_pch_timer_remove(p);
}
diff --git a/src/bts_pch_timer.h b/src/bts_pch_timer.h
index 26b89c80..cc5dcb05 100644
--- a/src/bts_pch_timer.h
+++ b/src/bts_pch_timer.h
@@ -32,12 +32,17 @@ struct bts_pch_timer {
struct llist_head entry;
struct gprs_rlcmac_bts *bts;
struct osmo_timer_list T3113;
+ uint32_t ptmsi; /* GSM_RESERVED_TMSI if not available */
char imsi[OSMO_IMSI_BUF_SIZE];
};
-void bts_pch_timer_start(struct gprs_rlcmac_bts *bts, const char *imsi);
-void bts_pch_timer_stop(struct gprs_rlcmac_bts *bts, const char *imsi);
+struct GprsMs;
+
+void bts_pch_timer_start(struct gprs_rlcmac_bts *bts, const struct osmo_mobile_identity *mi_paging,
+ const char *imsi);
+void bts_pch_timer_stop(struct gprs_rlcmac_bts *bts, const struct GprsMs *ms);
void bts_pch_timer_stop_all(struct gprs_rlcmac_bts *bts);
+struct bts_pch_timer *bts_pch_timer_get_by_imsi(struct gprs_rlcmac_bts *bts, const char *imsi);
#ifdef __cplusplus
}
diff --git a/src/coding_scheme.c b/src/coding_scheme.c
index 27241d19..c370c4b6 100644
--- a/src/coding_scheme.c
+++ b/src/coding_scheme.c
@@ -11,10 +11,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <stdint.h>
diff --git a/src/coding_scheme.h b/src/coding_scheme.h
index 1b212650..fdecf1c9 100644
--- a/src/coding_scheme.h
+++ b/src/coding_scheme.h
@@ -11,10 +11,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#pragma once
diff --git a/src/csn1.c b/src/csn1.c
index e165e920..a9b13430 100644
--- a/src/csn1.c
+++ b/src/csn1.c
@@ -22,10 +22,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <assert.h>
diff --git a/src/csn1.h b/src/csn1.h
index 285ae991..47956c34 100644
--- a/src/csn1.h
+++ b/src/csn1.h
@@ -19,10 +19,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef _PACKET_CSN1_H_
diff --git a/src/csn1_dec.c b/src/csn1_dec.c
index fa1f0c39..f0d07ac7 100644
--- a/src/csn1_dec.c
+++ b/src/csn1_dec.c
@@ -22,10 +22,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <assert.h>
@@ -996,7 +992,7 @@ csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, struct bitvec *vector
}
}
LOGPC(DCSN1, LOGL_DEBUG, "%s = %u%s | ", pDescr->sz , (unsigned)fExist, fExist && isnull ? " (NULL)" : "");
- *pui8++ = fExist;
+ *pui8++ = !isnull;
remaining_bits_len -= 1;
bit_offset++;
diff --git a/src/csn1_enc.c b/src/csn1_enc.c
index 5518d063..e4e5e092 100644
--- a/src/csn1_enc.c
+++ b/src/csn1_enc.c
@@ -22,10 +22,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <assert.h>
diff --git a/src/cxx_linuxlist.h b/src/cxx_linuxlist.h
index 9a74b3fe..1562bfe1 100644
--- a/src/cxx_linuxlist.h
+++ b/src/cxx_linuxlist.h
@@ -12,10 +12,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#pragma once
diff --git a/src/decoding.cpp b/src/decoding.cpp
index 0caa8bfd..ca0c720e 100644
--- a/src/decoding.cpp
+++ b/src/decoding.cpp
@@ -12,10 +12,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <decoding.h>
#include <rlc.h>
diff --git a/src/decoding.h b/src/decoding.h
index 7270c3d8..b0a5aed9 100644
--- a/src/decoding.h
+++ b/src/decoding.h
@@ -12,10 +12,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#pragma once
diff --git a/src/encoding.cpp b/src/encoding.cpp
index 30b0ee1d..4737137a 100644
--- a/src/encoding.cpp
+++ b/src/encoding.cpp
@@ -13,10 +13,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <encoding.h>
diff --git a/src/encoding.h b/src/encoding.h
index 998e69aa..fd2225e4 100644
--- a/src/encoding.h
+++ b/src/encoding.h
@@ -13,10 +13,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#pragma once
diff --git a/src/gprs_bssgp_pcu.c b/src/gprs_bssgp_pcu.c
index 1fcacdb1..bf82fc4f 100644
--- a/src/gprs_bssgp_pcu.c
+++ b/src/gprs_bssgp_pcu.c
@@ -12,10 +12,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <gprs_rlcmac.h>
@@ -39,6 +35,7 @@
#include "tbf_dl.h"
#include "llc.h"
#include "gprs_rlcmac.h"
+#include "bts_pch_timer.h"
/* Tuning parameters for BSSGP flow control */
#define FC_DEFAULT_LIFE_TIME_SECS 10 /* experimental value, 10s */
@@ -107,12 +104,8 @@ static int gprs_bssgp_pcu_rx_dl_ud(struct msgb *msg, struct tlv_parsed *tp)
uint8_t egprs_ms_class = 0;
int rc;
MS_Radio_Access_capability_t rac;
- /* TODO: is it really necessary to initialize this as a "000" IMSI? It seems, the function should just return an
- * error if no IMSI IE was found. */
- struct osmo_mobile_identity mi_imsi = {
- .type = GSM_MI_TYPE_TMSI,
- };
- OSMO_STRLCPY_ARRAY(mi_imsi.imsi, "000");
+ const char *imsi = NULL;
+ struct osmo_mobile_identity mi_imsi;
budh = (struct bssgp_ud_hdr *)msgb_bssgph(msg);
tlli = ntohl(budh->tlli);
@@ -143,6 +136,7 @@ static int gprs_bssgp_pcu_rx_dl_ud(struct msgb *msg, struct tlv_parsed *tp)
LOGP(DBSSGP, LOGL_NOTICE, "Failed to parse IMSI IE (rc=%d)\n", rc);
return bssgp_tx_status(BSSGP_CAUSE_COND_IE_ERR, NULL, msg);
}
+ imsi = &mi_imsi.imsi[0];
}
/* parse ms radio access capability */
@@ -179,10 +173,11 @@ static int gprs_bssgp_pcu_rx_dl_ud(struct msgb *msg, struct tlv_parsed *tp)
"TLLI (old) IE\n");
}
- LOGP(DBSSGP, LOGL_INFO, "LLC [SGSN -> PCU] = TLLI: 0x%08x IMSI: %s len: %d\n", tlli, mi_imsi.imsi, len);
+ LOGP(DBSSGP, LOGL_INFO, "LLC [SGSN -> PCU] = TLLI: 0x%08x IMSI: %s len: %d\n",
+ tlli, imsi ? : "none", len);
- return dl_tbf_handle(the_pcu->bssgp.bts, tlli, tlli_old, mi_imsi.imsi,
- ms_class, egprs_ms_class, delay_csec, data, len);
+ return dl_tbf_handle(the_pcu->bssgp.bts, tlli, tlli_old, imsi, ms_class,
+ egprs_ms_class, delay_csec, data, len);
}
/* 3GPP TS 48.018 Table 10.3.2. Returns 0 on success, suggested BSSGP cause otherwise */
@@ -319,7 +314,14 @@ static int gprs_bssgp_pcu_rx_paging_ps(struct msgb *msg, const struct tlv_parsed
/* FIXME: look if MS is attached a specific BTS and then only page on that one? */
llist_for_each_entry(bts, &the_pcu->bts_list, list) {
- gprs_rlcmac_paging_request(bts, &paging_mi, pgroup);
+ if (bts_pch_timer_get_by_imsi(bts, mi_imsi.imsi)) {
+ LOGP(DBSSGP, LOGL_INFO, "PS-Paging request already pending for IMSI=%s\n", mi_imsi.imsi);
+ bts_do_rate_ctr_inc(bts, CTR_PCH_REQUESTS_ALREADY);
+ continue;
+ }
+ if (gprs_rlcmac_paging_request(bts, &paging_mi, pgroup) < 0)
+ continue;
+ bts_pch_timer_start(bts, &paging_mi, mi_imsi.imsi);
}
return 0;
}
@@ -1118,7 +1120,8 @@ static int ns_configure_nse(struct gprs_rlcmac_bts *bts,
if (!(valid & (1 << i)))
continue;
- if (!gprs_ns2_ip_bind_by_sockaddr(the_pcu->nsi, &local[i])) {
+ bind[i] = gprs_ns2_ip_bind_by_sockaddr(the_pcu->nsi, &local[i]);
+ if (!bind[i]) {
snprintf(name, sizeof(name), "pcu%u", i);
rc = gprs_ns2_ip_bind(the_pcu->nsi, name, &local[i], 0, &bind[i]);
if (rc < 0) {
diff --git a/src/gprs_bssgp_pcu.h b/src/gprs_bssgp_pcu.h
index 907e6663..0c0f0919 100644
--- a/src/gprs_bssgp_pcu.h
+++ b/src/gprs_bssgp_pcu.h
@@ -12,10 +12,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef GPRS_BSSGP_PCU_H
diff --git a/src/gprs_bssgp_rim.c b/src/gprs_bssgp_rim.c
index f1679a6b..033426b1 100644
--- a/src/gprs_bssgp_rim.c
+++ b/src/gprs_bssgp_rim.c
@@ -11,10 +11,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <osmocom/gprs/gprs_bssgp.h>
diff --git a/src/gprs_bssgp_rim.h b/src/gprs_bssgp_rim.h
index 5fac56f1..cf46b0ed 100644
--- a/src/gprs_bssgp_rim.h
+++ b/src/gprs_bssgp_rim.h
@@ -11,10 +11,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#pragma once
diff --git a/src/gprs_codel.c b/src/gprs_codel.c
index 7c3b2d42..9c5737f6 100644
--- a/src/gprs_codel.c
+++ b/src/gprs_codel.c
@@ -12,10 +12,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "gprs_codel.h"
diff --git a/src/gprs_codel.h b/src/gprs_codel.h
index 3ad7efce..10ba91f9 100644
--- a/src/gprs_codel.h
+++ b/src/gprs_codel.h
@@ -19,10 +19,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#pragma once
diff --git a/src/gprs_debug.cpp b/src/gprs_debug.cpp
index 0cbc4880..61c1c87e 100644
--- a/src/gprs_debug.cpp
+++ b/src/gprs_debug.cpp
@@ -12,10 +12,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
extern "C" {
diff --git a/src/gprs_debug.h b/src/gprs_debug.h
index cebeabce..b683a634 100644
--- a/src/gprs_debug.h
+++ b/src/gprs_debug.h
@@ -11,10 +11,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#pragma once
diff --git a/src/gprs_ms.c b/src/gprs_ms.c
index 0d6be4d5..c10eda7e 100644
--- a/src/gprs_ms.c
+++ b/src/gprs_ms.c
@@ -12,10 +12,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
@@ -522,6 +518,18 @@ void ms_set_imsi(struct GprsMs *ms, const char *imsi)
osmo_strlcpy(ms->imsi, imsi, sizeof(ms->imsi));
}
+uint16_t ms_paging_group(struct GprsMs *ms)
+{
+ uint16_t pgroup;
+ if (!ms_imsi_is_valid(ms))
+ return 0; /* 000 is the special "all paging" group */
+ if ((pgroup = imsi2paging_group(ms_imsi(ms))) > 999) {
+ LOGPMS(ms, DRLCMAC, LOGL_ERROR, "IMSI to paging group failed!\n");
+ return 0;
+ }
+ return pgroup;
+}
+
void ms_set_ta(struct GprsMs *ms, uint8_t ta_)
{
if (ta_ == ms->ta)
diff --git a/src/gprs_ms.h b/src/gprs_ms.h
index 4438a4c9..3ebf7a5b 100644
--- a/src/gprs_ms.h
+++ b/src/gprs_ms.h
@@ -12,10 +12,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#pragma once
@@ -132,6 +128,7 @@ void ms_detach_tbf(struct GprsMs *ms, struct gprs_rlcmac_tbf *tbf);
void ms_set_tlli(struct GprsMs *ms, uint32_t tlli);
bool ms_confirm_tlli(struct GprsMs *ms, uint32_t tlli);
void ms_set_imsi(struct GprsMs *ms, const char *imsi);
+uint16_t ms_paging_group(struct GprsMs *ms);
void ms_update_l1_meas(struct GprsMs *ms, const struct pcu_l1_meas *meas);
@@ -186,6 +183,11 @@ static inline const char *ms_imsi(const struct GprsMs *ms)
return ms->imsi;
}
+static inline bool ms_imsi_is_valid(const struct GprsMs *ms)
+{
+ return ms->imsi[0] != '\0';
+}
+
static inline uint8_t ms_ta(const struct GprsMs *ms)
{
return ms->ta;
diff --git a/src/gprs_ms_storage.cpp b/src/gprs_ms_storage.cpp
index 6245ed9f..aa0fc9e7 100644
--- a/src/gprs_ms_storage.cpp
+++ b/src/gprs_ms_storage.cpp
@@ -12,10 +12,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
@@ -29,8 +25,6 @@ extern "C" {
#include <osmocom/gsm/gsm48.h>
}
-#define GPRS_UNDEFINED_IMSI "000"
-
static void ms_storage_ms_idle_cb(struct GprsMs *ms)
{
llist_del(&ms->list);
@@ -89,10 +83,10 @@ GprsMs *GprsMsStorage::get_ms(uint32_t tlli, uint32_t old_tlli, const char *imsi
/* not found by TLLI */
- if (imsi && imsi[0] && strcmp(imsi, GPRS_UNDEFINED_IMSI) != 0) {
+ if (imsi && imsi[0] != '\0') {
llist_for_each(tmp, &m_list) {
ms = llist_entry(tmp, typeof(*ms), list);
- if (strcmp(imsi, ms_imsi(ms)) == 0)
+ if (ms_imsi_is_valid(ms) && strcmp(imsi, ms_imsi(ms)) == 0)
return ms;
}
}
diff --git a/src/gprs_ms_storage.h b/src/gprs_ms_storage.h
index dcb6d8df..ef808d0c 100644
--- a/src/gprs_ms_storage.h
+++ b/src/gprs_ms_storage.h
@@ -12,10 +12,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#pragma once
diff --git a/src/gprs_pcu.c b/src/gprs_pcu.c
index 5ed9d7d6..e8dba061 100644
--- a/src/gprs_pcu.c
+++ b/src/gprs_pcu.c
@@ -33,13 +33,14 @@ static struct osmo_tdef T_defs_pcu[] = {
{ .T=3113, .default_val=7, .unit=OSMO_TDEF_S, .desc="Timeout for paging", .val=0 },
{ .T=3190, .default_val=5, .unit=OSMO_TDEF_S, .desc="Return to packet idle mode after Packet DL Assignment on CCCH (s)", .val=0},
{ .T=3141, .default_val=10, .unit=OSMO_TDEF_S, .desc="Timeout for contention resolution procedure (s)", .val=0 },
+ { .T=3172, .default_val=5000, .unit=OSMO_TDEF_MS, .desc="Wait Indication used in Imm Ass Reject during TBF Establishment (PACCH)", .val=0, .min_val = 0, .max_val = 255000 }, /* TS 44.060 7.1.3.2.1 */
{ .T=PCU_TDEF_NEIGH_RESOLVE_TO, .default_val=1000, .unit=OSMO_TDEF_MS, .desc="[ARFCN+BSIC]->[RAC+CI] resolution timeout (ms)", .val=0 },
{ .T=PCU_TDEF_SI_RESOLVE_TO, .default_val=1000, .unit=OSMO_TDEF_MS, .desc="RIM RAN-INFO response timeout (ms)", .val=0 },
{ .T=PCU_TDEF_NEIGH_CACHE_ALIVE, .default_val=5, .unit=OSMO_TDEF_S, .desc="[ARFCN+BSIC]->[RAC+CI] resolution cache entry storage timeout (s)", .val=0 },
{ .T=PCU_TDEF_SI_CACHE_ALIVE, .default_val=5, .unit=OSMO_TDEF_S, .desc="[RAC+CI]->[SI] resolution cache entry storage timeout (s)", .val=0 },
{ .T=-101, .default_val=30, .unit=OSMO_TDEF_S, .desc="BSSGP (un)blocking procedures timer (s)", .val=0 },
{ .T=-102, .default_val=30, .unit=OSMO_TDEF_S, .desc="BSSGP reset procedure timer (s)", .val=0 },
- { .T=-2000, .default_val=2, .unit=OSMO_TDEF_MS, .desc="Delay release of UL TBF after tx Packet Access Reject (PACCH) (ms)", .val=0 },
+ { .T=-2000, .default_val=0, .unit=OSMO_TDEF_MS, .desc="Delay release of UL TBF after tx Packet Access Reject (PACCH) (ms)", .val=0 },
{ .T=-2001, .default_val=2, .unit=OSMO_TDEF_S, .desc="PACCH assignment timeout (s)", .val=0 },
{ .T=-2002, .default_val=200, .unit=OSMO_TDEF_MS, .desc="Waiting after IMM.ASS confirm timer (ms)", .val=0 },
{ .T=-2030, .default_val=60, .unit=OSMO_TDEF_S, .desc="Time to keep an idle MS object alive (s)", .val=0 }, /* slightly above T3314 (default 44s, 24.008, 11.2.2) */
@@ -47,8 +48,21 @@ static struct osmo_tdef T_defs_pcu[] = {
{ .T=0, .default_val=0, .unit=OSMO_TDEF_S, .desc=NULL, .val=0 } /* empty item at the end */
};
+static void _update_stats_timer_cb(void *data)
+{
+ struct gprs_pcu *pcu = (struct gprs_pcu *)data;
+ struct gprs_rlcmac_bts *bts;
+
+ llist_for_each_entry(bts, &pcu->bts_list, list)
+ osmo_time_cc_set_flag(&bts->all_allocated_pdch, bts_all_pdch_allocated(bts));
+
+ osmo_timer_schedule(&pcu->update_stats_timer, 1, 0);
+}
+
static int gprs_pcu_talloc_destructor(struct gprs_pcu *pcu)
{
+ if (osmo_timer_pending(&pcu->update_stats_timer))
+ osmo_timer_del(&pcu->update_stats_timer);
neigh_cache_free(pcu->neigh_cache);
si_cache_free(pcu->si_cache);
return 0;
@@ -125,6 +139,9 @@ struct gprs_pcu *gprs_pcu_alloc(void *ctx)
pcu->neigh_cache = neigh_cache_alloc(pcu, osmo_tdef_get(pcu->T_defs, PCU_TDEF_NEIGH_CACHE_ALIVE, OSMO_TDEF_S, -1));
pcu->si_cache = si_cache_alloc(pcu, osmo_tdef_get(pcu->T_defs, PCU_TDEF_SI_CACHE_ALIVE, OSMO_TDEF_S, -1));
+ osmo_timer_setup(&pcu->update_stats_timer, _update_stats_timer_cb, pcu);
+ osmo_timer_schedule(&pcu->update_stats_timer, 1, 0);
+
return pcu;
}
diff --git a/src/gprs_pcu.h b/src/gprs_pcu.h
index 86fe8eb4..a9e40ea6 100644
--- a/src/gprs_pcu.h
+++ b/src/gprs_pcu.h
@@ -25,6 +25,7 @@
#include <stdbool.h>
#include <osmocom/core/gsmtap_util.h>
+#include <osmocom/core/timer.h>
#include "gprs_bssgp_pcu.h"
#include "coding_scheme.h"
@@ -117,8 +118,9 @@ struct gprs_pcu {
struct gsmtap_inst *gsmtap;
uint32_t gsmtap_categ_mask;
+ char *gsmtap_remote_host;
- struct llist_head bts_list; /* list of gprs_rlcmac_tbf */
+ struct llist_head bts_list; /* list of gprs_rlcmac_bts */
struct gprs_ns2_inst *nsi;
@@ -130,6 +132,8 @@ struct gprs_pcu {
struct neigh_cache *neigh_cache; /* ARFC+BSIC -> CGI PS cache */
struct si_cache *si_cache; /* ARFC+BSIC -> CGI PS cache */
+
+ struct osmo_timer_list update_stats_timer; /* Used to update some time_cc stats periodically */
};
diff --git a/src/gprs_rlcmac.cpp b/src/gprs_rlcmac.cpp
index 22b12dfc..1ea0872d 100644
--- a/src/gprs_rlcmac.cpp
+++ b/src/gprs_rlcmac.cpp
@@ -13,10 +13,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
extern "C" {
@@ -26,7 +22,6 @@ extern "C" {
#include <pcu_l1_if.h>
#include <gprs_rlcmac.h>
#include <bts.h>
-#include <bts_pch_timer.h>
#include <encoding.h>
#include <tbf.h>
#include <gprs_debug.h>
@@ -49,7 +44,6 @@ int gprs_rlcmac_paging_request(struct gprs_rlcmac_bts *bts, const struct osmo_mo
return -1;
}
bts_do_rate_ctr_inc(bts, CTR_PCH_REQUESTS);
- bts_pch_timer_start(bts, mi->imsi);
pcu_l1if_tx_pch(bts, paging_request, plen, pgroup);
bitvec_free(paging_request);
diff --git a/src/gprs_rlcmac.h b/src/gprs_rlcmac.h
index cf95c37f..468712e9 100644
--- a/src/gprs_rlcmac.h
+++ b/src/gprs_rlcmac.h
@@ -12,10 +12,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef GPRS_RLCMAC_H
diff --git a/src/gprs_rlcmac_meas.cpp b/src/gprs_rlcmac_meas.cpp
index b9a324fb..d14f405c 100644
--- a/src/gprs_rlcmac_meas.cpp
+++ b/src/gprs_rlcmac_meas.cpp
@@ -11,10 +11,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
extern "C" {
diff --git a/src/gprs_rlcmac_sched.cpp b/src/gprs_rlcmac_sched.cpp
index 8867d436..8b5227fe 100644
--- a/src/gprs_rlcmac_sched.cpp
+++ b/src/gprs_rlcmac_sched.cpp
@@ -11,10 +11,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <gprs_bssgp_pcu.h>
diff --git a/src/gprs_rlcmac_ts_alloc.cpp b/src/gprs_rlcmac_ts_alloc.cpp
index 5b3b355a..3a60839e 100644
--- a/src/gprs_rlcmac_ts_alloc.cpp
+++ b/src/gprs_rlcmac_ts_alloc.cpp
@@ -13,10 +13,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <gprs_rlcmac.h>
@@ -298,20 +294,21 @@ static bool idle_pdch_avail(const struct gprs_rlcmac_bts *bts)
/*! Return free TFI
*
* \param[in] bts Pointer to BTS struct
- * \param[in] trx Optional pointer to TRX struct
* \param[in] ms Pointer to MS object
* \param[in] dir DL or UL direction
* \param[in] use_trx which TRX to use or -1 if it should be selected based on what MS uses
* \param[out] trx_no_ TRX number on which TFI was found
* \returns negative error code or 0 on success
*/
-static int tfi_find_free(const struct gprs_rlcmac_bts *bts, const gprs_rlcmac_trx *trx, const GprsMs *ms,
+static int tfi_find_free(const struct gprs_rlcmac_bts *bts, const GprsMs *ms,
enum gprs_rlcmac_tbf_direction dir, int8_t use_trx, uint8_t *trx_no_)
{
+ const struct gprs_rlcmac_trx *trx;
int tfi;
uint8_t trx_no;
- if (trx) {
+ /* If MS is already doing stuff on a TRX, set use_trx to it: */
+ if ((trx = ms_current_trx(ms))) {
if (use_trx >= 0 && use_trx != trx->trx_no) {
LOGP(DRLCMAC, LOGL_ERROR, "- Requested incompatible TRX %d (current is %d)\n",
use_trx, trx->trx_no);
@@ -320,9 +317,6 @@ static int tfi_find_free(const struct gprs_rlcmac_bts *bts, const gprs_rlcmac_tr
use_trx = trx->trx_no;
}
- if (use_trx == -1 && ms_current_trx(ms))
- use_trx = ms_current_trx(ms)->trx_no;
-
tfi = bts_tfi_find_free(bts, dir, &trx_no, use_trx);
if (tfi < 0)
return -EBUSY;
@@ -661,12 +655,12 @@ int find_multi_slots(struct gprs_rlcmac_trx *trx, uint8_t mslot_class, uint8_t *
* \param[in] slots Timeslots in use
* \param[in] reserved_slots Reserved timeslots
* \param[out] slotcount Number of TS in use
- * \param[out] avail_count Number of reserved TS
+ * \param[out] reserve_count Number of reserved TS
*/
-static void update_slot_counters(uint8_t slots, uint8_t reserved_slots, uint8_t *slotcount, uint8_t *avail_count)
+static void count_slots(uint8_t slots, uint8_t reserved_slots, uint8_t *slotcount, uint8_t *reserve_count)
{
(*slotcount) = pcu_bitcount(slots);
- (*avail_count) = pcu_bitcount(reserved_slots);
+ (*reserve_count) = pcu_bitcount(reserved_slots);
}
/*! Return slot mask with single TS from a given UL/DL set according to TBF's direction, ts pointer is set to that TS
@@ -869,7 +863,7 @@ int alloc_algorithm_b(struct gprs_rlcmac_bts *bts, struct gprs_rlcmac_tbf *tbf,
uint8_t reserved_ul_slots;
int8_t first_common_ts;
uint8_t slotcount = 0;
- uint8_t avail_count = 0, trx_no;
+ uint8_t reserve_count = 0, trx_no;
int first_ts = -1;
int usf[8] = {-1, -1, -1, -1, -1, -1, -1, -1};
int rc;
@@ -884,18 +878,16 @@ int alloc_algorithm_b(struct gprs_rlcmac_bts *bts, struct gprs_rlcmac_tbf *tbf,
reserved_dl_slots = ms_reserved_dl_slots(ms);
reserved_ul_slots = ms_reserved_ul_slots(ms);
first_common_ts = ms_first_common_ts(ms);
- trx = ms_current_trx(ms);
/* Step 2a: Find usable TRX and TFI */
- tfi = tfi_find_free(bts, trx, ms, tbf->direction, use_trx, &trx_no);
+ tfi = tfi_find_free(bts, ms, tbf->direction, use_trx, &trx_no);
if (tfi < 0) {
LOGPAL(tbf, "B", single, use_trx, LOGL_NOTICE, "failed to allocate a TFI\n");
return tfi;
}
/* Step 2b: Reserve slots on the TRX for the MS */
- if (!trx)
- trx = &bts->trx[trx_no];
+ trx = &bts->trx[trx_no];
if (!reserved_dl_slots || !reserved_ul_slots) {
rc = find_multi_slots(trx, ms_ms_class(ms), &reserved_ul_slots, &reserved_dl_slots);
@@ -914,7 +906,7 @@ int alloc_algorithm_b(struct gprs_rlcmac_bts *bts, struct gprs_rlcmac_tbf *tbf,
/* Step 3b: Derive the slot set for a given direction */
if (tbf->direction == GPRS_RLCMAC_DL_TBF) {
dl_slots = rc;
- update_slot_counters(dl_slots, reserved_dl_slots, &slotcount, &avail_count);
+ count_slots(dl_slots, reserved_dl_slots, &slotcount, &reserve_count);
} else {
rc = allocate_usf(trx, rc, dl_slots, usf);
if (rc < 0)
@@ -923,7 +915,7 @@ int alloc_algorithm_b(struct gprs_rlcmac_bts *bts, struct gprs_rlcmac_tbf *tbf,
ul_slots = rc;
reserved_ul_slots = ul_slots;
- update_slot_counters(ul_slots, reserved_ul_slots, &slotcount, &avail_count);
+ count_slots(ul_slots, reserved_ul_slots, &slotcount, &reserve_count);
}
first_ts = ffs(rc) - 1;
@@ -940,7 +932,7 @@ int alloc_algorithm_b(struct gprs_rlcmac_bts *bts, struct gprs_rlcmac_tbf *tbf,
}
if (single && slotcount) {
- tbf->upgrade_to_multislot = (avail_count > slotcount);
+ tbf->upgrade_to_multislot = (reserve_count > slotcount);
LOGPAL(tbf, "B", single, use_trx, LOGL_INFO, "using single slot at TS %d\n", first_ts);
} else {
tbf->upgrade_to_multislot = false;
diff --git a/src/gsm_rlcmac.c b/src/gsm_rlcmac.c
index 6793602c..570c97b8 100644
--- a/src/gsm_rlcmac.c
+++ b/src/gsm_rlcmac.c
@@ -23,10 +23,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <osmocom/core/utils.h>
diff --git a/src/gsm_rlcmac.h b/src/gsm_rlcmac.h
index 01e2ee63..c43d4181 100644
--- a/src/gsm_rlcmac.h
+++ b/src/gsm_rlcmac.h
@@ -23,10 +23,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef __PACKET_GSM_RLCMAC_H__
diff --git a/src/llc.cpp b/src/llc.cpp
index e508d0b1..b118307a 100644
--- a/src/llc.cpp
+++ b/src/llc.cpp
@@ -13,10 +13,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <bts.h>
diff --git a/src/llc.h b/src/llc.h
index 13662d83..623ae495 100644
--- a/src/llc.h
+++ b/src/llc.h
@@ -10,10 +10,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#pragma once
diff --git a/src/mslot_class.c b/src/mslot_class.c
index ff40f297..1809cd76 100644
--- a/src/mslot_class.c
+++ b/src/mslot_class.c
@@ -14,10 +14,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <mslot_class.h>
diff --git a/src/mslot_class.h b/src/mslot_class.h
index 045fb317..7a6d5d46 100644
--- a/src/mslot_class.h
+++ b/src/mslot_class.h
@@ -14,10 +14,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#pragma once
diff --git a/src/nacc_fsm.c b/src/nacc_fsm.c
index ba7bbb78..c049f602 100644
--- a/src/nacc_fsm.c
+++ b/src/nacc_fsm.c
@@ -12,10 +12,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <unistd.h>
diff --git a/src/nacc_fsm.h b/src/nacc_fsm.h
index beea0f75..b33dafa1 100644
--- a/src/nacc_fsm.h
+++ b/src/nacc_fsm.h
@@ -12,10 +12,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#pragma once
diff --git a/src/neigh_cache.c b/src/neigh_cache.c
index 3217f408..2f82fee5 100644
--- a/src/neigh_cache.c
+++ b/src/neigh_cache.c
@@ -12,10 +12,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <string.h>
diff --git a/src/neigh_cache.h b/src/neigh_cache.h
index 90260cd3..76706ab7 100644
--- a/src/neigh_cache.h
+++ b/src/neigh_cache.h
@@ -12,10 +12,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#pragma once
diff --git a/src/osmobts_sock.c b/src/osmobts_sock.c
index 91b62a00..1cbd1a0f 100644
--- a/src/osmobts_sock.c
+++ b/src/osmobts_sock.c
@@ -11,10 +11,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <stdio.h>
diff --git a/src/pcu_l1_if.cpp b/src/pcu_l1_if.cpp
index 8d9defc1..d5672e59 100644
--- a/src/pcu_l1_if.cpp
+++ b/src/pcu_l1_if.cpp
@@ -11,10 +11,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <stdio.h>
diff --git a/src/pcu_l1_if.h b/src/pcu_l1_if.h
index 7d48febe..1b13a925 100644
--- a/src/pcu_l1_if.h
+++ b/src/pcu_l1_if.h
@@ -11,10 +11,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef PCU_L1_IF_H
diff --git a/src/pcu_main.cpp b/src/pcu_main.cpp
index 003cabb4..0fb5ac8f 100644
--- a/src/pcu_main.cpp
+++ b/src/pcu_main.cpp
@@ -11,10 +11,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <pcu_l1_if.h>
@@ -64,7 +60,7 @@ extern void *bv_tall_ctx;
static int quit = 0;
static int rt_prio = -1;
static bool daemonize = false;
-static const char *gsmtap_addr = "localhost"; // FIXME: use gengetopt's default value instead
+static const char *gsmtap_addr;
static void print_help()
{
@@ -74,9 +70,7 @@ static void print_help()
" -m --mcc MCC Use given MCC instead of value provided by BTS\n"
" -n --mnc MNC Use given MNC instead of value provided by BTS\n"
" -V --version Print version\n"
- " -r --realtime PRIO Use SCHED_RR with the specified priority\n"
" -D --daemonize Fork the process into a background daemon\n"
- " -i --gsmtap-ip The destination IP used for GSMTAP\n"
"\nVTY reference generation:\n"
" --vty-ref-mode MODE VTY reference generation mode (e.g. 'expert').\n"
" --vty-ref-xml Generate the VTY reference XML output and exit.\n"
@@ -162,9 +156,13 @@ static void handle_options(int argc, char **argv)
break;
case 'i':
gsmtap_addr = optarg;
+ fprintf(stderr, "Command line argument '-i' is deprecated, use VTY "
+ "parameter 'gsmtap-remote-host %s' instead.\n", gsmtap_addr);
break;
case 'r':
rt_prio = atoi(optarg);
+ fprintf(stderr, "Command line argument '-r' is deprecated, use VTY "
+ "cpu-sched node setting 'policy rr %d' instead.\n", rt_prio);
break;
case 'D':
daemonize = true;
@@ -257,13 +255,6 @@ int main(int argc, char *argv[])
exit(0);
}
- pcu->gsmtap = gsmtap_source_init(gsmtap_addr, GSMTAP_UDP_PORT, 1);
-
- if (pcu->gsmtap)
- gsmtap_source_add_sink(pcu->gsmtap);
- else
- fprintf(stderr, "Failed to initialize GSMTAP for %s\n", gsmtap_addr);
-
pcu->nsi = gprs_ns2_instantiate(tall_pcu_ctx, gprs_ns_prim_cb, NULL);
if (!pcu->nsi) {
LOGP(DBSSGP, LOGL_ERROR, "Failed to create NS instance\n");
@@ -282,6 +273,31 @@ int main(int argc, char *argv[])
fprintf(stderr, "No config file: '%s' Using default config.\n",
config_file);
+ /* Accept a GSMTAP host from VTY config, but a commandline option overrides that. */
+ if (gsmtap_addr) {
+ if (pcu->gsmtap_remote_host != NULL) {
+ LOGP(DLGLOBAL, LOGL_NOTICE,
+ "Command line argument '-i %s' overrides "
+ "'gsmtap-remote-host %s' from the config file\n",
+ gsmtap_addr, pcu->gsmtap_remote_host);
+ talloc_free(pcu->gsmtap_remote_host);
+ }
+ pcu->gsmtap_remote_host = talloc_strdup(pcu, gsmtap_addr);
+ }
+
+ if (pcu->gsmtap_remote_host) {
+ LOGP(DLGLOBAL, LOGL_NOTICE,
+ "Setting up GSMTAP Um forwarding to '%s:%u'\n",
+ pcu->gsmtap_remote_host, GSMTAP_UDP_PORT);
+ pcu->gsmtap = gsmtap_source_init(pcu->gsmtap_remote_host,
+ GSMTAP_UDP_PORT, 1);
+ if (pcu->gsmtap == NULL) {
+ fprintf(stderr, "Failed during gsmtap_source_init()\n");
+ exit(1);
+ }
+ gsmtap_source_add_sink(pcu->gsmtap);
+ }
+
rc = telnet_init_dynif(tall_pcu_ctx, NULL, vty_get_bind_addr(),
OSMO_VTY_PORT_PCU);
if (rc < 0) {
diff --git a/src/pcu_utils.h b/src/pcu_utils.h
index e1a8572a..1c698ca4 100644
--- a/src/pcu_utils.h
+++ b/src/pcu_utils.h
@@ -10,10 +10,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#pragma once
#ifdef __cplusplus
diff --git a/src/pcu_vty.c b/src/pcu_vty.c
index c85e324b..6b33e297 100644
--- a/src/pcu_vty.c
+++ b/src/pcu_vty.c
@@ -70,6 +70,49 @@ static const struct value_string pcu_gsmtap_categ_help[] = {
{ 0, NULL }
};
+DEFUN(cfg_pcu_gsmtap_remote_host,
+ cfg_pcu_gsmtap_remote_host_cmd,
+ "gsmtap-remote-host [HOSTNAME]",
+ "Enable GSMTAP Um logging (see also 'gsmtap-category')\n"
+ "Remote IP address or hostname ('localhost' if omitted)\n")
+{
+ osmo_talloc_replace_string(the_pcu, &the_pcu->gsmtap_remote_host,
+ argc > 0 ? argv[0] : "localhost");
+
+ if (vty->type != VTY_FILE)
+ vty_out(vty, "%% This command requires restart%s", VTY_NEWLINE);
+
+ return CMD_SUCCESS;
+}
+
+DEFUN(cfg_pcu_no_gsmtap_remote_host,
+ cfg_pcu_no_gsmtap_remote_host_cmd,
+ "no gsmtap-remote-host",
+ NO_STR "Disable GSMTAP Um logging\n")
+{
+ if (the_pcu->gsmtap_remote_host)
+ TALLOC_FREE(the_pcu->gsmtap_remote_host);
+
+ if (vty->type != VTY_FILE)
+ vty_out(vty, "%% This command requires restart%s", VTY_NEWLINE);
+
+ return CMD_SUCCESS;
+}
+
+DEFUN(cfg_pcu_gsmtap_sapi_all, pcucfg_pcu_gsmtap_categ_all_cmd,
+ "gsmtap-category (enable-all|disable-all)",
+ "Enable/disable sending of UL/DL messages over GSMTAP\n"
+ "Enable all kinds of messages (all categories)\n"
+ "Disable all kinds of messages (all categories)\n")
+{
+
+ if (strcmp(argv[0], "enable-all") == 0)
+ the_pcu->gsmtap_categ_mask = UINT32_MAX;
+ else
+ the_pcu->gsmtap_categ_mask = 0x00;
+
+ return CMD_SUCCESS;
+}
DEFUN(cfg_pcu_gsmtap_categ, cfg_pcu_gsmtap_categ_cmd, "HIDDEN", "HIDDEN")
{
@@ -238,11 +281,14 @@ static int config_write_pcu(struct vty *vty)
if (strcmp(the_pcu->pcu_sock_path, PCU_SOCK_DEFAULT))
vty_out(vty, " pcu-socket %s%s", the_pcu->pcu_sock_path, VTY_NEWLINE);
+ if (the_pcu->gsmtap_remote_host)
+ vty_out(vty, " gsmtap-remote-host %s%s", the_pcu->gsmtap_remote_host, VTY_NEWLINE);
for (i = 0; i < 32; i++) {
- uint32_t cs = ((uint32_t)1 << i);
- if (the_pcu->gsmtap_categ_mask & cs) {
- vty_out(vty, " gsmtap-category %s%s",
- get_value_string(pcu_gsmtap_categ_names, i), VTY_NEWLINE);
+ if (the_pcu->gsmtap_categ_mask & ((uint32_t)1 << i)) {
+ const char *category_buf;
+ if (!(category_buf = get_value_string_or_null(pcu_gsmtap_categ_names, i)))
+ continue;
+ vty_out(vty, " gsmtap-category %s%s", category_buf, VTY_NEWLINE);
}
}
@@ -1294,6 +1340,9 @@ int pcu_vty_init(void)
install_element(PCU_NODE, &cfg_pcu_no_dl_tbf_preemptive_retransmission_cmd);
install_element(PCU_NODE, &cfg_pcu_ms_idle_time_cmd);
install_element(PCU_NODE, &cfg_pcu_no_ms_idle_time_cmd);
+ install_element(PCU_NODE, &cfg_pcu_gsmtap_remote_host_cmd);
+ install_element(PCU_NODE, &cfg_pcu_no_gsmtap_remote_host_cmd);
+ install_element(PCU_NODE, &pcucfg_pcu_gsmtap_categ_all_cmd);
install_element(PCU_NODE, &cfg_pcu_gsmtap_categ_cmd);
install_element(PCU_NODE, &cfg_pcu_no_gsmtap_categ_cmd);
install_element(PCU_NODE, &cfg_pcu_sock_cmd);
diff --git a/src/pcu_vty_functions.cpp b/src/pcu_vty_functions.cpp
index 657e5a16..1745eeaa 100644
--- a/src/pcu_vty_functions.cpp
+++ b/src/pcu_vty_functions.cpp
@@ -12,10 +12,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/* OsmoBTS VTY interface */
@@ -54,14 +50,15 @@ static void tbf_print_vty_info(struct vty *vty, struct gprs_rlcmac_tbf *tbf)
tbf->ta(),
tbf->direction == GPRS_RLCMAC_UL_TBF ? "UL" : "DL",
tbf->imsi(), VTY_NEWLINE);
- vty_out(vty, " created=%lu state=%08x [CCCH:%u, PACCH:%u] 1st_TS=%d 1st_cTS=%d ctrl_TS=%d MS_CLASS=%d/%d%s",
- tbf->created_ts(), tbf->state_fsm.state_flags,
+ vty_out(vty, " created=%lu state=%s flags=%08x [CCCH:%u, PACCH:%u] 1st_TS=%d 1st_cTS=%d ctrl_TS=%d MS_CLASS=%d/%d%s",
+ tbf->created_ts(), tbf->state_name(),
+ tbf->state_fsm.state_flags,
tbf->state_fsm.state_flags & (1 << GPRS_RLCMAC_FLAG_CCCH),
tbf->state_fsm.state_flags & (1 << GPRS_RLCMAC_FLAG_PACCH),
tbf->first_ts,
tbf->first_common_ts, tbf->control_ts,
tbf->ms_class(),
- tbf->ms() ? ms_egprs_ms_class(tbf->ms()) : -1,
+ ms_egprs_ms_class(tbf->ms()),
VTY_NEWLINE);
vty_out(vty, " TS_alloc=");
for (int i = 0; i < 8; i++) {
@@ -79,11 +76,10 @@ static void tbf_print_vty_info(struct vty *vty, struct gprs_rlcmac_tbf *tbf)
ul_tbf->window_size(), win->v_q(), win->v_r());
vty_out(vty, "%s", VTY_NEWLINE);
vty_out(vty, " TBF Statistics:%s", VTY_NEWLINE);
- if (GPRS == ms_mode(tbf->ms())) {
+ if (ul_tbf->m_ul_gprs_ctrs)
vty_out_rate_ctr_group(vty, " ", ul_tbf->m_ul_gprs_ctrs);
- } else {
+ if (ul_tbf->m_ul_egprs_ctrs)
vty_out_rate_ctr_group(vty, " ", ul_tbf->m_ul_egprs_ctrs);
- }
}
if (dl_tbf) {
gprs_rlc_dl_window *win = static_cast<gprs_rlc_dl_window *>(dl_tbf->window());
@@ -92,11 +88,10 @@ static void tbf_print_vty_info(struct vty *vty, struct gprs_rlcmac_tbf *tbf)
win->window_stalled() ? " STALLED" : "");
vty_out(vty, "%s", VTY_NEWLINE);
vty_out_rate_ctr_group(vty, " ", tbf->m_ctrs);
- if (GPRS == ms_mode(tbf->ms())) {
+ if (dl_tbf->m_dl_gprs_ctrs)
vty_out_rate_ctr_group(vty, " ", dl_tbf->m_dl_gprs_ctrs);
- } else {
+ if (dl_tbf->m_dl_egprs_ctrs)
vty_out_rate_ctr_group(vty, " ", dl_tbf->m_dl_egprs_ctrs);
- }
}
vty_out(vty, "%s%s", VTY_NEWLINE, VTY_NEWLINE);
}
diff --git a/src/pcu_vty_functions.h b/src/pcu_vty_functions.h
index a68df27c..172dffcc 100644
--- a/src/pcu_vty_functions.h
+++ b/src/pcu_vty_functions.h
@@ -12,10 +12,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#pragma once
diff --git a/src/pdch.cpp b/src/pdch.cpp
index 5d8658af..a5eb0804 100644
--- a/src/pdch.cpp
+++ b/src/pdch.cpp
@@ -123,14 +123,40 @@ static inline void sched_ul_ass_or_rej(struct gprs_rlcmac_bts *bts, struct gprs_
/* schedule uplink assignment or reject */
if (ul_tbf) {
- LOGP(DRLCMAC, LOGL_DEBUG, "MS requests UL TBF in ack message, so we provide one:\n");
+ LOGPTBFDL(tbf, LOGL_DEBUG, "MS requests UL TBF in ack message, so we provide one:\n");
osmo_fsm_inst_dispatch(tbf->ul_ass_fsm.fi, TBF_UL_ASS_EV_SCHED_ASS, NULL);
} else {
- LOGP(DRLCMAC, LOGL_DEBUG, "MS requests UL TBF in ack message, so we packet access reject:\n");
+ LOGPTBFDL(tbf, LOGL_NOTICE, "MS requests UL TBF in ack message, but alloc failed: send PktAssRej\n");
osmo_fsm_inst_dispatch(tbf->ul_ass_fsm.fi, TBF_UL_ASS_EV_SCHED_ASS_REJ, NULL);
}
}
+/* Make sure the PDCH vanished from the mask of reserved PDCHs for all MS, to
+ * avoid alloc_algorithm using it. */
+static void pdch_unreserve_all_ms_reserved_slots(struct gprs_rlcmac_pdch *pdch)
+{
+ struct llist_head *tmp;
+ uint8_t ts_rm_mask = (~(1 << pdch->ts_no));
+ struct gprs_rlcmac_trx *trx = pdch->trx;
+
+ llist_for_each(tmp, bts_ms_list(trx->bts)) {
+ struct GprsMs *ms = llist_entry(tmp, typeof(*ms), list);
+ if (ms->current_trx != trx)
+ continue;
+ uint8_t old_dl_slots = ms_reserved_dl_slots(ms);
+ uint8_t old_ul_slots = ms_reserved_ul_slots(ms);
+ uint8_t new_dl_slots = old_dl_slots & ts_rm_mask;
+ uint8_t new_ul_slots = old_ul_slots & ts_rm_mask;
+ if (old_dl_slots == new_dl_slots && old_ul_slots == new_ul_slots)
+ continue;
+ ms_set_reserved_slots(ms, trx, new_ul_slots, new_dl_slots);
+ }
+ if (pdch->num_reserved(GPRS_RLCMAC_UL_TBF) > 0 || pdch->num_reserved(GPRS_RLCMAC_DL_TBF) > 0)
+ LOGPDCH(pdch, DRLCMAC, LOGL_ERROR,
+ "Reserved TS count not zero after unreserving from all current MS in list! UL=%u DL=%u\n",
+ pdch->num_reserved(GPRS_RLCMAC_UL_TBF), pdch->num_reserved(GPRS_RLCMAC_DL_TBF));
+}
+
void pdch_init(struct gprs_rlcmac_pdch *pdch, struct gprs_rlcmac_trx *trx, uint8_t ts_nr)
{
pdch->ts_no = ts_nr;
@@ -143,6 +169,7 @@ void pdch_init(struct gprs_rlcmac_pdch *pdch, struct gprs_rlcmac_trx *trx, uint8
void gprs_rlcmac_pdch::enable()
{
+ LOGPDCH(this, DRLCMAC, LOGL_INFO, "PDCH state: %s => enabled\n", m_is_enabled ? "enabled" : "disabled");
OSMO_ASSERT(m_is_enabled == 0);
INIT_LLIST_HEAD(&paging_list);
@@ -155,6 +182,7 @@ void gprs_rlcmac_pdch::enable()
void gprs_rlcmac_pdch::disable()
{
+ LOGPDCH(this, DRLCMAC, LOGL_INFO, "PDCH state: %s => disabled\n", m_is_enabled ? "enabled" : "disabled");
OSMO_ASSERT(m_is_enabled == 1);
this->free_resources();
@@ -169,6 +197,8 @@ void gprs_rlcmac_pdch::free_resources()
/* kick all TBF on slot */
pdch_free_all_tbf(this);
+ pdch_unreserve_all_ms_reserved_slots(this);
+
/* flush all pending paging messages */
while ((pag = dequeue_paging()))
talloc_free(pag);
@@ -613,15 +643,16 @@ void gprs_rlcmac_pdch::rcv_resource_request(Packet_Resource_Request_t *request,
{
struct gprs_rlcmac_sba *sba;
int rc;
+ struct gprs_rlcmac_bts *bts = trx->bts;
if (request->ID.UnionType) {
struct gprs_rlcmac_ul_tbf *ul_tbf = NULL;
struct pdch_ulc_node *item;
uint32_t tlli = request->ID.u.TLLI;
- GprsMs *ms = bts_ms_by_tlli(bts(), tlli, GSM_RESERVED_TMSI);
+ GprsMs *ms = bts_ms_by_tlli(bts, tlli, GSM_RESERVED_TMSI);
if (!ms) {
- ms = bts_alloc_ms(bts(), 0, 0); /* ms class updated later */
+ ms = bts_alloc_ms(bts, 0, 0); /* ms class updated later */
ms_set_tlli(ms, tlli);
}
@@ -649,6 +680,18 @@ void gprs_rlcmac_pdch::rcv_resource_request(Packet_Resource_Request_t *request,
"MS requests UL TBF throguh SBA\n", fn);
ms_set_ta(ms, sba->ta);
sba_free(sba);
+ /* If MS identified by TLLI sent us a PktResReq through SBA, it means it came
+ * from CCCH, so it's for sure not using previous UL
+ * TBF; drop it if it still exits on our end: */
+ if ((ul_tbf = ms_ul_tbf(ms))) {
+ /* Get rid of previous finished UL TBF before providing a new one */
+ LOGPTBFUL(ul_tbf, LOGL_NOTICE,
+ "Got PACKET RESOURCE REQ while TBF not finished, killing pending UL TBF\n");
+ tbf_free(ul_tbf);
+ ul_tbf = NULL;
+ }
+ /* MS seized the PDCH answering on the SBA: */
+ bts_do_rate_ctr_inc(bts, CTR_IMMEDIATE_ASSIGN_UL_TBF_CONTENTION_RESOLUTION_SUCCESS);
break;
case PDCH_ULC_NODE_TBF_POLL:
if (item->tbf_poll.poll_tbf->direction != GPRS_RLCMAC_UL_TBF) {
@@ -707,9 +750,9 @@ void gprs_rlcmac_pdch::rcv_resource_request(Packet_Resource_Request_t *request,
ms_set_egprs_ms_class(ms, egprs_ms_class);
}
- ul_tbf = tbf_alloc_ul_pacch(bts(), ms, trx_no());
+ ul_tbf = tbf_alloc_ul_pacch(bts, ms, trx_no());
if (!ul_tbf) {
- handle_tbf_reject(bts(), ms, trx_no(), ts_no);
+ handle_tbf_reject(bts, ms, trx_no(), ts_no);
goto return_unref;
}
@@ -720,7 +763,7 @@ void gprs_rlcmac_pdch::rcv_resource_request(Packet_Resource_Request_t *request,
* sent to tbf_fsm which will call tbf_assign_control_ts(),
* effectively setting back control_ts to
* tbf->initial_common_ts. */
- LOGPTBF(ul_tbf, LOGL_DEBUG, "change control TS %d -> %d until assignment is complete.\n",
+ LOGPTBF(ul_tbf, LOGL_INFO, "change control TS %d -> %d until assignment is complete.\n",
ul_tbf->control_ts, ts_no);
ul_tbf->control_ts = ts_no;
@@ -738,7 +781,7 @@ return_unref:
if (request->ID.u.Global_TFI.UnionType) {
struct gprs_rlcmac_dl_tbf *dl_tbf;
int8_t tfi = request->ID.u.Global_TFI.u.DOWNLINK_TFI;
- dl_tbf = bts_dl_tbf_by_tfi(bts(), tfi, trx_no(), ts_no);
+ dl_tbf = bts_dl_tbf_by_tfi(bts, tfi, trx_no(), ts_no);
if (!dl_tbf) {
LOGP(DRLCMAC, LOGL_NOTICE, "PACKET RESOURCE REQ unknown downlink TFI=%d\n", tfi);
return;
@@ -751,7 +794,7 @@ return_unref:
} else {
struct gprs_rlcmac_ul_tbf *ul_tbf;
int8_t tfi = request->ID.u.Global_TFI.u.UPLINK_TFI;
- ul_tbf = bts_ul_tbf_by_tfi(bts(), tfi, trx_no(), ts_no);
+ ul_tbf = bts_ul_tbf_by_tfi(bts, tfi, trx_no(), ts_no);
if (!ul_tbf) {
LOGP(DRLCMAC, LOGL_NOTICE, "PACKET RESOURCE REQ unknown uplink TFI=%d\n", tfi);
return;
@@ -1132,6 +1175,11 @@ void gprs_rlcmac_pdch::detach_tbf(gprs_rlcmac_tbf *tbf)
{
gprs_rlcmac_ul_tbf *ul_tbf;
+ LOGPDCH(this, DRLCMAC, LOGL_INFO, "Detaching %s, %d TBFs, "
+ "USFs = %02x, TFIs = %08x.\n",
+ tbf->name(), num_tbfs(tbf->direction),
+ m_assigned_usf, m_assigned_tfi[tbf->direction]);
+
if (tbf->is_egprs_enabled()) {
OSMO_ASSERT(m_num_tbfs_egprs[tbf->direction] > 0);
} else {
@@ -1147,11 +1195,6 @@ void gprs_rlcmac_pdch::detach_tbf(gprs_rlcmac_tbf *tbf)
m_tbfs[tbf->direction][tbf->tfi()] = NULL;
pdch_ulc_release_tbf(ulc, tbf);
-
- LOGPDCH(this, DRLCMAC, LOGL_INFO, "Detaching %s, %d TBFs, "
- "USFs = %02x, TFIs = %08x.\n",
- tbf->name(), num_tbfs(tbf->direction),
- m_assigned_usf, m_assigned_tfi[tbf->direction]);
}
bool gprs_rlcmac_pdch::has_gprs_only_tbf_attached() const
@@ -1243,3 +1286,13 @@ bool pdch_is_enabled(const struct gprs_rlcmac_pdch *pdch)
{
return pdch->is_enabled();
}
+
+/* To be called only on enabled PDCHs. Used to gather information on whether the
+ * PDCH is currently unable to allocate more TBFs due to any resource being
+ * full. Used by bts_all_pdch_allocated() for counting purposes. */
+bool pdch_is_full(const struct gprs_rlcmac_pdch *pdch)
+{
+ return pdch->assigned_tfi(GPRS_RLCMAC_UL_TBF) == NO_FREE_TFI ||
+ pdch->assigned_tfi(GPRS_RLCMAC_DL_TBF) == NO_FREE_TFI ||
+ find_free_usf(pdch->assigned_usf()) < 0;
+}
diff --git a/src/pdch.h b/src/pdch.h
index 94056069..cf4ac4eb 100644
--- a/src/pdch.h
+++ b/src/pdch.h
@@ -13,10 +13,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#pragma once
@@ -194,6 +190,7 @@ void pdch_init(struct gprs_rlcmac_pdch *pdch, struct gprs_rlcmac_trx *trx, uint8
void pdch_free_all_tbf(struct gprs_rlcmac_pdch *pdch);
void pdch_disable(struct gprs_rlcmac_pdch *pdch);
bool pdch_is_enabled(const struct gprs_rlcmac_pdch *pdch);
+bool pdch_is_full(const struct gprs_rlcmac_pdch *pdch);
#ifdef __cplusplus
}
#endif
diff --git a/src/pdch_ul_controller.c b/src/pdch_ul_controller.c
index 79a03391..7fbbc513 100644
--- a/src/pdch_ul_controller.c
+++ b/src/pdch_ul_controller.c
@@ -12,10 +12,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with it program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <unistd.h>
diff --git a/src/pdch_ul_controller.h b/src/pdch_ul_controller.h
index c56945f1..0e667202 100644
--- a/src/pdch_ul_controller.h
+++ b/src/pdch_ul_controller.h
@@ -12,10 +12,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#pragma once
diff --git a/src/rlc.cpp b/src/rlc.cpp
index a2cc52c2..a0825976 100644
--- a/src/rlc.cpp
+++ b/src/rlc.cpp
@@ -10,10 +10,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "bts.h"
diff --git a/src/rlc.h b/src/rlc.h
index 45cbb95f..73a537ff 100644
--- a/src/rlc.h
+++ b/src/rlc.h
@@ -12,10 +12,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#pragma once
#ifdef __cplusplus
diff --git a/src/sba.c b/src/sba.c
index d293784c..94c3c564 100644
--- a/src/sba.c
+++ b/src/sba.c
@@ -12,10 +12,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <sba.h>
diff --git a/src/sba.h b/src/sba.h
index 39625764..749b1457 100644
--- a/src/sba.h
+++ b/src/sba.h
@@ -13,10 +13,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#pragma once
diff --git a/src/tbf.cpp b/src/tbf.cpp
index 07732dc4..c2eeb893 100644
--- a/src/tbf.cpp
+++ b/src/tbf.cpp
@@ -13,10 +13,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <new>
@@ -94,14 +90,14 @@ gprs_rlcmac_tbf::Meas::Meas() :
gprs_rlcmac_tbf::gprs_rlcmac_tbf(struct gprs_rlcmac_bts *bts_, GprsMs *ms, gprs_rlcmac_tbf_direction dir) :
direction(dir),
trx(NULL),
- first_ts(0),
- first_common_ts(0),
- control_ts(TBF_CONTROL_TS_UNSET),
+ first_ts(TBF_TS_UNSET),
+ first_common_ts(TBF_TS_UNSET),
+ control_ts(TBF_TS_UNSET),
fT(0),
num_fT_exp(0),
upgrade_to_multislot(false),
bts(bts_),
- m_tfi(0),
+ m_tfi(TBF_TFI_UNSET),
m_created_ts(0),
m_ctrs(NULL),
m_ms(ms),
@@ -137,6 +133,8 @@ gprs_rlcmac_tbf::gprs_rlcmac_tbf(struct gprs_rlcmac_bts *bts_, GprsMs *ms, gprs_
m_llc.init();
m_name_buf[0] = '\0';
+
+ m_created_ts = time(NULL);
}
@@ -249,7 +247,7 @@ static void tbf_unlink_pdch(struct gprs_rlcmac_tbf *tbf)
* confirmation from the MS and goes through the FLOW state. Hence, we
* may have ULC pollings ongoing and we need to make sure we drop all
* reserved nodes there: */
- if (tbf->control_ts != TBF_CONTROL_TS_UNSET && !tbf->pdch[tbf->control_ts])
+ if (tbf->control_ts != TBF_TS_UNSET && !tbf->pdch[tbf->control_ts])
pdch_ulc_release_tbf(tbf->trx->pdch[tbf->control_ts].ulc, tbf);
/* Now simply detach from all attached PDCHs */
@@ -338,7 +336,7 @@ int gprs_rlcmac_tbf::update()
void tbf_assign_control_ts(struct gprs_rlcmac_tbf *tbf)
{
- if (tbf->control_ts == TBF_CONTROL_TS_UNSET)
+ if (tbf->control_ts == TBF_TS_UNSET)
LOGPTBF(tbf, LOGL_INFO, "Setting Control TS %d\n",
tbf->first_common_ts);
else if (tbf->control_ts != tbf->first_common_ts)
@@ -524,7 +522,7 @@ int gprs_rlcmac_tbf::check_polling(uint32_t fn, uint8_t ts,
}
if ((rc = pdch_ulc_get_next_free_rrbp_fn(trx->pdch[ts].ulc, fn, poll_fn_, rrbp_)) < 0) {
- LOGPTBF(this, LOGL_DEBUG,
+ LOGPTBF(this, LOGL_NOTICE,
"(bts=%u,trx=%u,ts=%u) FN=%u No suitable free RRBP offset found!\n",
trx->bts->nr, trx->trx_no, ts, fn);
return rc;
@@ -657,7 +655,6 @@ int gprs_rlcmac_tbf::setup(int8_t use_trx, bool single_slot)
if (ms_mode(m_ms) != GPRS)
enable_egprs();
- m_created_ts = time(NULL);
/* select algorithm */
rc = the_pcu->alloc_algorithm(bts, this, single_slot, use_trx);
/* if no resource */
@@ -718,9 +715,10 @@ const char *tbf_name(const gprs_rlcmac_tbf *tbf)
const char *gprs_rlcmac_tbf::name() const
{
+ int8_t tfi = (m_tfi == TBF_TS_UNSET) ? -1 : m_tfi;
snprintf(m_name_buf, sizeof(m_name_buf) - 1,
"TBF(TFI=%d TLLI=0x%08x DIR=%s STATE=%s%s)",
- m_tfi, tlli(),
+ tfi, tlli(),
direction == GPRS_RLCMAC_UL_TBF ? "UL" : "DL",
state_name(),
is_egprs_enabled() ? " EGPRS" : ""
@@ -732,9 +730,10 @@ const char *gprs_rlcmac_tbf::name() const
void tbf_update_state_fsm_name(struct gprs_rlcmac_tbf *tbf)
{
char buf[64];
+ int8_t tfi = (tbf_tfi(tbf) == TBF_TS_UNSET) ? -1 : tbf_tfi(tbf);
snprintf(buf, sizeof(buf), "%s-TFI_%d",
tbf_direction(tbf) == GPRS_RLCMAC_UL_TBF ? "UL" : "DL",
- tbf_tfi(tbf));
+ tfi);
osmo_identifier_sanitize_buf(buf, NULL, '_');
osmo_fsm_inst_update_id(tbf->state_fsm.fi, buf);
diff --git a/src/tbf.h b/src/tbf.h
index 4013ab05..31bbe5fa 100644
--- a/src/tbf.h
+++ b/src/tbf.h
@@ -10,10 +10,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#pragma once
@@ -116,7 +112,8 @@ enum tbf_counters { /* TBF counters from 3GPP TS 44.060 ยง13.4 */
#define GPRS_RLCMAC_FLAG_TO_DL_ACK 3 /* DL TBF: Failed to receive last polled DL ACK/NACK */
#define GPRS_RLCMAC_FLAG_TO_MASK 0xf0 /* timeout bits */
-#define TBF_CONTROL_TS_UNSET 0xff
+#define TBF_TS_UNSET 0xff
+#define TBF_TFI_UNSET 0xff
#define T_START(tbf, t, T, r, f) tbf->t_start(t, T, r, f, __FILE__, __LINE__)
diff --git a/src/tbf_dl.cpp b/src/tbf_dl.cpp
index 05d5ad36..ec455c12 100644
--- a/src/tbf_dl.cpp
+++ b/src/tbf_dl.cpp
@@ -13,10 +13,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <bts.h>
@@ -296,7 +292,9 @@ int dl_tbf_handle(struct gprs_rlcmac_bts *bts,
/* check for existing TBF */
ms = bts_ms_store(bts)->get_ms(tlli, tlli_old, imsi);
- if (ms && strlen(ms_imsi(ms)) == 0) {
+ /* If we got MS by TLLI above let's see if we already have another MS
+ * object identified by IMSI and merge them */
+ if (ms && !ms_imsi_is_valid(ms) && imsi) {
ms_old = bts_ms_store(bts)->get_ms(0, 0, imsi);
if (ms_old && ms_old != ms) {
/* The TLLI has changed (RAU), so there are two MS
@@ -310,7 +308,7 @@ int dl_tbf_handle(struct gprs_rlcmac_bts *bts,
if (!ms_dl_tbf(ms) && ms_dl_tbf(ms_old)) {
LOGP(DTBF, LOGL_NOTICE,
"IMSI %s, old TBF %s: moving DL TBF to new MS object\n",
- imsi, ms_dl_tbf(ms_old)->name());
+ imsi ? : "unknown", ms_dl_tbf(ms_old)->name());
dl_tbf = ms_dl_tbf(ms_old);
/* Move the DL TBF to the new MS */
dl_tbf->set_ms(ms);
@@ -323,7 +321,8 @@ int dl_tbf_handle(struct gprs_rlcmac_bts *bts,
if (!ms)
ms = bts_alloc_ms(bts, ms_class, egprs_ms_class);
- ms_set_imsi(ms, imsi);
+ if (imsi)
+ ms_set_imsi(ms, imsi);
ms_confirm_tlli(ms, tlli);
if (!ms_ms_class(ms) && ms_class) {
ms_set_ms_class(ms, ms_class);
@@ -599,7 +598,6 @@ struct msgb *gprs_rlcmac_dl_tbf::create_dl_acked_block(uint32_t fn, uint8_t ts,
/* depending on the current TBF, we assign on PACCH or AGCH */
void gprs_rlcmac_dl_tbf::trigger_ass(struct gprs_rlcmac_tbf *old_tbf)
{
- uint16_t pgroup;
/* stop pending timer */
stop_timers("assignment (DL-TBF)");
@@ -618,9 +616,7 @@ void gprs_rlcmac_dl_tbf::trigger_ass(struct gprs_rlcmac_tbf *old_tbf)
osmo_fsm_inst_dispatch(this->state_fsm.fi, TBF_EV_ASSIGN_ADD_CCCH, NULL);
/* send immediate assignment */
- if ((pgroup = imsi2paging_group(imsi())) > 999)
- LOGPTBFDL(this, LOGL_ERROR, "IMSI to paging group failed! (%s)\n", imsi());
- bts_snd_dl_ass(bts, this, pgroup);
+ bts_snd_dl_ass(bts, this);
}
}
diff --git a/src/tbf_dl.h b/src/tbf_dl.h
index d20ad75f..c0c0284f 100644
--- a/src/tbf_dl.h
+++ b/src/tbf_dl.h
@@ -11,10 +11,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#pragma once
diff --git a/src/tbf_dl_ass_fsm.c b/src/tbf_dl_ass_fsm.c
index 37ced616..9ea216c2 100644
--- a/src/tbf_dl_ass_fsm.c
+++ b/src/tbf_dl_ass_fsm.c
@@ -12,10 +12,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <unistd.h>
@@ -77,9 +73,6 @@ struct msgb *create_packet_dl_assign(const struct tbf_dl_ass_fsm_ctx *ctx,
return NULL;
}
- if (new_dl_tbf == as_dl_tbf(ctx->tbf))
- LOGPTBF(ctx->tbf, LOGL_DEBUG, "New and old TBF are the same.\n");
-
if (old_tfi_is_valid && ms_tlli(ms) == GSM_RESERVED_TMSI) {
LOGPTBF(ctx->tbf, LOGL_ERROR,
"The old TFI is not assigned and there is no TLLI. New TBF %s\n",
@@ -99,7 +92,12 @@ struct msgb *create_packet_dl_assign(const struct tbf_dl_ass_fsm_ctx *ctx,
};
bitvec_unhex(&bv, DUMMY_VEC);
- LOGPTBF((struct gprs_rlcmac_tbf *)new_dl_tbf, LOGL_INFO, "start Packet Downlink Assignment (PACCH)\n");
+ if (ctx->tbf != (struct gprs_rlcmac_tbf *)new_dl_tbf)
+ LOGPTBF(ctx->tbf, LOGL_INFO, "start Packet Downlink Assignment (PACCH) for %s\n",
+ tbf_name((const struct gprs_rlcmac_tbf *)new_dl_tbf));
+ else
+ LOGPTBF(ctx->tbf, LOGL_INFO, "start Packet Downlink Assignment (PACCH)\n");
+
mac_control_block = (RlcMacDownlink_t *)talloc_zero(ctx->tbf, RlcMacDownlink_t);
write_packet_downlink_assignment(mac_control_block, old_tfi_is_valid,
tbf_tfi(ctx->tbf), (tbf_direction(ctx->tbf) == GPRS_RLCMAC_DL_TBF),
@@ -183,11 +181,7 @@ static void st_wait_ack(struct osmo_fsm_inst *fi, uint32_t event, void *data)
static int tbf_dl_ass_fsm_timer_cb(struct osmo_fsm_inst *fi)
{
- struct tbf_dl_ass_fsm_ctx *ctx = (struct tbf_dl_ass_fsm_ctx *)fi->priv;
switch (fi->T) {
- case -2000:
- tbf_free(ctx->tbf);
- break;
default:
OSMO_ASSERT(0);
}
@@ -206,7 +200,9 @@ static struct osmo_fsm_state tbf_dl_ass_fsm_states[] = {
},
[TBF_DL_ASS_SEND_ASS] = {
.in_event_mask = X(TBF_DL_ASS_EV_CREATE_RLCMAC_MSG),
- .out_state_mask = X(TBF_DL_ASS_WAIT_ACK),
+ .out_state_mask =
+ X(TBF_DL_ASS_WAIT_ACK) |
+ X(TBF_DL_ASS_NONE),
.name = "SEND_ASS",
.action = st_send_ass,
},
diff --git a/src/tbf_dl_ass_fsm.h b/src/tbf_dl_ass_fsm.h
index 94c9062d..a259c03d 100644
--- a/src/tbf_dl_ass_fsm.h
+++ b/src/tbf_dl_ass_fsm.h
@@ -12,10 +12,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#pragma once
diff --git a/src/tbf_fsm.c b/src/tbf_fsm.c
index af2b34ef..2189747f 100644
--- a/src/tbf_fsm.c
+++ b/src/tbf_fsm.c
@@ -12,10 +12,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <unistd.h>
@@ -214,15 +210,11 @@ static void st_flow(struct osmo_fsm_inst *fi, uint32_t event, void *data)
if ((ctx->state_flags & (1 << GPRS_RLCMAC_FLAG_CCCH))
&& !(ctx->state_flags & (1 << GPRS_RLCMAC_FLAG_DL_ACK))) {
struct GprsMs *ms = tbf_ms(ctx->tbf);
- const char *imsi = ms_imsi(ms);
- uint16_t pgroup;
LOGPTBF(ctx->tbf, LOGL_DEBUG, "Re-send downlink assignment on PCH (IMSI=%s)\n",
- imsi);
+ ms_imsi_is_valid(ms) ? ms_imsi(ms) : "");
tbf_fsm_state_chg(fi, TBF_ST_ASSIGN);
/* send immediate assignment */
- if ((pgroup = imsi2paging_group(imsi)) > 999)
- LOGPTBF(ctx->tbf, LOGL_ERROR, "IMSI to paging group failed! (%s)\n", imsi);
- bts_snd_dl_ass(ms->bts, ctx->tbf, pgroup);
+ bts_snd_dl_ass(ms->bts, ctx->tbf);
}
break;
case TBF_EV_LAST_DL_DATA_SENT:
diff --git a/src/tbf_fsm.h b/src/tbf_fsm.h
index 614c319d..9814c0ee 100644
--- a/src/tbf_fsm.h
+++ b/src/tbf_fsm.h
@@ -12,10 +12,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#pragma once
diff --git a/src/tbf_ul.cpp b/src/tbf_ul.cpp
index 74b2636b..305daaa6 100644
--- a/src/tbf_ul.cpp
+++ b/src/tbf_ul.cpp
@@ -13,10 +13,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <bts.h>
@@ -151,7 +147,12 @@ struct gprs_rlcmac_ul_tbf *tbf_alloc_ul_tbf(struct gprs_rlcmac_bts *bts, GprsMs
return tbf;
}
-/* Alloc a UL TBF to be assigned over PACCH */
+/* Alloc a UL TBF to be assigned over PACCH. Called when an MS requests to
+ * create a new UL TBF during the end of life of a previous UL TBF (or an SBA).
+ * In summary, this TBF is allocated as a consequence of receiving a "Pkt
+ * Resource Req" or "Pkt Ctrl Ack" from the MS.
+ * See TS 44.060 9.3.2.4.2 "Non-extended uplink TBF mode".
+ */
gprs_rlcmac_ul_tbf *tbf_alloc_ul_pacch(struct gprs_rlcmac_bts *bts, GprsMs *ms, int8_t use_trx)
{
struct gprs_rlcmac_ul_tbf *tbf;
@@ -162,13 +163,15 @@ gprs_rlcmac_ul_tbf *tbf_alloc_ul_pacch(struct gprs_rlcmac_bts *bts, GprsMs *ms,
/* Caller will most probably send a Imm Ass Reject after return */
return NULL;
}
+ /* Contention resolution is considered to be done since TLLI is known in MS: */
tbf->m_contention_resolution_done = 1;
osmo_fsm_inst_dispatch(tbf->state_fsm.fi, TBF_EV_ASSIGN_ADD_PACCH, NULL);
return tbf;
}
-/* Alloc a UL TBF to be assigned over CCCH */
+/* Alloc a UL TBF to be assigned over CCCH. Used by request of a "One phase
+ * packet access", where MS requested only 1 PDCH TS (TS 44.018 Table 9.1.8.1). */
struct gprs_rlcmac_ul_tbf *tbf_alloc_ul_ccch(struct gprs_rlcmac_bts *bts, struct GprsMs *ms)
{
struct gprs_rlcmac_ul_tbf *tbf;
@@ -203,8 +206,11 @@ struct gprs_rlcmac_ul_tbf *handle_tbf_reject(struct gprs_rlcmac_bts *bts,
talloc_set_destructor(ul_tbf, ul_tbf_dtor);
new (ul_tbf) gprs_rlcmac_ul_tbf(bts, ms);
- ul_tbf->control_ts = ts;
ul_tbf->trx = trx;
+ /* The only one TS is the common, control TS */
+ ul_tbf->first_ts = ts;
+ ul_tbf->first_common_ts = ts;
+ tbf_assign_control_ts(ul_tbf);
ul_tbf->m_ctrs = rate_ctr_group_alloc(ul_tbf, &tbf_ctrg_desc, next_tbf_ctr_group_id++);
ul_tbf->m_ul_egprs_ctrs = rate_ctr_group_alloc(ul_tbf,
&tbf_ul_egprs_ctrg_desc,
@@ -217,6 +223,7 @@ struct gprs_rlcmac_ul_tbf *handle_tbf_reject(struct gprs_rlcmac_bts *bts,
talloc_free(ul_tbf);
return NULL;
}
+ tbf_update_state_fsm_name(ul_tbf);
ms_attach_tbf(ms, ul_tbf);
llist_add(tbf_trx_list((struct gprs_rlcmac_tbf *)ul_tbf), &trx->ul_tbfs);
@@ -321,6 +328,8 @@ void gprs_rlcmac_ul_tbf::contention_resolution_success()
/* now we must set this flag, so we are allowed to assign downlink
* TBF on PACCH. it is only allowed when TLLI is acknowledged. */
m_contention_resolution_done = 1;
+
+ bts_do_rate_ctr_inc(bts, CTR_IMMEDIATE_ASSIGN_UL_TBF_CONTENTION_RESOLUTION_SUCCESS);
}
/*! \brief receive data from PDCH/L1 */
@@ -430,7 +439,7 @@ int gprs_rlcmac_ul_tbf::rcv_data_block_acknowledged(
"Decoded premier TLLI=0x%08x of UL DATA TFI=%d.\n",
new_tlli, rlc->tfi);
update_ms(new_tlli, GPRS_RLCMAC_UL_TBF);
- bts_pch_timer_stop(bts, ms_imsi(ms()));
+ bts_pch_timer_stop(bts, ms());
} else if (new_tlli != GSM_RESERVED_TMSI && new_tlli != tlli()) {
LOGPTBFUL(this, LOGL_NOTICE,
"Decoded TLLI=%08x mismatch on UL DATA TFI=%d. (Ignoring due to contention resolution)\n",
diff --git a/src/tbf_ul.h b/src/tbf_ul.h
index 0dc2336d..62b94567 100644
--- a/src/tbf_ul.h
+++ b/src/tbf_ul.h
@@ -11,10 +11,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#pragma once
diff --git a/src/tbf_ul_ack_fsm.c b/src/tbf_ul_ack_fsm.c
index 32e3533f..364ef00f 100644
--- a/src/tbf_ul_ack_fsm.c
+++ b/src/tbf_ul_ack_fsm.c
@@ -12,10 +12,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <unistd.h>
diff --git a/src/tbf_ul_ack_fsm.h b/src/tbf_ul_ack_fsm.h
index aaee5a3e..d2e93321 100644
--- a/src/tbf_ul_ack_fsm.h
+++ b/src/tbf_ul_ack_fsm.h
@@ -12,10 +12,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#pragma once
diff --git a/src/tbf_ul_ass_fsm.c b/src/tbf_ul_ass_fsm.c
index ab23fbdb..b443e4f4 100644
--- a/src/tbf_ul_ass_fsm.c
+++ b/src/tbf_ul_ass_fsm.c
@@ -12,10 +12,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <unistd.h>
@@ -64,7 +60,7 @@ static struct msgb *create_packet_access_reject(const struct tbf_ul_ass_fsm_ctx
bitvec_unhex(packet_access_rej, DUMMY_VEC);
write_packet_access_reject(packet_access_rej, ms_tlli(ms),
- osmo_tdef_get(ms->bts->T_defs_bts, 3172, OSMO_TDEF_MS, -1));
+ osmo_tdef_get(ms->bts->pcu->T_defs, 3172, OSMO_TDEF_MS, -1));
bts_do_rate_ctr_inc(ms->bts, CTR_PKT_ACCESS_REJ);
@@ -110,7 +106,12 @@ struct msgb *create_packet_ul_assign(const struct tbf_ul_ass_fsm_ctx *ctx,
};
bitvec_unhex(&bv, DUMMY_VEC);
- LOGPTBFUL((const struct gprs_rlcmac_tbf *)new_tbf, LOGL_INFO, "start Packet Uplink Assignment (PACCH)\n");
+ if (ctx->tbf != (struct gprs_rlcmac_tbf *)new_tbf)
+ LOGPTBF(ctx->tbf, LOGL_INFO, "start Packet Uplink Assignment (PACCH) for %s\n",
+ tbf_name((const struct gprs_rlcmac_tbf *)new_tbf));
+ else
+ LOGPTBF(ctx->tbf, LOGL_INFO, "start Packet Uplink Assignment (PACCH)\n");
+
mac_control_block = (RlcMacDownlink_t *)talloc_zero(ctx->tbf, RlcMacDownlink_t);
tlli = ms_tlli(ms);
write_packet_uplink_assignment(mac_control_block, tbf_tfi(ctx->tbf),
diff --git a/src/tbf_ul_ass_fsm.h b/src/tbf_ul_ass_fsm.h
index 34b81a7b..8a612f26 100644
--- a/src/tbf_ul_ass_fsm.h
+++ b/src/tbf_ul_ass_fsm.h
@@ -12,10 +12,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#pragma once
diff --git a/src/wireshark_compat.h b/src/wireshark_compat.h
index 13b165a0..2840124f 100644
--- a/src/wireshark_compat.h
+++ b/src/wireshark_compat.h
@@ -10,10 +10,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/* This header contains a few definitions required by rlcmac and csn1 files
diff --git a/tests/alloc/AllocTest.cpp b/tests/alloc/AllocTest.cpp
index 35bbfc4d..b5d4b954 100644
--- a/tests/alloc/AllocTest.cpp
+++ b/tests/alloc/AllocTest.cpp
@@ -11,10 +11,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "gprs_rlcmac.h"
@@ -152,6 +148,8 @@ static void test_alloc_a(gprs_rlcmac_tbf_direction dir,
OSMO_ASSERT(i == count);
+ OSMO_ASSERT(bts_all_pdch_allocated(bts));
+
for (i = 0; i < count; ++i)
if (tbfs[i])
tbf_free(tbfs[i]);
@@ -479,6 +477,7 @@ static GprsMs *alloc_tbfs(struct gprs_rlcmac_bts *bts, struct GprsMs *old_ms, en
tbf_free(ms_ul_tbf(old_ms));
tbf = tbf_alloc_ul_tbf(bts, old_ms, trx_no, false);
if (tbf == NULL) {
+ OSMO_ASSERT(trx_no != -1 || bts_all_pdch_allocated(bts));
ms_unref(old_ms);
return NULL;
}
@@ -490,6 +489,7 @@ static GprsMs *alloc_tbfs(struct gprs_rlcmac_bts *bts, struct GprsMs *old_ms, en
tbf_free(ms_dl_tbf(old_ms));
tbf = tbf_alloc_dl_tbf(bts, old_ms, trx_no, false);
if (tbf == NULL) {
+ OSMO_ASSERT(trx_no != -1 || bts_all_pdch_allocated(bts));
ms_unref(old_ms);
return NULL;
}
@@ -806,15 +806,22 @@ static void test_2_consecutive_dl_tbfs()
static void test_bts_pch_timer(void)
{
struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);
- const char *imsi1 = "1234";
- const char *imsi2 = "5678";
+ struct osmo_mobile_identity mi_imsi1, mi_imsi2;
+ struct osmo_mobile_identity mi_tmsi1;
+ mi_imsi1.type = mi_imsi2.type = GSM_MI_TYPE_IMSI;
+ mi_tmsi1.type = GSM_MI_TYPE_TMSI;
+ OSMO_STRLCPY_ARRAY(mi_imsi1.imsi, "1234");
+ OSMO_STRLCPY_ARRAY(mi_imsi2.imsi, "5678");
+ mi_tmsi1.tmsi = 987654321;
fprintf(stderr, "Testing bts_pch_timer dealloc on bts dealloc\n");
log_set_category_filter(osmo_stderr_target, DPCU, 1, LOGL_DEBUG);
fprintf(stderr, "Starting PCH timer for 2 IMSI\n");
- bts_pch_timer_start(bts, imsi1);
- bts_pch_timer_start(bts, imsi2);
+ bts_pch_timer_start(bts, &mi_imsi1, mi_imsi1.imsi);
+ bts_pch_timer_start(bts, &mi_imsi2, mi_imsi2.imsi);
+ fprintf(stderr, "Starting PCH timer for 1 TMSI\n");
+ bts_pch_timer_start(bts, &mi_tmsi1, "6666");
fprintf(stderr, "Deallocating BTS, expecting the PCH timer to be stopped and deallocated\n");
talloc_free(bts);
diff --git a/tests/alloc/AllocTest.err b/tests/alloc/AllocTest.err
index 1ca4b3ba..1f86336a 100644
--- a/tests/alloc/AllocTest.err
+++ b/tests/alloc/AllocTest.err
@@ -389,7 +389,7 @@ TBF{NEW}: Allocated
UL_ASS_TBF{NONE}: Allocated
DL_ASS_TBF{NONE}: Allocated
[DL] algo A <multi> (suggested TRX: -1): failed to find a usable TRX (TFI exhausted)
-TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
+TBF(TFI=-1 TLLI=0xffffffff DIR=DL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
TBF{NEW}: Deallocated
UL_ASS_TBF{NONE}: Deallocated
DL_ASS_TBF{NONE}: Deallocated
@@ -748,7 +748,7 @@ TBF{NEW}: Allocated
UL_ASS_TBF{NONE}: Allocated
DL_ASS_TBF{NONE}: Allocated
[UL] algo A <multi> (suggested TRX: -1): failed to allocate a TS, no USF available
-TBF(TFI=0 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
+TBF(TFI=-1 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
TBF{NEW}: Deallocated
UL_ASS_TBF{NONE}: Deallocated
DL_ASS_TBF{NONE}: Deallocated
@@ -1595,7 +1595,7 @@ TBF{NEW}: Allocated
UL_ASS_TBF{NONE}: Allocated
DL_ASS_TBF{NONE}: Allocated
[DL] algo A <multi> (suggested TRX: -1): failed to find a usable TRX (TFI exhausted)
-TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
+TBF(TFI=-1 TLLI=0xffffffff DIR=DL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
TBF{NEW}: Deallocated
UL_ASS_TBF{NONE}: Deallocated
DL_ASS_TBF{NONE}: Deallocated
@@ -2294,7 +2294,7 @@ TBF{NEW}: Allocated
UL_ASS_TBF{NONE}: Allocated
DL_ASS_TBF{NONE}: Allocated
[UL] algo A <multi> (suggested TRX: -1): failed to allocate a TS, no USF available
-TBF(TFI=0 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
+TBF(TFI=-1 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
TBF{NEW}: Deallocated
UL_ASS_TBF{NONE}: Deallocated
DL_ASS_TBF{NONE}: Deallocated
@@ -474805,7 +474805,7 @@ TBF{NEW}: Allocated
UL_ASS_TBF{NONE}: Allocated
DL_ASS_TBF{NONE}: Allocated
[UL] algo A <multi> (suggested TRX: -1): failed to allocate a TS, no USF available
-TBF(TFI=0 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
+TBF(TFI=-1 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
TBF{NEW}: Deallocated
UL_ASS_TBF{NONE}: Deallocated
DL_ASS_TBF{NONE}: Deallocated
@@ -474994,7 +474994,7 @@ TBF{NEW}: Allocated
UL_ASS_TBF{NONE}: Allocated
DL_ASS_TBF{NONE}: Allocated
No USF available
-TBF(TFI=0 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
+TBF(TFI=-1 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
TBF{NEW}: Deallocated
UL_ASS_TBF{NONE}: Deallocated
DL_ASS_TBF{NONE}: Deallocated
@@ -475183,7 +475183,7 @@ TBF{NEW}: Allocated
UL_ASS_TBF{NONE}: Allocated
DL_ASS_TBF{NONE}: Allocated
No USF available
-TBF(TFI=0 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
+TBF(TFI=-1 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
TBF{NEW}: Deallocated
UL_ASS_TBF{NONE}: Deallocated
DL_ASS_TBF{NONE}: Deallocated
@@ -475468,7 +475468,7 @@ TBF{NEW}: Allocated
UL_ASS_TBF{NONE}: Allocated
DL_ASS_TBF{NONE}: Allocated
No USF available
-TBF(TFI=0 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
+TBF(TFI=-1 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
TBF{NEW}: Deallocated
UL_ASS_TBF{NONE}: Deallocated
DL_ASS_TBF{NONE}: Deallocated
@@ -475681,7 +475681,7 @@ TBF{NEW}: Allocated
UL_ASS_TBF{NONE}: Allocated
DL_ASS_TBF{NONE}: Allocated
No USF available
-TBF(TFI=0 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
+TBF(TFI=-1 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
TBF{NEW}: Deallocated
UL_ASS_TBF{NONE}: Deallocated
DL_ASS_TBF{NONE}: Deallocated
@@ -475895,7 +475895,7 @@ UL_ASS_TBF{NONE}: Allocated
DL_ASS_TBF{NONE}: Allocated
No USF available
[UL] algo A <multi> (suggested TRX: -1): failed to allocate a TS, no USF available
-TBF(TFI=0 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
+TBF(TFI=-1 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
TBF{NEW}: Deallocated
UL_ASS_TBF{NONE}: Deallocated
DL_ASS_TBF{NONE}: Deallocated
@@ -476330,7 +476330,7 @@ TBF{NEW}: Allocated
UL_ASS_TBF{NONE}: Allocated
DL_ASS_TBF{NONE}: Allocated
[UL] algo A <multi> (suggested TRX: 0): failed to allocate a TS, no USF available
-TBF(TFI=0 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = 0, single_slot = 0
+TBF(TFI=-1 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = 0, single_slot = 0
TBF{NEW}: Deallocated
UL_ASS_TBF{NONE}: Deallocated
DL_ASS_TBF{NONE}: Deallocated
@@ -476529,7 +476529,7 @@ TBF{NEW}: Allocated
UL_ASS_TBF{NONE}: Allocated
DL_ASS_TBF{NONE}: Allocated
No USF available
-TBF(TFI=0 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = 0, single_slot = 0
+TBF(TFI=-1 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = 0, single_slot = 0
TBF{NEW}: Deallocated
UL_ASS_TBF{NONE}: Deallocated
DL_ASS_TBF{NONE}: Deallocated
@@ -476729,7 +476729,7 @@ UL_ASS_TBF{NONE}: Allocated
DL_ASS_TBF{NONE}: Allocated
No USF available
[UL] algo A <multi> (suggested TRX: 0): failed to allocate a TS, no USF available
-TBF(TFI=0 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = 0, single_slot = 0
+TBF(TFI=-1 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = 0, single_slot = 0
TBF{NEW}: Deallocated
UL_ASS_TBF{NONE}: Deallocated
DL_ASS_TBF{NONE}: Deallocated
@@ -479307,7 +479307,7 @@ TBF{NEW}: Allocated
UL_ASS_TBF{NONE}: Allocated
DL_ASS_TBF{NONE}: Allocated
[UL] algo A <multi> (suggested TRX: -1): failed to find a usable TRX (TFI exhausted)
-TBF(TFI=0 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
+TBF(TFI=-1 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
TBF{NEW}: Deallocated
UL_ASS_TBF{NONE}: Deallocated
DL_ASS_TBF{NONE}: Deallocated
@@ -479836,7 +479836,7 @@ UL_ASS_TBF{NONE}: Allocated
DL_ASS_TBF{NONE}: Allocated
No TFI available (suggested TRX: 0).
[DL] algo B <multi> (suggested TRX: 0): failed to allocate a TFI
-TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW) Timeslot Allocation failed: trx = 0, single_slot = 0
+TBF(TFI=-1 TLLI=0xffffffff DIR=DL STATE=NEW) Timeslot Allocation failed: trx = 0, single_slot = 0
TBF{NEW}: Deallocated
UL_ASS_TBF{NONE}: Deallocated
DL_ASS_TBF{NONE}: Deallocated
@@ -481537,7 +481537,7 @@ TBF{NEW}: Allocated
UL_ASS_TBF{NONE}: Allocated
DL_ASS_TBF{NONE}: Allocated
[UL] algo A <multi> (suggested TRX: -1): failed to find a usable TRX (TFI exhausted)
-TBF(TFI=0 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
+TBF(TFI=-1 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
TBF{NEW}: Deallocated
UL_ASS_TBF{NONE}: Deallocated
DL_ASS_TBF{NONE}: Deallocated
@@ -482112,7 +482112,7 @@ TBF{NEW}: Allocated
UL_ASS_TBF{NONE}: Allocated
DL_ASS_TBF{NONE}: Allocated
[UL] algo A <multi> (suggested TRX: 0): failed to allocate a TS, no USF available
-TBF(TFI=0 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = 0, single_slot = 0
+TBF(TFI=-1 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = 0, single_slot = 0
TBF{NEW}: Deallocated
UL_ASS_TBF{NONE}: Deallocated
DL_ASS_TBF{NONE}: Deallocated
@@ -482371,7 +482371,7 @@ TBF{NEW}: Allocated
UL_ASS_TBF{NONE}: Allocated
DL_ASS_TBF{NONE}: Allocated
No USF available
-TBF(TFI=0 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = 0, single_slot = 0
+TBF(TFI=-1 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = 0, single_slot = 0
TBF{NEW}: Deallocated
UL_ASS_TBF{NONE}: Deallocated
DL_ASS_TBF{NONE}: Deallocated
@@ -482631,7 +482631,7 @@ UL_ASS_TBF{NONE}: Allocated
DL_ASS_TBF{NONE}: Allocated
No USF available
[UL] algo A <multi> (suggested TRX: 0): failed to allocate a TS, no USF available
-TBF(TFI=0 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = 0, single_slot = 0
+TBF(TFI=-1 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = 0, single_slot = 0
TBF{NEW}: Deallocated
UL_ASS_TBF{NONE}: Deallocated
DL_ASS_TBF{NONE}: Deallocated
@@ -482854,7 +482854,7 @@ TBF{NEW}: Allocated
UL_ASS_TBF{NONE}: Allocated
DL_ASS_TBF{NONE}: Allocated
[UL] algo A <multi> (suggested TRX: -1): failed to allocate a TS, no USF available
-TBF(TFI=0 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
+TBF(TFI=-1 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
TBF{NEW}: Deallocated
UL_ASS_TBF{NONE}: Deallocated
DL_ASS_TBF{NONE}: Deallocated
@@ -482953,7 +482953,7 @@ TBF{NEW}: Allocated
UL_ASS_TBF{NONE}: Allocated
DL_ASS_TBF{NONE}: Allocated
No USF available
-TBF(TFI=0 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
+TBF(TFI=-1 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
TBF{NEW}: Deallocated
UL_ASS_TBF{NONE}: Deallocated
DL_ASS_TBF{NONE}: Deallocated
@@ -483095,7 +483095,7 @@ UL_ASS_TBF{NONE}: Allocated
DL_ASS_TBF{NONE}: Allocated
No USF available
[UL] algo A <multi> (suggested TRX: -1): failed to allocate a TS, no USF available
-TBF(TFI=0 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
+TBF(TFI=-1 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
TBF{NEW}: Deallocated
UL_ASS_TBF{NONE}: Deallocated
DL_ASS_TBF{NONE}: Deallocated
@@ -484069,7 +484069,7 @@ TBF{NEW}: Allocated
UL_ASS_TBF{NONE}: Allocated
DL_ASS_TBF{NONE}: Allocated
[DL] algo A <multi> (suggested TRX: -1): failed to find a usable TRX (TFI exhausted)
-TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
+TBF(TFI=-1 TLLI=0xffffffff DIR=DL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
TBF{NEW}: Deallocated
UL_ASS_TBF{NONE}: Deallocated
DL_ASS_TBF{NONE}: Deallocated
@@ -484272,7 +484272,7 @@ UL_ASS_TBF{NONE}: Allocated
DL_ASS_TBF{NONE}: Allocated
No TFI available (suggested TRX: -1).
[DL] algo B <multi> (suggested TRX: -1): failed to allocate a TFI
-TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
+TBF(TFI=-1 TLLI=0xffffffff DIR=DL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
TBF{NEW}: Deallocated
UL_ASS_TBF{NONE}: Deallocated
DL_ASS_TBF{NONE}: Deallocated
@@ -484959,7 +484959,7 @@ TBF{NEW}: Allocated
UL_ASS_TBF{NONE}: Allocated
DL_ASS_TBF{NONE}: Allocated
[DL] algo A <multi> (suggested TRX: -1): failed to find a usable TRX (TFI exhausted)
-TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
+TBF(TFI=-1 TLLI=0xffffffff DIR=DL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
TBF{NEW}: Deallocated
UL_ASS_TBF{NONE}: Deallocated
DL_ASS_TBF{NONE}: Deallocated
@@ -487533,7 +487533,7 @@ TBF{NEW}: Allocated
UL_ASS_TBF{NONE}: Allocated
DL_ASS_TBF{NONE}: Allocated
[UL] algo A <multi> (suggested TRX: -1): failed to find a usable TRX (TFI exhausted)
-TBF(TFI=0 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
+TBF(TFI=-1 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
TBF{NEW}: Deallocated
UL_ASS_TBF{NONE}: Deallocated
DL_ASS_TBF{NONE}: Deallocated
@@ -487753,7 +487753,7 @@ TBF{NEW}: Allocated
UL_ASS_TBF{NONE}: Allocated
DL_ASS_TBF{NONE}: Allocated
[UL] algo A <multi> (suggested TRX: 0): failed to allocate a TS, no USF available
-TBF(TFI=0 TLLI=0xc0000023 DIR=UL STATE=NEW) Timeslot Allocation failed: trx = 0, single_slot = 0
+TBF(TFI=-1 TLLI=0xc0000023 DIR=UL STATE=NEW) Timeslot Allocation failed: trx = 0, single_slot = 0
TBF{NEW}: Deallocated
UL_ASS_TBF{NONE}: Deallocated
DL_ASS_TBF{NONE}: Deallocated
@@ -491263,7 +491263,7 @@ TBF{NEW}: Allocated
UL_ASS_TBF{NONE}: Allocated
DL_ASS_TBF{NONE}: Allocated
[UL] algo A <multi> (suggested TRX: -1): failed to find a usable TRX (TFI exhausted)
-TBF(TFI=0 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
+TBF(TFI=-1 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
TBF{NEW}: Deallocated
UL_ASS_TBF{NONE}: Deallocated
DL_ASS_TBF{NONE}: Deallocated
@@ -493033,7 +493033,7 @@ TBF{NEW}: Allocated
UL_ASS_TBF{NONE}: Allocated
DL_ASS_TBF{NONE}: Allocated
[DL] algo A <multi> (suggested TRX: -1): failed to find a usable TRX (TFI exhausted)
-TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
+TBF(TFI=-1 TLLI=0xffffffff DIR=DL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
TBF{NEW}: Deallocated
UL_ASS_TBF{NONE}: Deallocated
DL_ASS_TBF{NONE}: Deallocated
@@ -493563,7 +493563,7 @@ UL_ASS_TBF{NONE}: Allocated
DL_ASS_TBF{NONE}: Allocated
No TFI available (suggested TRX: 0).
[DL] algo B <multi> (suggested TRX: 0): failed to allocate a TFI
-TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW) Timeslot Allocation failed: trx = 0, single_slot = 0
+TBF(TFI=-1 TLLI=0xffffffff DIR=DL STATE=NEW) Timeslot Allocation failed: trx = 0, single_slot = 0
TBF{NEW}: Deallocated
UL_ASS_TBF{NONE}: Deallocated
DL_ASS_TBF{NONE}: Deallocated
@@ -493679,7 +493679,7 @@ TBF{NEW}: Allocated
UL_ASS_TBF{NONE}: Allocated
DL_ASS_TBF{NONE}: Allocated
No USF available
-TBF(TFI=0 TLLI=0xc0000011 DIR=UL STATE=NEW) Timeslot Allocation failed: trx = 0, single_slot = 0
+TBF(TFI=-1 TLLI=0xc0000011 DIR=UL STATE=NEW) Timeslot Allocation failed: trx = 0, single_slot = 0
TBF{NEW}: Deallocated
UL_ASS_TBF{NONE}: Deallocated
DL_ASS_TBF{NONE}: Deallocated
@@ -494436,7 +494436,7 @@ UL_ASS_TBF{NONE}: Allocated
DL_ASS_TBF{NONE}: Allocated
No TFI available (suggested TRX: 0).
[DL] algo B <multi> (suggested TRX: 0): failed to allocate a TFI
-TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW) Timeslot Allocation failed: trx = 0, single_slot = 0
+TBF(TFI=-1 TLLI=0xffffffff DIR=DL STATE=NEW) Timeslot Allocation failed: trx = 0, single_slot = 0
TBF{NEW}: Deallocated
UL_ASS_TBF{NONE}: Deallocated
DL_ASS_TBF{NONE}: Deallocated
@@ -494803,7 +494803,7 @@ UL_ASS_TBF{NONE}: Allocated
DL_ASS_TBF{NONE}: Allocated
No TFI available (suggested TRX: -1).
[DL] algo B <multi> (suggested TRX: -1): failed to allocate a TFI
-TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
+TBF(TFI=-1 TLLI=0xffffffff DIR=DL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
TBF{NEW}: Deallocated
UL_ASS_TBF{NONE}: Deallocated
DL_ASS_TBF{NONE}: Deallocated
@@ -496297,7 +496297,7 @@ TBF{NEW}: Allocated
UL_ASS_TBF{NONE}: Allocated
DL_ASS_TBF{NONE}: Allocated
[UL] algo A <multi> (suggested TRX: -1): failed to find a usable TRX (TFI exhausted)
-TBF(TFI=0 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
+TBF(TFI=-1 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
TBF{NEW}: Deallocated
UL_ASS_TBF{NONE}: Deallocated
DL_ASS_TBF{NONE}: Deallocated
@@ -496409,7 +496409,7 @@ TBF{NEW}: Allocated
UL_ASS_TBF{NONE}: Allocated
DL_ASS_TBF{NONE}: Allocated
[UL] algo A <multi> (suggested TRX: 0): failed to allocate a TS, no USF available
-TBF(TFI=0 TLLI=0xc0000011 DIR=UL STATE=NEW) Timeslot Allocation failed: trx = 0, single_slot = 0
+TBF(TFI=-1 TLLI=0xc0000011 DIR=UL STATE=NEW) Timeslot Allocation failed: trx = 0, single_slot = 0
TBF{NEW}: Deallocated
UL_ASS_TBF{NONE}: Deallocated
DL_ASS_TBF{NONE}: Deallocated
@@ -499422,7 +499422,7 @@ TBF{NEW}: Allocated
UL_ASS_TBF{NONE}: Allocated
DL_ASS_TBF{NONE}: Allocated
[UL] algo A <multi> (suggested TRX: -1): failed to find a usable TRX (TFI exhausted)
-TBF(TFI=0 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
+TBF(TFI=-1 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
TBF{NEW}: Deallocated
UL_ASS_TBF{NONE}: Deallocated
DL_ASS_TBF{NONE}: Deallocated
@@ -501192,7 +501192,7 @@ TBF{NEW}: Allocated
UL_ASS_TBF{NONE}: Allocated
DL_ASS_TBF{NONE}: Allocated
[DL] algo A <multi> (suggested TRX: -1): failed to find a usable TRX (TFI exhausted)
-TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
+TBF(TFI=-1 TLLI=0xffffffff DIR=DL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 0
TBF{NEW}: Deallocated
UL_ASS_TBF{NONE}: Deallocated
DL_ASS_TBF{NONE}: Deallocated
@@ -501219,8 +501219,11 @@ UL_ASS_TBF(DL-TFI_1){NONE}: Deallocated
DL_ASS_TBF(DL-TFI_1){NONE}: Deallocated
Testing bts_pch_timer dealloc on bts dealloc
Starting PCH timer for 2 IMSI
-PCH paging timer started for IMSI=1234
-PCH paging timer started for IMSI=5678
+PCH paging timer started for MI=IMSI-1234 IMSI=1234
+PCH paging timer started for MI=IMSI-5678 IMSI=5678
+Starting PCH timer for 1 TMSI
+PCH paging timer started for MI=TMSI-0x3ADE68B1 IMSI=6666
Deallocating BTS, expecting the PCH timer to be stopped and deallocated
PCH paging timer stopped for IMSI=1234
PCH paging timer stopped for IMSI=5678
+PCH paging timer stopped for IMSI=6666
diff --git a/tests/alloc/MslotTest.cpp b/tests/alloc/MslotTest.cpp
index 96fe61be..1b06b0b8 100644
--- a/tests/alloc/MslotTest.cpp
+++ b/tests/alloc/MslotTest.cpp
@@ -11,10 +11,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "gprs_rlcmac.h"
diff --git a/tests/app_info/AppInfoTest.cpp b/tests/app_info/AppInfoTest.cpp
index d3a047e2..9530d099 100644
--- a/tests/app_info/AppInfoTest.cpp
+++ b/tests/app_info/AppInfoTest.cpp
@@ -9,10 +9,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <cstdlib>
diff --git a/tests/app_info/AppInfoTest.err b/tests/app_info/AppInfoTest.err
index a8c4511e..1a9fab02 100644
--- a/tests/app_info/AppInfoTest.err
+++ b/tests/app_info/AppInfoTest.err
@@ -10,6 +10,10 @@ Application Information Request received: type=0x00000000 len=0
Packet Application Information will not be sent, no subscribers with active TBF
--- prepare_bts_with_two_dl_tbf_subscr ---
+PDCH(bts=0,trx=0,ts=4) PDCH state: disabled => enabled
+PDCH(bts=0,trx=0,ts=5) PDCH state: disabled => enabled
+PDCH(bts=0,trx=0,ts=6) PDCH state: disabled => enabled
+PDCH(bts=0,trx=0,ts=7) PDCH state: disabled => enabled
Creating MS object, TLLI = 0xffffffff
Modifying MS object, TLLI = 0xffffffff, MS class 0 -> 10
Modifying MS object, TLLI = 0xffffffff, EGPRS MS class 0 -> 11
@@ -52,14 +56,14 @@ Previous Packet Application Information was not sent to all subscribers, overwri
Sending Packet Application Information to 2 subscribers with active TBF
--- cleanup ---
-PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW EGPRS), 1 TBFs, USFs = 00, TFIs = 00000002.
-PDCH(bts=0,trx=0,ts=5) Detaching TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW EGPRS), 1 TBFs, USFs = 00, TFIs = 00000002.
-PDCH(bts=0,trx=0,ts=6) Detaching TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW EGPRS), 1 TBFs, USFs = 00, TFIs = 00000002.
-PDCH(bts=0,trx=0,ts=7) Detaching TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW EGPRS), 0 TBFs, USFs = 00, TFIs = 00000000.
+PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW EGPRS), 2 TBFs, USFs = 00, TFIs = 00000003.
+PDCH(bts=0,trx=0,ts=5) Detaching TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW EGPRS), 2 TBFs, USFs = 00, TFIs = 00000003.
+PDCH(bts=0,trx=0,ts=6) Detaching TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW EGPRS), 2 TBFs, USFs = 00, TFIs = 00000003.
+PDCH(bts=0,trx=0,ts=7) Detaching TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW EGPRS), 1 TBFs, USFs = 00, TFIs = 00000001.
MS(TLLI=0xffffffff, IMSI=, TA=220, 10/11,) Detaching TBF: TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW EGPRS)
-PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=1 TLLI=0xffffffff DIR=DL STATE=NEW EGPRS), 0 TBFs, USFs = 00, TFIs = 00000000.
-PDCH(bts=0,trx=0,ts=5) Detaching TBF(TFI=1 TLLI=0xffffffff DIR=DL STATE=NEW EGPRS), 0 TBFs, USFs = 00, TFIs = 00000000.
-PDCH(bts=0,trx=0,ts=6) Detaching TBF(TFI=1 TLLI=0xffffffff DIR=DL STATE=NEW EGPRS), 0 TBFs, USFs = 00, TFIs = 00000000.
+PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=1 TLLI=0xffffffff DIR=DL STATE=NEW EGPRS), 1 TBFs, USFs = 00, TFIs = 00000002.
+PDCH(bts=0,trx=0,ts=5) Detaching TBF(TFI=1 TLLI=0xffffffff DIR=DL STATE=NEW EGPRS), 1 TBFs, USFs = 00, TFIs = 00000002.
+PDCH(bts=0,trx=0,ts=6) Detaching TBF(TFI=1 TLLI=0xffffffff DIR=DL STATE=NEW EGPRS), 1 TBFs, USFs = 00, TFIs = 00000002.
MS(TLLI=0xffffffff, IMSI=, TA=220, 12/13,) Detaching TBF: TBF(TFI=1 TLLI=0xffffffff DIR=DL STATE=NEW EGPRS)
MS(TLLI=0xffffffff, IMSI=, TA=220, 12/13,) Destroying MS object
MS(TLLI=0xffffffff, IMSI=, TA=220, 10/11,) Destroying MS object
diff --git a/tests/ms/MsTest.err b/tests/ms/MsTest.err
index 6adbfc48..d4895b9b 100644
--- a/tests/ms/MsTest.err
+++ b/tests/ms/MsTest.err
@@ -1,22 +1,22 @@
Creating MS object, TLLI = 0xffeeddbb
-MS(TLLI=0xffeeddbb, IMSI=, TA=220, 0/0,) Attaching UL TBF: TBF(TFI=0 TLLI=0xffeeddbb DIR=UL STATE=NEW)
-MS(TLLI=0xffeeddbb, IMSI=, TA=220, 0/0, UL) Attaching DL TBF: TBF(TFI=0 TLLI=0xffeeddbb DIR=DL STATE=NEW)
-MS(TLLI=0xffeeddbb, IMSI=, TA=220, 0/0, DL) Detaching TBF: TBF(TFI=0 TLLI=0xffeeddbb DIR=UL STATE=NEW)
-MS(TLLI=0xffeeddbb, IMSI=, TA=220, 0/0,) Detaching TBF: TBF(TFI=0 TLLI=0xffeeddbb DIR=DL STATE=NEW)
+MS(TLLI=0xffeeddbb, IMSI=, TA=220, 0/0,) Attaching UL TBF: TBF(TFI=-1 TLLI=0xffeeddbb DIR=UL STATE=NEW)
+MS(TLLI=0xffeeddbb, IMSI=, TA=220, 0/0, UL) Attaching DL TBF: TBF(TFI=-1 TLLI=0xffeeddbb DIR=DL STATE=NEW)
+MS(TLLI=0xffeeddbb, IMSI=, TA=220, 0/0, DL) Detaching TBF: TBF(TFI=-1 TLLI=0xffeeddbb DIR=UL STATE=NEW)
+MS(TLLI=0xffeeddbb, IMSI=, TA=220, 0/0,) Detaching TBF: TBF(TFI=-1 TLLI=0xffeeddbb DIR=DL STATE=NEW)
MS(TLLI=0xffeeddbb, IMSI=, TA=220, 0/0,) Destroying MS object
Creating MS object, TLLI = 0xffeeddbb
-MS(TLLI=0xffeeddbb, IMSI=, TA=220, 0/0,) Attaching UL TBF: TBF(TFI=0 TLLI=0xffeeddbb DIR=UL STATE=NEW)
-MS(TLLI=0xffeeddbb, IMSI=, TA=220, 0/0, UL) Attaching DL TBF: TBF(TFI=0 TLLI=0xffeeddbb DIR=DL STATE=NEW)
-MS(TLLI=0xffeeddbb, IMSI=, TA=220, 0/0, DL) Detaching TBF: TBF(TFI=0 TLLI=0xffeeddbb DIR=UL STATE=NEW)
-MS(TLLI=0xffeeddbb, IMSI=, TA=220, 0/0,) Detaching TBF: TBF(TFI=0 TLLI=0xffeeddbb DIR=DL STATE=NEW)
+MS(TLLI=0xffeeddbb, IMSI=, TA=220, 0/0,) Attaching UL TBF: TBF(TFI=-1 TLLI=0xffeeddbb DIR=UL STATE=NEW)
+MS(TLLI=0xffeeddbb, IMSI=, TA=220, 0/0, UL) Attaching DL TBF: TBF(TFI=-1 TLLI=0xffeeddbb DIR=DL STATE=NEW)
+MS(TLLI=0xffeeddbb, IMSI=, TA=220, 0/0, DL) Detaching TBF: TBF(TFI=-1 TLLI=0xffeeddbb DIR=UL STATE=NEW)
+MS(TLLI=0xffeeddbb, IMSI=, TA=220, 0/0,) Detaching TBF: TBF(TFI=-1 TLLI=0xffeeddbb DIR=DL STATE=NEW)
MS(TLLI=0xffeeddbb, IMSI=, TA=220, 0/0,) Destroying MS object
Creating MS object, TLLI = 0xffeeddbb
-MS(TLLI=0xffeeddbb, IMSI=, TA=220, 0/0,) Attaching DL TBF: TBF(TFI=0 TLLI=0xffeeddbb DIR=DL STATE=NEW)
-MS(TLLI=0xffeeddbb, IMSI=, TA=220, 0/0, DL) Attaching DL TBF: TBF(TFI=0 TLLI=0xffeeddbb DIR=DL STATE=NEW)
-MS(TLLI=0xffeeddbb, IMSI=, TA=220, 0/0, DL) Attaching UL TBF: TBF(TFI=0 TLLI=0xffeeddbb DIR=UL STATE=NEW)
-MS(TLLI=0xffeeddbb, IMSI=, TA=220, 0/0, DL) Detaching TBF: TBF(TFI=0 TLLI=0xffeeddbb DIR=UL STATE=NEW)
-MS(TLLI=0xffeeddbb, IMSI=, TA=220, 0/0, DL) Detaching TBF: TBF(TFI=0 TLLI=0xffeeddbb DIR=DL STATE=NEW)
-MS(TLLI=0xffeeddbb, IMSI=, TA=220, 0/0,) Detaching TBF: TBF(TFI=0 TLLI=0xffeeddbb DIR=DL STATE=NEW)
+MS(TLLI=0xffeeddbb, IMSI=, TA=220, 0/0,) Attaching DL TBF: TBF(TFI=-1 TLLI=0xffeeddbb DIR=DL STATE=NEW)
+MS(TLLI=0xffeeddbb, IMSI=, TA=220, 0/0, DL) Attaching DL TBF: TBF(TFI=-1 TLLI=0xffeeddbb DIR=DL STATE=NEW)
+MS(TLLI=0xffeeddbb, IMSI=, TA=220, 0/0, DL) Attaching UL TBF: TBF(TFI=-1 TLLI=0xffeeddbb DIR=UL STATE=NEW)
+MS(TLLI=0xffeeddbb, IMSI=, TA=220, 0/0, DL) Detaching TBF: TBF(TFI=-1 TLLI=0xffeeddbb DIR=UL STATE=NEW)
+MS(TLLI=0xffeeddbb, IMSI=, TA=220, 0/0, DL) Detaching TBF: TBF(TFI=-1 TLLI=0xffeeddbb DIR=DL STATE=NEW)
+MS(TLLI=0xffeeddbb, IMSI=, TA=220, 0/0,) Detaching TBF: TBF(TFI=-1 TLLI=0xffeeddbb DIR=DL STATE=NEW)
MS(TLLI=0xffeeddbb, IMSI=, TA=220, 0/0,) Destroying MS object
Creating MS object, TLLI = 0xaa000000
Modifying MS object, UL TLLI: 0xaa000000 -> 0xff001111, not yet confirmed
@@ -41,21 +41,21 @@ Modifying MS object, TLLI = 0xffeeddbb, IMSI '' -> '001001987654321'
Creating MS object, TLLI = 0xffffffff
Modifying MS object, UL TLLI: 0xffffffff -> 0xffeeddbc, not yet confirmed
Modifying MS object, TLLI = 0xffeeddbc, IMSI '' -> '001001987654322'
-MS(TLLI=0xffeeddbb, IMSI=001001987654321, TA=220, 0/0,) Attaching UL TBF: TBF(TFI=0 TLLI=0xffeeddbb DIR=UL STATE=NEW)
-MS(TLLI=0xffeeddbb, IMSI=001001987654321, TA=220, 0/0,) Detaching TBF: TBF(TFI=0 TLLI=0xffeeddbb DIR=UL STATE=NEW)
+MS(TLLI=0xffeeddbb, IMSI=001001987654321, TA=220, 0/0,) Attaching UL TBF: TBF(TFI=-1 TLLI=0xffeeddbb DIR=UL STATE=NEW)
+MS(TLLI=0xffeeddbb, IMSI=001001987654321, TA=220, 0/0,) Detaching TBF: TBF(TFI=-1 TLLI=0xffeeddbb DIR=UL STATE=NEW)
MS(TLLI=0xffeeddbb, IMSI=001001987654321, TA=220, 0/0,) Destroying MS object
-MS(TLLI=0xffeeddbc, IMSI=001001987654322, TA=220, 0/0,) Attaching UL TBF: TBF(TFI=0 TLLI=0xffffffff DIR=UL STATE=NEW)
-MS(TLLI=0xffeeddbc, IMSI=001001987654322, TA=220, 0/0,) Detaching TBF: TBF(TFI=0 TLLI=0xffffffff DIR=UL STATE=NEW)
+MS(TLLI=0xffeeddbc, IMSI=001001987654322, TA=220, 0/0,) Attaching UL TBF: TBF(TFI=-1 TLLI=0xffffffff DIR=UL STATE=NEW)
+MS(TLLI=0xffeeddbc, IMSI=001001987654322, TA=220, 0/0,) Detaching TBF: TBF(TFI=-1 TLLI=0xffffffff DIR=UL STATE=NEW)
MS(TLLI=0xffeeddbc, IMSI=001001987654322, TA=220, 0/0,) Destroying MS object
Creating MS object, TLLI = 0xffeeddbb
-MS(TLLI=0xffeeddbb, IMSI=, TA=220, 0/0,) Attaching UL TBF: TBF(TFI=0 TLLI=0xffeeddbb DIR=UL STATE=NEW)
-MS(TLLI=0xffeeddbb, IMSI=, TA=220, 0/0, UL) Attaching DL TBF: TBF(TFI=0 TLLI=0xffeeddbb DIR=DL STATE=NEW)
-MS(TLLI=0xffeeddbb, IMSI=, TA=220, 0/0, DL) Detaching TBF: TBF(TFI=0 TLLI=0xffeeddbb DIR=UL STATE=NEW)
-MS(TLLI=0xffeeddbb, IMSI=, TA=220, 0/0,) Detaching TBF: TBF(TFI=0 TLLI=0xffeeddbb DIR=DL STATE=NEW)
+MS(TLLI=0xffeeddbb, IMSI=, TA=220, 0/0,) Attaching UL TBF: TBF(TFI=-1 TLLI=0xffeeddbb DIR=UL STATE=NEW)
+MS(TLLI=0xffeeddbb, IMSI=, TA=220, 0/0, UL) Attaching DL TBF: TBF(TFI=-1 TLLI=0xffeeddbb DIR=DL STATE=NEW)
+MS(TLLI=0xffeeddbb, IMSI=, TA=220, 0/0, DL) Detaching TBF: TBF(TFI=-1 TLLI=0xffeeddbb DIR=UL STATE=NEW)
+MS(TLLI=0xffeeddbb, IMSI=, TA=220, 0/0,) Detaching TBF: TBF(TFI=-1 TLLI=0xffeeddbb DIR=DL STATE=NEW)
MS(TLLI=0xffeeddbb, IMSI=, TA=220, 0/0,) Release timer expired
MS(TLLI=0xffeeddbb, IMSI=, TA=220, 0/0,) Destroying MS object
Creating MS object, TLLI = 0xffeeddbb
-MS(TLLI=0xffeeddbb, IMSI=, TA=220, 0/0,) Attaching DL TBF: TBF(TFI=0 TLLI=0xffeeddbb DIR=DL STATE=NEW)
+MS(TLLI=0xffeeddbb, IMSI=, TA=220, 0/0,) Attaching DL TBF: TBF(TFI=-1 TLLI=0xffeeddbb DIR=DL STATE=NEW)
Creating MS object, TLLI = 0xdeadbeef
Creating MS object, TLLI = 0xdeadbef0
-MS(TLLI=0xdeadbef0, IMSI=, TA=220, 0/0,) Attaching DL TBF: TBF(TFI=0 TLLI=0xdeadbef0 DIR=DL STATE=NEW)
+MS(TLLI=0xdeadbef0, IMSI=, TA=220, 0/0,) Attaching DL TBF: TBF(TFI=-1 TLLI=0xdeadbef0 DIR=DL STATE=NEW)
diff --git a/tests/rlcmac/RLCMACTest.cpp b/tests/rlcmac/RLCMACTest.cpp
index 88847de6..30476c55 100644
--- a/tests/rlcmac/RLCMACTest.cpp
+++ b/tests/rlcmac/RLCMACTest.cpp
@@ -11,10 +11,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
diff --git a/tests/tbf/TbfTest.cpp b/tests/tbf/TbfTest.cpp
index 8700347d..9bea528b 100644
--- a/tests/tbf/TbfTest.cpp
+++ b/tests/tbf/TbfTest.cpp
@@ -1718,7 +1718,7 @@ static void send_dl_data(struct gprs_rlcmac_bts *bts, uint32_t tlli, const char
OSMO_ASSERT(ms != NULL);
OSMO_ASSERT(ms_dl_tbf(ms) != NULL);
- if (imsi[0] && strcmp(imsi, "000") != 0) {
+ if (imsi[0] != '\0') {
ms2 = bts_ms_by_tlli(bts, tlli, GSM_RESERVED_TMSI);
OSMO_ASSERT(ms == ms2);
}
diff --git a/tests/tbf/TbfTest.err b/tests/tbf/TbfTest.err
index 26ba446e..892b31ed 100644
--- a/tests/tbf/TbfTest.err
+++ b/tests/tbf/TbfTest.err
@@ -1,6 +1,8 @@
=== start test_tbf_base ===
=== end test_tbf_base ===
=== start test_tbf_tlli_update ===
+PDCH(bts=0,trx=0,ts=2) PDCH state: disabled => enabled
+PDCH(bts=0,trx=0,ts=3) PDCH state: disabled => enabled
Creating MS object, TLLI = 0xffffffff
MS(TLLI=0xffffffff, IMSI=, TA=220, 0/0,) ********** DL-TBF starts here **********
MS(TLLI=0xffffffff, IMSI=, TA=220, 0/0,) Allocating DL TBF
@@ -47,6 +49,7 @@ Modifying MS object, TLLI: 0x00002342 -> 0x00004232, already confirmed partly
Modifying MS object, TLLI = 0x00004232, TA 4 -> 6
=== end test_tbf_tlli_update ===
=== start test_tbf_final_ack ===
+PDCH(bts=0,trx=0,ts=4) PDCH state: disabled => enabled
Creating MS object, TLLI = 0xffffffff
Modifying MS object, TLLI = 0xffffffff, MS class 0 -> 45
Found first unallocated TRX=0 TFI=0
@@ -84,7 +87,6 @@ TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) appending 200 bytes
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) appending 200 bytes
DL_ASS_TBF(DL-TFI_0){SEND_ASS}: Received Event CREATE_RLCMAC_MSG
PDCH(bts=0,trx=0,ts=4) POLL scheduled at FN 0 + 13 = 13
-TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) New and old TBF are the same.
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) start Packet Downlink Assignment (PACCH)
+++++++++++++++++++++++++ TX : Packet Downlink Assignment +++++++++++++++++++++++++
------------------------- TX : Packet Downlink Assignment -------------------------
@@ -144,14 +146,14 @@ TBF(TFI=1 TLLI=0xffeeddcc DIR=DL STATE=NEW) set ass. type PACCH [prev CCCH:0, PA
TBF(DL-TFI_1){NEW}: state_chg to ASSIGN
TBF(TFI=1 TLLI=0xffeeddcc DIR=DL STATE=ASSIGN) Starting timer X2001 [assignment (PACCH)] with 2 sec. 0 microsec
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE) free
-PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE), 1 TBFs, USFs = 00, TFIs = 00000002.
+PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE), 2 TBFs, USFs = 00, TFIs = 00000003.
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 45/0, DL) Detaching TBF: TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE)
********** DL-TBF ends here **********
TBF(DL-TFI_0){WAIT_RELEASE}: Deallocated
UL_ASS_TBF(DL-TFI_0){NONE}: Deallocated
DL_ASS_TBF(DL-TFI_0){WAIT_ACK}: Deallocated
TBF(TFI=1 TLLI=0xffeeddcc DIR=DL STATE=ASSIGN) free
-PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=1 TLLI=0xffeeddcc DIR=DL STATE=ASSIGN), 0 TBFs, USFs = 00, TFIs = 00000000.
+PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=1 TLLI=0xffeeddcc DIR=DL STATE=ASSIGN), 1 TBFs, USFs = 00, TFIs = 00000002.
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 45/0,) Detaching TBF: TBF(TFI=1 TLLI=0xffeeddcc DIR=DL STATE=ASSIGN)
********** DL-TBF ends here **********
TBF(DL-TFI_1){ASSIGN}: Deallocated
@@ -160,6 +162,7 @@ DL_ASS_TBF(DL-TFI_1){NONE}: Deallocated
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 45/0,) Destroying MS object
=== end test_tbf_final_ack ===
=== start test_tbf_final_ack ===
+PDCH(bts=0,trx=0,ts=4) PDCH state: disabled => enabled
Creating MS object, TLLI = 0xffffffff
Modifying MS object, TLLI = 0xffffffff, MS class 0 -> 45
Found first unallocated TRX=0 TFI=0
@@ -197,7 +200,6 @@ TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) appending 200 bytes
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) appending 200 bytes
DL_ASS_TBF(DL-TFI_0){SEND_ASS}: Received Event CREATE_RLCMAC_MSG
PDCH(bts=0,trx=0,ts=4) POLL scheduled at FN 0 + 13 = 13
-TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) New and old TBF are the same.
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) start Packet Downlink Assignment (PACCH)
+++++++++++++++++++++++++ TX : Packet Downlink Assignment +++++++++++++++++++++++++
------------------------- TX : Packet Downlink Assignment -------------------------
@@ -257,14 +259,14 @@ TBF(TFI=1 TLLI=0xffeeddcc DIR=DL STATE=NEW) set ass. type PACCH [prev CCCH:0, PA
TBF(DL-TFI_1){NEW}: state_chg to ASSIGN
TBF(TFI=1 TLLI=0xffeeddcc DIR=DL STATE=ASSIGN) Starting timer X2001 [assignment (PACCH)] with 2 sec. 0 microsec
TBF(TFI=1 TLLI=0xffeeddcc DIR=DL STATE=ASSIGN) free
-PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=1 TLLI=0xffeeddcc DIR=DL STATE=ASSIGN), 1 TBFs, USFs = 00, TFIs = 00000001.
+PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=1 TLLI=0xffeeddcc DIR=DL STATE=ASSIGN), 2 TBFs, USFs = 00, TFIs = 00000003.
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 45/0,) Detaching TBF: TBF(TFI=1 TLLI=0xffeeddcc DIR=DL STATE=ASSIGN)
********** DL-TBF ends here **********
TBF(DL-TFI_1){ASSIGN}: Deallocated
UL_ASS_TBF(DL-TFI_1){NONE}: Deallocated
DL_ASS_TBF(DL-TFI_1){NONE}: Deallocated
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE) free
-PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE), 0 TBFs, USFs = 00, TFIs = 00000000.
+PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE), 1 TBFs, USFs = 00, TFIs = 00000001.
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 45/0,) Detaching TBF: TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE)
********** DL-TBF ends here **********
TBF(DL-TFI_0){WAIT_RELEASE}: Deallocated
@@ -273,6 +275,7 @@ DL_ASS_TBF(DL-TFI_0){WAIT_ACK}: Deallocated
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 45/0,) Destroying MS object
=== end test_tbf_final_ack ===
=== start test_tbf_delayed_release ===
+PDCH(bts=0,trx=0,ts=4) PDCH state: disabled => enabled
Creating MS object, TLLI = 0xffffffff
Modifying MS object, TLLI = 0xffffffff, MS class 0 -> 45
Found first unallocated TRX=0 TFI=0
@@ -310,7 +313,6 @@ TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) appending 200 bytes
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) appending 200 bytes
DL_ASS_TBF(DL-TFI_0){SEND_ASS}: Received Event CREATE_RLCMAC_MSG
PDCH(bts=0,trx=0,ts=4) POLL scheduled at FN 0 + 13 = 13
-TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) New and old TBF are the same.
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) start Packet Downlink Assignment (PACCH)
+++++++++++++++++++++++++ TX : Packet Downlink Assignment +++++++++++++++++++++++++
------------------------- TX : Packet Downlink Assignment -------------------------
@@ -532,7 +534,7 @@ TBF(DL-TFI_0){FINISHED}: Received Event FINAL_ACK_RECVD
TBF(DL-TFI_0){FINISHED}: state_chg to WAIT_RELEASE
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE) starting timer T3193 with 0 sec. 100000 microsec
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE) free
-PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE), 0 TBFs, USFs = 00, TFIs = 00000000.
+PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE), 1 TBFs, USFs = 00, TFIs = 00000001.
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 45/0,) Detaching TBF: TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE)
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 45/0,) Destroying MS object
********** DL-TBF ends here **********
@@ -541,6 +543,7 @@ UL_ASS_TBF(DL-TFI_0){NONE}: Deallocated
DL_ASS_TBF(DL-TFI_0){WAIT_ACK}: Deallocated
=== end test_tbf_delayed_release ===
=== start test_tbf_imsi ===
+PDCH(bts=0,trx=0,ts=4) PDCH state: disabled => enabled
Creating MS object, TLLI = 0xffffffff
Modifying MS object, TLLI = 0xffffffff, MS class 0 -> 45
Found first unallocated TRX=0 TFI=0
@@ -612,7 +615,7 @@ Modifying MS object, TLLI = 0xf1000001, IMSI '001001000000001' -> '0010010000000
Modifying MS object, TLLI = 0xf1000002, IMSI '' -> '001001000000002'
MS(TLLI=0xf1000002, IMSI=, TA=0, 45/0, DL) IMSI '001001000000002' was already assigned to another MS object: TLLI = 0xf1000001, that IMSI will be removed
TBF(TFI=0 TLLI=0xf1000001 DIR=DL STATE=FLOW) free
-PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xf1000001 DIR=DL STATE=FLOW), 1 TBFs, USFs = 00, TFIs = 00000002.
+PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xf1000001 DIR=DL STATE=FLOW), 2 TBFs, USFs = 00, TFIs = 00000003.
MS(TLLI=0xf1000001, IMSI=001001000000002, TA=0, 45/0,) Detaching TBF: TBF(TFI=0 TLLI=0xf1000001 DIR=DL STATE=FLOW)
********** DL-TBF ends here **********
TBF(DL-TFI_0){FLOW}: Deallocated
@@ -621,7 +624,7 @@ DL_ASS_TBF(DL-TFI_0){SEND_ASS}: Deallocated
MS(TLLI=0xf1000001, IMSI=001001000000002, TA=0, 45/0,) Clearing MS object
MS(TLLI=0xffffffff, IMSI=, TA=0, 45/0,) Destroying MS object
TBF(TFI=1 TLLI=0xf1000002 DIR=DL STATE=FLOW) free
-PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=1 TLLI=0xf1000002 DIR=DL STATE=FLOW), 0 TBFs, USFs = 00, TFIs = 00000000.
+PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=1 TLLI=0xf1000002 DIR=DL STATE=FLOW), 1 TBFs, USFs = 00, TFIs = 00000002.
MS(TLLI=0xf1000002, IMSI=001001000000002, TA=0, 45/0,) Detaching TBF: TBF(TFI=1 TLLI=0xf1000002 DIR=DL STATE=FLOW)
MS(TLLI=0xf1000002, IMSI=001001000000002, TA=0, 45/0,) Destroying MS object
********** DL-TBF ends here **********
@@ -630,6 +633,7 @@ UL_ASS_TBF(DL-TFI_1){NONE}: Deallocated
DL_ASS_TBF(DL-TFI_1){SEND_ASS}: Deallocated
=== end test_tbf_imsi ===
=== start test_tbf_exhaustion ===
+PDCH(bts=0,trx=0,ts=4) PDCH state: disabled => enabled
Creating MS object, TLLI = 0xffffffff
Modifying MS object, TLLI = 0xffffffff, MS class 0 -> 45
Modifying MS object, TLLI = 0xffffffff, IMSI '' -> '001001000000000'
@@ -1601,7 +1605,7 @@ UL_ASS_TBF{NONE}: Allocated
DL_ASS_TBF{NONE}: Allocated
[DL] algo A <single> (suggested TRX: -1): Alloc start
[DL] algo A <single> (suggested TRX: -1): failed to find a usable TRX (TFI exhausted)
-TBF(TFI=0 TLLI=0xc0000020 DIR=DL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 1
+TBF(TFI=-1 TLLI=0xc0000020 DIR=DL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 1
TBF{NEW}: Deallocated
UL_ASS_TBF{NONE}: Deallocated
DL_ASS_TBF{NONE}: Deallocated
@@ -1609,6 +1613,7 @@ MS(TLLI=0xc0000020, IMSI=001001000000032, TA=220, 45/0,) No PDCH resource
=== end test_tbf_exhaustion ===
MS(TLLI=0xc0000020, IMSI=001001000000032, TA=220, 45/0,) Destroying MS object
=== start test_tbf_dl_llc_loss ===
+PDCH(bts=0,trx=0,ts=4) PDCH state: disabled => enabled
Creating MS object, TLLI = 0xffffffff
Modifying MS object, TLLI = 0xffffffff, MS class 0 -> 45
Modifying MS object, TLLI = 0xffffffff, IMSI '' -> '001001000123456'
@@ -1642,7 +1647,7 @@ TBF(TFI=0 TLLI=0xc0123456 DIR=DL STATE=ASSIGN) appending 19 bytes
Modifying MS object, TLLI = 0xc0123456, TA 220 -> 0
TBF(TFI=0 TLLI=0xc0123456 DIR=DL STATE=ASSIGN) appending 19 bytes
TBF(TFI=0 TLLI=0xc0123456 DIR=DL STATE=ASSIGN) free
-PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xc0123456 DIR=DL STATE=ASSIGN), 0 TBFs, USFs = 00, TFIs = 00000000.
+PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xc0123456 DIR=DL STATE=ASSIGN), 1 TBFs, USFs = 00, TFIs = 00000001.
MS(TLLI=0xc0123456, IMSI=001001000123456, TA=0, 45/0,) Detaching TBF: TBF(TFI=0 TLLI=0xc0123456 DIR=DL STATE=ASSIGN)
MS(TLLI=0xc0123456, IMSI=001001000123456, TA=0, 45/0,) Schedule MS release in 10 secs
********** DL-TBF ends here **********
@@ -1717,8 +1722,10 @@ TBF(TFI=0 TLLI=0xc0123456 DIR=DL STATE=FINISHED) msg block (BSN 2, CS-1): 07 01
MSG = 07 01 04 4d 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03
=== end test_tbf_dl_llc_loss ===
=== start test_tbf_single_phase ===
+PDCH(bts=0,trx=0,ts=7) PDCH state: disabled => enabled
Found first unallocated TRX=0 TFI=0
MS requests Uplink resource on CCCH/RACH: ra=0x03 (8 bit) Fn=2654167 qta=31
+MS requests single TS uplink transmission (one phase packet access)
Creating MS object, TLLI = 0xffffffff
MS(TLLI=0xffffffff, IMSI=, TA=220, 0/0,) ********** UL-TBF starts here **********
MS(TLLI=0xffffffff, IMSI=, TA=220, 0/0,) Allocating UL TBF
@@ -1799,8 +1806,9 @@ TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=ASSIGN) TX: START Immediate Assignment Do
TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=ASSIGN) appending 4 bytes
=== end test_tbf_single_phase ===
=== start test_tbf_two_phase ===
+PDCH(bts=0,trx=0,ts=7) PDCH state: disabled => enabled
MS requests Uplink resource on CCCH/RACH: ra=0x73 (8 bit) Fn=2654167 qta=31
-MS requests single block allocation
+MS requests single block allocation (two phase packet access)
Allocated a single block at SBFn=2654270 TRX=0 TS=7
Tx Immediate Assignment on AGCH: TRX=0 (ARFCN 0) TS=7 TA=7 TSC=0 TFI=-1 USF=7
Found first unallocated TRX=0 TFI=0
@@ -1898,8 +1906,9 @@ TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=ASSIGN) Starting timer X2001 [assignment
TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=ASSIGN) appending 4 bytes
=== end test_tbf_two_phase ===
=== start test_tbf_ra_update_rach ===
+PDCH(bts=0,trx=0,ts=7) PDCH state: disabled => enabled
MS requests Uplink resource on CCCH/RACH: ra=0x73 (8 bit) Fn=2654167 qta=31
-MS requests single block allocation
+MS requests single block allocation (two phase packet access)
Allocated a single block at SBFn=2654270 TRX=0 TS=7
Tx Immediate Assignment on AGCH: TRX=0 (ARFCN 0) TS=7 TA=7 TSC=0 TFI=-1 USF=7
Found first unallocated TRX=0 TFI=0
@@ -1998,7 +2007,7 @@ Old MS: TLLI = 0xf1223344, TA = 7, IMSI = 0011223344, LLC = 1
PDCH(bts=0,trx=0,ts=7) Received RTS for PDCH: FN=2654275 block_nr=9 scheduling USF=0 for TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FLOW), expect answer on UL FN=2654279
DL_ASS_TBF(UL-TFI_0){SEND_ASS}: Received Event CREATE_RLCMAC_MSG
PDCH(bts=0,trx=0,ts=7) POLL scheduled at FN 2654275 + 13 = 2654288
-TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=ASSIGN) start Packet Downlink Assignment (PACCH)
+TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FLOW) start Packet Downlink Assignment (PACCH) for TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=ASSIGN)
+++++++++++++++++++++++++ TX : Packet Downlink Assignment +++++++++++++++++++++++++
------------------------- TX : Packet Downlink Assignment -------------------------
TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FLOW) Scheduled DL Assignment polling on PACCH (FN=2654288, TS=7)
@@ -2064,7 +2073,7 @@ TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FINISHED) restarting timer T3191 [final b
TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FINISHED) Scheduled Ack/Nack polling on FN=2654309, TS=7
TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FINISHED) msg block (BSN 0, CS-4): 0f 01 00 29 52 41 55 5f 41 43 43 45 50 54 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 00
MS requests Uplink resource on CCCH/RACH: ra=0x73 (8 bit) Fn=2654245 qta=31
-MS requests single block allocation
+MS requests single block allocation (two phase packet access)
Allocated a single block at SBFn=2654348 TRX=0 TS=7
Tx Immediate Assignment on AGCH: TRX=0 (ARFCN 0) TS=7 TA=7 TSC=0 TFI=-1 USF=7
Found first unallocated TRX=0 TFI=1
@@ -2148,7 +2157,7 @@ IMSI 0011223344, old TBF TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FINISHED): movin
MS(TLLI=0xf1223344, IMSI=0011223344, TA=7, 1/0, UL) Detaching TBF: TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FINISHED)
MS(TLLI=0xf5667788, IMSI=, TA=7, 1/0, UL) Attaching DL TBF: TBF(TFI=0 TLLI=0xf5667788 DIR=DL STATE=FINISHED)
TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FLOW) free
-PDCH(bts=0,trx=0,ts=7) Detaching TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FLOW), 1 TBFs, USFs = 02, TFIs = 00000002.
+PDCH(bts=0,trx=0,ts=7) Detaching TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FLOW), 2 TBFs, USFs = 03, TFIs = 00000003.
MS(TLLI=0xf1223344, IMSI=0011223344, TA=7, 1/0,) Detaching TBF: TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FLOW)
********** UL-TBF ends here **********
UL_ACK_TBF(UL-TFI_0){NONE}: Deallocated
@@ -2162,8 +2171,9 @@ TBF(TFI=0 TLLI=0xf5667788 DIR=DL STATE=FINISHED) appending 4 bytes
New MS: TLLI = 0xf5667788, TA = 7, IMSI = 0011223344, LLC = 1
=== end test_tbf_ra_update_rach ===
=== start test_tbf_dl_flow_and_rach_two_phase ===
+PDCH(bts=0,trx=0,ts=7) PDCH state: disabled => enabled
MS requests Uplink resource on CCCH/RACH: ra=0x73 (8 bit) Fn=2654167 qta=31
-MS requests single block allocation
+MS requests single block allocation (two phase packet access)
Allocated a single block at SBFn=2654270 TRX=0 TS=7
Tx Immediate Assignment on AGCH: TRX=0 (ARFCN 0) TS=7 TA=7 TSC=0 TFI=-1 USF=7
Found first unallocated TRX=0 TFI=0
@@ -2263,7 +2273,7 @@ TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=ASSIGN) appending 20 bytes
TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=ASSIGN) appending 20 bytes
Old MS: TLLI = 0xf1223344, TA = 7, IMSI = 0011223344, LLC = 2
TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FLOW) free
-PDCH(bts=0,trx=0,ts=7) Detaching TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FLOW), 0 TBFs, USFs = 00, TFIs = 00000000.
+PDCH(bts=0,trx=0,ts=7) Detaching TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FLOW), 1 TBFs, USFs = 01, TFIs = 00000001.
MS(TLLI=0xf1223344, IMSI=0011223344, TA=7, 1/0, DL) Detaching TBF: TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FLOW)
********** UL-TBF ends here **********
UL_ACK_TBF(UL-TFI_0){NONE}: Deallocated
@@ -2271,7 +2281,7 @@ TBF(UL-TFI_0){FLOW}: Deallocated
UL_ASS_TBF(UL-TFI_0){NONE}: Deallocated
DL_ASS_TBF(UL-TFI_0){SEND_ASS}: Deallocated
MS requests Uplink resource on CCCH/RACH: ra=0x73 (8 bit) Fn=2654224 qta=31
-MS requests single block allocation
+MS requests single block allocation (two phase packet access)
Allocated a single block at SBFn=2654327 TRX=0 TS=7
Tx Immediate Assignment on AGCH: TRX=0 (ARFCN 0) TS=7 TA=7 TSC=0 TFI=-1 USF=7
Found first unallocated TRX=0 TFI=0
@@ -2335,8 +2345,9 @@ TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FLOW) No gaps in received block, last blo
New MS: TLLI = 0xf1223344, TA = 7, IMSI = 0011223344, LLC = 2
=== end test_tbf_dl_flow_and_rach_two_phase ===
=== start test_tbf_dl_flow_and_rach_single_phase ===
+PDCH(bts=0,trx=0,ts=7) PDCH state: disabled => enabled
MS requests Uplink resource on CCCH/RACH: ra=0x73 (8 bit) Fn=2654167 qta=31
-MS requests single block allocation
+MS requests single block allocation (two phase packet access)
Allocated a single block at SBFn=2654270 TRX=0 TS=7
Tx Immediate Assignment on AGCH: TRX=0 (ARFCN 0) TS=7 TA=7 TSC=0 TFI=-1 USF=7
Found first unallocated TRX=0 TFI=0
@@ -2436,7 +2447,7 @@ TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=ASSIGN) appending 20 bytes
TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=ASSIGN) appending 20 bytes
Old MS: TLLI = 0xf1223344, TA = 7, IMSI = 0011223344, LLC = 2
TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FLOW) free
-PDCH(bts=0,trx=0,ts=7) Detaching TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FLOW), 0 TBFs, USFs = 00, TFIs = 00000000.
+PDCH(bts=0,trx=0,ts=7) Detaching TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FLOW), 1 TBFs, USFs = 01, TFIs = 00000001.
MS(TLLI=0xf1223344, IMSI=0011223344, TA=7, 1/0, DL) Detaching TBF: TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FLOW)
********** UL-TBF ends here **********
UL_ACK_TBF(UL-TFI_0){NONE}: Deallocated
@@ -2445,6 +2456,7 @@ UL_ASS_TBF(UL-TFI_0){NONE}: Deallocated
DL_ASS_TBF(UL-TFI_0){SEND_ASS}: Deallocated
Found first unallocated TRX=0 TFI=0
MS requests Uplink resource on CCCH/RACH: ra=0x03 (8 bit) Fn=2654275 qta=31
+MS requests single TS uplink transmission (one phase packet access)
Creating MS object, TLLI = 0xffffffff
MS(TLLI=0xffffffff, IMSI=, TA=220, 0/0,) ********** UL-TBF starts here **********
MS(TLLI=0xffffffff, IMSI=, TA=220, 0/0,) Allocating UL TBF
@@ -2480,7 +2492,7 @@ TBF(TFI=0 TLLI=0xffffffff DIR=UL STATE=FLOW) BSN 0 storing in window (0..63)
TBF(TFI=0 TLLI=0xffffffff DIR=UL STATE=FLOW) data_length=20, data=f1 22 33 44 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
TBF(TFI=0 TLLI=0xffffffff DIR=UL STATE=FLOW) Decoded premier TLLI=0xf1223344 of UL DATA TFI=0.
TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=ASSIGN) free
-PDCH(bts=0,trx=0,ts=7) Detaching TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=ASSIGN), 0 TBFs, USFs = 01, TFIs = 00000000.
+PDCH(bts=0,trx=0,ts=7) Detaching TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=ASSIGN), 1 TBFs, USFs = 01, TFIs = 00000001.
MS(TLLI=0xf1223344, IMSI=0011223344, TA=7, 1/0,) Detaching TBF: TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=ASSIGN)
********** DL-TBF ends here **********
TBF(DL-TFI_0){ASSIGN}: Deallocated
@@ -2506,8 +2518,9 @@ UL_ACK_TBF(UL-TFI_0){NONE}: state_chg to SCHED_UL_ACK
New MS: TLLI = 0xf1223344, TA = 7, IMSI = 0011223344, LLC = 2
=== end test_tbf_dl_flow_and_rach_single_phase ===
=== start test_tbf_dl_reuse ===
+PDCH(bts=0,trx=0,ts=7) PDCH state: disabled => enabled
MS requests Uplink resource on CCCH/RACH: ra=0x73 (8 bit) Fn=2654167 qta=31
-MS requests single block allocation
+MS requests single block allocation (two phase packet access)
Allocated a single block at SBFn=2654270 TRX=0 TS=7
Tx Immediate Assignment on AGCH: TRX=0 (ARFCN 0) TS=7 TA=7 TSC=0 TFI=-1 USF=7
Found first unallocated TRX=0 TFI=0
@@ -2647,7 +2660,7 @@ Old MS: TLLI = 0xf1223344, TA = 7, IMSI = 0011223344, LLC = 40
PDCH(bts=0,trx=0,ts=7) Received RTS for PDCH: FN=2654275 block_nr=9 scheduling USF=0 for TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FLOW), expect answer on UL FN=2654279
DL_ASS_TBF(UL-TFI_0){SEND_ASS}: Received Event CREATE_RLCMAC_MSG
PDCH(bts=0,trx=0,ts=7) POLL scheduled at FN 2654275 + 13 = 2654288
-TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=ASSIGN) start Packet Downlink Assignment (PACCH)
+TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FLOW) start Packet Downlink Assignment (PACCH) for TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=ASSIGN)
+++++++++++++++++++++++++ TX : Packet Downlink Assignment +++++++++++++++++++++++++
------------------------- TX : Packet Downlink Assignment -------------------------
TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FLOW) Scheduled DL Assignment polling on PACCH (FN=2654288, TS=7)
@@ -3346,7 +3359,7 @@ PDCH(bts=0,trx=0,ts=7) Timeout for registered USF (FN=2654400): TBF(TFI=0 TLLI=0
TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=RELEASING) N3101 27 => 28 (< MAX 10)
DL_ASS_TBF(DL-TFI_0){SEND_ASS}: Received Event CREATE_RLCMAC_MSG
PDCH(bts=0,trx=0,ts=7) POLL scheduled at FN 2654400 + 13 = 2654413
-TBF(TFI=1 TLLI=0xf1223344 DIR=DL STATE=ASSIGN) start Packet Downlink Assignment (PACCH)
+TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=WAIT_RELEASE) start Packet Downlink Assignment (PACCH) for TBF(TFI=1 TLLI=0xf1223344 DIR=DL STATE=ASSIGN)
+++++++++++++++++++++++++ TX : Packet Downlink Assignment +++++++++++++++++++++++++
------------------------- TX : Packet Downlink Assignment -------------------------
TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=WAIT_RELEASE) Scheduled DL Assignment polling on PACCH (FN=2654413, TS=7)
@@ -3359,7 +3372,7 @@ TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=WAIT_RELEASE) [UPLINK] DOWNLINK ASSIGNED
DL_ASS_TBF(DL-TFI_0){WAIT_ACK}: Received Event RX_ASS_CTRL_ACK
DL_ASS_TBF(DL-TFI_0){WAIT_ACK}: state_chg to NONE
TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=WAIT_RELEASE) free
-PDCH(bts=0,trx=0,ts=7) Detaching TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=WAIT_RELEASE), 1 TBFs, USFs = 01, TFIs = 00000002.
+PDCH(bts=0,trx=0,ts=7) Detaching TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=WAIT_RELEASE), 2 TBFs, USFs = 01, TFIs = 00000003.
MS(TLLI=0xf1223344, IMSI=0011223344, TA=7, 1/0, UL DL) Detaching TBF: TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=WAIT_RELEASE)
********** DL-TBF ends here **********
TBF(DL-TFI_0){WAIT_RELEASE}: Deallocated
@@ -3561,6 +3574,7 @@ TBF(TFI=1 TLLI=0xf1223344 DIR=DL STATE=FINISHED) Scheduled Ack/Nack polling on F
TBF(TFI=1 TLLI=0xf1223344 DIR=DL STATE=FINISHED) msg block (BSN 10, CS-1): 0f 03 14 4d 43 20 50 41 43 4b 45 54 20 30 39 20 28 54 42 46 20 32 29
=== end test_tbf_dl_reuse ===
=== start test_tbf_gprs_egprs ===
+PDCH(bts=0,trx=0,ts=4) PDCH state: disabled => enabled
Creating MS object, TLLI = 0xffffffff
Modifying MS object, TLLI = 0xffffffff, MS class 0 -> 45
Modifying MS object, TLLI = 0xffffffff, IMSI '' -> '001001123456789'
@@ -3593,6 +3607,10 @@ TBF(TFI=0 TLLI=0xc0006789 DIR=DL STATE=ASSIGN) TX: START Immediate Assignment Do
TBF(TFI=0 TLLI=0xc0006789 DIR=DL STATE=ASSIGN) appending 256 bytes
=== end test_tbf_gprs_egprs ===
=== start test_tbf_ws ===
+PDCH(bts=0,trx=0,ts=4) PDCH state: disabled => enabled
+PDCH(bts=0,trx=0,ts=2) PDCH state: disabled => enabled
+PDCH(bts=0,trx=0,ts=3) PDCH state: disabled => enabled
+PDCH(bts=0,trx=0,ts=5) PDCH state: disabled => enabled
Creating MS object, TLLI = 0xffffffff
Modifying MS object, TLLI = 0xffffffff, MS class 0 -> 12
MS(TLLI=0xffffffff, IMSI=, TA=220, 12/0,) ********** DL-TBF starts here **********
@@ -3625,10 +3643,10 @@ TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW) Allocated: trx = 0, ul_slots = 10, d
MS(TLLI=0xffffffff, IMSI=, TA=220, 12/0,) Attaching DL TBF: TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW)
DL TBF slots: 0x3c, N: 4, WS: 64
TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW) free
-PDCH(bts=0,trx=0,ts=2) Detaching TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW), 0 TBFs, USFs = 00, TFIs = 00000000.
-PDCH(bts=0,trx=0,ts=3) Detaching TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW), 0 TBFs, USFs = 00, TFIs = 00000000.
-PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW), 0 TBFs, USFs = 00, TFIs = 00000000.
-PDCH(bts=0,trx=0,ts=5) Detaching TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW), 0 TBFs, USFs = 00, TFIs = 00000000.
+PDCH(bts=0,trx=0,ts=2) Detaching TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW), 1 TBFs, USFs = 00, TFIs = 00000001.
+PDCH(bts=0,trx=0,ts=3) Detaching TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW), 1 TBFs, USFs = 00, TFIs = 00000001.
+PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW), 1 TBFs, USFs = 00, TFIs = 00000001.
+PDCH(bts=0,trx=0,ts=5) Detaching TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW), 1 TBFs, USFs = 00, TFIs = 00000001.
MS(TLLI=0xffffffff, IMSI=, TA=220, 12/0,) Detaching TBF: TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW)
MS(TLLI=0xffffffff, IMSI=, TA=220, 12/0,) Destroying MS object
********** DL-TBF ends here **********
@@ -3671,10 +3689,10 @@ TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW EGPRS) setting EGPRS DL window size t
ws(384)
DL TBF slots: 0x3c, N: 4, WS: 384
TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW EGPRS) free
-PDCH(bts=0,trx=0,ts=2) Detaching TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW EGPRS), 0 TBFs, USFs = 00, TFIs = 00000000.
-PDCH(bts=0,trx=0,ts=3) Detaching TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW EGPRS), 0 TBFs, USFs = 00, TFIs = 00000000.
-PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW EGPRS), 0 TBFs, USFs = 00, TFIs = 00000000.
-PDCH(bts=0,trx=0,ts=5) Detaching TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW EGPRS), 0 TBFs, USFs = 00, TFIs = 00000000.
+PDCH(bts=0,trx=0,ts=2) Detaching TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW EGPRS), 1 TBFs, USFs = 00, TFIs = 00000001.
+PDCH(bts=0,trx=0,ts=3) Detaching TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW EGPRS), 1 TBFs, USFs = 00, TFIs = 00000001.
+PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW EGPRS), 1 TBFs, USFs = 00, TFIs = 00000001.
+PDCH(bts=0,trx=0,ts=5) Detaching TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW EGPRS), 1 TBFs, USFs = 00, TFIs = 00000001.
MS(TLLI=0xffffffff, IMSI=, TA=220, 12/12,) Detaching TBF: TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW EGPRS)
MS(TLLI=0xffffffff, IMSI=, TA=220, 12/12,) Destroying MS object
********** DL-TBF ends here **********
@@ -3683,8 +3701,9 @@ UL_ASS_TBF(DL-TFI_0){NONE}: Deallocated
DL_ASS_TBF(DL-TFI_0){NONE}: Deallocated
=== end test_tbf_ws ===
=== start test_tbf_egprs_two_phase ===
+PDCH(bts=0,trx=0,ts=7) PDCH state: disabled => enabled
MS requests Uplink resource on CCCH/RACH: ra=0x73 (8 bit) Fn=2654167 qta=31
-MS requests single block allocation
+MS requests single block allocation (two phase packet access)
Allocated a single block at SBFn=2654270 TRX=0 TS=7
Tx Immediate Assignment on AGCH: TRX=0 (ARFCN 0) TS=7 TA=7 TSC=0 TFI=-1 USF=7
Found first unallocated TRX=0 TFI=0
@@ -3790,8 +3809,9 @@ TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=ASSIGN EGPRS) Starting timer X2001 [assig
TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=ASSIGN EGPRS) appending 256 bytes
=== end test_tbf_egprs_two_phase ===
=== start test_tbf_egprs_two_phase_spb ===
+PDCH(bts=0,trx=0,ts=7) PDCH state: disabled => enabled
MS requests Uplink resource on CCCH/RACH: ra=0x73 (8 bit) Fn=2654167 qta=31
-MS requests single block allocation
+MS requests single block allocation (two phase packet access)
Allocated a single block at SBFn=2654270 TRX=0 TS=7
Tx Immediate Assignment on AGCH: TRX=0 (ARFCN 0) TS=7 TA=7 TSC=0 TFI=-1 USF=7
Found first unallocated TRX=0 TFI=0
@@ -4020,6 +4040,7 @@ TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=ASSIGN EGPRS) Starting timer X2001 [assig
TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=ASSIGN EGPRS) appending 256 bytes
=== end test_tbf_egprs_two_phase_spb ===
=== start test_tbf_egprs_dl ===
+PDCH(bts=0,trx=0,ts=4) PDCH state: disabled => enabled
Testing MCS-1
Creating MS object, TLLI = 0xffffffff
Modifying MS object, TLLI = 0xffffffff, MS class 0 -> 11
@@ -4061,7 +4082,6 @@ The MS object cannot fully confirm an unexpected TLLI: 0xffeeddcc, partly confir
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) appending 10 bytes
DL_ASS_TBF(DL-TFI_0){SEND_ASS}: Received Event CREATE_RLCMAC_MSG
PDCH(bts=0,trx=0,ts=4) POLL scheduled at FN 0 + 13 = 13
-TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) New and old TBF are the same.
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) start Packet Downlink Assignment (PACCH)
+++++++++++++++++++++++++ TX : Packet Downlink Assignment +++++++++++++++++++++++++
------------------------- TX : Packet Downlink Assignment -------------------------
@@ -4321,7 +4341,7 @@ TBF(DL-TFI_0){FLOW}: Received Event FINAL_ACK_RECVD
TBF(DL-TFI_0){FLOW}: state_chg to WAIT_RELEASE
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS) starting timer T3193 with 0 sec. 100000 microsec
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS) free
-PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS), 0 TBFs, USFs = 00, TFIs = 00000000.
+PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS), 1 TBFs, USFs = 00, TFIs = 00000001.
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 11/11,) Detaching TBF: TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS)
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 11/11,) Destroying MS object
********** DL-TBF ends here **********
@@ -4369,7 +4389,6 @@ The MS object cannot fully confirm an unexpected TLLI: 0xffeeddcc, partly confir
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) appending 10 bytes
DL_ASS_TBF(DL-TFI_0){SEND_ASS}: Received Event CREATE_RLCMAC_MSG
PDCH(bts=0,trx=0,ts=4) POLL scheduled at FN 0 + 13 = 13
-TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) New and old TBF are the same.
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) start Packet Downlink Assignment (PACCH)
+++++++++++++++++++++++++ TX : Packet Downlink Assignment +++++++++++++++++++++++++
------------------------- TX : Packet Downlink Assignment -------------------------
@@ -4579,7 +4598,7 @@ TBF(DL-TFI_0){FLOW}: Received Event FINAL_ACK_RECVD
TBF(DL-TFI_0){FLOW}: state_chg to WAIT_RELEASE
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS) starting timer T3193 with 0 sec. 100000 microsec
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS) free
-PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS), 0 TBFs, USFs = 00, TFIs = 00000000.
+PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS), 1 TBFs, USFs = 00, TFIs = 00000001.
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 11/11,) Detaching TBF: TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS)
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 11/11,) Destroying MS object
********** DL-TBF ends here **********
@@ -4627,7 +4646,6 @@ The MS object cannot fully confirm an unexpected TLLI: 0xffeeddcc, partly confir
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) appending 10 bytes
DL_ASS_TBF(DL-TFI_0){SEND_ASS}: Received Event CREATE_RLCMAC_MSG
PDCH(bts=0,trx=0,ts=4) POLL scheduled at FN 0 + 13 = 13
-TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) New and old TBF are the same.
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) start Packet Downlink Assignment (PACCH)
+++++++++++++++++++++++++ TX : Packet Downlink Assignment +++++++++++++++++++++++++
------------------------- TX : Packet Downlink Assignment -------------------------
@@ -4797,7 +4815,7 @@ TBF(DL-TFI_0){FLOW}: Received Event FINAL_ACK_RECVD
TBF(DL-TFI_0){FLOW}: state_chg to WAIT_RELEASE
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS) starting timer T3193 with 0 sec. 100000 microsec
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS) free
-PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS), 0 TBFs, USFs = 00, TFIs = 00000000.
+PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS), 1 TBFs, USFs = 00, TFIs = 00000001.
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 11/11,) Detaching TBF: TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS)
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 11/11,) Destroying MS object
********** DL-TBF ends here **********
@@ -4845,7 +4863,6 @@ The MS object cannot fully confirm an unexpected TLLI: 0xffeeddcc, partly confir
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) appending 10 bytes
DL_ASS_TBF(DL-TFI_0){SEND_ASS}: Received Event CREATE_RLCMAC_MSG
PDCH(bts=0,trx=0,ts=4) POLL scheduled at FN 0 + 13 = 13
-TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) New and old TBF are the same.
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) start Packet Downlink Assignment (PACCH)
+++++++++++++++++++++++++ TX : Packet Downlink Assignment +++++++++++++++++++++++++
------------------------- TX : Packet Downlink Assignment -------------------------
@@ -4999,7 +5016,7 @@ TBF(DL-TFI_0){FLOW}: Received Event FINAL_ACK_RECVD
TBF(DL-TFI_0){FLOW}: state_chg to WAIT_RELEASE
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS) starting timer T3193 with 0 sec. 100000 microsec
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS) free
-PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS), 0 TBFs, USFs = 00, TFIs = 00000000.
+PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS), 1 TBFs, USFs = 00, TFIs = 00000001.
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 11/11,) Detaching TBF: TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS)
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 11/11,) Destroying MS object
********** DL-TBF ends here **********
@@ -5047,7 +5064,6 @@ The MS object cannot fully confirm an unexpected TLLI: 0xffeeddcc, partly confir
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) appending 10 bytes
DL_ASS_TBF(DL-TFI_0){SEND_ASS}: Received Event CREATE_RLCMAC_MSG
PDCH(bts=0,trx=0,ts=4) POLL scheduled at FN 0 + 13 = 13
-TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) New and old TBF are the same.
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) start Packet Downlink Assignment (PACCH)
+++++++++++++++++++++++++ TX : Packet Downlink Assignment +++++++++++++++++++++++++
------------------------- TX : Packet Downlink Assignment -------------------------
@@ -5185,7 +5201,7 @@ TBF(DL-TFI_0){FLOW}: Received Event FINAL_ACK_RECVD
TBF(DL-TFI_0){FLOW}: state_chg to WAIT_RELEASE
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS) starting timer T3193 with 0 sec. 100000 microsec
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS) free
-PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS), 0 TBFs, USFs = 00, TFIs = 00000000.
+PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS), 1 TBFs, USFs = 00, TFIs = 00000001.
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 11/11,) Detaching TBF: TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS)
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 11/11,) Destroying MS object
********** DL-TBF ends here **********
@@ -5233,7 +5249,6 @@ The MS object cannot fully confirm an unexpected TLLI: 0xffeeddcc, partly confir
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) appending 10 bytes
DL_ASS_TBF(DL-TFI_0){SEND_ASS}: Received Event CREATE_RLCMAC_MSG
PDCH(bts=0,trx=0,ts=4) POLL scheduled at FN 0 + 13 = 13
-TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) New and old TBF are the same.
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) start Packet Downlink Assignment (PACCH)
+++++++++++++++++++++++++ TX : Packet Downlink Assignment +++++++++++++++++++++++++
------------------------- TX : Packet Downlink Assignment -------------------------
@@ -5347,7 +5362,7 @@ TBF(DL-TFI_0){FLOW}: Received Event FINAL_ACK_RECVD
TBF(DL-TFI_0){FLOW}: state_chg to WAIT_RELEASE
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS) starting timer T3193 with 0 sec. 100000 microsec
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS) free
-PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS), 0 TBFs, USFs = 00, TFIs = 00000000.
+PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS), 1 TBFs, USFs = 00, TFIs = 00000001.
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 11/11,) Detaching TBF: TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS)
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 11/11,) Destroying MS object
********** DL-TBF ends here **********
@@ -5395,7 +5410,6 @@ The MS object cannot fully confirm an unexpected TLLI: 0xffeeddcc, partly confir
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) appending 10 bytes
DL_ASS_TBF(DL-TFI_0){SEND_ASS}: Received Event CREATE_RLCMAC_MSG
PDCH(bts=0,trx=0,ts=4) POLL scheduled at FN 0 + 13 = 13
-TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) New and old TBF are the same.
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) start Packet Downlink Assignment (PACCH)
+++++++++++++++++++++++++ TX : Packet Downlink Assignment +++++++++++++++++++++++++
------------------------- TX : Packet Downlink Assignment -------------------------
@@ -5518,7 +5532,7 @@ TBF(DL-TFI_0){FLOW}: Received Event FINAL_ACK_RECVD
TBF(DL-TFI_0){FLOW}: state_chg to WAIT_RELEASE
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS) starting timer T3193 with 0 sec. 100000 microsec
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS) free
-PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS), 0 TBFs, USFs = 00, TFIs = 00000000.
+PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS), 1 TBFs, USFs = 00, TFIs = 00000001.
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 11/11,) Detaching TBF: TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS)
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 11/11,) Destroying MS object
********** DL-TBF ends here **********
@@ -5566,7 +5580,6 @@ The MS object cannot fully confirm an unexpected TLLI: 0xffeeddcc, partly confir
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) appending 10 bytes
DL_ASS_TBF(DL-TFI_0){SEND_ASS}: Received Event CREATE_RLCMAC_MSG
PDCH(bts=0,trx=0,ts=4) POLL scheduled at FN 0 + 13 = 13
-TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) New and old TBF are the same.
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) start Packet Downlink Assignment (PACCH)
+++++++++++++++++++++++++ TX : Packet Downlink Assignment +++++++++++++++++++++++++
------------------------- TX : Packet Downlink Assignment -------------------------
@@ -5680,7 +5693,7 @@ TBF(DL-TFI_0){FLOW}: Received Event FINAL_ACK_RECVD
TBF(DL-TFI_0){FLOW}: state_chg to WAIT_RELEASE
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS) starting timer T3193 with 0 sec. 100000 microsec
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS) free
-PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS), 0 TBFs, USFs = 00, TFIs = 00000000.
+PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS), 1 TBFs, USFs = 00, TFIs = 00000001.
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 11/11,) Detaching TBF: TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS)
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 11/11,) Destroying MS object
********** DL-TBF ends here **********
@@ -5728,7 +5741,6 @@ The MS object cannot fully confirm an unexpected TLLI: 0xffeeddcc, partly confir
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) appending 10 bytes
DL_ASS_TBF(DL-TFI_0){SEND_ASS}: Received Event CREATE_RLCMAC_MSG
PDCH(bts=0,trx=0,ts=4) POLL scheduled at FN 0 + 13 = 13
-TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) New and old TBF are the same.
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) start Packet Downlink Assignment (PACCH)
+++++++++++++++++++++++++ TX : Packet Downlink Assignment +++++++++++++++++++++++++
------------------------- TX : Packet Downlink Assignment -------------------------
@@ -5831,7 +5843,7 @@ TBF(DL-TFI_0){FLOW}: Received Event FINAL_ACK_RECVD
TBF(DL-TFI_0){FLOW}: state_chg to WAIT_RELEASE
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS) starting timer T3193 with 0 sec. 100000 microsec
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS) free
-PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS), 0 TBFs, USFs = 00, TFIs = 00000000.
+PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS), 1 TBFs, USFs = 00, TFIs = 00000001.
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 11/11,) Detaching TBF: TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS)
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 11/11,) Destroying MS object
********** DL-TBF ends here **********
@@ -5840,6 +5852,7 @@ UL_ASS_TBF(DL-TFI_0){NONE}: Deallocated
DL_ASS_TBF(DL-TFI_0){SEND_ASS}: Deallocated
=== end test_tbf_egprs_dl ===
=== start test_tbf_egprs_retx_dl ===
+PDCH(bts=0,trx=0,ts=4) PDCH state: disabled => enabled
Testing retx for MCS 6 - 6
Creating MS object, TLLI = 0xffffffff
Modifying MS object, TLLI = 0xffffffff, MS class 0 -> 11
@@ -5904,7 +5917,7 @@ TBF(DL-TFI_0){FLOW}: Received Event FINAL_ACK_RECVD
TBF(DL-TFI_0){FLOW}: state_chg to WAIT_RELEASE
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS) starting timer T3193 with 0 sec. 100000 microsec
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS) free
-PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS), 0 TBFs, USFs = 00, TFIs = 00000000.
+PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS), 1 TBFs, USFs = 00, TFIs = 00000001.
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 11/11,) Detaching TBF: TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS)
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 11/11,) Destroying MS object
********** DL-TBF ends here **********
@@ -5974,7 +5987,7 @@ TBF(DL-TFI_0){FLOW}: Received Event FINAL_ACK_RECVD
TBF(DL-TFI_0){FLOW}: state_chg to WAIT_RELEASE
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS) starting timer T3193 with 0 sec. 100000 microsec
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS) free
-PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS), 0 TBFs, USFs = 00, TFIs = 00000000.
+PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS), 1 TBFs, USFs = 00, TFIs = 00000001.
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 11/11,) Detaching TBF: TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS)
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 11/11,) Destroying MS object
********** DL-TBF ends here **********
@@ -6044,7 +6057,7 @@ TBF(DL-TFI_0){FLOW}: Received Event FINAL_ACK_RECVD
TBF(DL-TFI_0){FLOW}: state_chg to WAIT_RELEASE
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS) starting timer T3193 with 0 sec. 100000 microsec
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS) free
-PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS), 0 TBFs, USFs = 00, TFIs = 00000000.
+PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS), 1 TBFs, USFs = 00, TFIs = 00000001.
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 11/11,) Detaching TBF: TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS)
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 11/11,) Destroying MS object
********** DL-TBF ends here **********
@@ -6138,7 +6151,7 @@ TBF(DL-TFI_0){FLOW}: Received Event FINAL_ACK_RECVD
TBF(DL-TFI_0){FLOW}: state_chg to WAIT_RELEASE
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS) starting timer T3193 with 0 sec. 100000 microsec
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS) free
-PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS), 0 TBFs, USFs = 00, TFIs = 00000000.
+PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS), 1 TBFs, USFs = 00, TFIs = 00000001.
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 11/11,) Detaching TBF: TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS)
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 11/11,) Destroying MS object
********** DL-TBF ends here **********
@@ -6231,7 +6244,7 @@ TBF(DL-TFI_0){FLOW}: Received Event FINAL_ACK_RECVD
TBF(DL-TFI_0){FLOW}: state_chg to WAIT_RELEASE
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS) starting timer T3193 with 0 sec. 100000 microsec
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS) free
-PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS), 0 TBFs, USFs = 00, TFIs = 00000000.
+PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS), 1 TBFs, USFs = 00, TFIs = 00000001.
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 11/11,) Detaching TBF: TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS)
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 11/11,) Destroying MS object
********** DL-TBF ends here **********
@@ -6324,7 +6337,7 @@ TBF(DL-TFI_0){FLOW}: Received Event FINAL_ACK_RECVD
TBF(DL-TFI_0){FLOW}: state_chg to WAIT_RELEASE
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS) starting timer T3193 with 0 sec. 100000 microsec
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS) free
-PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS), 0 TBFs, USFs = 00, TFIs = 00000000.
+PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS), 1 TBFs, USFs = 00, TFIs = 00000001.
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 11/11,) Detaching TBF: TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS)
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 11/11,) Destroying MS object
********** DL-TBF ends here **********
@@ -6417,7 +6430,7 @@ TBF(DL-TFI_0){FLOW}: Received Event FINAL_ACK_RECVD
TBF(DL-TFI_0){FLOW}: state_chg to WAIT_RELEASE
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS) starting timer T3193 with 0 sec. 100000 microsec
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS) free
-PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS), 0 TBFs, USFs = 00, TFIs = 00000000.
+PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS), 1 TBFs, USFs = 00, TFIs = 00000001.
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 11/11,) Detaching TBF: TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS)
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 11/11,) Destroying MS object
********** DL-TBF ends here **********
@@ -6426,6 +6439,7 @@ UL_ASS_TBF(DL-TFI_0){NONE}: Deallocated
DL_ASS_TBF(DL-TFI_0){SEND_ASS}: Deallocated
=== end test_tbf_egprs_retx_dl ===
=== start test_tbf_egprs_spb_dl ===
+PDCH(bts=0,trx=0,ts=4) PDCH state: disabled => enabled
Testing retx for MCS 6 to reseg_mcs 3
Creating MS object, TLLI = 0xffffffff
Modifying MS object, TLLI = 0xffffffff, MS class 0 -> 11
@@ -6496,7 +6510,7 @@ TBF(DL-TFI_0){FLOW}: Received Event FINAL_ACK_RECVD
TBF(DL-TFI_0){FLOW}: state_chg to WAIT_RELEASE
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS) starting timer T3193 with 0 sec. 100000 microsec
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS) free
-PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS), 0 TBFs, USFs = 00, TFIs = 00000000.
+PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS), 1 TBFs, USFs = 00, TFIs = 00000001.
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 11/11,) Detaching TBF: TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS)
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 11/11,) Destroying MS object
********** DL-TBF ends here **********
@@ -6573,7 +6587,7 @@ TBF(DL-TFI_0){FLOW}: Received Event FINAL_ACK_RECVD
TBF(DL-TFI_0){FLOW}: state_chg to WAIT_RELEASE
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS) starting timer T3193 with 0 sec. 100000 microsec
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS) free
-PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS), 0 TBFs, USFs = 00, TFIs = 00000000.
+PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS), 1 TBFs, USFs = 00, TFIs = 00000001.
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 11/11,) Detaching TBF: TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS)
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 11/11,) Destroying MS object
********** DL-TBF ends here **********
@@ -6650,7 +6664,7 @@ TBF(DL-TFI_0){FLOW}: Received Event FINAL_ACK_RECVD
TBF(DL-TFI_0){FLOW}: state_chg to WAIT_RELEASE
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS) starting timer T3193 with 0 sec. 100000 microsec
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS) free
-PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS), 0 TBFs, USFs = 00, TFIs = 00000000.
+PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS), 1 TBFs, USFs = 00, TFIs = 00000001.
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 11/11,) Detaching TBF: TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS)
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 11/11,) Destroying MS object
********** DL-TBF ends here **********
@@ -6734,7 +6748,7 @@ TBF(DL-TFI_0){FLOW}: Received Event FINAL_ACK_RECVD
TBF(DL-TFI_0){FLOW}: state_chg to WAIT_RELEASE
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS) starting timer T3193 with 0 sec. 100000 microsec
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS) free
-PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS), 0 TBFs, USFs = 00, TFIs = 00000000.
+PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS), 1 TBFs, USFs = 00, TFIs = 00000001.
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 11/11,) Detaching TBF: TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT_RELEASE EGPRS)
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 11/11,) Destroying MS object
********** DL-TBF ends here **********
@@ -6743,8 +6757,9 @@ UL_ASS_TBF(DL-TFI_0){NONE}: Deallocated
DL_ASS_TBF(DL-TFI_0){SEND_ASS}: Deallocated
=== end test_tbf_egprs_spb_dl ===
=== start test_tbf_puan_urbb_len ===
+PDCH(bts=0,trx=0,ts=7) PDCH state: disabled => enabled
MS requests Uplink resource on CCCH/RACH: ra=0x73 (8 bit) Fn=2654167 qta=31
-MS requests single block allocation
+MS requests single block allocation (two phase packet access)
Allocated a single block at SBFn=2654270 TRX=0 TS=7
Tx Immediate Assignment on AGCH: TRX=0 (ARFCN 0) TS=7 TA=7 TSC=0 TFI=-1 USF=7
Found first unallocated TRX=0 TFI=0
@@ -6873,6 +6888,10 @@ TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=ASSIGN EGPRS) Starting timer X2001 [assig
TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=ASSIGN EGPRS) appending 256 bytes
=== end test_tbf_puan_urbb_len ===
=== start test_tbf_update_ws ===
+PDCH(bts=0,trx=0,ts=4) PDCH state: disabled => enabled
+PDCH(bts=0,trx=0,ts=2) PDCH state: disabled => enabled
+PDCH(bts=0,trx=0,ts=3) PDCH state: disabled => enabled
+PDCH(bts=0,trx=0,ts=5) PDCH state: disabled => enabled
Creating MS object, TLLI = 0xffffffff
Modifying MS object, TLLI = 0xffffffff, MS class 0 -> 11
Modifying MS object, TLLI = 0xffffffff, EGPRS MS class 0 -> 11
@@ -6903,7 +6922,7 @@ TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW EGPRS) setting EGPRS DL window size t
ws(192)
DL TBF slots: 0x10, N: 1, WS: 192
********** DL-TBF update **********
-PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW EGPRS), 0 TBFs, USFs = 00, TFIs = 00000000.
+PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW EGPRS), 1 TBFs, USFs = 00, TFIs = 00000001.
[DL] algo B <multi> (suggested TRX: -1): Alloc start
Found first unallocated TRX=0 TFI=0
Selected DL slots: (TS=0)"..DDDD.."(TS=7), multi
@@ -6920,10 +6939,10 @@ TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW EGPRS) setting EGPRS DL window size t
ws(384)
DL TBF slots: 0x3c, N: 4, WS: 384
TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW EGPRS) free
-PDCH(bts=0,trx=0,ts=2) Detaching TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW EGPRS), 0 TBFs, USFs = 00, TFIs = 00000000.
-PDCH(bts=0,trx=0,ts=3) Detaching TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW EGPRS), 0 TBFs, USFs = 00, TFIs = 00000000.
-PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW EGPRS), 0 TBFs, USFs = 00, TFIs = 00000000.
-PDCH(bts=0,trx=0,ts=5) Detaching TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW EGPRS), 0 TBFs, USFs = 00, TFIs = 00000000.
+PDCH(bts=0,trx=0,ts=2) Detaching TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW EGPRS), 1 TBFs, USFs = 00, TFIs = 00000001.
+PDCH(bts=0,trx=0,ts=3) Detaching TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW EGPRS), 1 TBFs, USFs = 00, TFIs = 00000001.
+PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW EGPRS), 1 TBFs, USFs = 00, TFIs = 00000001.
+PDCH(bts=0,trx=0,ts=5) Detaching TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW EGPRS), 1 TBFs, USFs = 00, TFIs = 00000001.
MS(TLLI=0xffffffff, IMSI=, TA=220, 11/11,) Detaching TBF: TBF(TFI=0 TLLI=0xffffffff DIR=DL STATE=NEW EGPRS)
MS(TLLI=0xffffffff, IMSI=, TA=220, 11/11,) Destroying MS object
********** DL-TBF ends here **********
@@ -6932,8 +6951,9 @@ UL_ASS_TBF(DL-TFI_0){NONE}: Deallocated
DL_ASS_TBF(DL-TFI_0){NONE}: Deallocated
=== end test_tbf_update_ws ===
=== start test_tbf_li_decoding ===
+PDCH(bts=0,trx=0,ts=7) PDCH state: disabled => enabled
MS requests Uplink resource on CCCH/RACH: ra=0x73 (8 bit) Fn=2654167 qta=31
-MS requests single block allocation
+MS requests single block allocation (two phase packet access)
Allocated a single block at SBFn=2654270 TRX=0 TS=7
Tx Immediate Assignment on AGCH: TRX=0 (ARFCN 0) TS=7 TA=7 TSC=0 TFI=-1 USF=7
Found first unallocated TRX=0 TFI=0
@@ -7051,6 +7071,7 @@ TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=ASSIGN EGPRS) Starting timer X2001 [assig
TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=ASSIGN EGPRS) appending 256 bytes
=== end test_tbf_li_decoding ===
=== start test_tbf_epdan_out_of_rx_window ===
+PDCH(bts=0,trx=0,ts=4) PDCH state: disabled => enabled
Creating MS object, TLLI = 0xffffffff
Modifying MS object, TLLI = 0xffffffff, MS class 0 -> 11
Modifying MS object, TLLI = 0xffffffff, EGPRS MS class 0 -> 11
@@ -7094,7 +7115,7 @@ TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) ack: (BSN=1176)"RRRRRRRRRRII
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) DL analysis, range=1176:1288, lost=0, recv=0, skipped=112, bsn=1944, info='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx................................................................................................................................................................................................................................................................................................................................................................................'
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) V(B): (V(A)=1186)"NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNAAANAAAAAAAAAAAAAAAAAAAAAAAAAA"(V(S)-1=1287) A=Acked N=Nacked U=Unacked X=Resend-Unacked I=Invalid
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) free
-PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS), 0 TBFs, USFs = 00, TFIs = 00000000.
+PDCH(bts=0,trx=0,ts=4) Detaching TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS), 1 TBFs, USFs = 00, TFIs = 00000001.
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 11/11,) Detaching TBF: TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS)
MS(TLLI=0xffeeddcc, IMSI=, TA=0, 11/11,) Destroying MS object
********** DL-TBF ends here **********
@@ -7103,7 +7124,9 @@ UL_ASS_TBF(DL-TFI_0){NONE}: Deallocated
DL_ASS_TBF(DL-TFI_0){SEND_ASS}: Deallocated
=== end test_tbf_epdan_out_of_rx_window ===
=== start test_immediate_assign_rej_multi_block ===
+PDCH(bts=0,trx=0,ts=7) PDCH state: disabled => enabled
MS requests Uplink resource on CCCH/RACH: ra=0x78 (8 bit) Fn=2654167 qta=31
+MS requests single TS uplink transmission (one phase packet access)
Creating MS object, TLLI = 0xffffffff
MS(TLLI=0xffffffff, IMSI=, TA=220, 0/0,) ********** UL-TBF starts here **********
MS(TLLI=0xffffffff, IMSI=, TA=220, 0/0,) Allocating UL TBF
@@ -7131,6 +7154,7 @@ TBF(TFI=0 TLLI=0xffffffff DIR=UL STATE=FLOW) starting timer T3141 [Contention re
Modifying MS object, TLLI = 0xffffffff, TA 220 -> 7
Tx Immediate Assignment on AGCH: TRX=0 (ARFCN 0) TS=7 TA=7 TSC=0 TFI=0 USF=0
MS requests Uplink resource on CCCH/RACH: ra=0x79 (8 bit) Fn=2654167 qta=31
+MS requests single TS uplink transmission (one phase packet access)
Creating MS object, TLLI = 0xffffffff
MS(TLLI=0xffffffff, IMSI=, TA=220, 0/0,) ********** UL-TBF starts here **********
MS(TLLI=0xffffffff, IMSI=, TA=220, 0/0,) Allocating UL TBF
@@ -7158,6 +7182,7 @@ TBF(TFI=1 TLLI=0xffffffff DIR=UL STATE=FLOW) starting timer T3141 [Contention re
Modifying MS object, TLLI = 0xffffffff, TA 220 -> 7
Tx Immediate Assignment on AGCH: TRX=0 (ARFCN 0) TS=7 TA=7 TSC=0 TFI=1 USF=1
MS requests Uplink resource on CCCH/RACH: ra=0x7a (8 bit) Fn=2654167 qta=31
+MS requests single TS uplink transmission (one phase packet access)
Creating MS object, TLLI = 0xffffffff
MS(TLLI=0xffffffff, IMSI=, TA=220, 0/0,) ********** UL-TBF starts here **********
MS(TLLI=0xffffffff, IMSI=, TA=220, 0/0,) Allocating UL TBF
@@ -7185,6 +7210,7 @@ TBF(TFI=2 TLLI=0xffffffff DIR=UL STATE=FLOW) starting timer T3141 [Contention re
Modifying MS object, TLLI = 0xffffffff, TA 220 -> 7
Tx Immediate Assignment on AGCH: TRX=0 (ARFCN 0) TS=7 TA=7 TSC=0 TFI=2 USF=2
MS requests Uplink resource on CCCH/RACH: ra=0x7b (8 bit) Fn=2654167 qta=31
+MS requests single TS uplink transmission (one phase packet access)
Creating MS object, TLLI = 0xffffffff
MS(TLLI=0xffffffff, IMSI=, TA=220, 0/0,) ********** UL-TBF starts here **********
MS(TLLI=0xffffffff, IMSI=, TA=220, 0/0,) Allocating UL TBF
@@ -7212,6 +7238,7 @@ TBF(TFI=3 TLLI=0xffffffff DIR=UL STATE=FLOW) starting timer T3141 [Contention re
Modifying MS object, TLLI = 0xffffffff, TA 220 -> 7
Tx Immediate Assignment on AGCH: TRX=0 (ARFCN 0) TS=7 TA=7 TSC=0 TFI=3 USF=3
MS requests Uplink resource on CCCH/RACH: ra=0x7c (8 bit) Fn=2654167 qta=31
+MS requests single TS uplink transmission (one phase packet access)
Creating MS object, TLLI = 0xffffffff
MS(TLLI=0xffffffff, IMSI=, TA=220, 0/0,) ********** UL-TBF starts here **********
MS(TLLI=0xffffffff, IMSI=, TA=220, 0/0,) Allocating UL TBF
@@ -7239,6 +7266,7 @@ TBF(TFI=4 TLLI=0xffffffff DIR=UL STATE=FLOW) starting timer T3141 [Contention re
Modifying MS object, TLLI = 0xffffffff, TA 220 -> 7
Tx Immediate Assignment on AGCH: TRX=0 (ARFCN 0) TS=7 TA=7 TSC=0 TFI=4 USF=4
MS requests Uplink resource on CCCH/RACH: ra=0x7d (8 bit) Fn=2654167 qta=31
+MS requests single TS uplink transmission (one phase packet access)
Creating MS object, TLLI = 0xffffffff
MS(TLLI=0xffffffff, IMSI=, TA=220, 0/0,) ********** UL-TBF starts here **********
MS(TLLI=0xffffffff, IMSI=, TA=220, 0/0,) Allocating UL TBF
@@ -7266,6 +7294,7 @@ TBF(TFI=5 TLLI=0xffffffff DIR=UL STATE=FLOW) starting timer T3141 [Contention re
Modifying MS object, TLLI = 0xffffffff, TA 220 -> 7
Tx Immediate Assignment on AGCH: TRX=0 (ARFCN 0) TS=7 TA=7 TSC=0 TFI=5 USF=5
MS requests Uplink resource on CCCH/RACH: ra=0x7e (8 bit) Fn=2654167 qta=31
+MS requests single TS uplink transmission (one phase packet access)
Creating MS object, TLLI = 0xffffffff
MS(TLLI=0xffffffff, IMSI=, TA=220, 0/0,) ********** UL-TBF starts here **********
MS(TLLI=0xffffffff, IMSI=, TA=220, 0/0,) Allocating UL TBF
@@ -7293,6 +7322,7 @@ TBF(TFI=6 TLLI=0xffffffff DIR=UL STATE=FLOW) starting timer T3141 [Contention re
Modifying MS object, TLLI = 0xffffffff, TA 220 -> 7
Tx Immediate Assignment on AGCH: TRX=0 (ARFCN 0) TS=7 TA=7 TSC=0 TFI=6 USF=6
MS requests Uplink resource on CCCH/RACH: ra=0x7f (8 bit) Fn=2654167 qta=31
+MS requests single TS uplink transmission (one phase packet access)
Creating MS object, TLLI = 0xffffffff
MS(TLLI=0xffffffff, IMSI=, TA=220, 0/0,) ********** UL-TBF starts here **********
MS(TLLI=0xffffffff, IMSI=, TA=220, 0/0,) Allocating UL TBF
@@ -7310,7 +7340,7 @@ UL_ACK_TBF{NONE}: Allocated
- Skipping TS 6, because not enabled
- Skipping TS 7, because no USF available
[UL] algo A <single> (suggested TRX: -1): failed to allocate a TS, no USF available
-TBF(TFI=0 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 1
+TBF(TFI=-1 TLLI=0xffffffff DIR=UL STATE=NEW) Timeslot Allocation failed: trx = -1, single_slot = 1
UL_ACK_TBF{NONE}: Deallocated
TBF{NEW}: Deallocated
UL_ASS_TBF{NONE}: Deallocated
@@ -7320,15 +7350,18 @@ Tx Immediate Assignment Reject on AGCH
MS(TLLI=0xffffffff, IMSI=, TA=220, 0/0,) Destroying MS object
=== end test_immediate_assign_rej_multi_block ===
=== start test_immediate_assign_rej_single_block ===
+PDCH(bts=0,trx=0,ts=7) PDCH state: disabled => enabled
+PDCH(bts=0,trx=0,ts=7) PDCH state: enabled => disabled
MS requests Uplink resource on CCCH/RACH: ra=0x70 (8 bit) Fn=2654167 qta=31
-MS requests single block allocation
+MS requests single block allocation (two phase packet access)
No PDCH available.
No PDCH resource for single block allocation
Tx Immediate Assignment Reject on AGCH
=== end test_immediate_assign_rej_single_block ===
=== start test_tbf_egprs_two_phase_puan ===
+PDCH(bts=0,trx=0,ts=7) PDCH state: disabled => enabled
MS requests Uplink resource on CCCH/RACH: ra=0x73 (8 bit) Fn=2654167 qta=31
-MS requests single block allocation
+MS requests single block allocation (two phase packet access)
Allocated a single block at SBFn=2654270 TRX=0 TS=7
Tx Immediate Assignment on AGCH: TRX=0 (ARFCN 0) TS=7 TA=7 TSC=0 TFI=-1 USF=7
Found first unallocated TRX=0 TFI=0
@@ -8073,7 +8106,7 @@ UL_ACK_TBF(UL-TFI_0){SCHED_UL_ACK}: state_chg to NONE
PDCH(bts=0,trx=0,ts=7) Received RTS for PDCH: FN=2654279 block_nr=10 scheduling USF=0 for TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FLOW EGPRS), expect answer on UL FN=2654283
DL_ASS_TBF(UL-TFI_0){SEND_ASS}: Received Event CREATE_RLCMAC_MSG
PDCH(bts=0,trx=0,ts=7) POLL scheduled at FN 2654279 + 13 = 2654292
-TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=ASSIGN EGPRS) start Packet Downlink Assignment (PACCH)
+TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FLOW EGPRS) start Packet Downlink Assignment (PACCH) for TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=ASSIGN EGPRS)
+++++++++++++++++++++++++ TX : Packet Downlink Assignment +++++++++++++++++++++++++
------------------------- TX : Packet Downlink Assignment -------------------------
TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FLOW EGPRS) Scheduled DL Assignment polling on PACCH (FN=2654292, TS=7)
@@ -8589,6 +8622,7 @@ Got MS: TLLI = 0xf1223344, TA = 7
TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=ASSIGN EGPRS) appending 256 bytes
=== end test_tbf_egprs_two_phase_puan ===
=== start test_packet_access_rej_epdan ===
+PDCH(bts=0,trx=0,ts=4) PDCH state: disabled => enabled
Creating MS object, TLLI = 0xffffffff
Modifying MS object, TLLI = 0xffffffff, MS class 0 -> 11
Modifying MS object, TLLI = 0xffffffff, EGPRS MS class 0 -> 11
@@ -8634,36 +8668,37 @@ UL_ASS_TBF(DL-TFI_0){SEND_ASS_REJ}: state_chg to NONE
packet reject: 40 84 7f f7 6e e6 7e ab 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
=== end test_packet_access_rej_epdan ===
=== start test_packet_access_rej_prr ===
+PDCH(bts=0,trx=0,ts=7) PDCH state: disabled => enabled
MS requests Uplink resource on CCCH/RACH: ra=0x70 (8 bit) Fn=2654167 qta=31
-MS requests single block allocation
+MS requests single block allocation (two phase packet access)
Allocated a single block at SBFn=52 TRX=0 TS=7
Tx Immediate Assignment on AGCH: TRX=0 (ARFCN 0) TS=7 TA=7 TSC=0 TFI=-1 USF=7
MS requests Uplink resource on CCCH/RACH: ra=0x71 (8 bit) Fn=2654167 qta=31
-MS requests single block allocation
+MS requests single block allocation (two phase packet access)
Allocated a single block at SBFn=56 TRX=0 TS=7
Tx Immediate Assignment on AGCH: TRX=0 (ARFCN 0) TS=7 TA=7 TSC=0 TFI=-1 USF=7
MS requests Uplink resource on CCCH/RACH: ra=0x72 (8 bit) Fn=2654167 qta=31
-MS requests single block allocation
+MS requests single block allocation (two phase packet access)
Allocated a single block at SBFn=60 TRX=0 TS=7
Tx Immediate Assignment on AGCH: TRX=0 (ARFCN 0) TS=7 TA=7 TSC=0 TFI=-1 USF=7
MS requests Uplink resource on CCCH/RACH: ra=0x73 (8 bit) Fn=2654167 qta=31
-MS requests single block allocation
+MS requests single block allocation (two phase packet access)
Allocated a single block at SBFn=65 TRX=0 TS=7
Tx Immediate Assignment on AGCH: TRX=0 (ARFCN 0) TS=7 TA=7 TSC=0 TFI=-1 USF=7
MS requests Uplink resource on CCCH/RACH: ra=0x74 (8 bit) Fn=2654167 qta=31
-MS requests single block allocation
+MS requests single block allocation (two phase packet access)
Allocated a single block at SBFn=69 TRX=0 TS=7
Tx Immediate Assignment on AGCH: TRX=0 (ARFCN 0) TS=7 TA=7 TSC=0 TFI=-1 USF=7
MS requests Uplink resource on CCCH/RACH: ra=0x75 (8 bit) Fn=2654167 qta=31
-MS requests single block allocation
+MS requests single block allocation (two phase packet access)
Allocated a single block at SBFn=73 TRX=0 TS=7
Tx Immediate Assignment on AGCH: TRX=0 (ARFCN 0) TS=7 TA=7 TSC=0 TFI=-1 USF=7
MS requests Uplink resource on CCCH/RACH: ra=0x76 (8 bit) Fn=2654167 qta=31
-MS requests single block allocation
+MS requests single block allocation (two phase packet access)
Allocated a single block at SBFn=78 TRX=0 TS=7
Tx Immediate Assignment on AGCH: TRX=0 (ARFCN 0) TS=7 TA=7 TSC=0 TFI=-1 USF=7
MS requests Uplink resource on CCCH/RACH: ra=0x77 (8 bit) Fn=2654167 qta=31
-MS requests single block allocation
+MS requests single block allocation (two phase packet access)
Allocated a single block at SBFn=82 TRX=0 TS=7
Tx Immediate Assignment on AGCH: TRX=0 (ARFCN 0) TS=7 TA=7 TSC=0 TFI=-1 USF=7
Detected FN jump! 2654167 -> 52
@@ -9056,7 +9091,7 @@ UL_ACK_TBF{NONE}: Allocated
- Skipping TS 6, because not enabled
- Skipping TS 7, because no USF available
[UL] algo A <multi> (suggested TRX: 0): failed to allocate a TS, no USF available
-TBF(TFI=0 TLLI=0xffeeddd3 DIR=UL STATE=NEW EGPRS) Timeslot Allocation failed: trx = 0, single_slot = 0
+TBF(TFI=-1 TLLI=0xffeeddd3 DIR=UL STATE=NEW EGPRS) Timeslot Allocation failed: trx = 0, single_slot = 0
UL_ACK_TBF{NONE}: Deallocated
TBF{NEW}: Deallocated
UL_ASS_TBF{NONE}: Deallocated
@@ -9066,13 +9101,14 @@ TBF{NEW}: Allocated
UL_ASS_TBF{NONE}: Allocated
DL_ASS_TBF{NONE}: Allocated
UL_ACK_TBF{NONE}: Allocated
-MS(TLLI=0xffeeddd3, IMSI=, TA=7, 11/11,) Attaching UL TBF: TBF(TFI=0 TLLI=0xffeeddd3 DIR=UL STATE=NEW)
-TBF{NEW}: Received Event ASSIGN_ADD_PACCH
-TBF(TFI=0 TLLI=0xffeeddd3 DIR=UL STATE=NEW) set ass. type PACCH [prev CCCH:0, PACCH:0]
-TBF{NEW}: state_chg to ASSIGN
-TBF(TFI=0 TLLI=0xffeeddd3 DIR=UL STATE=ASSIGN) Starting timer X2001 [assignment (PACCH)] with 2 sec. 0 microsec
-UL_ASS_TBF{NONE}: Received Event SCHED_ASS_REJ
-UL_ASS_TBF{NONE}: state_chg to SEND_ASS_REJ
+TBF(TFI=-1 TLLI=0xffeeddd3 DIR=UL STATE=NEW) Setting Control TS 7
+MS(TLLI=0xffeeddd3, IMSI=, TA=7, 11/11,) Attaching UL TBF: TBF(TFI=-1 TLLI=0xffeeddd3 DIR=UL STATE=NEW)
+TBF(UL-TFI_-1){NEW}: Received Event ASSIGN_ADD_PACCH
+TBF(TFI=-1 TLLI=0xffeeddd3 DIR=UL STATE=NEW) set ass. type PACCH [prev CCCH:0, PACCH:0]
+TBF(UL-TFI_-1){NEW}: state_chg to ASSIGN
+TBF(TFI=-1 TLLI=0xffeeddd3 DIR=UL STATE=ASSIGN) Starting timer X2001 [assignment (PACCH)] with 2 sec. 0 microsec
+UL_ASS_TBF(UL-TFI_-1){NONE}: Received Event SCHED_ASS_REJ
+UL_ASS_TBF(UL-TFI_-1){NONE}: state_chg to SEND_ASS_REJ
PDCH(bts=0,trx=0,ts=7) Expiring FN=82 but previous FN=2654231 is still reserved!
PDCH(bts=0,trx=0,ts=7) Timeout for registered POLL (FN=2654231, reason=UL_ASS): TBF(TFI=6 TLLI=0xffeeddd2 DIR=UL STATE=ASSIGN EGPRS)
TBF(TFI=6 TLLI=0xffeeddd2 DIR=UL STATE=ASSIGN EGPRS) poll timeout for FN=2654231, TS=7 (curr FN 82)
@@ -9090,30 +9126,32 @@ UL_ASS_TBF(UL-TFI_0){SEND_ASS}: state_chg to WAIT_ACK
PDCH(bts=0,trx=0,ts=7) FN=2654218 Scheduling control message at RTS for TBF(TFI=0 TLLI=0xffeeddcc DIR=UL STATE=ASSIGN EGPRS)
=== end test_packet_access_rej_prr ===
=== start test_packet_access_rej_prr_no_other_tbfs ===
+PDCH(bts=0,trx=0,ts=7) PDCH state: disabled => enabled
Creating MS object, TLLI = 0xffffffff
Modifying MS object, UL TLLI: 0xffffffff -> 0xffeeddcc, not yet confirmed
TBF{NEW}: Allocated
UL_ASS_TBF{NONE}: Allocated
DL_ASS_TBF{NONE}: Allocated
UL_ACK_TBF{NONE}: Allocated
-MS(TLLI=0xffeeddcc, IMSI=, TA=220, 0/0,) Attaching UL TBF: TBF(TFI=0 TLLI=0xffeeddcc DIR=UL STATE=NEW)
-TBF{NEW}: Received Event ASSIGN_ADD_PACCH
-TBF(TFI=0 TLLI=0xffeeddcc DIR=UL STATE=NEW) set ass. type PACCH [prev CCCH:0, PACCH:0]
-TBF{NEW}: state_chg to ASSIGN
-TBF(TFI=0 TLLI=0xffeeddcc DIR=UL STATE=ASSIGN) Starting timer X2001 [assignment (PACCH)] with 2 sec. 0 microsec
-UL_ASS_TBF{NONE}: Received Event SCHED_ASS_REJ
-UL_ASS_TBF{NONE}: state_chg to SEND_ASS_REJ
-UL_ASS_TBF{SEND_ASS_REJ}: Received Event CREATE_RLCMAC_MSG
-UL_ASS_TBF{SEND_ASS_REJ}: state_chg to NONE
-TBF(TFI=0 TLLI=0xffeeddcc DIR=UL STATE=ASSIGN) starting timer X2000 [reject (PACCH)] with 0 sec. 0 microsec
-PDCH(bts=0,trx=0,ts=7) FN=2654218 Scheduling control message at RTS for TBF(TFI=0 TLLI=0xffeeddcc DIR=UL STATE=ASSIGN)
-UL_ASS_TBF{NONE}: Timeout of X2000
-TBF(TFI=0 TLLI=0xffeeddcc DIR=UL STATE=ASSIGN) free
-MS(TLLI=0xffeeddcc, IMSI=, TA=220, 0/0,) Detaching TBF: TBF(TFI=0 TLLI=0xffeeddcc DIR=UL STATE=ASSIGN)
+TBF(TFI=-1 TLLI=0xffeeddcc DIR=UL STATE=NEW) Setting Control TS 7
+MS(TLLI=0xffeeddcc, IMSI=, TA=220, 0/0,) Attaching UL TBF: TBF(TFI=-1 TLLI=0xffeeddcc DIR=UL STATE=NEW)
+TBF(UL-TFI_-1){NEW}: Received Event ASSIGN_ADD_PACCH
+TBF(TFI=-1 TLLI=0xffeeddcc DIR=UL STATE=NEW) set ass. type PACCH [prev CCCH:0, PACCH:0]
+TBF(UL-TFI_-1){NEW}: state_chg to ASSIGN
+TBF(TFI=-1 TLLI=0xffeeddcc DIR=UL STATE=ASSIGN) Starting timer X2001 [assignment (PACCH)] with 2 sec. 0 microsec
+UL_ASS_TBF(UL-TFI_-1){NONE}: Received Event SCHED_ASS_REJ
+UL_ASS_TBF(UL-TFI_-1){NONE}: state_chg to SEND_ASS_REJ
+UL_ASS_TBF(UL-TFI_-1){SEND_ASS_REJ}: Received Event CREATE_RLCMAC_MSG
+UL_ASS_TBF(UL-TFI_-1){SEND_ASS_REJ}: state_chg to NONE
+TBF(TFI=-1 TLLI=0xffeeddcc DIR=UL STATE=ASSIGN) starting timer X2000 [reject (PACCH)] with 0 sec. 0 microsec
+PDCH(bts=0,trx=0,ts=7) FN=2654218 Scheduling control message at RTS for TBF(TFI=-1 TLLI=0xffeeddcc DIR=UL STATE=ASSIGN)
+UL_ASS_TBF(UL-TFI_-1){NONE}: Timeout of X2000
+TBF(TFI=-1 TLLI=0xffeeddcc DIR=UL STATE=ASSIGN) free
+MS(TLLI=0xffeeddcc, IMSI=, TA=220, 0/0,) Detaching TBF: TBF(TFI=-1 TLLI=0xffeeddcc DIR=UL STATE=ASSIGN)
MS(TLLI=0xffeeddcc, IMSI=, TA=220, 0/0,) Destroying MS object
********** UL-TBF ends here **********
-UL_ACK_TBF{NONE}: Deallocated
-TBF{ASSIGN}: Deallocated
-UL_ASS_TBF{NONE}: Deallocated
-DL_ASS_TBF{NONE}: Deallocated
+UL_ACK_TBF(UL-TFI_-1){NONE}: Deallocated
+TBF(UL-TFI_-1){ASSIGN}: Deallocated
+UL_ASS_TBF(UL-TFI_-1){NONE}: Deallocated
+DL_ASS_TBF(UL-TFI_-1){NONE}: Deallocated
=== end test_packet_access_rej_prr_no_other_tbfs ===
diff --git a/tests/ulc/PdchUlcTest.err b/tests/ulc/PdchUlcTest.err
index d122f31c..c7357c57 100644
--- a/tests/ulc/PdchUlcTest.err
+++ b/tests/ulc/PdchUlcTest.err
@@ -1,46 +1,50 @@
+PDCH(bts=0,trx=0,ts=0) PDCH state: disabled => enabled
PDCH(bts=0,trx=0,ts=0) Trying to reserve already reserved FN 72
PDCH(bts=0,trx=0,ts=0) Trying to reserve already reserved FN 78
PDCH(bts=0,trx=0,ts=0) Trying to reserve already reserved FN 72
PDCH(bts=0,trx=0,ts=0) Trying to reserve already reserved FN 78
PDCH(bts=0,trx=0,ts=0) Trying to release unregistered SBA (FN=78, TA=0)
PDCH(bts=0,trx=0,ts=0) Timeout for registered SBA (FN=72, TA=0)
+PDCH(bts=0,trx=0,ts=0) PDCH state: disabled => enabled
Creating MS object, TLLI = 0x12345678
-MS(TLLI=0x12345678, IMSI=, TA=220, 0/0,) Attaching DL TBF: TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=NEW)
+MS(TLLI=0x12345678, IMSI=, TA=220, 0/0,) Attaching DL TBF: TBF(TFI=-1 TLLI=0x12345678 DIR=DL STATE=NEW)
PDCH(bts=0,trx=0,ts=0) Expiring FN=2715613 but previous FN=2715608 is still reserved!
-PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=2715608, reason=UL_ASS): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=NEW)
-PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=2715613, reason=UL_ASS): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=NEW)
+PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=2715608, reason=UL_ASS): TBF(TFI=-1 TLLI=0x12345678 DIR=DL STATE=NEW)
+PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=2715613, reason=UL_ASS): TBF(TFI=-1 TLLI=0x12345678 DIR=DL STATE=NEW)
PDCH(bts=0,trx=0,ts=0) Expiring FN=43 but previous FN=2715617 is still reserved!
-PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=2715617, reason=UL_ASS): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=NEW)
+PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=2715617, reason=UL_ASS): TBF(TFI=-1 TLLI=0x12345678 DIR=DL STATE=NEW)
PDCH(bts=0,trx=0,ts=0) Expiring FN=43 but previous FN=2715622 is still reserved!
-PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=2715622, reason=UL_ASS): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=NEW)
+PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=2715622, reason=UL_ASS): TBF(TFI=-1 TLLI=0x12345678 DIR=DL STATE=NEW)
PDCH(bts=0,trx=0,ts=0) Expiring FN=43 but previous FN=2715626 is still reserved!
-PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=2715626, reason=UL_ASS): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=NEW)
+PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=2715626, reason=UL_ASS): TBF(TFI=-1 TLLI=0x12345678 DIR=DL STATE=NEW)
PDCH(bts=0,trx=0,ts=0) Expiring FN=43 but previous FN=2715630 is still reserved!
-PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=2715630, reason=UL_ASS): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=NEW)
+PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=2715630, reason=UL_ASS): TBF(TFI=-1 TLLI=0x12345678 DIR=DL STATE=NEW)
PDCH(bts=0,trx=0,ts=0) Expiring FN=43 but previous FN=2715635 is still reserved!
-PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=2715635, reason=UL_ASS): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=NEW)
+PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=2715635, reason=UL_ASS): TBF(TFI=-1 TLLI=0x12345678 DIR=DL STATE=NEW)
PDCH(bts=0,trx=0,ts=0) Expiring FN=43 but previous FN=2715639 is still reserved!
-PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=2715639, reason=UL_ASS): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=NEW)
+PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=2715639, reason=UL_ASS): TBF(TFI=-1 TLLI=0x12345678 DIR=DL STATE=NEW)
PDCH(bts=0,trx=0,ts=0) Expiring FN=43 but previous FN=2715643 is still reserved!
-PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=2715643, reason=UL_ASS): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=NEW)
+PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=2715643, reason=UL_ASS): TBF(TFI=-1 TLLI=0x12345678 DIR=DL STATE=NEW)
PDCH(bts=0,trx=0,ts=0) Expiring FN=43 but previous FN=4 is still reserved!
-PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=4, reason=UL_ASS): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=NEW)
+PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=4, reason=UL_ASS): TBF(TFI=-1 TLLI=0x12345678 DIR=DL STATE=NEW)
PDCH(bts=0,trx=0,ts=0) Expiring FN=43 but previous FN=8 is still reserved!
-PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=8, reason=UL_ASS): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=NEW)
+PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=8, reason=UL_ASS): TBF(TFI=-1 TLLI=0x12345678 DIR=DL STATE=NEW)
PDCH(bts=0,trx=0,ts=0) Expiring FN=43 but previous FN=13 is still reserved!
-PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=13, reason=UL_ASS): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=NEW)
+PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=13, reason=UL_ASS): TBF(TFI=-1 TLLI=0x12345678 DIR=DL STATE=NEW)
PDCH(bts=0,trx=0,ts=0) Expiring FN=43 but previous FN=17 is still reserved!
-PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=17, reason=UL_ASS): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=NEW)
+PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=17, reason=UL_ASS): TBF(TFI=-1 TLLI=0x12345678 DIR=DL STATE=NEW)
PDCH(bts=0,trx=0,ts=0) Expiring FN=43 but previous FN=21 is still reserved!
-PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=21, reason=UL_ASS): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=NEW)
+PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=21, reason=UL_ASS): TBF(TFI=-1 TLLI=0x12345678 DIR=DL STATE=NEW)
PDCH(bts=0,trx=0,ts=0) Expiring FN=43 but previous FN=26 is still reserved!
-PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=26, reason=UL_ASS): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=NEW)
+PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=26, reason=UL_ASS): TBF(TFI=-1 TLLI=0x12345678 DIR=DL STATE=NEW)
PDCH(bts=0,trx=0,ts=0) Expiring FN=43 but previous FN=30 is still reserved!
-PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=30, reason=UL_ASS): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=NEW)
+PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=30, reason=UL_ASS): TBF(TFI=-1 TLLI=0x12345678 DIR=DL STATE=NEW)
PDCH(bts=0,trx=0,ts=0) Expiring FN=43 but previous FN=34 is still reserved!
-PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=34, reason=UL_ASS): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=NEW)
+PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=34, reason=UL_ASS): TBF(TFI=-1 TLLI=0x12345678 DIR=DL STATE=NEW)
PDCH(bts=0,trx=0,ts=0) Expiring FN=43 but previous FN=39 is still reserved!
-PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=39, reason=UL_ASS): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=NEW)
+PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=39, reason=UL_ASS): TBF(TFI=-1 TLLI=0x12345678 DIR=DL STATE=NEW)
+PDCH(bts=0,trx=0,ts=0) PDCH state: disabled => enabled
+PDCH(bts=0,trx=0,ts=0) PDCH state: disabled => enabled
PDCH(bts=0,trx=0,ts=0) POLL scheduled at FN 26 + 13 = 39
PDCH(bts=0,trx=0,ts=0) UL block already scheduled at FN 91 + 13 = 104
PDCH(bts=0,trx=0,ts=0) POLL scheduled at FN 91 + 17 = 108