Commit Graph

959 Commits

Author SHA1 Message Date
Matan Perelman cc1ac21671 ctrl: Add lchan show to all ctrl levels
This new commands show information about logical channels:
    net.btsN.trxM.tsI.show-lchan.full
    net.btsN.trxM.show-lchan.full
    net.btsN.show-lchan.full
    net.show-lchan.full

Change-Id: I23c1a7e6f6679e3964e359fb202ffe6781a07e8a
2024-02-24 16:44:30 +02:00
Matan Perelman d399e0c927 ctrl: Add ms power
This new command allows to control MS power level for a specific
logical channel using net.btsN.trxM.tsI.lchanL.ms-power

This patch also adds a lchan node to the ctrl interface.

Depends: libosmocore.git Ibf2786f668ee7e4f5b6a9ef43f2141cd2d79b4e2
Change-Id: I6f556b66011be6126d6bac31a14101ba37f81cc4
2024-02-17 11:07:46 +02:00
Matan Perelman 6b6714ba13 ctrl: Split bts_trx_ts_ctrl from bts_trx_ctrl
Besides from making the ts ctrl interface follow the convention
of being in its own file, it will be used in the next patch to add
a ctrl interface for lchan.

Change-Id: I9840bddd4eae409bc8373912d54b6bbfc9fc1c1a
2024-02-08 20:30:51 +00:00
Pau Espin 0368a9e815 abis_nm_sw_act_req_ack: attr_len should be unsigned
Change-Id: I5c0ba76b5cc2464c7e362a850325c94770f38397
2024-02-05 14:45:04 +01:00
Vadim Yanitskiy 11d7ed2d9f abis_nm: misc/cosmetic changes to abis_nm_sw_act_req_ack()
Change-Id: I2849a22647805e7477d66055c18614a3a9f80748
2024-02-03 06:38:45 +07:00
Andreas Eversberg 0c1ab7d82f Add vty commands "no gprs nsvc ..."
A switch (bool) is used to enable or disable NSVC 0 or 1. It is enabled
via any "gprs nsvc 0|1" command and disabled via "no gprs nsvc 0|1"
command. If it is disabled, it is treated as unconfigured, similar when
no remote IP or port has been defined.

Related: OS#6006
Change-Id: Ia112e86aa35f6a245d98ef1b3720c18835faeda6
2024-01-24 08:52:55 +00:00
Andreas Eversberg 9a730ee2d4 VTY: Add command `show bts brief`
This line shows all BTS an their OML states in a single line.
Additionally the uptime or downtime is displayed, if there was a connect
or disconnect of the OML link.

Related: OS#6018
Change-Id: I003fd32e589ddf53b7dd42089f904cfb598e3625
2024-01-24 08:52:55 +00:00
Andreas Eversberg f405db793e Also track downtime when OML link is lost
This will be used in a later patch to dertemine when a BTS became
offline.

Related: OS#6018
Change-Id: I1776099cbfef51af1d5a3a056fb0654abd7366a9
2024-01-24 08:52:55 +00:00
Vadim Yanitskiy b2f11dbcae Remove unused OpenBSC leftover 'openbscdefines.h'
Change-Id: Iafc9f387a07f1eba66d291a84017e7dee56c4cb7
2024-01-22 19:52:27 +07:00
Matan Perelman 40ecc7d538 abis_rsl: Add rach expiry timeout
This allows controlling the RACH DoS attack protection without
increasing call drops rate.

Change-Id: Iff7266672dd8bc9ce2b34b0478d98fb70691f425
2024-01-02 09:14:16 +02:00
Oliver Smith 6766608231 recover BORKEN lchans for missing ACK scenarios
We already recover broken lchans where an ACTIV ACK or REL ACK arrives
late. Now add a recovery path for lchans that are broken because no
ACTIV ACK or REL ACK arrives at all.

Add a timeout of X28 = 30s to the lchan BORKEN state.
On timeout, attempt both a Channel Activation and a Channel Release. If
any of them is ACKed, we have successfully synced BTS and BSC's state.

After successful recovery, place the lchan back in the UNUSED state,
available for servicing subscribers.

If recovery is unsuccessful, just continue to attempt recovery every
further X28 seconds.

