aboutsummaryrefslogtreecommitdiffstats
AgeCommit message (Collapse)AuthorFilesLines
2021-07-01WIP: Support ANR procedures on MS with active TBFpespin/anrnextPau Espin Pedrol28-6/+1607
TODO: * General clean up * Find out and fix why MS not resetting Neighbour List to BA(GPRS) when empty NC_Frequency_List is sent in Packet Measurement Order. * Fix MS most of the time not sending Neighbour report for cells not present in SI2, probably due to waiting not enough time (increasing NC_REPORTING_PERIOD_T may help, but then problem in previous point above may show up more). Also maybe waiting for several reports before continuing may also help. * Configurable/dynamic chunk list size currently hardcoded to 5. Improvements/optimizations: * Use FREQUENCY_DIFF in Add_Frequency for NC_Frequency_List to make it smaller and hence require less PAcketMeasurementOrder messages. * Support Enchanced Packet Report message (need to signal support for it too). Related: SYS#5303 Change-Id: I051d4fa90fe4ccc44ea691f8a3a487e97868e52c
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
2021-04-29manual: Update copyright yearsHarald Welte3-3/+3
Change-Id: Ia0dde7100dd90c6ad6279efbaf02b9bd3f868635
2021-04-29manual: remove revhistory, as we don't maintain it manually anyywayHarald Welte3-31/+0
Change-Id: Ibbe08cac143f4bff6192125940ef190cc943d307
2021-04-27doc/tbf.txt: Update and improve some informationPau Espin Pedrol1-11/+25
Change-Id: I3cd643ef462637708c69895c62c488554a428571
2021-04-26Clarify, document Assignment related timersPau Espin Pedrol4-7/+12
Related: OS#3928 Change-Id: Iad31a5c6f83cd78793adf05a6af782ceacae8b11
2021-04-26sched: Simplify else-if conditionPau Espin Pedrol1-6/+2
The code path running into first call of "create_packet_access_reject()" is a superset condition of the second one, so the second one will never be hit. As a result first, this block: """ else if (tbf == tbfs->ul_ass && tbf->direction == GPRS_RLCMAC_DL_TBF) if (tbf->ul_ass_state_is(GPRS_RLCMAC_UL_ASS_SEND_ASS_REJ)) msg = tbfs->ul_ass->create_packet_access_reject(); else msg = tbfs->ul_ass->create_ul_ass(fn, ts); """ Can be simplified into: """ else if (tbf == tbfs->ul_ass && tbf->direction == GPRS_RLCMAC_DL_TBF && !tbf->ul_ass_state_is(GPRS_RLCMAC_UL_ASS_SEND_ASS_REJ)) msg = tbfs->ul_ass->create_ul_ass(fn, ts); """ Next, one can see that previous condition still forces !tbf->ul_ass_state_is(GPRS_RLCMAC_UL_ASS_SEND_ASS_REJ) to be always true if we ever reach that code, so it can be dropped. Change-Id: I62e2255e28fc4f43fe0a31259ebf18ad00e7e357
2021-04-26Make WaitIndication T3172 configurablePau Espin Pedrol6-11/+18
Tbftest expectatins need to change because 5000/20 = 250 < 255, hence the message is now sent as units of 20ms instead of seconds. Related: OS#3928 Change-Id: I48b34b94b1a5dfb046a3a6cf8a0d944a7c9b6754