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 };
75
76 bool isRadioOff() const { return radio_state_ == RADIO_STATE_OFF; }
77
78 private:
80 std::vector<CommandHandler> InitializeCommandHandlers();
83
84 bool WakeupFromSleep();
85 bool IsHasNetwork();
87 void AdjustSignalStrengthValue(int& value, const std::pair<int, int>& range);
88
92
93 enum RadioState : int32_t {
96 };
98
99 /* Operator */
106 };
107
108 std::string numeric;
109 std::string long_name;
110 std::string short_name;
112
114
115 NetworkOperator(const std::string& number,
116 const std::string& ln,
117 const std::string& sn,
118 OperatorState state)
119 : numeric(number),
120 long_name(ln),
121 short_name(sn),
122 operator_state(state) {}
123 };
124
131 };
132
133 std::vector<NetworkOperator> operator_list_;
136
137 /* SignalStrength */
139 int gsm_rssi; /* Valid values are (0-31, 99) as defined in TS 27.007 8.5 */
140 int gsm_ber; /* bit error rate (0-7, 99) as defined in TS 27.007 8.5 */
141
142 int cdma_dbm; /* Valid values are positive integers. This value is the actual RSSI value
143 * multiplied by -1. Example: If the actual RSSI is -75, then this response
144 * value will be 75.
145 */
146 int cdma_ecio; /* Valid values are positive integers. This value is the actual Ec/Io multiplied
147 * by -10. Example: If the actual Ec/Io is -12.5 dB, then this response value
148 * will be 125.
149 */
150
151 int evdo_dbm; /* Refer cdma_dbm */
152 int evdo_ecio; /* Refer cdma_ecio */
153 int evdo_snr; /* Valid values are 0-8. 8 is the highest signal to noise ratio. */
154
155 int lte_rssi; /* Refer gsm_rssi */
156 int lte_rsrp; /* The current Reference Signal Receive Power in dBm multiplied by -1.
157 * Range: 44 to 140 dBm
158 * INT_MAX: 0x7FFFFFFF denotes invalid value.
159 * Reference: 3GPP TS 36.133 9.1.4 */
160 int lte_rsrq; /* The current Reference Signal Receive Quality in dB multiplied by -1.
161 * Range: 20 to 3 dB.
162 * INT_MAX: 0x7FFFFFFF denotes invalid value.
163 * Reference: 3GPP TS 36.133 9.1.7 */
164 int lte_rssnr; /* The current reference signal signal-to-noise ratio in 0.1 dB units.
165 * Range: -200 to +300 (-200 = -20.0 dB, +300 = 30dB).
166 * INT_MAX : 0x7FFFFFFF denotes invalid value.
167 * Reference: 3GPP TS 36.101 8.1.1 */
168 int lte_cqi; /* The current Channel Quality Indicator.
169 * Range: 0 to 15.
170 * INT_MAX : 0x7FFFFFFF denotes invalid value.
171 * Reference: 3GPP TS 36.101 9.2, 9.3, A.4 */
172 int lte_ta; /* timing advance in micro seconds for a one way trip from cell to device.
173 * Approximate distance can be calculated using 300m/us * timingAdvance.
174 * Range: 0 to 0x7FFFFFFE
175 * INT_MAX : 0x7FFFFFFF denotes invalid value.
176 * Reference: 3GPP 36.321 section 6.1.3.5 */
177
178 int tdscdma_rscp; /* P-CCPCH RSCP as defined in TS 25.225 5.1.1
179 * Valid values are (0-96, 255) as defined in TS 27.007 8.69
180 * INT_MAX denotes that the value is invalid/unreported. */
181
182 int wcdma_rssi; /* Refer gsm_rssi */
183 int wcdma_ber; /* Refer gsm_ber */
184
185 int32_t nr_ss_rsrp; /* SS reference signal received power, multiplied by -1.
186 * Reference: 3GPP TS 38.215.
187 * Range [44, 140], INT_MAX means invalid/unreported. */
188 int32_t nr_ss_rsrq; /* SS reference signal received quality, multiplied by -1.
189 * Reference: 3GPP TS 38.215.
190 * Range [3, 20], INT_MAX means invalid/unreported. */
191 int32_t nr_ss_sinr; /* SS signal-to-noise and interference ratio.
192 * Reference: 3GPP TS 38.215 section 5.1.*, 3GPP TS 38.133 section 10.1.16.1.
193 * Range [-23, 40], INT_MAX means invalid/unreported. */
194 int32_t nr_csi_rsrp; /* CSI reference signal received power, multiplied by -1.
195 * Reference: 3GPP TS 38.215.
196 * Range [44, 140], INT_MAX means invalid/unreported. */
197 int32_t nr_csi_rsrq; /* CSI reference signal received quality, multiplied by -1.
198 * Reference: 3GPP TS 38.215.
199 * Range [3, 20], INT_MAX means invalid/unreported. */
200 int32_t nr_csi_sinr; /* CSI signal-to-noise and interference ratio.
201 * Reference: 3GPP TS 138.215 section 5.1.*, 3GPP TS 38.133 section 10.1.16.1.
202 * Range [-23, 40], INT_MAX means invalid/unreported. */
203
205 : gsm_rssi(INT_MAX),
206 gsm_ber(INT_MAX),
207 cdma_dbm(INT_MAX),
208 cdma_ecio(INT_MAX),
209 evdo_dbm(INT_MAX),
210 evdo_ecio(INT_MAX),
211 evdo_snr(INT_MAX),
212 lte_rssi(INT_MAX),
213 lte_rsrp(INT_MAX),
214 lte_rsrq(INT_MAX),
215 lte_rssnr(INT_MAX),
216 lte_cqi(INT_MAX),
217 lte_ta(INT_MAX),
218 tdscdma_rscp(INT_MAX),
219 wcdma_rssi(INT_MAX),
220 wcdma_ber(INT_MAX),
221 nr_ss_rsrp(INT_MAX),
222 nr_ss_rsrq(INT_MAX),
223 nr_ss_sinr(INT_MAX),
224 nr_csi_rsrp(INT_MAX),
225 nr_csi_rsrq(INT_MAX),
226 nr_csi_sinr(INT_MAX) {}
227 };
228
229 // There's no such thing as a percentage for signal strength in the real
230 // world, as for example for battery usage, this percent value is used to pick
231 // a value within the corresponding signal strength values range for emulation
232 // purposes only.
234
235 static int GetValueInRange(const std::pair<int, int>& range, int percent);
236 static std::string BuildCSQCommandResponse(
237 const SignalStrength& signal_strength);
238 SignalStrength GetCurrentSignalStrength();
239
240 /* Data / voice Registration State */
246 };
247
263 };
264
269
273 };
274
277
281
283 int getModemTechFromPrefer(int preferred_mask);
285
286 std::atomic<bool> first_signal_strength_request_; // For time update
287 std::atomic<time_t> android_last_signal_time_;
288
290 public:
292 void Start();
293
294 private:
296
298 std::atomic_flag loop_started_;
299 };
300
302
303 void HandleIdentifierDisclosure(const std::string& command);
304 void HandleSecurityAlgorithmUpdate(const std::string& command);
305};
306
307} // namespace cuttlefish
Definition: channel_monitor.h:35
Definition: client.h:47
Definition: data_service.h:22
Definition: misc_service.h:24
Definition: modem_service.h:63
int32_t service_id_
Definition: modem_service.h:114
KeepSignalStrengthChangingLoop(NetworkService &network_service)
Definition: network_service.cpp:1283
NetworkService & network_service_
Definition: network_service.h:297
std::atomic_flag loop_started_
Definition: network_service.h:298
void UpdateSignalStrengthCallback()
Definition: network_service.cpp:1296
Definition: network_service.h:30
void InitializeNetworkOperator()
Definition: network_service.cpp:152
NetworkService(const NetworkService &)=delete
NetworkService & operator=(const NetworkService &)=delete
bool isRadioOff() const
Definition: network_service.h:76
void InitializeServiceState()
Definition: network_service.cpp:126
RadioState
Definition: network_service.h:93
@ RADIO_STATE_OFF
Definition: network_service.h:94
@ RADIO_STATE_ON
Definition: network_service.h:95
NetworkService(int32_t service_id_, ChannelMonitor *channel_monitor, ThreadLooper *thread_looper)
Definition: network_service.cpp:35
bool WakeupFromSleep()
Definition: network_service.cpp:333
void HandleQueryNetworkSelectionMode(const Client &client)
Definition: network_service.cpp:514
void HandleRadioPowerReq(const Client &client)
Definition: network_service.cpp:298
std::vector< NetworkOperator > operator_list_
Definition: network_service.h:133
void HandleSecurityAlgorithmUpdate(const std::string &command)
Definition: network_service.cpp:1270
MiscService * misc_service_
Definition: network_service.h:89
static int GetValueInRange(const std::pair< int, int > &range, int percent)
Definition: network_service.cpp:1129
void HandleRequestOperator(const Client &client)
Definition: network_service.cpp:539
ModemTechnology current_network_mode_
Definition: network_service.h:278
void OnDataRegisterStateChanged()
Definition: network_service.cpp:1091
std::string current_operator_numeric_
Definition: network_service.h:134
void HandleIdentifierDisclosure(const std::string &command)
Definition: network_service.cpp:1265
void UpdateRegisterState(RegistrationState state)
Definition: network_service.cpp:1002
void HandleNetworkRegistration(cuttlefish::SharedFD client, std::string &command)
int getModemTechFromPrefer(int preferred_mask)
Definition: network_service.cpp:986
OperatorSelectionMode oper_selection_mode_
Definition: network_service.h:135
void InitializeSimOperator()
Definition: network_service.cpp:176
RegistrationState GetVoiceRegistrationState() const
Definition: network_service.cpp:1279
OperatorSelectionMode
Definition: network_service.h:125
@ OPER_SELECTION_MANUAL_AUTOMATIC
Definition: network_service.h:130
@ OPER_SELECTION_SET_FORMAT
Definition: network_service.h:129
@ OPER_SELECTION_AUTOMATIC
Definition: network_service.h:126
@ OPER_SELECTION_MANUAL
Definition: network_service.h:127
@ OPER_SELECTION_DEREGISTRATION
Definition: network_service.h:128
void HandleReceiveRemoteVoiceDataReg(const Client &client, std::string &command)
Definition: network_service.cpp:1204
ModemTechnology getTechFromNetworkType(NetworkRegistrationStatus::AccessTechnoloy act)
Definition: network_service.cpp:753
void SetupDependency(MiscService *misc, SimService *sim, DataService *data)
Definition: network_service.cpp:243
void OnSignalStrengthChanged()
Definition: network_service.cpp:1275
NetworkRegistrationStatus data_registration_status_
Definition: network_service.h:276
void HandleSetPreferredNetworkType(const Client &client, std::string &command)
Definition: network_service.cpp:1028
DataService * data_service_
Definition: network_service.h:91
RadioState radio_state_
Definition: network_service.h:97
void AdjustSignalStrengthValue(int &value, const std::pair< int, int > &range)
void HandleVoiceNetworkRegistration(const Client &client, std::string &command)
Definition: network_service.cpp:826
void HandleSetNetworkSelectionMode(const Client &client, std::string &command)
Definition: network_service.cpp:592
SimService * sim_service_
Definition: network_service.h:90
std::atomic< time_t > android_last_signal_time_
Definition: network_service.h:287
int preferred_network_mode_
Definition: network_service.h:279
KeepSignalStrengthChangingLoop keep_signal_strength_changing_loop_
Definition: network_service.h:301
void OnSimStatusChanged(SimService::SimStatus sim_status)
Definition: network_service.cpp:251
void HandleQueryAvailableNetwork(const Client &client)
Definition: network_service.cpp:573
void HandleGetPreferredNetworkType(const Client &client)
Definition: network_service.cpp:953
std::atomic< bool > first_signal_strength_request_
Definition: network_service.h:286
void HandleReceiveRemoteSignal(const Client &client, std::string &command)
Definition: network_service.cpp:1248
int signal_strength_percent_
Definition: network_service.h:233
std::vector< CommandHandler > InitializeCommandHandlers()
Definition: network_service.cpp:44
void HandleSignalStrength(const Client &client)
Definition: network_service.cpp:429
void HandleReceiveRemoteCTEC(const Client &client, std::string &command)
Definition: network_service.cpp:1220
NetworkRegistrationStatus voice_registration_status_
Definition: network_service.h:275
NetworkRegistrationStatus::AccessTechnoloy getNetworkTypeFromTech(ModemTechnology modemTech)
Definition: network_service.cpp:738
RegistrationState
Definition: network_service.h:65
@ NET_REGISTRATION_ROAMING
Definition: network_service.h:71
@ NET_REGISTRATION_SEARCHING
Definition: network_service.h:68
@ NET_REGISTRATION_HOME
Definition: network_service.h:67
@ NET_REGISTRATION_EMERGENCY
Definition: network_service.h:72
@ NET_REGISTRATION_UNREGISTERED
Definition: network_service.h:66
@ NET_REGISTRATION_DENIED
Definition: network_service.h:69
@ NET_REGISTRATION_UNKNOWN
Definition: network_service.h:70
void HandleQuerySupportedTechs(const Client &client)
Definition: network_service.cpp:965
int modem_radio_capability_
Definition: network_service.h:280
static std::string BuildCSQCommandResponse(const SignalStrength &signal_strength)
Definition: network_service.cpp:1135
void HandleDataNetworkRegistration(const Client &client, std::string &command)
Definition: network_service.cpp:897
SignalStrength GetCurrentSignalStrength()
Definition: network_service.cpp:1166
bool IsHasNetwork()
Definition: network_service.cpp:448
void HandleRadioPower(const Client &client, std::string &command)
Definition: network_service.cpp:309
void OnVoiceRegisterStateChanged()
Definition: network_service.cpp:1068
Definition: shared_fd.h:129
Definition: sim_service.h:28
SimStatus
Definition: sim_service.h:70
Definition: thread_looper.h:51
char data[Size]
Definition: incremental_server.cpp:1
Definition: alloc_utils.cpp:23
ModemTechnology
Definition: modem_technology.h:20
Definition: network_service.h:100
std::string short_name
Definition: network_service.h:110
NetworkOperator(const std::string &number, const std::string &ln, const std::string &sn, OperatorState state)
Definition: network_service.h:115
std::string numeric
Definition: network_service.h:108
OperatorState operator_state
Definition: network_service.h:111
std::string long_name
Definition: network_service.h:109
OperatorState
Definition: network_service.h:101
@ OPER_STATE_FORBIDDEN
Definition: network_service.h:105
@ OPER_STATE_AVAILABLE
Definition: network_service.h:103
@ OPER_STATE_UNKNOWN
Definition: network_service.h:102
@ OPER_STATE_CURRENT
Definition: network_service.h:104
NetworkOperator()
Definition: network_service.h:113
NetworkRegistrationStatus()
Definition: network_service.h:265
RegistrationState registration_state
Definition: network_service.h:271
AccessTechnoloy network_type
Definition: network_service.h:272
AccessTechnoloy
Definition: network_service.h:248
@ ACESS_TECH_E_UTRA_NR
Definition: network_service.h:262
@ ACESS_TECH_E_UTRA
Definition: network_service.h:259
@ ACESS_TECH_HSPA
Definition: network_service.h:255
@ ACESS_TECH_EUTRAN
Definition: network_service.h:256
@ ACESS_TECH_GSM
Definition: network_service.h:249
@ ACESS_TECH_NR
Definition: network_service.h:260
@ ACESS_TECH_NG_RAN
Definition: network_service.h:261
@ ACESS_TECH_E_UTRAN
Definition: network_service.h:258
@ ACESS_TECH_EGPRS
Definition: network_service.h:252
@ ACESS_TECH_HSUPA
Definition: network_service.h:254
@ ACESS_TECH_UTRAN
Definition: network_service.h:251
@ ACESS_TECH_EC_GSM_IoT
Definition: network_service.h:257
@ ACESS_TECH_GSM_COMPACT
Definition: network_service.h:250
@ ACESS_TECH_HSDPA
Definition: network_service.h:253
RegistrationUnsolMode
Definition: network_service.h:242
@ REGISTRATION_UNSOL_DISABLED
Definition: network_service.h:243
@ REGISTRATION_UNSOL_ENABLED_FULL
Definition: network_service.h:245
@ REGISTRATION_UNSOL_ENABLED
Definition: network_service.h:244
RegistrationUnsolMode unsol_mode
Definition: network_service.h:270
Definition: network_service.h:138
int gsm_rssi
Definition: network_service.h:139
int32_t nr_ss_rsrp
Definition: network_service.h:185
int32_t nr_ss_rsrq
Definition: network_service.h:188
int lte_rsrp
Definition: network_service.h:156
int32_t nr_csi_sinr
Definition: network_service.h:200
SignalStrength()
Definition: network_service.h:204
int lte_ta
Definition: network_service.h:172
int evdo_ecio
Definition: network_service.h:152
int lte_rssi
Definition: network_service.h:155
int cdma_dbm
Definition: network_service.h:142
int evdo_snr
Definition: network_service.h:153
int cdma_ecio
Definition: network_service.h:146
int evdo_dbm
Definition: network_service.h:151
int32_t nr_csi_rsrq
Definition: network_service.h:197
int lte_cqi
Definition: network_service.h:168
int32_t nr_ss_sinr
Definition: network_service.h:191
int lte_rssnr
Definition: network_service.h:164
int wcdma_ber
Definition: network_service.h:183
int lte_rsrq
Definition: network_service.h:160
int wcdma_rssi
Definition: network_service.h:182
int32_t nr_csi_rsrp
Definition: network_service.h:194
int gsm_ber
Definition: network_service.h:140
int tdscdma_rscp
Definition: network_service.h:178