aboutsummaryrefslogtreecommitdiffstats
path: root/src
AgeCommit message (Collapse)AuthorFilesLines
2021-01-26sched: Avoid picking TBF with nacked dl blocks when GMSK is requiredPau Espin Pedrol1-3/+28
Sine we don't yet implement properly all resegmentation of blocks from same MCS family type, when requiring a GMSK DL block (due to GPRS+EGPRS multiplexing limitations) we need to skip retransmitions, otherwise we'd be incorrectly picking a DL block which was already built with a potentially higher MCS value. The "DL_PRIO_NEW_DATA" prio serves two purposes: * There's new data to send * There's some nacked data to be retransmitted The 2nd purpose has, later on, more priority over the 1st one when the tbf is selected (see gprs_rlcmac_dl_tbf::take_next_bsn()). Until now we were handling correctly the case where the tbf was skipped in case the prio was to resend unacked data (DL_PRIO_SENT_DATA), but was incorrectly selected when it'd send nacked data. Let's fix it by specifically checking w->resend_needed() < 0. Change-Id: I253de8e1a190a9adb56160f38892c9e43e2c0272
2021-01-25Fix Dl EGPRS data blocks being generated occasionally on GPRS TBFsPau Espin Pedrol5-33/+59
Under some circumstances, it could happen that a DL TBF is created as a GPRS TBF due to not yet having enough information of the MS, and only after the TBF is created the PCU gains that information and upgrades the MS mode to "EGPRS". Hence, there's the possibility to run into a situation where a GPRS TBF is attached to a EGPRS MS. It may also happen sometimes that despite the TBF and the MS be EGPRS, there's need to further limit the DL MCS to use, eg. MCS1-4 (GMSK). As a result, when asking for the current DL (M)CS to use, we must tell the MS which kind of limitations we want to apply. The later reasoning was already implemented when GPRS+EGPRS multiplexing was added, but the former was not being checked. Hence, by further spreading through the call stack the "req_kind_mode" we match both cases. Related: OS#4973 Change-Id: Ic0276ce045660713129f0c72f1158a3321c5977f
2021-01-25ms: Properly handle EGPRS_GMSK mode in ms_max_cs_dl/ul()Pau Espin Pedrol1-18/+10
Change-Id: Ied3e02a12145112fafa12282ed7aefa5b0fa6eb6
2021-01-25ms: Set proper initial MCS values setting mode EGPRS_GMSKPau Espin Pedrol1-0/+13
Before this patch, shared logic with EGPRS case would allow keeping MCS>4. Change-Id: I94cbf0c120fd37deb2dfd077d35b3811c7da0675
2021-01-25encoding: fix typos in commentPau Espin Pedrol1-2/+2
Change-Id: I0867935ad08d6e49c62e061742d3d76eeac35844
2021-01-25tbf: Drop always-true condition checking for MSPau Espin Pedrol1-3/+3
The TBF can sometimes be detached from an MS, for eg. when switching from one MS object to another due to them being merged after we found duplicate objects upon receiving new information from it, but that change is instantaneous so it shouldn't be a problem. The only other way where an MS can be detached from an MS is during the end of its (or the MS) life, where it is not sending data anymore. Hence, it is safe to drop those checks for MS not being null. Those being trigger, it should be considered a bug. Change-Id: If292a53a09a64664031e756bff4735b9c6ee8651
2021-01-25sched: Check if egprs is enabled in TBF rather than MS being egprs capablePau Espin Pedrol1-1/+1
It could happen as of current implementation that a TBF was created as GPRS due to the MS being non-egprs, and later on the MS was upgraded to EGPRS due to newly received information from the MS. Hence, in order to infer if the data block is EGPRS or GPRS, let's better check for the TBF info, which is the one really mandating the kind of dl block to generate. Change-Id: I49720fb3a69ca972cd1973de937ac8ee77615431
2021-01-25ms: Drop always-false checkPau Espin Pedrol1-3/+0
MS is always assigned to a BTS, since it's set during MS constructor. Hence, the check removed in this patch would never hold true (and if it did, it'd be a bug). Change-Id: I86a71c64623f7bec031226938a54306148370ffb
2021-01-22gprs_pcu: Use libosmocore osmo_cgi_ps_cmp APIPau Espin Pedrol1-1/+1
it was noticed that gprs_pcu_get_bts_by_cgi_ps() sometimes failed to return the BTS even if the CGI-PS fields matched, probably due to memcmp checking too padding bytes which may not be zero-initialized in one of the two memory regions being checked. Let's be on the safe side and use libosmocore APIs to check them. Depends: libosmocore.git Change-Id I00e329bc5be8674b30267dec238e7656ddfc21db Change-Id: I7c8ee2c447634e45b367bb8f84adf0140ae48591
2021-01-22Initial handling support for RIM messagesPau Espin Pedrol8-1/+230
This code doesn't do anything yet app-related with the received RIM messages, but already provides the initial infrastructure to handle them in the future, and does first checkings. Related: SYS#5103 Change-Id: Ia0ade0e97ea781ec655439c008b6cefaf3e90dec
2021-01-21Get rid of singleton gprs_bssgp_pcu_current_bctx()Pau Espin Pedrol5-10/+4
Access it from existing pointers instead. Change-Id: I77455da5221090ebea142ecd49d5dba0065bfc5c
2021-01-20bts: Store RAC+CI from info_indPau Espin Pedrol2-0/+7
Having those values at hand will be needed later for RIM / NACC related purposes. Change-Id: Ia3596e9e81cd71443be2cc6f2450bb7f91d2667d
2021-01-20Allow multiple bts objects in PCUPau Espin Pedrol17-169/+285
This patch doesn't really tests whether osmo-pcu can work on a multi-bts environment, but it prepares the data structures to be able to do so at any later point in time. Change-Id: I6b10913f46c19d438c4e250a436a7446694b725a
2021-01-19Convert osmo_bts_sock.cpp to CPau Espin Pedrol5-14/+16
There's no real point in using C++ there, and using C++ makes the compiler fail to use llist_head in multi-bts patches added later due to: """ 'offsetof' within non-standard-layout type is conditionally-supported """ Change-Id: I8965b5cc5a713e64788b5b6aa183d3035341ddbb
2021-01-19Move tbf::free_all static methods to proper object filesPau Espin Pedrol7-25/+31
Move each method to the object on which they operate, be it a trx or a pdch ts. Change-Id: Ida715cbf384431d37b2b192fbd7882957c93a4d1
2021-01-19Convert gprs_bssgp_pcu.cpp to CPau Espin Pedrol10-48/+80
There's no real use of C++ in that file, and it causes problems when using llist_head entry macros in future patches adding initial support for multiple BTS in PCU object, so let's move it to plain C. Change-Id: Ic771a89fd78b5e66151a5384f0ff6a8895589466
2021-01-19Get rid of unused gsm_timer.{cpp,h}Pau Espin Pedrol8-343/+7
Those files are not really being used other than for calling get_current_fn() which is just a placeholder to call bts_current_frame_number on the global bts object. Change-Id: I6d50a8c15c1de5e2a308a24b313a7776f94ae54f
2021-01-19bts: combine bts_{init,cleanup} into consturctor/destructor methodsPau Espin Pedrol1-43/+34
The bts_init/cleanup functions were kept during the C and C++ structure merge process to make the patch simpler. It's not needed anymore, let's move all the destructor logic into one function and keep that together. Change-Id: I73a9457d5c92f62261561ef6afe392953576aec4
2021-01-19Rename 'bts_data' leftovers to 'bts'Pau Espin Pedrol9-55/+40
Before, we used tho have a BTs object split into 2 parts, a C gprs_rlcmac_bts struct and a C++ BTS struct, and "bts_data" naming was used to distinguish them in variable names. Nowadays the struct is finally combined into one, so there's no point in using this "bts_data" terminology, we use always "bts". Change-Id: I9852bf439292d1abc70711bea65698b21bde0ee8
2021-01-19Get rid of bts singletonsPau Espin Pedrol6-29/+16
There's no BTS single global object anymore, get rid of those APIs. Move users to use "pcu->bts", which will evolve to a linked list in the future. Change-Id: I9cf762b0d3cb9e2cc3582727e07fa82c8e183ec5
2021-01-19Unify BTS into a C usable structurePau Espin Pedrol32-691/+584
Previous work on BTS class started to get stuff out of the C++ struct into a C struct (BTS -> struct gprs_glcmac_bts) so that some parts of it were accessible from C code. Doing so, however, ended up being messy too, since all code needs to be switching from one object to another, which actually refer to the same logical component. Let's instead rejoin the structures and make sure the struct is accessible and usable from both C and C++ code by rewriting all methods to be C compatible and converting 3 allocated suboject as pointers. This way BTS can internally still use those C++ objects while providing a clean APi to both C and C++ code. Change-Id: I7d12c896c5ded659ca9d3bff4cf3a3fc857db9dd
2021-01-18Fix configuration mess of initial_cs/mcs between PCUIF and VTYPau Espin Pedrol6-55/+110
Both values (optionally) set (forced) by VTY and the values received from PCUIF were stored in the same variable, meaning that for instance the PCUIF values wouldn't really be used if someone applied eg "no cs" during runtime. This commit does something similar to what was already done for the max_(m)cs fields. We store PCUIF values in one place and VTY ones in another place, and then trigger a bts object internal process to find out exactly which initial CS should it be using. Change-Id: I80a6ba401f9c0c85bdf6e0cc99a9d2008d31e1b0
2021-01-18Move llc_* fields from BTS to PCUPau Espin Pedrol9-65/+34
Change-Id: Iffb916e53fdf99164ad07cd19e4b35a64136307e
2021-01-18Move ws_* fields from BTS to PCUPau Espin Pedrol8-13/+11
Change-Id: I997bc52f0d924c8f2a0b1d6cf23af98828ad4258
2021-01-18Move fc_* fields from BTS to PCUPau Espin Pedrol6-65/+33
Change-Id: I816d49e732d0fc7a3c9aa1f0e9a83b83d25e6a32
2021-01-18Move ns_dialect field from BTS to PCUPau Espin Pedrol6-12/+8
Change-Id: Iffb22b776b91f93d6d2a7ccfa47deeecc22c33f0
2021-01-18Move (m)cs_lqual_ranges fields from BTS to PCUPau Espin Pedrol6-89/+81
Change-Id: I39e2fc7e229851610d797c594d84902af6079411
2021-01-18Move cs_downgrade_threshold field from BTS to PCUPau Espin Pedrol6-16/+9
Change-Id: I3e1c65eb3cccff565d5d84588bdce93a47909a0f
2021-01-18Move cs_adj* fields from BTS to PCUPau Espin Pedrol8-28/+21
Change-Id: I2b00a83279dccd4feeeeb95e34878c4405e7972c
2021-01-18Move dl_arq_type field from BTS to PCUPau Espin Pedrol7-19/+15
Change-Id: I0b82ab59edd58d60e5581c707dc49f58de0ba203
2021-01-18Move dl_tbf_preemptive_retransmission field from BTS to PCUPau Espin Pedrol6-12/+6
Change-Id: I3ab32fcafe83f3ecb116a5b8a05f58f3fddc5451
2021-01-18Move alpha,gamma fields from BTS to PCUPau Espin Pedrol6-17/+11
Change-Id: I2fdd9c8a7393157183fff64084bb10e2a3b1dc63
2021-01-18Move force_two_phase field from BTS to PCUPau Espin Pedrol4-11/+5
Change-Id: I68a6e032f725cde87992b99f039c5280e912faf7
2021-01-18Move T_defs_pcu from BTS to PCU objectPau Espin Pedrol9-41/+32
Change-Id: I0cac5c12dff2e90b52d00383a00b4b94a9603a0a
2021-01-18Split PCU global PCU object from BTS objectPau Espin Pedrol14-264/+388
Currently the BTS object (and gprs_rlcmac_bts struct) are used to hold both PCU global fields and BTS specific fields, all mangled together. The BTS is even accessed in lots of places by means of a singleton. This patch introduces a new struct gprs_pcu object aimed at holding all global state, and several fields are already moved from BTS to it. The new object can be accessed as global variable "the_pcu", reusing and including an already exisitng "the_pcu" global variable only used for bssgp related purposes so far. This is only a first step towards having a complete split global pcu and BTS, some fields are still kept in BTS and will be moved over follow-up smaller patches in the future (since this patch is already quite big). So far, the code still only supports one BTS, which can be accessed using the_pcu->bts. In the future that field will be replaced with a list, and the BTS singletons will be removed. The cur_fn output changes in TbfTest are actually a side effect fix, since the singleton main_bts() now points internally to the_pcu->bts, hence the same we allocate and assign in the test. Beforehand, "the_bts" was allocated in the stack while main_bts() still returned an unrelated singleton BTS object instance. Related: OS#4935 Change-Id: I88e3c6471b80245ce3798223f1a61190f14aa840
2021-01-15gprs_rlc_ts_alloc: ensure no rolling slots are allocatedAlexander Couzens1-2/+17
When allocating multiple slots for a UE the following example is not allowed 'UU----UU' for a UE class 12. The time slot number can not roll over 7 and move to 0. 44.060 or 45.002 only specifies contigous however it was unclear it this is an allowed pattern. Only the example 45.002 B.3 in release 12 cleared this up. It gives an example for a multi slot class 5 UE which has 7 possible configuration this means the rolled over is not allowed. Multislot class type 2 UE doesn't have this limitation. Further if a UE supports 8 time slots this is not a limitation because the window size (45.002 B.1) can include all time slots. Releated: SYS#5073 Change-Id: I16019bdbe741b37b83b62749b840a3b7f4ddc6c7
2021-01-14Workaround ASan false positive runtime errors under some platformsPau Espin Pedrol2-4/+7
Under some platforms (RPI4, ARM) container older ASan, it will log false positive log errors which will make unit test fail because then output changes: """ pcu_l1_if.cpp:847:2: runtime error: member access within misaligned address 0xb3f0b78c for type 'struct GprsMs', which requires 8 byte alignment """ The pointer is indeed misaligned, but it's not actually a bug, because the pointer is never derreferenced. That happens during llist_for_each_entry operation where it does cast the pointer but it only checks if the list has actually reached the end. To workaround the issue, simply defer casting it by using llist_for_each instead, where the pointer is assigned only in the case it really points to a GprsMS struct. Change-Id: I149fb42706501eb33f9c6fe48f76a03ddee5954a
2021-01-13bts: fix uninitialized memaccess in BTS::send_gsmtap()Vadim Yanitskiy1-1/+1
Change-Id: I7c5105c9e8a2c680dc8b24cc5e3bda6f7405a3ee Fixes: CID#216511
2021-01-13bts: fix uninitialized memaccess in BTS::send_gsmtap_rach()Vadim Yanitskiy1-1/+1
Unfortunately, RACH.ind on the PCU interface contains no Uplink measurements: neiter RSSI nor C/I. In order to avoid sending garbage, let's zero-initialize 'struct pcu_l1_meas'. Change-Id: I8c3210c428da17d23d798f3ef9df941ded6e162a Fixes: CID#216512
2021-01-12gprs_ms: Mark ms_ctrg_desc staticPau Espin Pedrol1-1/+1
Change-Id: I3b1f0d0ee932a97414375a679962356c9178c2eb
2021-01-12ms: Replace struct var with rate_ctrPau Espin Pedrol4-15/+33
Let's use usual osmocom rate_ctr instead of having one variable + setter/getter functions, so we can easily add new counters and also because it makes code more clear (no need to look at what the "update" function is doing). Using rate counter also provides info about how recently the MS has been interacting with the network. Related: OS#4907 Change-Id: I744507fde4291955c1dbbb9739b18a12a80145b1
2021-01-11tbf: remove 'software error' logs from tbf_freePau Espin Pedrol2-17/+0
It is expected that the tbf object is freed at any moment in time, for instance if osmo-pcu drops PCUIF connection with osmo-bts. I couldn't find any reason why it would e dangerous to free the tbf, so let's remove this message. related: OS#4779 Change-Id: I4ab5ccaa5bf6257b18d8fd5ba06baab083821817
2021-01-11tbf: add virtual destructorEric1-0/+1
This ensures spec compliance, because currently the base class destructor would be called through a base class pointer to derived class instead of the most derived one, which ist unexpected and actually undefined behavior in c++11 and beyond. Change-Id: Ic4abde1658a983bb0ccf9a526177dce50ff6dc23
2021-01-06gprs_rlcmac_sched: fix incorrect SBA frame number assignmentVadim Yanitskiy1-1/+1
There is a big difference between: if ((a = foo() != 0xffffffff)) { ... } and if ((a = foo()) != 0xffffffff) { ... } In the first case, 'a' is the result of '!=' operation, i.e. either 0 (false) or 1 (true). In the second case, 'a' will hold the value returned by foo(), and this is exactly what must have been used in gprs_rlcmac_rcv_rts_block(). The bug was there since SBA allocation feature was added in 2012. Change-Id: Ifd607ae8a33382e48f9d9e50a28a4bdf4eaf73a2 Fixes: 07e97cf8a551b05d7f5f3f9583b68b2eff0f1c23 Related: CID#215835
2021-01-05tbf: Fix wrong verb used in log messagePau Espin Pedrol1-1/+1
Change-Id: Id9f8df9a5c0e0f88a811c5d7f06821cb4f30ab93
2021-01-05Convert GprsMS and helpers classes to CPau Espin Pedrol24-1486/+1539
As we integrate osmo-pcu more and more with libosmocore features, it becomes really hard to use them since libosmocore relies heavily on C specific compilation features, which are not available in old C++ compilers (such as designated initializers for complex types in FSMs). GprsMs is right now a quite simple object since initial design of osmo-pcu made it optional and most of the logic was placed and stored duplicated in TBF objects. However, that's changing as we introduce more features, with the GprsMS class getting more weight. Hence, let's move it now to be a C struct in order to be able to easily use libosmocore features there, such as FSMs. Some helper classes which GprsMs uses are also mostly move to C since they are mostly structs with methods, so there's no point in having duplicated APIs for C++ and C for such simple cases. For some more complex classes, like (ul_,dl_)tbf, C API bindings are added where needed so that GprsMs can use functionalitites from that class. Most of those APIs can be kept afterwards and drop the C++ ones since they provide no benefit in general. Change-Id: I0b50e3367aaad9dcada76da97b438e452c8b230c
2020-12-30gprs_rlcmac_sched: don't leak a sched_dummy()Alexander Couzens1-1/+0
Change-Id: Iea0fc51809c78514c85e45e7f499a531c4ea1bcf
2020-12-17sched: Convert code handling next_list array to be size independantPau Espin Pedrol1-6/+5
Change-Id: Id209fe66f85501437a79f7ca0c8e3cf816177611
2020-12-17gprs_rlcmac_sched: Use helper structure to store several tbf pointer paramsPau Espin Pedrol1-41/+41
The resulting code is cleaner since it becomes clear the relation between all those pointers, which are set in one function and used in another one, passed through the caller of the former two. Moreover, if more tbf candidates are to be added for other type of actions, having them in a struct is much easier since only one pointer is passed. Change-Id: I55482aa5af7be5a176a7b4879a672ad37e618020
2020-12-16gprs_ns2: set default dialect to ipaccessAlexander Couzens1-0/+1
The default pcu dialect is ipaccess. Keep it that way. Fixes ttcn3 pcu testcases. Change-Id: I426f507fb8863abd8995bc615dc6a6fa7ae69217