aboutsummaryrefslogtreecommitdiffstats
path: root/src/osmo-bsc/abis_rsl.c
AgeCommit message (Collapse)AuthorFilesLines
2022-02-22rename RSL_ENC_ALG_A5 to ALG_A5_NR_TO_RSL, clarifyNeels Hofmeyr1-2/+2
The naming confused me so that I wrote buggy code again. Hopefully this clarifies which representations the code paths are using. In the macro code, highlight the error case of n <= -1 explicitly. Also add ALG_A5_NR_TO_PERM_ALG_BITS. I need the 1<<n case in an upcoming patch. Related: SYS#5839 Change-Id: I7557ae97764bba09c906748a18e9031dfb362611
2021-11-30fix chreq:* counters: typos in chreq:successful_* constantsNeels Hofmeyr1-7/+7
Related: SYS#4878 Related: I17a7702b151ac03fd9f7ecd6927ef42133aad953 (osmo-ttcn3-hacks) Change-Id: I1fde77d5d5920093ab037184eb3518876804353d
2021-11-29dbg log: abis_rsl print_meas_rep(): clarify rxlevNeels Hofmeyr1-1/+1
Change-Id: Ia2c1d59eac556b8f6a56c39abf12b35a3ba807eb
2021-11-15[overpower] Allow configuring specific channel mode(s)Vadim Yanitskiy1-3/+17
Change-Id: I34d29d7d0f66c629367f3d6e8a660e199ecbe080 Related: SYS#5319
2021-11-15abis_rsl: s/*_acch_cap_for_bts/put_*_acch_cap_ie/gVadim Yanitskiy1-7/+7
Change-Id: I663023adb4f2381d4b8debb01786801803b3d741
2021-11-15abis_rsl: {rep,top}_acch_cap_for_bts(): make *lchan constVadim Yanitskiy1-4/+4
Change-Id: I3e71bb88db7b1eadff5a73fdb98fe7eee2fc2540
2021-11-15struct gsm_bts: s/temporary_overpower/top_acch_cap/gVadim Yanitskiy1-2/+2
Let's have a short and consistent naming for both ACCH repetition and temporary ACCH overpower structures, like it's done in osmo-bts. Change-Id: I39b98dcd14219402959646524315d5afea7c08cf Related: Ib1d51f91139b4c2fe794e37fc8543b2d7a9b9c07
2021-11-15struct gsm_bts: s/repeated_acch_policy/rep_acch_cap/gVadim Yanitskiy1-1/+1
Let's have a short and consistent naming for both ACCH repetition and temporary ACCH overpower structures, like it's done in osmo-bts. Change-Id: Ia12c83ad1af4744ce28ba655ac806784f746e88a Related: Ib1d51f91139b4c2fe794e37fc8543b2d7a9b9c07
2021-11-15abis_rsl: cosmetic: fix coding style rep_acch_cap_for_bts()Vadim Yanitskiy1-1/+1
The linter (executed by Jenkins) complains: src/osmo-bsc/abis_rsl.c:543: ERROR:POINTER_LOCATION: "(foo*)" should be "(foo *)" and blocks changes, adding V-1 when I am changing the related code. Change-Id: I0cf00ff898e69734850659e8ba0e2ff023f9b2dd
2021-11-15abis_rsl: simplify checking if channel mode is AMRVadim Yanitskiy1-2/+2
Change-Id: If933ce0fa0a162c4518ddab840f186ebaa1bcff9
2021-11-10implement bts.N.cm_serv_rej:<cause> rate countersNeels Hofmeyr1-0/+102
Related: I0214b27da18af87eca9715ebf7eeeff945e3e12a (osmo-ttcn3-hacks) Related: SYS#4878 Change-Id: I79b1261e5a281d9797eaaf9c27d90edd8e27c78b
2021-11-10refactor lchan countingNeels Hofmeyr1-2/+5
Add chan_counts_for_trx() and chan_counts_for_bts(). Drop bts_count_free_ts() and trx_count_free_ts(). Rationale: The bts_count_free_ts() and trx_count_free_ts() always returned the number of free lchans, not timeslots. Hence, passing the pchan type as argument never really matched the semantics. Especially, when looking for free SDCCH, there is no clear match on a gsm_phys_chan_config enum value: SDCCH8_SACCH8C, CCCH_SDCCH4, CCCH_SDCCH4_CBCH, SDCCH8_SACCH8C_CBCH? -- GSM_LCHAN_SDCCH is clear. ==> Rather count free lchans by enum gsm_chan_t. Counting lchans of distinct types required separate iterations for each lchan type. ==> Rather compose an array of counts for all types, in one go. I need to count the amount of free SDCCH lchans in an upcoming patch to implement the performance indicator allAvailableAllocatedSDCCH (cumulate time for which no SDCCH are available). To implement allAvailableAllocated{SDCCH,TCH}, I need a count of both the used as well as the total lchans for a type: it does not make sense to flag "all available allocated" if none are ever available. To properly count dynamic ts, I need the maximum total that can be possible at any time. And to count currently free lchans, I need the current total. This may seem counter intuitive, but consider, e.g.: - Obviously, if a cell has only static TCH/F timeslots, it does not make sense to flag that all available TCH/H are occupied, because no TCH/H are available ever. Just stating this as contrast to dyn TS. - If a cell has OSMO_DYN timeslots, I *do* want to flag that all TCH/H are occupied when all dyn timeslots are fully occupied. - If those OSMO_DYN however are all used as TCH/F, the current total of TCH/H becomes zero, and it seems like TCH/H should not be considered. - To count the nr of currently free lchans, I need the currently possible total of lchans and the nr of occupied lchans. So return both a maximum total and a current total of lchans. In above example, the maximum total shows that there would be TCH/H possible. BTW, it would be nice to keep a chan_counts array on trx, bts and bsc level and update as channels are allocated and released, instead of counting them all over periodically. But it's less error prone this way. Related: SYS#4878 Change-Id: I2fb48c549186db812b1e9d6b735a92e80f27b8d3
2021-11-08abis_rsl: permit simultaneous ACCH repetition and overpowerVadim Yanitskiy1-18/+3
As stated in "GSM/EDGE Evolution and Performance", section 12.3, both features *can* be enabled simultaneously. Change-Id: I2189f01bd78625dab3d642597240338ee581fc98 Related: SYS#5319
2021-11-07abis_rsl: print_meas_rep_{buf,uni}() accept const *mrVadim Yanitskiy1-5/+7
Change-Id: I5c3e27a00cd84f102558499072965ec538f5a87f
2021-11-07abis_rsl: do not pass lchan to print_meas_rep_buf()Vadim Yanitskiy1-16/+11
Change-Id: If965c7dc6b989ee758ddec0190ec1cce8363b240
2021-11-05add chreq:successful_<reason> rate countersNeels Hofmeyr1-1/+31
Related: SYS#4878 Change-Id: I32c2c197a6199617a82986480b686c515fa40d62
2021-11-05rsl_tx_chan_activ(): fix manual channel activation for nanoBTSVadim Yanitskiy1-0/+6
nanoBTS would NACK a CHANnel ACTIVation message for an 'intra cell channel change' if it does not contain the Timing Advance IE. And this is right, because according to 3GPP TS 48.058, section 8.4.1, point '4)', it *must* be included. Indeed, the actual Timing Advance value is not known during the manual channel activation triggered from the VTY interface. So let's merely indicate 0 if it's not known. Change-Id: Iee7ddb4cf1a9a7bb9b34e6c9f6f9899da480fbd0
2021-10-08rsl_rx_resource_indication(): check result of rsl_tlv_parse()Vadim Yanitskiy1-3/+7
Change-Id: I3b4758f80f2cd87e22bd3617e189f12403461ea3 Related: SYS#5313
2021-10-07Get rid of lots of stubs [4/4]Pau Espin Pedrol1-2/+5
These are not needed anymore since we re-introduced libbsc, specially to avoid all this churn. Some specific methods are explicitly required to be overwritten by tests, so we specificially mark those with __attribute__((weak)) in order to be able to overwrite them. This is the last step towards fixing interdependency mess of symbols and stubs, and requires previous patches in order to have tests apssing fine. Change-Id: Ic7401b8a6eb903882e30fda1cf091ac99a254ef0
2021-10-05Implement MS Uplink Power Control LoopKeith1-0/+3
* Adds vty option dyn-bsc for ms-power-control -> mode * Imports power_control.c from osmo-bts project [at commit 2f3cd4b697972d8484f9a9d3b7ef634086f65fa5] * Removes unused C/I code from osmo-bts's power_control.c This patch then calls the power loop on receipt of measurement reports and updates the MS Power Level accordingly. Change-Id: Ibc307e758697eb5ca3fb86622f35709d6077db9e
2021-10-04fix TSC / TSC Set used for HandoverNeels Hofmeyr1-2/+0
From the nature of the lchan_activate_info.tsc_set and .tsc, it is easy to forget to set tsc_set,tsc = -1 to use default TSC Set and TSC values. Handover code is one such instance that forgets to set -1. Change the semantics of tsc_set and tsc so that this kind of error can not happen again as easily: use a separate bool to flag whether to use the default config or explicit values. Implicitly fix the lchan_activate_infos "launched" in handover_fsm.c as well as abis_rsl_chan_rqd_queue_poll(). Related: OS#5244 SYS#4895 Related: I1ed6f068c85b01e5a2d7b5f2651498a1521f89af (osmo-ttcn3-hacks) Change-Id: Iae20df4387c3d75752301bd5daeeea7508966393
2021-09-28Fix MEAS parsing, as Ericsson RBS reports TA shifted by 2 bits.Keith1-2/+3
This fixes call setup issues when more than ~1km from the tower. NOTE: We use the last reported TA from the UE in the CHANnel ACTIVation. When the UE is more than 1km from the tower, (unshifted) TA in the measurement report can be 8 or greater. Once we send TA of 8 in the CHAN ACTIV message, the lchan is unrecoverable. Change-Id: I1c9bd5bf2fd126e62bcbec419f3499d2e0465559
2021-09-02bty_vty: add VTY settungs for temporary overpowerPhilipp Maier1-0/+31
To configure temporary overpower, new VTY commands are added. This patch also addes the logic needed to attach the temporary overpower IE to the RSL CHANNEL ACTIVATE message. Change-Id: I488a91bb4ed86f630db56564a0cd293f39f0f690 Related: SYS#5319
2021-08-16early IMM ASS 3/n: implement 'pre-ts-ack'Neels Hofmeyr1-1/+10
Add experimental 'pre-ts-ack' to the 'immediate-assignment' options: send the IMM ASS even before a dynamic timeslot is switched. This possibly saves an Abis roundtrip, but may be racy. When pre-ts-ack is chosen, already do the IMM ASS before the dyn TS pchan switch is ACKed. In Immediate Assignment, in case the dyn TS is not ready yet, get the pchan kind from lchan->type, which already reflects the target type, and not from ts->pchan_is, which still reflects the previous pchan type. Related test is in I2ae28cd92910d4bc341a88571599347a64a18fe5 Related: SYS#5559 Change-Id: I19e6a3d614aa5ae24d64eed96caf53e6f0e8bb74
2021-08-16early IMM ASS 2/n: implement 'pre-chan-ack'Neels Hofmeyr1-0/+1
When 'immediate-assignment pre-chan-ack' is set, send the Immediate Assignment directly after the Channel Activation, not waiting for the Activation ACK, to save an Abis roundtrip. Related test is in If71f4562d532b6c5faf55f5fd073449a8a137ebf Related: SYS#5559 Change-Id: I56c25cde152040fb66bdba44399bd37671ae3df2
2021-07-23Introduce VTY option to forbid use of TCH for non-voicecall signallingPau Espin Pedrol1-11/+13
Usual allocation mechansim, when some signalling channel is needed, first tries to reserve an SDCCH, and if all of them are exhausted, then attempts to reserve a TCH as a last resort. This, however, may cause TCH starvation under certain situations, for instance if there high load on other services (LU, SMS, etc.). Hence, it may be desirable for the operator to forbid reservation of TCH slots once SDCCH become exhausted. This commit is thus adding a VTY command which allows forbidding it. The default behavior (allow using TCH timeslots when SDCCHs are exhausted) is kept as before. The above mentioned prohibition is applied only to non-voicecall related signalling services. That's because voicecall services will end up requiring a TCH anyway, and forbidding reservation of TCH straighaway when SDCCHs are exhausted would mean no voice calls could be initiated while still TCHs would be available. Related: SYS#5548 Change-Id: Ib08027125145df26602069bfb51847063b0ccc0c
2021-07-22RES IND: tweak error code on missing Resource Information IENeels Hofmeyr1-1/+1
If the RES IND message is invalid, let's not return ENOENT which translates to "No such file or directory", instead return EINVAL. Related: SYS#5313 Change-Id: Ifd700e90c881874d428f2860603a4ddbf13d705e
2021-07-22RES IND: allow empty Resource Information IENeels Hofmeyr1-2/+4
If all channels of a BTS are in use and there are no interference ratings to be reported, the Resource Information IE may be empty. Do not log this as an error, it is not something that needs operator attention. Related: SYS#5313 Change-Id: I75b851ef1269674f43db3fb3a48518e76182d7f0
2021-07-22Fix recent regression in CHREQ allocationPau Espin Pedrol1-1/+1
Recent commit introduces a silly bug when changing code. Fixing it now. Fixes: fdb87343d7a747575fae0bb436cd9d105b9748e9 Change-Id: I1e8027a3933c3c8450e76e1325d0f7c28a89a6d1
2021-07-21abis_rsl: Log chan rqd reason on resource exhaustion log messagePau Espin Pedrol1-6/+8
This allows better understanding which of use is exhausting channels when there a lot of load. Change-Id: Ic68162c2d52df07b05c76374e2a92148b9a7ccd5
2021-07-20_select_sdcch_for_call: Avoid 2nd lchan lookup when finally selecting itPau Espin Pedrol1-2/+1
We already looked it up, it's not necessary to look it up again by calling lchan_select_by_type(). Let's instead call lchan_select_set_type() directly on the lchan pointer. Related: SYS#5309 Change-Id: I1054c18f58c9e249f263e3e97a365a1fd8b03a93
2021-07-16separate 'interference-meas level-bounds' cfg and usedNeels Hofmeyr1-2/+2
The VTY defun already indicates BSC_VTY_ATTR_RESTART_ABIS_OML_LINK correctly, but so far we would immediately start using the new values internally, and wrongly interpret interference levels. Fix that. Have bts->interf_meas_params twice: interf_meas_params_cfg for the VTY configured values, and interf_meas_params_used for the values that the BTS actually knows about, after they were sent via OML. In a running BSC, when changing the interference level boundaries on the telnet VTY, the BTS is not immediately told about the change. That would require a BTS restart. Hence store the cfg values separately in interf_meas_params_cfg. For comparing/printing interference levels in a running BTS, only employ the values that were actually sent via OML and placed in interf_meas_params_used. Related: SYS#5313 Change-Id: Iad8cf4151ff7f86dc0549158ed5d91d788d40b1f
2021-07-15cosmetic: Small improvements to _select_sdcch_for_callPau Espin Pedrol1-13/+14
This commit improves some cosmetic and logical aspects from recent commit (see "Fixes" below). * Fix typo s/free_tcch/free_tchh/" * Improve some comments Fixes: fdb87343d7a747575fae0bb436cd9d105b9748e9 Change-Id: Id6217c929068b0182cb2d4a9922bfbf544c8c75d
2021-07-14Avoid switching dyn ts to sdcch8 if it starves later TCHPau Espin Pedrol1-3/+63
In case an MS requests a channel to establish a voice call, we usuually try to assign an SDCCH to negotiate the call and finally make the MS switch to a TCH. However, it doesn't make much sense to provoke a switch of a dynamic TS into SDCCH8 if that would mean we end up with no TS available for TCH at the next step close in time. In that case, we are better assigning the TCH directly so that the full call can be established successfully. Related: SYS#5309 Change-Id: I3b32968949a7bdcbebf5a823359295bac51d8e08
2021-07-11RES IND: parse msg and store interference levels in lchansNeels Hofmeyr1-1/+70
Also show the current interference levels of unused lchans in the vty. Related: SYS#5313 Change-Id: Iccc1391e8419604bb09e464db8455e053dfbc982
2021-07-06Rename osmo dyn ts enums to contain SDCCH8Pau Espin Pedrol1-2/+2
They will gain support to be activated as SDCCH/8 soon too. Related: OS#5309 Depends: libosmocore.git I56dcfe4d17899630b17f80145c3ced72f1e91e68 Change-Id: Id5b89fe589a52ff88486435ac43809edb4b80f98
2021-06-30power_control: omit BS Power Parameters IE if the maximum is 0 dBVadim Yanitskiy1-0/+6
If BS Power Parameters IE is present in the channel activation message, the BTS shall employ dynamic BS power control for that logical channel and interpret BS Power IE as the maximum value. If the maximum value is 0 dB, then it does not make sense to send BS Power Parameters IE to the BTS, because the power control loop would never exceed the maximum. Change-Id: If8507992dfd90ade1edda99b72bf2420a702ccd5 Related: SYS#4918, SYS#4919
2021-06-23abis_rsl: fix rsl_rx_ccch_load(): properly check the message lengthVadim Yanitskiy1-1/+1
msg->data_len is the total number of bytes available in the buffer, not the actual length of the payload. Use msgb_length(). Change-Id: I35bf0827ff14e84a755c1aa24a6efc06bc7b9f9b
2021-06-18implement A5/4 in Ciphering Mode procedureNeels Hofmeyr1-0/+8
Receive and store the Kc128 key from MSC, and use as key sent to BTS if A5/4 is the chosen encryption algorithm. (A5/4 in handover will follow in a separate patch) Related: SYS#5324 Change-Id: I7c458c8a7350f34ff79531b3c891e1b367614469
2021-06-18rewire build_encr_info() to return errorsNeels Hofmeyr1-4/+35
In build_encr_info(), validate the algorithm and key presence and return negative if errors are encountered. At all callers, handle the error case. An upcoming patch will add handling of Kc128 for A5/4 encryption and also wants to return error codes. This is a preparation for that patch: I7c458c8a7350f34ff79531b3c891e1b367614469 Notice that osmo-bsc does send the key along even if A5/0 is chosen, this patch keeps that behavior unchanged. Related: SYS#5324 Change-Id: I125d8aabceddd5b34cb98978cee9b6d2fc8fd0f2
2021-06-18rsl_data_request() check lchan pointer before accessNeels Hofmeyr1-5/+7
fixup for commit 43aeeaf05ad814ccab0e93227b1248a20302c8ec 'RSL chan_nr: replace OSMO_ASSERT with error handling' I71ed6437c403a3f9336e17a94b4948fca295d853 Related: CID#236319 Related: SYS#5315 OS#4940 Change-Id: I873c1a27f9449a56c525984ea50bfcf6daa4b5f8
2021-06-10get_any_lchan(): reduce minor code dupNeels Hofmeyr1-11/+4
Change-Id: I304a7333adc265e156f04b42a10bac6912f58ad2
2021-06-10RSL: rx and tx VAMOS Channel Number cbits for VAMOS lchansNeels Hofmeyr1-17/+17
Add the Osmocom-specific extension to indicate VAMOS shadow lchans in RSL, in lchan lookup and RSL message transmission. Note that RR messages containing cbits (Assignment Command, Handover Command, ...) must *not* send Osmocom specific cbits to the MS. Only the RSL messages directed to the BTS send Osmocom specific bits. Related: SYS#5315 OS#4940 Depends: If33c1695922d110c0d2c60d5c0136caf2587194e (libosmocore) Change-Id: I957eff0d2c33ec795eda75a4bff21965b0179f73
2021-06-10RSL chan_nr: replace OSMO_ASSERT with error handlingNeels Hofmeyr1-25/+95
It's bad to abort the program for an incompatible chan_nr. Instead of OSMO_ASSERT(), make sure that error handling happens all they way to the original callers of gsm_lchan2chan_nr etc. This is also preparation to add further error causes: Osmocom specific cbits needed for a non-Osmo BTS. Related: SYS#5315 OS#4940 Change-Id: I71ed6437c403a3f9336e17a94b4948fca295d853
2021-06-10add VAMOS secondary lchans to timeslot structNeels Hofmeyr1-5/+12
So far there is a bunch of code setting a primary lchan in VAMOS mode. This patch now adds the actual secondary "shadow" lchans that may be combined with a primary lchan in VAMOS mode to form a multiplex. VAMOS lchans are put in the same ts->lchan[] array that keeps the primary lchans. They are at most two additional usable lchans (for a TCH/H shadow) added to either TCH/F or TCH/H. Keeping these in the same array allows looping over all lchans easily. The ts->max_primary_lchans indicates the index of the first VAMOS shadow lchan. Related: SYS#5315 OS#4940 Change-Id: I928af99498bba488d317693f3144d4fccbbe9af3
2021-06-10implement CHANnel ACTIVate to VAMOS modeNeels Hofmeyr1-1/+5
Related: SYS#5315 OS#4940 Change-Id: If3ac584e4223ef7656c7fedc3bf11df87e4309ec
2021-06-10lchan_fsm: introduce lchan.activate.ch_mode_rate to allow tweakingNeels Hofmeyr1-2/+2
lchan->activate.info.ch_mode_rate should remain unchanged, it is the immutable request data. However, for VAMOS, we will want to automatically see that the chan_mode is chosen correctly. As a first step, place a mutable ch_mode_rate copy at lchan->activate.ch_mode_rate, i.e. not in .activate.info, but in .activate. Use that everywhere. This is mostly a non-functional change, preparing for a subsequent patch that adds handling of VAMOS shadow lchans. As side effect of adding lchan_activate_set_ch_mode_rate_and_mr_config() after MODE_MODIF_ACK (enabling the voice stream after a channel mode modify), fix AMR config: the call to lchan_mr_config() was missing. Change-Id: Icc9cc7481b3984fdca34eef49ea91ad3388c06fe
2021-06-10implement Channel Mode Modify to VAMOS modeNeels Hofmeyr1-5/+22
Put a (primary) lchan in VAMOS speech mode. This is not yet about activating shadow lchans, this merely puts any lchan in a VAMOS capable channel- and speech mode. Protocol: In RR Channel Mode Modify, send a spec conforming VAMOS channel mode as well as an Extended TSC Set, wich adds the TSC Set to the training sequence code value. In RSL MODE MODIFY, send Osmocom specific extensions to indicate the TSC Set and TSC, as well as the VAMOS channel mode; only to OsmoBTS type cells. - Set the Channel Mode's Channel Rate to Osmocom specific RSL_CMOD_CRT_OSMO_TCH_VAMOS_Bm / RSL_CMOD_CRT_OSMO_TCH_VAMOS_Lm - Add the Osmocom specific Training Sequence IE containing both TSC Set and TSC. (These are documented in the Abis manual.) Implementation: The internal API to request a Mode Modify is lchan_modify(info). Add to this info the 'vamos' bool, set to true when the modification should put the lchan in VAMOS channel mode or not. When info.vamos == true, make sure the channel mode value is a VAMOS one: in the copy of info->ch_mode_rate at lchan->modify.ch_mode_rate, convert to the right VAMOS/non-VAMOS equivalent channel mode. When the modification is through, set lchan->vamos.enabled appropriately. This patch also builds on Ic665125255d7354f5499d10dda1dd866ab243d24 'allow explixit TSC Set and TSC on chan activ / modif / assignment' placing tsc_set and tsc values in the TSC related IEs. Related: SYS#5315 OS#4940 Change-Id: Ibf53f4797d7491b17a33946fd7d920f038362b4c
2021-06-05fixup: pass tsc = -1 for previous default training sequence codeNeels Hofmeyr1-0/+2
An unintended change in default behavior was introduced in patch: "allow explixit TSC Set and TSC on chan activ / modif / assignment" Ic665125255d7354f5499d10dda1dd866ab243d24 c33eb8d56943b8981523754b081967e6ff5f245d Set tsc_set and tsc = -1 for all lchan_activate_info and assignment_request requests to actually yield the default behavior of selecting the TSC based on the timeslot cfg or the BSIC value. By setting tsc = 0 implicitly, the patch caused all requests to ask for tsc 0 instead of calling gsm_ts_tsc(). For a Channel Mode Modify in assignment_fsm, pass the lchan's current TSC to keep it unchanged. osmo-ttcn3-hacks Id67a949e0f61ec8123976eb8d336f04510c55c01 adds a test to verify the expected TSC in all of the activation, assignment and modify messages. Current osmo-bsc master fails, this patch fixes. Related: SYS#5315 OS#4940 Ic665125255d7354f5499d10dda1dd866ab243d24 Change-Id: If12df11511fe22ea167782f776736a1a9c484b1f
2021-06-05meas rep logging: use log_check_level() to skip a logging loopNeels Hofmeyr1-6/+7
A side effect is that the final cleanup part of that function is now always called, also when num_cell == 7. (Whether we should really clear that logging context at that place is a different question, out of scope here.) Change-Id: I71a402a0940857bbedbaf25d293429934706a83c