Patch-by: osmith, nhofmeyr
Related: osmo-ttcn3-hacks I9b4ddfc4a337808d9d5ec538c25fd390b1b2530f
Related: OS#5106
Related: SYS#6655
Change-Id: Ic4728b3efe843ea63e2a0b54b1ea8a925347484a
2023-11-27 16:33:25 +00:00
arehbein 252e7f3e91 bsc: Make socket queue max. length configurable
Title refers to the maximum length of the osmo_wqueue used for
the PCU socket connection.

Related: OS#5774
Change-Id: Ic5f19f4613bccaf582997a4d02b689adee083a0b
2023-11-24 10:46:08 +00:00
Philipp Maier 647bc1e698 pcuif_proto: signal BTS model via PCUIF
At the moment the PCU has no way of knowing with which BTS model it is
used with. However, some BTS models may require slightly different
behaviour by the PCU, depending on which BTS model is used. So, lets add
an additional bts_model field to struct gsm_pcu_if_info_ind in order to
convey the exact BTS model to the PCU.

Related: OS#6191
Depends: osmo-pcu.git I48eb75f65ab54fdec41ef913e24c1f18cd4a4047
Change-Id: I4b58912ad7be3070829614853901aa19108ba2c0
2023-11-21 09:16:46 +00:00
arehbein 50cb01c29f osmo-bsc: Have PCU socket connection use osmo_wqueue
Close PCU socket on write queue overflow.

Related: OS#5774
Change-Id: Ifd9741045a87338e17eec3492590a5de9c308cb5
2023-10-24 19:30:25 +00:00
Philipp Maier 801b55ee4a pcuif_proto: clean up last remains of old PCUIF v10
There are still some remains that are related to the old PCUIF v10
protocol version. Let's clean those up.

Related: OS#5927
Depends: osmo-pcu.git I68a3f59d5c960ae3a4fbd74f9d4a894295cb9ed8
Change-Id: Iebb3a634fee680bdc3636a61f3ccaa1e97e54a64
2023-10-24 15:10:28 +00:00
Andreas Eversberg d4625a20a5 ASCI: Add System Information 10 support
For each BTS, an SI 10 is generated with the informations about all
neighbor BTS that have the same group/broadcast call.

The SI 10 will only define neighbor cells within the same BSC, because
it does not know about neighbor cells within other BSCs.

When multiple channels are used for a group/broadcast call, the SI 10
is generated after all channels have been activated. Subsequent channel
activations result in an update of SI 10 on all channels.

Change-Id: Icd3101e6dd935a57f003253aaef400c2cf95a0c3
2023-10-23 11:31:26 +02:00
Andreas Eversberg fec682b45b ASCI: Make neigh_list_get_arfcn() available to other users
The error logging message within this function is moved to the user
neigh_list_get_arfcn().

In case of an error, which results in measurement report with cell
index that does not exist in the list of neigbor cells, the measurement
report is truncated to 0 neighbor cell measurements.

Change-Id: Ia8a1dca4837536129d17e7784b892bcb75b9ca4b
2023-10-09 12:47:04 +02:00
Philipp Maier a3a225a16b pcuif_proto: rename PCU_IF_FLAG_SYSMO to PCU_IF_FLAG_DIRECT_PHY
The PCUIF flag PCU_IF_FLAG_SYSMO was originally used by osmo-bts-sysmo
to signal to the PCU that the direct PHY access for the sysmo-bts DSP
should be enabled. With time, support for other BTS models was added and
the flag became a synonym for "direct PHY access", so it makes sense to
rename it to "PCU_IF_FLAG_DIRECT_PHY"

Related: OS#6191
Depends: osmo-pcu.git I29b7b78a3a91d062b9ea3cd72623d30618cd3f0b
Change-Id: I23df067df99b76048667131905c4448d32d80640
2023-10-04 14:46:21 +00:00
arehbein ea388e1db1 meas_feed: Use osmo_io instead of write queue
Related: OS#6170
Change-Id: Ib0570a3242e2846062e24c93cbbbbd31137acdee
2023-10-04 08:38:12 +00:00
Matan Perelman eff19b55b0 si2quater: Invalidate thresh_lo, prio and qrxlm when needed
Change-Id: I5910ce8db2d085295b327b12096ba129369eb532
2023-09-24 16:05:29 +00:00
Vadim Yanitskiy 392cfc6a2a abis_nm: delay configure_loop() until NM_MT_SW_ACTIVATED_REP
Even though the Abis/OML message flow looks the way it should look
on the wire, it does not actually reflect the sequence/flow of events
and actions in the NM FSMs.  For example (extracted from a PCAP):

    GPRS Cell(00,00,ff) State Changed Event Report
    GPRS Cell(00,00,ff) Software Activate Request
    GPRS Cell(00,00,ff) Software Activate Request ACK
    GPRS Cell(00,00,ff) Activate Software
    GPRS Cell(00,00,ff) Activate Software ACK
