aboutsummaryrefslogtreecommitdiffstats
AgeCommit message (Collapse)AuthorFilesLines
2021-01-29doc: Mark PCU node red in network node diagramPau Espin Pedrol1-0/+1
Change-Id: I81ab7bf144eacbfab94d3cee3d75af5a05e1c71a
2021-01-29NACC: Send only Pkt Cell Chg Continue if SI retrieve failsPau Espin Pedrol1-5/+5
If fore some reason we fail to fetch SI of target cell, we move directly to NACC_ST_TX_CELL_CHG_CONTINUE in order to submit a Cell Change Continue against the MS without providing any Packet Neighbor Cell Data beforehand, as per spec that's probably the best we can do in this scenario (TS 44.060): """ 1) The network responds with a PACKET CELL CHANGE CONTINUE message. If a mobile station as response to a PACKET CELL CHANGE NOTIFICATION message receives a PACKET CELL CHANGE CONTINUE message without receiving any neighbour cell system information, the mobile station shall stop timer T3208, stop timer T3210 if still running, leave CCN mode and continue cell reselection in NC0/NC1 mode. """ This commit also fixes a use-after-free triggered by TTCN3 test TC_nacc_outbound_rac_ci-resolve_fail_parse_response, where the "cmd" pointer passed to nacc_fsm_ctrl_reply_cb() was freed during FSM termination (its talloc ctx was under ctx->neigh_ctrl_conn) and the libosmocore code calling that callback was later on accessing cmd->defer. Since due to this change the FSM is no longer syncrhonously freed, the issue is gone. Related: SYS#4909 Change-Id: Ie3f12a08ad611b1086d3f4ab7c3d34af43c07961
2021-01-29NACC: Configure neighbor and SI resolution timeout valuesPau Espin Pedrol3-3/+37
Upon timeout, we move directly to NACC_ST_TX_CELL_CHG_CONTINUE in order to submit a Cell Change Continue against the MS without providing any Packet Neighbor Cell Data beforehand, as per spec that's probably the best we can do in this scenario (TS 44.060): """ 1) The network responds with a PACKET CELL CHANGE CONTINUE message. If a mobile station as response to a PACKET CELL CHANGE NOTIFICATION message receives a PACKET CELL CHANGE CONTINUE message without receiving any neighbour cell system information, the mobile station shall stop timer T3208, stop timer T3210 if still running, leave CCN mode and continue cell reselection in NC0/NC1 mode. """ Related: SYS#4909 Change-Id: Ia9932ab082ec095294e85dc4d532046970e17986
2021-01-29NACC: allow setting keep time for entries in neigh and si cachePau Espin Pedrol5-15/+45
Related: SYS#4909 Change-Id: Ifa336aa27dd88ff5b78dbc5a2799740f542bb369
2021-01-29NACC: delay CTRL conn socket init until it's neededPau Espin Pedrol1-14/+11
This way, we don't open a socket and do the IPA handshake in the event the request is already cached. Related: SYS#4909 Change-Id: Ib1ea85e1196c8b9dc40c8837ab5d4a54f2a1f2d4
2021-01-29NACC: Fix crash freeing struct if CTRL conn was refused during allocPau Espin Pedrol1-0/+3
Older versions of osmo_ctrl_conn_alloc() may not properly initialize write_queue.bfd.fd to -1, which means if osmo_sock_init2_ofd() failed during nacc_fsm_alloc(), the destructor would wrongly enter the conditon where the whole structure is set and unregister the unregistered fd. Related: libosmocore Change-Id I98f744d2880fbb883719cdf1d3eb31f2b22a13b6 Related: SYS#4909 Change-Id: I253bd9087b1f7ab039aa1127e9dc586f5106905a
2021-01-29Introduce NACC supportPau Espin Pedrol24-5/+1407
A new nacc_fsm is introduced per MS object, with its partner priv structure struct nacc_fsm_ctx, which exists and is available in the MS object only during the duration of the NACC procedure. The NACC context is created on an MS whenever a Pkt Cell Change Notification is received on Uplink RLCMAC, which asks for neighbor information of a given ARFCN+BSIC. First, the target ARFCN+BSIC needs to be translated into a CGI-PS (RAC+CI) address. That's done by asking the BSC through the Neighbour Resolution Service available in osmo-bsc using the CTRL interface. Once the CGI-PS of the target cell is known, PCU starts a RIM RAN-INFO request against the SGSN (which will route the request as needed), and wait for a response containing the SI bits from the target cell. After the SI are received, the scheduler is instructed to eventually poll a TBF for the MS originating the CCN, so that we can send the SI encapsulated into multiple Packet Neighbor Cell Data messages on the downlink. One all the SI bits are sent, the scheduler is instructed to send a Packet Cell Change Continue message. Once the message above has been sent, the FSM autodestroys itself. Caches are also introduced in this patch which allows for re-using recently known translations ARFCN+BSIC -> CGI-PS and CGI-PS -> SI_INFO respectively. Change-Id: Id35f40d05f3e081f32fddbf1fa34cb338db452ca
2021-01-29tbf: Make tbf_ms() param constPau Espin Pedrol2-2/+2
Change-Id: I041c564b15d17d05ce97ea0085fcd9192a346578
2021-01-28gprs_ns2: migrate to the new vty syntaxAlexander Couzens1-3/+1
This also changes the vty configuration. If only timeout has been configured for ns the new configuration is compatible. For further information see: https://osmocom.org/projects/libosmocore/wiki/Network_service_(NS) Depends-on: I8c3f2afecc74b78f7f914f7dce166cbcb63444eb (libosmocore) Change-Id: I14af821a8d1fda670643c3d5f81299a3abf3c583
2021-01-28follow gprs_ns2 API enum changesAlexander Couzens3-14/+14
All gprs_ns2 enums have now GPRS_NS2 as prefix. Depends-on: I548ff12f7277cbb7e1a630a3dc02b738ce89be72 (libosmocore) Change-Id: Ifdc7956318c07d680feab33c22bc2c6f20927bf9
2021-01-28configure.ac: set -std=gnu11Oliver Smith1-1/+1
Change-Id: Iac2c0b14252c46aec2b00d46800fcc9f87a5a586
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 Pedrol6-36/+62
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 Pedrol2-20/+12
Change-Id: Ied3e02a12145112fafa12282ed7aefa5b0fa6eb6
2021-01-25ms: Set proper initial MCS values setting mode EGPRS_GMSKPau Espin Pedrol2-2/+15
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 Pedrol27-264/+356
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 Pedrol6-15/+17
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 Pedrol12-58/+90
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 Pedrol9-346/+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 Pedrol7-30/+17
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 Pedrol41-1179/+1033
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 Pedrol9-23/+19
Change-Id: I997bc52f0d924c8f2a0b1d6cf23af98828ad4258
2021-01-18tests/tbf: Allocate PCU per test instead of globallyPau Espin Pedrol1-33/+58
Otherwise some state may be left from one test to another. Change-Id: I18e2fe7dd1cc5940570252a2a6a106de49d8a7dd
2021-01-18Move fc_* fields from BTS to PCUPau Espin Pedrol7-66/+34
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 Pedrol8-25/+14
Change-Id: I3e1c65eb3cccff565d5d84588bdce93a47909a0f
2021-01-18Move cs_adj* fields from BTS to PCUPau Espin Pedrol9-29/+22
Change-Id: I2b00a83279dccd4feeeeb95e34878c4405e7972c
2021-01-18Move dl_arq_type field from BTS to PCUPau Espin Pedrol8-29/+19
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 Pedrol7-18/+12
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 Pedrol10-53/+41
Change-Id: I0cac5c12dff2e90b52d00383a00b4b94a9603a0a
2021-01-18Split PCU global PCU object from BTS objectPau Espin Pedrol24-788/+1006
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 Couzens3-15677/+15692
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-13contrib/jenkins: don't build osmo-gsm-manualsOliver Smith1-1/+0
Related: OS#4912 Change-Id: If45bb7d4958b200ca6b5d1c5b8a52eba06944909