Android-cuttlefish cvd tool
network_service.h
Go to the documentation of this file.
1//
2// Copyright (C) 2020 The Android Open Source Project
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15
16#pragma once
17
18#include <atomic>
19#include <ctime>
20
27
28namespace cuttlefish {
29
30class NetworkService : public ModemService, public std::enable_shared_from_this<NetworkService> {
31 public:
32 NetworkService(int32_t service_id_, ChannelMonitor* channel_monitor,
33 ThreadLooper* thread_looper);
34 ~NetworkService() = default;
35
36 NetworkService(const NetworkService &) = delete;
38
40
41 void HandleRadioPowerReq(const Client& client);
42 void HandleRadioPower(const Client& client, std::string& command);
43 void HandleSignalStrength(const Client& client);
44 void HandleQueryNetworkSelectionMode(const Client& client);
45 void HandleRequestOperator(const Client& client);
46 void HandleQueryAvailableNetwork(const Client& client);
47 void HandleSetNetworkSelectionMode(const Client& client, std::string& command);
48 void HandleVoiceNetworkRegistration(const Client& client, std::string& command);
49 void HandleDataNetworkRegistration(const Client& client, std::string& command);
50 void HandleGetPreferredNetworkType(const Client& client);
51 void HandleQuerySupportedTechs(const Client& client);
52 void HandleSetPreferredNetworkType(const Client& client, std::string& command);
53 void HandleNetworkRegistration(cuttlefish::SharedFD client, std::string& command);
54
55 void HandleReceiveRemoteVoiceDataReg(const Client& client,
56 std::string& command);
57 void HandleReceiveRemoteCTEC(const Client& client, std::string& command);
58 void HandleReceiveRemoteSignal(const Client& client, std::string& command);
59
64
73 };
74
83 };
85
86 bool isRadioOff() const { return radio_state_ == RADIO_STATE_OFF; }
87
88 private:
90 std::vector<CommandHandler> InitializeCommandHandlers();
93
94 bool WakeupFromSleep();
95 bool IsHasNetwork();
97 void AdjustSignalStrengthValue(int& value, const std::pair<int, int>& range);
98
102
103 enum RadioState : int32_t {
106 };
108
109 /* Operator */
116 };
117
118 std::string numeric;
119 std::string long_name;
120 std::string short_name;
122
124
125 NetworkOperator(const std::string& number,
126 const std::string& ln,
127 const std::string& sn,
128 OperatorState state)
129 : numeric(number),
130 long_name(ln),
131 short_name(sn),
132 operator_state(state) {}
133 };
134
141 };
142
143 std::vector<NetworkOperator> operator_list_;
146
147 /* SignalStrength */
149 int gsm_rssi; /* Valid values are (0-31, 99) as defined in TS 27.007 8.5 */
150 int gsm_ber; /* bit error rate (0-7, 99) as defined in TS 27.007 8.5 */
151
152 int cdma_dbm; /* Valid values are positive integers. This value is the actual RSSI value
153 * multiplied by -1. Example: If the actual RSSI is -75, then this response
154 * value will be 75.
155 */
156 int cdma_ecio; /* Valid values are positive integers. This value is the actual Ec/Io multiplied
157 * by -10. Example: If the actual Ec/Io is -12.5 dB, then this response value
158 * will be 125.
159 */
160
161 int evdo_dbm; /* Refer cdma_dbm */
162 int evdo_ecio; /* Refer cdma_ecio */
163 int evdo_snr; /* Valid values are 0-8. 8 is the highest signal to noise ratio. */
164
165 int lte_rssi; /* Refer gsm_rssi */
166 int lte_rsrp; /* The current Reference Signal Receive Power in dBm multiplied by -1.
167 * Range: 44 to 140 dBm
168 * INT_MAX: 0x7FFFFFFF denotes invalid value.
169 * Reference: 3GPP TS 36.133 9.1.4 */
170 int lte_rsrq; /* The current Reference Signal Receive Quality in dB multiplied by -1.
171 * Range: 20 to 3 dB.
172 * INT_MAX: 0x7FFFFFFF denotes invalid value.
173 * Reference: 3GPP TS 36.133 9.1.7 */
174 int lte_rssnr; /* The current reference signal signal-to-noise ratio in 0.1 dB units.
175 * Range: -200 to +300 (-200 = -20.0 dB, +300 = 30dB).
176 * INT_MAX : 0x7FFFFFFF denotes invalid value.
177 * Reference: 3GPP TS 36.101 8.1.1 */
178 int lte_cqi; /* The current Channel Quality Indicator.
179 * Range: 0 to 15.
180 * INT_MAX : 0x7FFFFFFF denotes invalid value.
181 * Reference: 3GPP TS 36.101 9.2, 9.3, A.4 */
182 int lte_ta; /* timing advance in micro seconds for a one way trip from cell to device.
183 * Approximate distance can be calculated using 300m/us * timingAdvance.
184 * Range: 0 to 0x7FFFFFFE
185 * INT_MAX : 0x7FFFFFFF denotes invalid value.
186 * Reference: 3GPP 36.321 section 6.1.3.5 */
187
188 int tdscdma_rscp; /* P-CCPCH RSCP as defined in TS 25.225 5.1.1
189 * Valid values are (0-96, 255) as defined in TS 27.007 8.69
190 * INT_MAX denotes that the value is invalid/unreported. */
191
192 int wcdma_rssi; /* Refer gsm_rssi */
193 int wcdma_ber; /* Refer gsm_ber */
194
195 int32_t nr_ss_rsrp; /* SS reference signal received power, multiplied by -1.
196 * Reference: 3GPP TS 38.215.
197 * Range [44, 140], INT_MAX means invalid/unreported. */
198 int32_t nr_ss_rsrq; /* SS reference signal received quality, multiplied by -1.
199 * Reference: 3GPP TS 38.215.
200 * Range [3, 20], INT_MAX means invalid/unreported. */
201 int32_t nr_ss_sinr; /* SS signal-to-noise and interference ratio.
202 * Reference: 3GPP TS 38.215 section 5.1.*, 3GPP TS 38.133 section 10.1.16.1.
203 * Range [-23, 40], INT_MAX means invalid/unreported. */
204 int32_t nr_csi_rsrp; /* CSI reference signal received power, multiplied by -1.
205 * Reference: 3GPP TS 38.215.
206 * Range [44, 140], INT_MAX means invalid/unreported. */
207 int32_t nr_csi_rsrq; /* CSI reference signal received quality, multiplied by -1.
208 * Reference: 3GPP TS 38.215.
209 * Range [3, 20], INT_MAX means invalid/unreported. */
210 int32_t nr_csi_sinr; /* CSI signal-to-noise and interference ratio.
211 * Reference: 3GPP TS 138.215 section 5.1.*, 3GPP TS 38.133 section 10.1.16.1.
212 * Range [-23, 40], INT_MAX means invalid/unreported. */
213
215 : gsm_rssi(INT_MAX),
216 gsm_ber(INT_MAX),
217 cdma_dbm(INT_MAX),
218 cdma_ecio(INT_MAX),
219 evdo_dbm(INT_MAX),
220 evdo_ecio(INT_MAX),
221 evdo_snr(INT_MAX),
222 lte_rssi(INT_MAX),
223 lte_rsrp(INT_MAX),
224 lte_rsrq(INT_MAX),
225 lte_rssnr(INT_MAX),
226 lte_cqi(INT_MAX),
227 lte_ta(INT_MAX),
228 tdscdma_rscp(INT_MAX),
229 wcdma_rssi(INT_MAX),
230 wcdma_ber(INT_MAX),
231 nr_ss_rsrp(INT_MAX),
232 nr_ss_rsrq(INT_MAX),
233 nr_ss_sinr(INT_MAX),
234 nr_csi_rsrp(INT_MAX),
235 nr_csi_rsrq(INT_MAX),
236 nr_csi_sinr(INT_MAX) {}
237 };
238
239 // There's no such thing as a percentage for signal strength in the real
240 // world, as for example for battery usage, this percent value is used to pick
241 // a value within the corresponding signal strength values range for emulation
242 // purposes only.
244
245 static int GetValueInRange(const std::pair<int, int>& range, int percent);
246 static std::string BuildCSQCommandResponse(
247 const SignalStrength& signal_strength);
248 SignalStrength GetCurrentSignalStrength();
249
250 /* Data / voice Registration State */
256 };
257
273 };
274
279
283 };
284
287
291
293 int getModemTechFromPrefer(int preferred_mask);
295
296 std::atomic<bool> first_signal_strength_request_; // For time update
297 std::atomic<time_t> android_last_signal_time_;
298
300 public:
302 void Start();
303
304 private:
306
308 std::atomic_flag loop_started_;
309 };
310
312
313 void HandleIdentifierDisclosure(const std::string& command);
314 void HandleSecurityAlgorithmUpdate(const std::string& command);
315};
316
317} // namespace cuttlefish
Definition: channel_monitor.h:35
Definition: client.h:48
Definition: data_service.h:23
Definition: misc_service.h:25
Definition: modem_service.h:63
int32_t service_id_
Definition: modem_service.h:113
KeepSignalStrengthChangingLoop(NetworkService &network_service)
Definition: network_service.cpp:1286
NetworkService & network_service_
Definition: network_service.h:307
std::atomic_flag loop_started_
Definition: network_service.h:308
void UpdateSignalStrengthCallback()
Definition: network_service.cpp:1299
Definition: network_service.h:30
void InitializeNetworkOperator()
Definition: network_service.cpp:154
NetworkService(const NetworkService &)=delete
NetworkService & operator=(const NetworkService &)=delete
bool isRadioOff() const
Definition: network_service.h:86
void InitializeServiceState()
Definition: network_service.cpp:128
RadioState
Definition: network_service.h:103
@ RADIO_STATE_OFF
Definition: network_service.h:104
@ RADIO_STATE_ON
Definition: network_service.h:105
NetworkService(int32_t service_id_, ChannelMonitor *channel_monitor, ThreadLooper *thread_looper)
Definition: network_service.cpp:37
bool WakeupFromSleep()
Definition: network_service.cpp:336
void HandleQueryNetworkSelectionMode(const Client &client)
Definition: network_service.cpp:517
void HandleRadioPowerReq(const Client &client)
Definition: network_service.cpp:300
std::vector< NetworkOperator > operator_list_
Definition: network_service.h:143
void HandleSecurityAlgorithmUpdate(const std::string &command)
Definition: network_service.cpp:1273
MiscService * misc_service_
Definition: network_service.h:99
static int GetValueInRange(const std::pair< int, int > &range, int percent)
Definition: network_service.cpp:1132
void HandleRequestOperator(const Client &client)
Definition: network_service.cpp:542
ModemTechnology current_network_mode_
Definition: network_service.h:288
void OnDataRegisterStateChanged()
Definition: network_service.cpp:1094
std::string current_operator_numeric_
Definition: network_service.h:144
void HandleIdentifierDisclosure(const std::string &command)
Definition: network_service.cpp:1268
void UpdateRegisterState(RegistrationState state)
Definition: network_service.cpp:1005
void HandleNetworkRegistration(cuttlefish::SharedFD client, std::string &command)
int getModemTechFromPrefer(int preferred_mask)
Definition: network_service.cpp:989
OperatorSelectionMode oper_selection_mode_
Definition: network_service.h:145
void InitializeSimOperator()
Definition: network_service.cpp:178
RegistrationState GetVoiceRegistrationState() const
Definition: network_service.cpp:1282
OperatorSelectionMode
Definition: network_service.h:135
@ OPER_SELECTION_MANUAL_AUTOMATIC
Definition: network_service.h:140
@ OPER_SELECTION_SET_FORMAT
Definition: network_service.h:139
@ OPER_SELECTION_AUTOMATIC
Definition: network_service.h:136
@ OPER_SELECTION_MANUAL
Definition: network_service.h:137
@ OPER_SELECTION_DEREGISTRATION
Definition: network_service.h:138
void HandleReceiveRemoteVoiceDataReg(const Client &client, std::string &command)
Definition: network_service.cpp:1207
ModemTechnology getTechFromNetworkType(NetworkRegistrationStatus::AccessTechnoloy act)
Definition: network_service.cpp:756
void SetupDependency(MiscService *misc, SimService *sim, DataService *data)
Definition: network_service.cpp:245
void OnSignalStrengthChanged()
Definition: network_service.cpp:1278
NetworkRegistrationStatus data_registration_status_
Definition: network_service.h:286
void HandleSetPreferredNetworkType(const Client &client, std::string &command)
Definition: network_service.cpp:1031
DataService * data_service_
Definition: network_service.h:101
RadioState radio_state_
Definition: network_service.h:107
void AdjustSignalStrengthValue(int &value, const std::pair< int, int > &range)
void HandleVoiceNetworkRegistration(const Client &client, std::string &command)
Definition: network_service.cpp:829
void HandleSetNetworkSelectionMode(const Client &client, std::string &command)
Definition: network_service.cpp:595
SimService * sim_service_
Definition: network_service.h:100
std::atomic< time_t > android_last_signal_time_
Definition: network_service.h:297
int preferred_network_mode_
Definition: network_service.h:289
KeepSignalStrengthChangingLoop keep_signal_strength_changing_loop_
Definition: network_service.h:311
void OnSimStatusChanged(SimService::SimStatus sim_status)
Definition: network_service.cpp:253
void HandleQueryAvailableNetwork(const Client &client)
Definition: network_service.cpp:576
void HandleGetPreferredNetworkType(const Client &client)
Definition: network_service.cpp:956
std::atomic< bool > first_signal_strength_request_
Definition: network_service.h:296
void HandleReceiveRemoteSignal(const Client &client, std::string &command)
Definition: network_service.cpp:1251
int signal_strength_percent_
Definition: network_service.h:243
std::vector< CommandHandler > InitializeCommandHandlers()
Definition: network_service.cpp:46
void HandleSignalStrength(const Client &client)
Definition: network_service.cpp:432
void HandleReceiveRemoteCTEC(const Client &client, std::string &command)
Definition: network_service.cpp:1223
NetworkRegistrationStatus voice_registration_status_
Definition: network_service.h:285
NetworkRegistrationStatus::AccessTechnoloy getNetworkTypeFromTech(ModemTechnology modemTech)
Definition: network_service.cpp:741
RegistrationState
Definition: network_service.h:75
@ NET_REGISTRATION_ROAMING
Definition: network_service.h:81
@ NET_REGISTRATION_SEARCHING
Definition: network_service.h:78
@ NET_REGISTRATION_HOME
Definition: network_service.h:77
@ NET_REGISTRATION_EMERGENCY
Definition: network_service.h:82
@ NET_REGISTRATION_UNREGISTERED
Definition: network_service.h:76
@ NET_REGISTRATION_DENIED
Definition: network_service.h:79
@ NET_REGISTRATION_UNKNOWN
Definition: network_service.h:80
void HandleQuerySupportedTechs(const Client &client)
Definition: network_service.cpp:968
int modem_radio_capability_
Definition: network_service.h:290
static std::string BuildCSQCommandResponse(const SignalStrength &signal_strength)
Definition: network_service.cpp:1138
void HandleDataNetworkRegistration(const Client &client, std::string &command)
Definition: network_service.cpp:900
SignalStrength GetCurrentSignalStrength()
Definition: network_service.cpp:1169
bool IsHasNetwork()
Definition: network_service.cpp:451
void HandleRadioPower(const Client &client, std::string &command)
Definition: network_service.cpp:311
void OnVoiceRegisterStateChanged()
Definition: network_service.cpp:1071
ModemTechnology
Definition: network_service.h:65
@ M_MODEM_TECH_GSM
Definition: network_service.h:66
@ M_MODEM_TECH_TDSCDMA
Definition: network_service.h:70
@ M_MODEM_TECH_LTE
Definition: network_service.h:71
@ M_MODEM_TECH_NR
Definition: network_service.h:72
@ M_MODEM_TECH_CDMA
Definition: network_service.h:68
@ M_MODEM_TECH_WCDMA
Definition: network_service.h:67
@ M_MODEM_TECH_EVDO
Definition: network_service.h:69
Definition: shared_fd.h:124
Definition: sim_service.h:28
SimStatus
Definition: sim_service.h:72
Definition: thread_looper.h:51
#define data
Definition: dict.c:56
std::string_view misc
Definition: android_composite_disk_config.cc:54
Definition: alloc_driver.h:20
Definition: network_service.h:110
std::string short_name
Definition: network_service.h:120
NetworkOperator(const std::string &number, const std::string &ln, const std::string &sn, OperatorState state)
Definition: network_service.h:125
std::string numeric
Definition: network_service.h:118
OperatorState operator_state
Definition: network_service.h:121
std::string long_name
Definition: network_service.h:119
OperatorState
Definition: network_service.h:111
@ OPER_STATE_FORBIDDEN
Definition: network_service.h:115
@ OPER_STATE_AVAILABLE
Definition: network_service.h:113
@ OPER_STATE_UNKNOWN
Definition: network_service.h:112
@ OPER_STATE_CURRENT
Definition: network_service.h:114
NetworkOperator()
Definition: network_service.h:123
NetworkRegistrationStatus()
Definition: network_service.h:275
RegistrationState registration_state
Definition: network_service.h:281
AccessTechnoloy network_type
Definition: network_service.h:282
AccessTechnoloy
Definition: network_service.h:258
@ ACCESS_TECH_HSUPA
Definition: network_service.h:264
@ ACCESS_TECH_E_UTRA_NR
Definition: network_service.h:272
@ ACCESS_TECH_EGPRS
Definition: network_service.h:262
@ ACCESS_TECH_GSM
Definition: network_service.h:259
@ ACCESS_TECH_E_UTRAN
Definition: network_service.h:268
@ ACCESS_TECH_NG_RAN
Definition: network_service.h:271
@ ACCESS_TECH_GSM_COMPACT
Definition: network_service.h:260
@ ACCESS_TECH_HSPA
Definition: network_service.h:265
@ ACCESS_TECH_EC_GSM_IoT
Definition: network_service.h:267
@ ACCESS_TECH_E_UTRA
Definition: network_service.h:269
@ ACCESS_TECH_UTRAN
Definition: network_service.h:261
@ ACCESS_TECH_HSDPA
Definition: network_service.h:263
@ ACCESS_TECH_NR
Definition: network_service.h:270
@ ACCESS_TECH_EUTRAN
Definition: network_service.h:266
RegistrationUnsolMode
Definition: network_service.h:252
@ REGISTRATION_UNSOL_DISABLED
Definition: network_service.h:253
@ REGISTRATION_UNSOL_ENABLED_FULL
Definition: network_service.h:255
@ REGISTRATION_UNSOL_ENABLED
Definition: network_service.h:254
RegistrationUnsolMode unsol_mode
Definition: network_service.h:280
Definition: network_service.h:148
int gsm_rssi
Definition: network_service.h:149
int32_t nr_ss_rsrp
Definition: network_service.h:195
int32_t nr_ss_rsrq
Definition: network_service.h:198
int lte_rsrp
Definition: network_service.h:166
int32_t nr_csi_sinr
Definition: network_service.h:210
SignalStrength()
Definition: network_service.h:214
int lte_ta
Definition: network_service.h:182
int evdo_ecio
Definition: network_service.h:162
int lte_rssi
Definition: network_service.h:165
int cdma_dbm
Definition: network_service.h:152
int evdo_snr
Definition: network_service.h:163
int cdma_ecio
Definition: network_service.h:156
int evdo_dbm
Definition: network_service.h:161
int32_t nr_csi_rsrq
Definition: network_service.h:207
int lte_cqi
Definition: network_service.h:178
int32_t nr_ss_sinr
Definition: network_service.h:201
int lte_rssnr
Definition: network_service.h:174
int wcdma_ber
Definition: network_service.h:193
int lte_rsrq
Definition: network_service.h:170
int wcdma_rssi
Definition: network_service.h:192
int32_t nr_csi_rsrp
Definition: network_service.h:204
int gsm_ber
Definition: network_service.h:150
int tdscdma_rscp
Definition: network_service.h:188