[a] GPRS Cell(00,00,ff) State Changed Event Report
[b] GPRS Cell(00,00,ff) Software Activated Report
[c] GPRS Cell(00,00,ff) Get Attributes
    GPRS Cell(00,00,ff) Get Attributes Response
[d] GPRS Cell(00,00,ff) IPA Set Attributes
    GPRS Cell(00,00,ff) IPA Set Attributes ACK
    GPRS Cell(00,00,ff) Change Administrative State
    GPRS Cell(00,00,ff) Change Administrative State ACK
    GPRS Cell(00,00,ff) State Changed Event Report
    GPRS Cell(00,00,ff) Opstart
    GPRS Cell(00,00,ff) Opstart ACK

A follow-up patch [1] changes the logic generating message [d],
so that the IPA Object Version of the GPRS Cell MO is taken into
account when adding the attributes.

The problem is that both messages [c] and [d] are generated and
queued for transmission on the receipt of message [a], but *before*
message [b] has been processed.  So the IPA Object Version is not
known and assumed to be 0 at that point in time.

This patch delays configure_loop() until message [b] is received.
So far only for nanoBTS and only for those MOs, for which Figure 2
in 3GPP TS 52.021 explicitly mentions that the SW downloading and
activation procedures may be required, plus for the ip.access
specific MOs which all seem to support the SW activation.

osmo-bts does send SW Activated Report only for a subset of MOs,
which does not include Baseband Transceiver, Radio Carrier, and
Radio Channel.  3GPP TS 52.021 is not clear on whether this
message shall be sent by all MOs either, so we consider it
optional and delay configure_loop() only for nanoBTS.

Change-Id: I3953a5e41eb27165f9ff203cac7447ee9d311abf
Related: [1] Ie0fb3eaf76e1f70e5a19bb088e1674b7e553d32a
2023-09-23 17:04:41 +07:00
Vadim Yanitskiy 4454350b42 oml: ipacc: parse Object Version from SW Activated Report
Change-Id: I39105096a6b29bd7e4fb15287653074527c3e024
Related: OS#4505
2023-09-15 05:29:05 +07:00
Vadim Yanitskiy ebffc84bf9 gsm_data: refactor/simplify and expose gsm_objclass2mo()
Change-Id: Ic03fdfabf84a1b5cd8046101c1575296914c6332
2023-09-14 16:26:19 +07:00
Vadim Yanitskiy c3446ef49e abis_nm: get rid of MAX_BTS_ATTR
This is a partial revert of commit [1], which defined a limit on the
number of attributes and SW Description IEs as a constant and added
a spec. reference.  The problem is that there is no such limit in the
referenced 3GPP TS 52.021.  The attributes and SW Description IEs are
using TL16V encoding, so there can be as many as the Length part can
represent.  It's actually the limitation of our side, since we
allocate a buffer of fixed size on the stack for parsing.

* Remove the MAX_BTS_ATTR and confusing spec. reference.
* For the SW Description IEs, define SW_DESCR_MAX locally.
* For the attributes, define the buffer size in place.

Change-Id: Idd8b971d32cf0f7a910a664d921e644b7c32d831
Related: [1] 1ebf23b7fe "Prepare for BTS attribute reporting via OML"
Related: OS#4505
2023-09-13 10:40:45 +00:00
Vadim Yanitskiy 9ac3459a00 abis_nm: parse feature flags in NM_ATT_IPACC_SUPP_FEATURES
Since change [1], among with the other attributes we started requesting
NM_ATT_IPACC_SUPP_FEATURES from the BTS.  This patch adds the logic for
parsing the response (so far only printing supported features).

