blob: c92c99e1969828b158ddaeabe1820cd754266f77 [file] [log] [blame]
Jason Glasgow82f9ab32012-04-04 14:27:19 -04001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Jason Glasgow14521872012-05-07 19:12:15 -04005#ifndef SHILL_CELLULAR_CAPABILITY_UNIVERSAL_H_
6#define SHILL_CELLULAR_CAPABILITY_UNIVERSAL_H_
Jason Glasgow82f9ab32012-04-04 14:27:19 -04007
8#include <deque>
Jason Glasgowaf583282012-04-18 15:18:22 -04009#include <map>
Jason Glasgow82f9ab32012-04-04 14:27:19 -040010#include <string>
11#include <vector>
12
13#include <base/memory/scoped_ptr.h>
14#include <base/memory/weak_ptr.h>
15#include <gtest/gtest_prod.h> // for FRIEND_TEST
Ben Chan5c853ef2012-10-05 00:05:37 -070016#include <ModemManager/ModemManager.h>
Jason Glasgow82f9ab32012-04-04 14:27:19 -040017
18#include "shill/accessor_interface.h"
19#include "shill/cellular.h"
20#include "shill/cellular_capability.h"
21#include "shill/mm1_modem_modem3gpp_proxy_interface.h"
22#include "shill/mm1_modem_modemcdma_proxy_interface.h"
23#include "shill/mm1_modem_proxy_interface.h"
24#include "shill/mm1_modem_simple_proxy_interface.h"
25#include "shill/mm1_sim_proxy_interface.h"
26
27
28struct mobile_provider;
29
30namespace shill {
31
32// CellularCapabilityUniversal handles modems using the
33// org.chromium.ModemManager1 DBUS interface. This class is used for
34// all types of modems, i.e. CDMA, GSM, and LTE modems.
35class CellularCapabilityUniversal : public CellularCapability {
36 public:
37 typedef std::vector<DBusPropertiesMap> ScanResults;
38 typedef DBusPropertiesMap ScanResult;
Jason Glasgowaf583282012-04-18 15:18:22 -040039 typedef std::map< uint32_t, uint32_t > LockRetryData;
Jason Glasgow82f9ab32012-04-04 14:27:19 -040040
Jason Glasgow14521872012-05-07 19:12:15 -040041 // Constants used in connect method call. Make available to test matchers.
42 // TODO(jglasgow): Generate from modem manager into
43 // ModemManager-names.h.
44 // See http://crosbug.com/30551.
45 static const char kConnectPin[];
46 static const char kConnectOperatorId[];
47 static const char kConnectBands[];
48 static const char kConnectAllowedModes[];
49 static const char kConnectPreferredMode[];
50 static const char kConnectApn[];
51 static const char kConnectIPType[];
52 static const char kConnectUser[];
53 static const char kConnectPassword[];
54 static const char kConnectNumber[];
55 static const char kConnectAllowRoaming[];
56 static const char kConnectRMProtocol[];
57
Jason Glasgow82f9ab32012-04-04 14:27:19 -040058 CellularCapabilityUniversal(Cellular *cellular, ProxyFactory *proxy_factory);
59
60 // Inherited from CellularCapability.
Gary Moraine285a842012-08-15 08:23:57 -070061 // Checks the modem state. If the state is kModemStateDisabled, then the
62 // modem is enabled. Otherwise, the enable command is buffered until the
63 // modem becomes disabled. ModemManager rejects the enable command if the
64 // modem is not disabled, for exmaple, if it is initializing insted.
Jason Glasgow82f9ab32012-04-04 14:27:19 -040065 virtual void StartModem(Error *error, const ResultCallback &callback);
66 virtual void StopModem(Error *error, const ResultCallback &callback);
67 virtual void Connect(const DBusPropertiesMap &properties, Error *error,
68 const ResultCallback &callback);
69 virtual void Disconnect(Error *error, const ResultCallback &callback);
70 virtual void Activate(const std::string &carrier,
71 Error *error, const ResultCallback &callback);
72
73 virtual void OnServiceCreated();
Jason Glasgow82f9ab32012-04-04 14:27:19 -040074 virtual void SetupConnectProperties(DBusPropertiesMap *properties);
Jason Glasgowef965562012-04-10 16:12:35 -040075 virtual void GetProperties();
Jason Glasgow82f9ab32012-04-04 14:27:19 -040076 virtual void Register(const ResultCallback &callback);
77
78 virtual void RegisterOnNetwork(const std::string &network_id,
79 Error *error,
80 const ResultCallback &callback);
81 virtual bool IsRegistered();
Eric Shienbrood7fce52c2012-04-13 19:11:02 -040082 virtual void SetUnregistered(bool searching);
Jason Glasgow82f9ab32012-04-04 14:27:19 -040083 virtual std::string CreateFriendlyServiceName();
84 virtual void RequirePIN(const std::string &pin, bool require,
85 Error *error, const ResultCallback &callback);
86 virtual void EnterPIN(const std::string &pin,
87 Error *error, const ResultCallback &callback);
88 virtual void UnblockPIN(const std::string &unblock_code,
89 const std::string &pin,
90 Error *error, const ResultCallback &callback);
91 virtual void ChangePIN(const std::string &old_pin,
92 const std::string &new_pin,
93 Error *error, const ResultCallback &callback);
94
95 virtual void Scan(Error *error, const ResultCallback &callback);
96 virtual std::string GetNetworkTechnologyString() const;
97 virtual std::string GetRoamingStateString() const;
Jason Glasgow82f9ab32012-04-04 14:27:19 -040098 virtual void GetSignalQuality();
Jason Glasgow9f09aef2012-05-08 16:26:55 -040099 virtual std::string GetTypeString() const;
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400100 virtual void OnDBusPropertiesChanged(
101 const std::string &interface,
102 const DBusPropertiesMap &changed_properties,
103 const std::vector<std::string> &invalidated_properties);
Jason Glasgowaf583282012-04-18 15:18:22 -0400104 virtual bool AllowRoaming();
Jason Glasgow14521872012-05-07 19:12:15 -0400105
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400106 protected:
107 virtual void InitProxies();
108 virtual void ReleaseProxies();
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400109
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400110 private:
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400111 // Constants used in scan results. Make available to unit tests.
112 // TODO(jglasgow): Generate from modem manager into ModemManager-names.h.
113 // See http://crosbug.com/30551.
114 static const char kStatusProperty[];
115 static const char kOperatorLongProperty[];
116 static const char kOperatorShortProperty[];
117 static const char kOperatorCodeProperty[];
118 static const char kOperatorAccessTechnologyProperty[];
119
Jason Glasgow14521872012-05-07 19:12:15 -0400120 // Modem Model ID strings. From modem firmware via modemmanager.
121 static const char kE362ModelId[];
122
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400123 friend class CellularTest;
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400124 friend class CellularCapabilityTest;
Thieu Le3d275392012-07-20 15:32:58 -0700125 friend class CellularCapabilityUniversalTest;
Darin Petkovf508c822012-09-21 13:43:17 +0200126 FRIEND_TEST(CellularCapabilityUniversalTest, AllowRoaming);
Thieu Le3d275392012-07-20 15:32:58 -0700127 FRIEND_TEST(CellularCapabilityUniversalTest, Connect);
128 FRIEND_TEST(CellularCapabilityUniversalTest, ConnectApns);
Darin Petkova4ca3c32012-08-17 16:05:24 +0200129 FRIEND_TEST(CellularCapabilityUniversalTest, CreateFriendlyServiceName);
Thieu Le3d275392012-07-20 15:32:58 -0700130 FRIEND_TEST(CellularCapabilityUniversalTest, DisconnectNoProxy);
131 FRIEND_TEST(CellularCapabilityUniversalTest, GetTypeString);
132 FRIEND_TEST(CellularCapabilityUniversalTest, PropertiesChanged);
133 FRIEND_TEST(CellularCapabilityUniversalTest, Scan);
134 FRIEND_TEST(CellularCapabilityUniversalTest, ScanFailure);
Darin Petkovb4fccd22012-08-10 11:59:26 +0200135 FRIEND_TEST(CellularCapabilityUniversalTest, SetHomeProvider);
Ben Chanbd3aee82012-10-16 23:52:04 -0700136 FRIEND_TEST(CellularCapabilityUniversalTest, SimPathChanged);
Thieu Le3d275392012-07-20 15:32:58 -0700137 FRIEND_TEST(CellularCapabilityUniversalTest, SimPropertiesChanged);
Jason Glasgowaf583282012-04-18 15:18:22 -0400138 FRIEND_TEST(CellularCapabilityUniversalTest, StartModem);
Jason Glasgow02401cc2012-05-16 10:35:37 -0400139 FRIEND_TEST(CellularCapabilityUniversalTest, StopModem);
140 FRIEND_TEST(CellularCapabilityUniversalTest, StopModemConnected);
Darin Petkova4ca3c32012-08-17 16:05:24 +0200141 FRIEND_TEST(CellularCapabilityUniversalTest, UpdateOperatorInfo);
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400142
Jason Glasgowef965562012-04-10 16:12:35 -0400143 // Methods used in starting a modem
Gary Moraine285a842012-08-15 08:23:57 -0700144 void EnableModem(Error *error, const ResultCallback &callback);
Jason Glasgowef965562012-04-10 16:12:35 -0400145 void Start_EnableModemCompleted(const ResultCallback &callback,
146 const Error &error);
Jason Glasgowef965562012-04-10 16:12:35 -0400147
148 // Methods used in stopping a modem
149 void Stop_DisconnectCompleted(const ResultCallback &callback,
150 const Error &error);
151 void Stop_Disable(const ResultCallback &callback);
152 void Stop_DisableCompleted(const ResultCallback &callback,
153 const Error &error);
154
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400155 // Sets the upper level information about the home cellular provider from the
156 // modem's IMSI and SPN.
157 void SetHomeProvider();
158
159 // Updates the Universal operator name and country based on a newly
160 // obtained network id.
161 void UpdateOperatorInfo();
162
163 // Updates the serving operator on the active service.
164 void UpdateServingOperator();
165
166 // Initializes the |apn_list_| property based on the current |home_provider_|.
167 void InitAPNList();
168
169 Stringmap ParseScanResult(const ScanResult &result);
170
171 KeyValueStore SimLockStatusToProperty(Error *error);
172
173 void SetupApnTryList();
174 void FillConnectPropertyMap(DBusPropertiesMap *properties);
175
176 void HelpRegisterDerivedKeyValueStore(
177 const std::string &name,
178 KeyValueStore(CellularCapabilityUniversal::*get)(Error *error),
179 void(CellularCapabilityUniversal::*set)(
180 const KeyValueStore &value, Error *error));
181
Jason Glasgow14521872012-05-07 19:12:15 -0400182 // Returns true if a connect error should be retried. This function
183 // abstracts modem specific behavior for modems which do a lousy job
184 // of returning specific errors on connect failures.
185 bool RetriableConnectError(const Error &error) const;
186
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400187 // Signal callbacks
Nathan Williams3022be52012-04-19 17:40:49 -0400188 void OnNetworkModeSignal(uint32 mode);
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400189 void OnModemStateChangedSignal(int32 old_state,
190 int32 new_state,
191 uint32 reason);
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400192
193 // Property Change notification handlers
Nathan Williams3022be52012-04-19 17:40:49 -0400194 void OnModemPropertiesChanged(
Jason Glasgow4c0724a2012-04-17 15:47:40 -0400195 const DBusPropertiesMap &properties,
196 const std::vector<std::string> &invalidated_properties);
197
Nathan Williams3022be52012-04-19 17:40:49 -0400198 void OnSignalQualityChanged(uint32 quality);
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400199
Jason Glasgowef965562012-04-10 16:12:35 -0400200 // Updates the sim_path_ variable and creates a new proxy to the
201 // DBUS ModemManager1.Sim interface
Nathan Williams3022be52012-04-19 17:40:49 -0400202 void OnSimPathChanged(const std::string &sim_path);
Jason Glasgowaf583282012-04-18 15:18:22 -0400203 void OnModemCapabilitesChanged(uint32 capabilities);
204 void OnModemCurrentCapabilitiesChanged(uint32 current_capabilities);
205 void OnMdnChanged(const std::string &mdn);
206 void OnModemManufacturerChanged(const std::string &manufacturer);
207 void OnModemModelChanged(const std::string &model);
208 void OnModemRevisionChanged(const std::string &revision);
209 void OnModemStateChanged(Cellular::ModemState state);
210 void OnAccessTechnologiesChanged(uint32 access_technologies);
211 void OnSupportedModesChanged(uint32 supported_modes);
212 void OnAllowedModesChanged(uint32 allowed_modes);
213 void OnPreferredModeChanged(MMModemMode preferred_mode);
214 void OnLockRetriesChanged(MMModemLock unlock_required,
215 const LockRetryData &lock_retries);
216 void OnSimLockStatusChanged();
217
218 // 3GPP property change handlers
219 virtual void OnModem3GPPPropertiesChanged(
220 const DBusPropertiesMap &properties,
221 const std::vector<std::string> &invalidated_properties);
222 void OnImeiChanged(const std::string &imei);
223 void On3GPPRegistrationChanged(MMModem3gppRegistrationState state,
224 const std::string &operator_code,
225 const std::string &operator_name);
226 void OnFacilityLocksChanged(uint32 locks);
227
228 // SIM property change handlers
229 void OnSimPropertiesChanged(
230 const DBusPropertiesMap &props,
231 const std::vector<std::string> &invalidated_properties);
232 void OnImsiChanged(const std::string &imsi);
233 void OnSimIdentifierChanged(const std::string &id);
234 void OnOperatorIdChanged(const std::string &operator_id);
235 void OnOperatorNameChanged(const std::string &operator_name);
Jason Glasgowef965562012-04-10 16:12:35 -0400236
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400237 // Method callbacks
Nathan Williams3022be52012-04-19 17:40:49 -0400238 void OnRegisterReply(const ResultCallback &callback,
239 const Error &error);
240 void OnScanReply(const ResultCallback &callback,
241 const ScanResults &results,
242 const Error &error);
Nathan Williamsb54974f2012-04-19 11:16:30 -0400243 void OnConnectReply(const ResultCallback &callback,
244 const DBus::Path &bearer,
245 const Error &error);
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400246
247 scoped_ptr<mm1::ModemModem3gppProxyInterface> modem_3gpp_proxy_;
248 scoped_ptr<mm1::ModemModemCdmaProxyInterface> modem_cdma_proxy_;
249 scoped_ptr<mm1::ModemProxyInterface> modem_proxy_;
250 scoped_ptr<mm1::ModemSimpleProxyInterface> modem_simple_proxy_;
251 scoped_ptr<mm1::SimProxyInterface> sim_proxy_;
252
253 base::WeakPtrFactory<CellularCapabilityUniversal> weak_ptr_factory_;
254
255 MMModem3gppRegistrationState registration_state_;
256 MMModemCdmaRegistrationState cdma_registration_state_;
Jason Glasgowaf583282012-04-18 15:18:22 -0400257
258 // Bits based on MMModemCapabilities
Jason Glasgow14521872012-05-07 19:12:15 -0400259 uint32 capabilities_; // technologies supported, may require reload
260 uint32 current_capabilities_; // technologies supportsed without a reload
261 uint32 access_technologies_; // Bits based on MMModemAccessTechnology
262 uint32 supported_modes_; // Bits based on MMModemMode
263 uint32 allowed_modes_; // Bits based on MMModemMode
264 MMModemMode preferred_mode_; // A single MMModemMode bit
Jason Glasgowaf583282012-04-18 15:18:22 -0400265
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400266 Cellular::Operator serving_operator_;
267 std::string spn_;
Jason Glasgowaf583282012-04-18 15:18:22 -0400268 std::string sim_identifier_;
269 std::string operator_id_;
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400270 mobile_provider *home_provider_;
Darin Petkovf508c822012-09-21 13:43:17 +0200271 bool provider_requires_roaming_;
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400272 std::string desired_network_;
273
274 // Properties.
275 std::string carrier_;
276 std::string esn_;
277 std::string firmware_revision_;
278 std::string hardware_revision_;
279 std::string imei_;
280 std::string imsi_;
281 std::string manufacturer_;
282 std::string mdn_;
283 std::string meid_;
284 std::string min_;
285 std::string model_id_;
286 std::string selected_network_;
287 Stringmaps found_networks_;
288 std::deque<Stringmap> apn_try_list_;
289 bool scanning_supported_;
290 bool scanning_;
291 uint16 scan_interval_;
292 SimLockStatus sim_lock_status_;
293 Stringmaps apn_list_;
Jason Glasgowef965562012-04-10 16:12:35 -0400294 std::string sim_path_;
Ben Chanbd3aee82012-10-16 23:52:04 -0700295 bool sim_present_;
Nathan Williamsb54974f2012-04-19 11:16:30 -0400296 DBus::Path bearer_path_;
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400297
Gary Moraine285a842012-08-15 08:23:57 -0700298 // If the modem is not in a state to be enabled when StartModem is called,
299 // enabling is deferred using this callback.
300 base::Closure deferred_enable_modem_callback_;
301
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400302 static unsigned int friendly_service_name_id_;
303
304 DISALLOW_COPY_AND_ASSIGN(CellularCapabilityUniversal);
305};
306
307} // namespace shill
308
Jason Glasgow14521872012-05-07 19:12:15 -0400309#endif // SHILL_CELLULAR_CAPABILITY_UNIVERSAL_H_