aboutsummaryrefslogtreecommitdiffstats
AgeCommit message (Collapse)AuthorFilesLines
2021-08-11call tbf_unlink_pdch() from gprs_rlcmac_tbf destructorneels/segv2Neels Hofmeyr1-0/+1
Change-Id: Iadec328774291e09f45850e0514653ac679c3451
2021-08-10Add counters: pcu.bts.N.pch.requestsOliver Smith3-2/+5
Count attempted paging requests over PCH. Related: SYS#4878 Change-Id: I1026780ef8542f40060b961df2f37213e15c29d7
2021-08-10Add counters: pcu.sgsn.N.rx_paging_{cs,ps}Oliver Smith2-0/+29
Related: SYS#4878 Change-Id: Iefba6f3d29c69fd4865c084bd9cf1a3a78f5c202
2021-08-06test: add 'make update_exp' targetOliver Smith1-0/+39
Add convenience target to update the test output. Change-Id: I225dd3746200cad748ea09b2c3e1c7f9d006d32f
2021-07-26tests/tbf: Fix null pointer access if slowly stepping with gdbPau Espin Pedrol1-29/+41
When slowly debugging test_tbf_dl_llc_loss, bssgp_tx_llc_discarded() may trigger, submitting events to the libosmogb code. Since it didn't properly set up the callback, it would end up in a null pointer dereference when lib code tried to use backward-compatible API (which was neither set up properly). """ TBF(TFI=0 TLLI=0xc0123456 DIR=DL STATE=ASSIGN) Discarding LLC PDU because lifetime limit reached, count=3 new_queue_size=0 BSSGP (BVCI=2234) Tx LLC-DISCARDED TLLI=0xc0123456, FRAMES=3, OCTETS=57 /git/libosmocore/src/gb/gprs_ns.c:271:2: runtime error: member access within null pointer of type 'struct gprs_ns_inst' """ """ (gdb) bt #0 0x00007ffff729cac0 in gprs_active_nsvc_by_nsei (nsi=nsi@entry=0x0, nsei=2234, bvci=bvci@entry=0) at /git/libosmocore/src/gb/gprs_ns.c:271 #1 0x00007ffff72b1fec in gprs_ns_sendmsg (nsi=0x0, msg=0x621000000160) at /git/libosmocore/src/gb/gprs_ns.c:1087 #2 0x00007ffff72d1803 in _gprs_ns_sendmsg (ctx=<optimized out>, msg=<optimized out>) at /git/libosmocore/src/gb/gprs_bssgp.c:80 #3 0x00007ffff730226f in bssgp_tx_llc_discarded (bctx=<optimized out>, tlli=<optimized out>, num_frames=<optimized out>, num_octets=<optimized out>) at /git/libosmocore/src/gb/gprs_bssgp_bss.c:249 #4 0x000055555588243e in gprs_rlcmac_dl_tbf::llc_dequeue (this=0x7ffff1622860, bctx=<optimized out>) at /git/osmo-pcu/src/tbf_dl.cpp:413 """ Change-Id: Iee5bcf21afc8980a14f90f5b1ead6d2460a244ea
2021-07-22tbf: Drop impossible paths in create_dl_ass()Pau Espin Pedrol1-27/+13
create_dl_ass() is only called in gprs_rlcmac_sched.cpp on tbf_cand->dl_ass pointer, which is always assigned under the guard "!tbf->is_control_ts(pdch->ts_no)", since we only send CTRL messages for a TBF on its control TS. Hence, condition "!is_control_ts(ts)" in create_dl_ass will always be false, and as a result poll_ass_dl will always be 1. So we can drop different code paths. Change-Id: Ibea4100a5dc8bd49303cb6a3d02417038c3d3887
2021-07-15Make gcc 11.1.0 false positivies happyPau Espin Pedrol2-4/+5
After my system's gcc was upgraded, I get false positivies like the one below: """ /git/osmo-pcu/src/gprs_bssgp_pcu.c: In function ‘ns_configure_nse’: /git/osmo-pcu/src/gprs_bssgp_pcu.c:1103:58: error: ‘%d’ directive output may be truncated writing between 1 and 11 bytes into a region of size 2 [-Werror=format-truncation=] 1103 | snprintf(name, sizeof(name), "pcu%d", i); | ^~ /git/osmo-pcu/src/gprs_bssgp_pcu.c:1103:54: note: directive argument in the range [-2147483648, 1] 1103 | snprintf(name, sizeof(name), "pcu%d", i); | ^~~~~~~ /git/osmo-pcu/src/gprs_bssgp_pcu.c:1103:25: note: ‘snprintf’ output between 5 and 15 bytes into a destination of size 5 1103 | snprintf(name, sizeof(name), "pcu%d", i); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ """ In this case, i can't never take a value with more than 1 digit, but gcc seems to be unable to see that. Let's increase the buffer size a few bytes to make gcc happy, and make the variable unsigned since it never will get negative values. Next change is also a false positive, since variables are always initialized beforehand in the cod epaths where they are used: """ /git/osmo-pcu/src/bts.cpp: In function ‘int bts_rcv_rach(gprs_rlcmac_bts*, const rach_ind_params*)’: /git/osmo-pcu/src/bts.cpp:859:25: error: ‘ts_no’ may be used uninitialized in this function [-Werror=maybe-uninitialized] 859 | uint8_t trx_no, ts_no; | ^~~~~ /git/osmo-pcu/src/bts.cpp:859:17: error: ‘trx_no’ may be used uninitialized in this function [-Werror=maybe-uninitialized] 859 | uint8_t trx_no, ts_no; | ^~~~~~ """ Change-Id: I1362a335a0c761bde367dbc779de4afa88f13584
2021-07-01pdch: Fix heap-use-after-free in pdch->ulcPau Espin Pedrol6-19/+36
In existing previous code, pdch->ulc would be freed in gprs_rlcmac_pdch::free_resources() when it became disabled as per PCUIF info_ind (for instance, when a DYN TS is switched PDCH->SDCCH8). However, pdch->ulc was so far only allocated during pdch_init, which is only called during bts_alloc() time. Hence, after first info_ind disabling it, if it became again enabled (again by info_ind re-enabling it after SDCCH8 was not longer in use), the pdch->ulc would be used again but it would point to freed memory. Let's rearrange how/when resources are freed to make it more logical. With this patch, pdch internal resources are freed upon ->disable(), and re-allocated upon ->enable(). Change-Id: Id51f5f6a54ac9f24b784c17bc360ac38f5726fc7
2021-06-25Support proto IPAC_PROTO_EXT_PCU BSC<->PCUPau Espin Pedrol4-12/+65
Related: SYS#5303 Change-Id: I633db291107883c2e370a9b56606d562a990b714
2021-06-25pcuif_proto.h: Add new container messagePau Espin Pedrol1-0/+10
Related: SYS#5303 Change-Id: Ib6c7bf5ca5a06186a71ec50cfc1a91a5c9b01d9c
2021-06-23pdch: Fix null MS access gprs_rlcmac_pdch::rcv_control_ackPau Espin Pedrol1-3/+6
If bts_ms_by_tlli() at the start of the function fails, ms could be NULL. As a result "ms->nacc" access at the end of the function would crash. Solution: In the function, we get the related expected TBF from pdch_ulc, and we only continue if a TBF is found. Since tbf objects are always expected to have a GprsMs, simply gather it from there. Change-Id: I666ed5d157f42e74956fa49fc9eea85d27e63d44
2021-06-22pcu_l1_if: ignore PDCH interference reports, do not log errorsVadim Yanitskiy1-0/+3
Change-Id: I88e5c53131ee94bc3f3ff3f095077feb4ff272a7 Related: SYS#5313, OS#1569
2021-06-22PCUIF protocol: add message definition for interference reportVadim Yanitskiy1-0/+10
Change-Id: I4b5a4c25e984f9262f0afd30f9671f150edee20f Related: SYS#5313, OS#1569
2021-06-21gprs_rlcmac_sched: fix incorrect length for CTR_RLC_DL_BYTESVadim Yanitskiy1-1/+1
msg->data_len is the total number of bytes available in the buffer, while for CTR_RLC_DL_BYTES we need to count size of the actual payload within the buffer. A consequence of this bug: osmo-pcu was counting more Downlink bytes than it's actually transmitted. Change-Id: I6884d220f3d06a79b16c18ccc2d2a6cd047b8251
2021-06-15pcuif: Support receiving System Information 2Pau Espin Pedrol2-0/+33
OsmoPCU will need this SI2 in order to gain knowledge of the BCCH Frequency List being broadcasted, in order to build a per-MS specific Neighbour List using NC_FREQUENCY_LIST bits in Packet Measurement Order. Related: SYS#5303 Change-Id: I4a9c4f70beac6805322a19835a0d30f7247780b4
2021-06-07pdch: Log pdch_ulc reason upon rx of pkt ctrl ackPau Espin Pedrol4-18/+30
Change-Id: I7c7a421b1e9189e2814e9a28698d66655fc9ba60
2021-06-04Use new stat item/ctr getter APIsPau Espin Pedrol6-37/+38
Patch mostly done with the help of several small spatch snippets. Change-Id: I600c7a8725f5b229b1a2feb879da7c3b2dce4505
2021-06-01bts: Fix typo in field namePau Espin Pedrol3-3/+3
Change-Id: I5426ff4ccbc45464888e2246cceb8e861d1e477e
2021-05-28csn1: Implement CSN_CALLBACK type in encoderPau Espin Pedrol1-1/+7
Picked code from the Decoder function. I gave it a try callback_init_Cell_Selection_Params_FREQUENCY_DIFF and looks like working fine. Change-Id: Iac962ae3e9f52f417f394060b64fc4d0ebf3d0bf
2021-05-28gsm_rlcmac.c: Fix arg list of 2 callbacksPau Espin Pedrol1-2/+2
Other callback functions are properly specified as per what's in "typedef CSN_CallBackStatus_t". However, these two were wrong. Change-Id: I280b51d4c8c38c76cc1ccd49656b6b7bbe769760
2021-05-21cosmetic: Fix typo s/TIMSI/TMSI/Pau Espin Pedrol1-1/+1
Change-Id: I64231311633b64d898625c49fdbf3f816dfbb97a
2021-05-19tbf: Move existing tbf_state implementation to osmo_fsmPau Espin Pedrol17-364/+125013
This is only an initial implementation, where all state changes are still done outside the FSM itself. The idea is to do the move in several commits so that they can be digested better in logical steps and avoid major break up. Related: OS#2709 Change-Id: I6bb4baea2dee191ba5bbcbec2ea9dcf681aa1237
2021-05-19MsTest: Set up tbf talloc destructorPau Espin Pedrol1-24/+42
This is right now not an issue, but it will be whenever talloc destructor contains extra steps like freeing an FSM. Change-Id: I096ff56321c8ae5e66634537aae8b95804282c65
2021-05-19Move TBF list from BTS to the TRX structurePau Espin Pedrol10-40/+47
The TBFs are managed per TRX. Move the global list from BTS to TRX. Related: OS#1541 Change-Id: Id3c59c11d57d765fe68aaebaac94290c0d84feb2
2021-05-19tbf: Log error path in setup() failing to assign control TSPau Espin Pedrol1-0/+1
Change-Id: I047209dfe139e37a80878318cca75cb50905536e
2021-05-19bts: Use ms_store when calculating set of target PDCHs for Pkt Paging RequestPau Espin Pedrol1-11/+10
The ul_tbfs/dl_tbfs lists will become per-trx. Since in this case we want to operate on the BTS globally, let's iterate over MS objects instead. This makes more sense too since here we really aim at reaching a MS (subscriber) instead of specific TBFs. Later on the code can be optimized easily to schedule a Pkt Paging Request for only 1 of the TBFs of each MS instad of scheduling it for each TBFs in the MS. Change-Id: I671e531921bbea2f5cc0f2bfcb8a39ea5c6673b8
2021-05-19Optimize PAGING-CS PDCH set selection when target MS is knownPau Espin Pedrol4-24/+157
Before this patch, when a PAGING-GS was received in PCU from SGSN, it would always forward the paging request to all PDCHs in all TRXs of all BTS (well, it did some heuristics to avoid sending it in some PDCHs where onyl repeated TBFs would be listening). The previous behavior, didn't make much sense in the case where the PCU is asked to page an MS which it knows (ie in which PDCHs is listening to). Hence, in that case it makes sense to simply send the paging request on 1 PDCH where the MS is listening, instead of sending it in a big set of different PDCHs. This commit also splits the old get_paging_mi() helper which was erroneously created to parseboth CS/PS-PAGING requesst, since they actually use a different set of target subscriber information (for instance, CS-PAGING provides optionally a TLLI, and one provides P-TMSI while the other provides TMSI). In this patch, the handling of CS paging request is split into 2 parts: 1- A new helper "struct paging_req_cs" is introduced, where incoming CS-PAGING requests (from both SGSN over BSSGP and BTS/BSC over PCUIF) are parsed and information stored. Then, from available information, it tries to find a target MS if avaialable 2- bts_add_paging() is called from both BSSGP and PCUIF paths with the helper struct and the target MS (NULL if not found). If MS exists, paging is forwarding only on 1 PDCH that MS is attached to. If no MS exists, then the old heursitics are used to forward the request to all MS. Change-Id: Iea46d5321a29d800813b1aa2bf4ce175ce45e2cf
2021-05-19Use LOGPDCH macro in bts_add_paging()Pau Espin Pedrol1-1/+1
Change-Id: I58daab719924d70de121f7a5f2cc1f122f8840af
2021-05-19Clean false positive in newer GCC version checking guard of else clausePau Espin Pedrol1-4/+3
Got this today with newer gcc (11.1.0) after system upgrade: egprs_rlc_compression.cpp:693:9: error: this ‘else’ clause does not guard... [-Werror=misleading-indentation] The indentation was indeed wrong, provoking a warning in GCC. From code flow point of view, however, the previous state was fine too, so no logical change is involved in this commit. Change-Id: I37bfc8e85daaabbbf10dfd907b305e3e0ec31863
2021-05-17RIM: Refactor Rx path to decode stack in proper orderPau Espin Pedrol1-63/+47
Previous implementation of the Rx path was first checking the APP ID before checking the lower layer (container type), which was confusing because the information is then not verified in ascending order in the protocol stack. Let's instead, first, pass the pdu to the correct container type handler, and only once there, let each container type handler verify the available applications. Change-Id: Ibe017c1a6e789f45d74c4a5f5f4608298c8c9f91
2021-05-13pdch: Use llist_first_entry() APIPau Espin Pedrol1-1/+1
Change-Id: I96e7188ecf7d2cfc54598975f8d538e7aa94401a
2021-05-12sched: Clean up param passing and improve loggingPau Espin Pedrol1-5/+6
Change-Id: If137a2aaac7744e60564ca833a1b5564ed7d93bb
2021-05-12ul_tbf: Fix accessing zeroed block when checking if transfer is completePau Espin Pedrol1-2/+3
The logic checking whether the UL TBF had already been sent all the data (and hence was marked as finished and requesting UL ACK to be sent) was not taking into account the case where there was still no valid block stored, ie. when the first received UL data block was discarded for some reason (ex: because TLLI was not set during content resolution). Related: OS#1940 Change-Id: I739e67ae1bb40555a362170f26fb98ac69caabb2
2021-05-12ul_tbf: Simplify function rcv_data_block_acknowledgedPau Espin Pedrol1-14/+6
Let's avoid different code paths in the loop based on is_tlli_invalid. Instead, always do the proper storing of the block, and if later on the corner case is found (no TLLI received while in Content Resolution process) when checking tlli related stuff, then simply invalidate the block. Related: OS#1940 Change-Id: I77afaa617d7ce045c0f6d994fc0d8e03fe69de53
2021-05-12Drop existing tbf->ms() check conditionPau Espin Pedrol1-2/+1
Since a while ago, tbf should always have an MS attached since its creation, so there's no sense to check for it here. Change-Id: If056a3fb83b43a48c2a6382fc30c6c81fe2b2651
2021-05-12sched: Clean up helper function and improve loggingPau Espin Pedrol2-70/+67
Change-Id: I8c19d0924e73c324a36ea038cab7cc4e096b866b
2021-05-11encoding: Encode TA in UL ACK/NACK if availablePau Espin Pedrol2-6/+23
Change-Id: I3b060ee16aeac5f5d9b314b6bc46383f5e9c44c3
2021-05-11encoding: Use gsm48_ta_is_valid() APIPau Espin Pedrol1-1/+1
Change-Id: Ieaa4c2f926611576e22eaac8a7ac595135809e2c
2021-05-11Tx ul ack/nack: Avoid sending invalid/unknown TLLIPau Espin Pedrol1-4/+14
It could happen that if MS sends first UL blocks without TLLI (wrongly, due to being in contention resolution), the submitted UL ACK/NACK would contain an invalid TLLI. Related: OS#1940 Change-Id: Ibae5df6cfbb56f8f8007cb9fec9c29006d673b72
2021-05-11tbf_ul: Use is_tlli_valid() APIPau Espin Pedrol1-1/+1
Change-Id: I4abb46913b05d1e89ebe9e361b0a774880dee998
2021-05-11Implement T3141Pau Espin Pedrol7-5/+71
Related: OS#1940 Change-Id: I154984b835b2b436b1ebe4631a8afcebb7338c65
2021-05-11Split ul_tbf alloc on CCCH into new functionPau Espin Pedrol4-15/+29
This allows more easily finding when this specific scenario happens, and can easily be compared against the PACCH one. Change-Id: I609792a40fda2a798ca71a0e9f5639d0a0f011d7
2021-05-11Rename function s/tbf_alloc_ul/tbf_alloc_ul_pacch/Pau Espin Pedrol3-5/+5
Change-Id: I70ca0b5be0a29a05c6e65b9c92cc6d3b5c43d3dc
2021-05-10alloc_algorithm_b: Rearrange variable initializationPau Espin Pedrol1-9/+6
Untangle variable assignment at the start of the function. Changes end up in same kind of assignment, but are far easier to understand based on the variable use later on. * reserved_{dl,ul}_slots contain mask of TS either "previously-reserved" or "intended to be reserved now" based on MS's ms_class. * {dl,ul}_slots contain a derived mask from the one above, filtered further based on more factors like type of allocation requested (multi vs single), available USFs (UL), etc. Change-Id: If3cfa82f8b793a87e97145ee8a6fc0fe1a61add6
2021-05-10Simplify helper function tbf_select_slot_set()Pau Espin Pedrol2-10/+11
Store direction check to simplify the code. Get rid of 2-step LOGP to avoid multi-row logs in gsmtap log. Change-Id: Ia2e061da82ddce564b2d768d8ade1672c22934e2
2021-05-06rim: Constify param in funcPau Espin Pedrol1-1/+2
Change-Id: I47c471929a62d6a5340ae4a4ca88bd0b758c208d
2021-04-30sched: Rename func to describe its used only for RLCMAC CTRL blocks2021q1Pau Espin Pedrol1-2/+2
Change-Id: I20e15047af2aac4d51e1dae263ab16e479bb0c46
2021-04-30bts: constify arg in func bts_ms_store()Pau Espin Pedrol2-2/+2
Change-Id: I4cc8c4fc075cdd07e689511df8f1c267e5360014
2021-04-29manual: Include QoS chapter and add osmo-pcu specific exampleHarald Welte2-0/+46
Change-Id: I4d409b55861f05ba229dc5cb97f99370356e3dbd Requires: osmo-gsm-manuals.git Id344c29eda2a9b3e36376302b425e9db1f6c0f28
2021-04-29vty: Add configuration for Gb DSCP and socket priorityHarald Welte5-0/+41
While libosmogb / ns2 supports that natively in the VTY, the PCU doesn't want to use the complexities of the full NS2 vty. Change-Id: I7bfbad46582e65e5ad2ac0cc66545538bc632df8 Related: SYS#5427