Change-Id: I64cffa0bdead3617cc169c83b0f6ddf74f0866a7
Related: [1] 43440e1fc5
Depends: libosmocore.git Ia4208e10d61843dd6ae77398f6624c918dc81ea4
Related: OS#4505
2023-09-13 10:40:45 +00:00
Vadim Yanitskiy c4b330ba4c struct gsm_bts_trx[_ts], gsm_abis_mo: drop unused nm_attr
Change-Id: I36c3aaefa0bd9ee946a53ed537cf5c3bd7e9761e
2023-09-12 22:04:16 +00:00
Philipp Maier e55a114e8a pcu_sock: use PCU_IF_SAPI_AGCH_2 instead PCU_IF_SAPI_AGCH
In PCUIF v.11 we use PCU_IF_SAPI_AGCH_2 exclusively. We use this SAPI
to transfer IMMEDIATE ASSIGNMENT messages for uplink and downlink. One
new feature of PCU_IF_SAPI_AGCH_2 is that the PCU may ask to send a
confirmation when the MAC block is sent.

CAUTION: This patch breaks compatibility to current master osmo-pcu (See
also "Depends")

Related: OS#5927
Depends: osmo-pcu.git I9effdcec1da91a6e2e7a7c41f95d3300ad1bb292
Change-Id: I709c27adaf09a6766cfde4d76d878626d30ebb3c
2023-08-31 11:03:20 +02:00
Philipp Maier 33a2a2fed5 pcuif_proto: check confirm flag in struct gsm_pcu_if_pch
Since osmo-bsc uses RSL (with a propritary Ericsson RBS specific
extension) to send a confirmed IMMEDIATE ASSIGNMENT messages via
PCH, we can not just forward the MAC blocks into the paging queue
without determining whether the MAC block is a PAGING message or an
IMMEDIATE ASSIGNMENT message. the reason for this is that RSL uses
two different message types (IMMEDIATE ASSIGNMENT COMMAND and PAGING
COMMAND) to process IMMEDIATE ASSIGNMENT and PAGING messages.

This means we have to look into the MAC block to make sure whether
the message is a PAGING message or an IMMEDIATE ASSIGNMENT message.

We also need to make sure that the confirm flag is properly executed.
In the case of the IMMEDIATE ASSIGNMENT this means we have to include
(confirm=true) or not include (confirm=false) the RSL_IE_ERIC_MOBILE_ID
into the IMMEDIATE ASSIGNMENT COMMAND message.

In the case of PAGING we directly echo a confirmation after sending
the PAGING COMMAND via RSL when a confirmation is requested.

Related: OS#5927
Depends: osmo-pcu.git Ia202862aafc1f0cb6601574ef61eb9155de11f04
Change-Id: I3d2842626b7e8325860ea3160c7d900d39e953a0
2023-08-31 08:29:58 +00:00
Pau Espin c1d7bb6908 meas_feed: Increase wqueue max_len to 100 and make it vty-configurable
The previous amount of 10 messages may be small if the BSC is processing
lots of measurements from lots of BTS connected to it.
Increase it to 100 by default, and allow changing the write_queue length
through the VTY.

Related: SYS#6550
Change-Id: Ib2e3591498c038b8e59f3ad447ac1f65928d6da8
2023-08-30 11:27:24 +02:00
Philipp Maier 5c9162980d pcuif_proto: get rid of _DT, _dt (Direct TLLI)
Since we now no longer refer to TLLI when we mean "message ID" (msg_id),
we should also remove the "_DT" / "_dt" suffix from structs and define
constants and replace it with "_2" if required.

Depends: osmo-pcu.git If641b507dcb6b176109c99dce7cff2a7561364b0
Change-Id: I628aaf19999a0004d0760d25ecd323cdbc0076f5
Related: OS#5927
2023-08-10 15:04:51 +02:00
Philipp Maier 5950ea55e2 pcuif_proto: remove unnecessary members from gsm_pcu_if_data_cnf_dt
The struct gsm_pcu_if_data_cnf_dt was added when the first experiments
mit Ericsson RBS base stations were made. It is essentially a copy of
gsm_pcu_if_data, where the mamber "data" was replaced with a member
"msg_id" (which was originally called "tlli"). Since we didn't know
back then which parameters we would still need at some later point we
kept all the other parameters. However, to this day we never used the
parameters below fn. Even fn was only used for logging purposes, but is
now also unused.

Let's remove all those unused members.

(Since all removed members are at the tail of the struct,
compatibility with other programs that use the PCUIF should not break.)

Change-Id: I37845408edd96017b50559964c82b2cdc5e143a7
Related: OS#5927
2023-08-10 12:26:31 +02:00
Philipp Maier 4f53837528 pcuif_proto: rename tlli to msg_id
To confirm downlink IMMEDIATE ASSIGNMENT messages, we use the TLLI as an
identifier and the related struct member is also called "tlli".
Unfortunately this is misleading since the message identifier does not
necessarly have to be a TLLI. It is just an implementation detail that
osmo-pcu uses the TLLI as a message identifier.

To make that clear, lets rename the tlli member (and variable and
parameter names where it is passed on) to "msg_id".

(Since this change only renames variables and struct members it will not
break compatibility with other programs that use the PCUIF)

Related: OS#5927
Depends: osmo-pcu.git I4a25039dfe329e68879bc68936e49c4b190625e6
Change-Id: Ifb3f257099b52c50e525768484f9e93282089d0f
2023-08-08 17:40:22 +02:00
Andreas Eversberg 7200b01577 Select channel type by enum instead of three boolean
struct lchan_activate_info and struct lchan_modify_info use an enum to
define, if the channel type is for a normal channel, a VAMOS channel or
a VGCS/VBS channel.

Change-Id: I21167eb4192c02cd7b5e1574cddb382a3feaebe0
2023-07-21 13:33:55 +02:00
Andreas Eversberg 2d93d61fe3 ASCI: Add assignment to a VGCS/VBS channel
The assignment is triggered by the MSC by sending an ASSIGNMENT REQUEST
with a group call reference. The reference is used to find the VGCS/VBS
channel that belogs to the referenced call.

The existing VGCS/VBS channel is reactivated. This will put the channel
into a state where the MS can establish the link on it, to complete the
assignment. The old connection is released by the MSC and assignment
completion is handled by the VGCS FSM.

Change-Id: Idaa864cd5ce4df6c3193494ce12d91523c104d89
Related: OS#4852
2023-07-21 13:33:51 +02:00
Andreas Eversberg b0712a9f22 ASCI: Send release on VGCS/VBS channel via unit data
Channel release is sent to MS that is in dedicated mode on the main
DCCH. Additionally it is sent as unit data on a VGCS/VBS to notify all
listeners that the channel has been released. All listeners return to
IDLE mode.

Change-Id: Ib777fe98c8ce2342082d88d227b796167d92cfe1
Related: OS#4852
2023-07-21 13:33:46 +02:00
Andreas Eversberg 1f05282243 ASCI: Add processing and FSMs for VGCS/VBS
Change-Id: Id9e94fb4f27bb438b7093c031344a3400bfa34f1
Related: OS#4852
2023-07-21 13:33:31 +02:00
Andreas Eversberg 1349c9c217 ASCI: Add TX support for UPLINK FREE/BUSY messages
Change-Id: Ia27e0ebb5bf7edb1b9f84999cafc028231b9489f
Related: OS#4852
2023-07-21 13:33:22 +02:00
Andreas Eversberg 353fa5a14d ASCI: Add support for sending RSL UNIT-DATA towards BTS
This is required to send UPLINK FREE and UPLINK BUSY messages to the
BTS.

Change-Id: I25e80f079989a4c7dede58c327c22b958784f3ff
Related: OS#4852
2023-07-21 11:15:27 +00:00
Andreas Eversberg fd35bc917a ASCI: Do not release channel, if SAPI 0 is released
A VGCS channel must not release, if all SAPIs (including 0) are
released. lchan FSM will ignore this.

Change-Id: Ief1e1894362c4917f6e0092268690f68c8193750
Related: OS#4852
2023-07-21 11:15:27 +00:00
Andreas Eversberg 0a2e79e946 ASCI: Add new debug category "ASCI" for VGCS/VBS state machines
Change-Id: I4714fa4ff2b1327183a365223a3e3d89ae0357f7
Related: OS#4852
2023-07-21 11:15:27 +00:00
Andreas Eversberg b18cae1952 ASCI: Make function to add OSMUX IE public
Rename _gsm0808_ass_compl_extend_osmux() to gsm0808_extend_osmux().

This IE is also used for VGCS/VBS assignment command that is located in
a different file.

Change-Id: I1452cabb142f9e7a169f4ddfeac85908abaf8dfc
Related: OS#4852
2023-07-21 11:15:27 +00:00
Andreas Eversberg 2193f98f3e ASCI: Add TX support for UPLINK RELEASE message
Change-Id: Ie3d8ad1ea8325c13759838d8083c6e47a0f54497
Related: OS#4852
2023-07-21 11:14:44 +00:00
Andreas Eversberg 2436f40b4c ASCI: Add selection reason for VGCS/VBS channels
"enum lchan_select_reason" gets a new selection reason: "SELECT_FOR_VGCS"

The selection "direction" can also be changed via VTY.

Change-Id: I6b96d0a1df68efa5858b98297ebe0944b1473aaf
Related: OS#4852
2023-07-21 11:14:44 +00:00
Andreas Eversberg 4827437a26 ASCI: Add support for Group/Broadcast channel activation
"struct lchan_activate_info" is expanded to support flags for VGCS and
VBS. These are used to send the correct Channel Mode to the BTS.

"enum lchan_activate_for" is expanded to indicate and activation of
VGCS/VBS calls.

Change-Id: Ic0c0597d149d0758d6766937d99660fa02e0e139
Related: OS#4852
2023-07-21 11:14:44 +00:00
Andreas Eversberg bcb7b32f5a ASCI: Add support for NOTIFICATION COMMAND (RSL) message
This message will be sent to each BTS with a VGCS/VBS channel to notify
the served MSs about ongoing group/broadcast calls. It is also used to
remove the notification, if the call is terminated.

Change-Id: I96ec0ee5d1a772a45f1ebfd64210718c8bf5aa58
Related: OS#4852
2023-07-21 11:14:44 +00:00
Andreas Eversberg e45fdd42d7 Fix typo in rate counters ASSIGMENT->ASSIGNMENT
Change-Id: I73079948afbdde35594660959b5335118a810d7b
2023-07-21 11:14:44 +00:00
Andreas Eversberg aee1db9dc1 ASCI: Add new rate counters to support VGCS/VBS messages
Change-Id: I18e4ca3599e480de2d0f64cc1b6f4bb6ce8020d4
Related: OS#4852
2023-07-21 11:14:44 +00:00
Harald Welte 8798689f3b Support (optional) indication of NCH position in SI1 rest octets
This adds the vty commands and respective logic to allow the user to
specify the NCH (notification channel) position in the SI1 rests octets.

Change-Id: Iefde0af44a663f22462a54d68a58caa560eceb2f
Related: OS#5781
Requires: libosmocore.git I24a0095ac6eee0197f9d9ef9895c7795df6cdc49
2023-05-31 09:19:53 +00:00
Philipp Maier a1ff30920d pcu_sock: fix PCUIF interface (PCH)
The PCUIF interface implementation in osmo-bsc provides two ways to
access the paging channel (PCH).

1) Under the SAPI PCU_IF_SAPI_PCH PAGING COMMAND messages are accepted
as whole MAC block but the format is in the style that we are going
to deprecate with PCUIF v.11. Also at the moment those PAGING COMMANDs
are not confirmed towards the PCU. This is also not necessary since
osmo-pcu would silently drop such confirmations. (see pcu_rx_data_cnf
in pcu_l1_if.cpp)

2) Under the SAPI PCU_IF_SAPI_PCH_DT messages are also accepded as
MAC blocks but the SAPI will only accept IMMEDIATE ASSIGNMENT messages.
The messages are encapsulated in a struct that holds IMSI (paging group)
and TLLI (used for confirmation) as separate struct members. The
messages are also confirmed towards the PCU as it should be.

Since we want to depreacete the older V.10 version of PCUIF and there is
not much benefit in maintaining two interfaces we should use
SAPI PCU_IF_SAPI_PCH_DT for both message types. This also requires small
adjustments to osmo-pcu (see Depends).

Depends: osmo-pcu.git I99cfe373fa157cfb32b74c113ad9935347653a71
Related: OS#5927
Change-Id: I82443f2b402aa2416469c8c50b1c050323ef3b8f
2023-05-24 12:29:00 +02:00
Vadim Yanitskiy 1f3bfff668 copyright: fix typo: sysmocom s/s.m.f.c./s.f.m.c./ GmbH
Change-Id: I849a18a3bfd15aad00de3e103339540a7548e097
2023-05-18 17:22:26 +07:00