blob: f3e9d37d88cc02d5bc4f3a53810a8c24034df74c [file] [log] [blame]
Darin Petkovc64fe5e2012-01-11 12:46:13 +01001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Chris Masone3bd3c8c2011-06-13 08:20:26 -07002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "shill/cellular.h"
6
Darin Petkov0828f5f2011-08-11 10:18:52 -07007#include <netinet/in.h>
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -07008#include <linux/if.h> // Needs definitions from netinet/in.h
Darin Petkov0828f5f2011-08-11 10:18:52 -07009
Chris Masone3bd3c8c2011-06-13 08:20:26 -070010#include <string>
Chris Masone889666b2011-07-03 12:58:50 -070011#include <utility>
12#include <vector>
Chris Masone3bd3c8c2011-06-13 08:20:26 -070013
Eric Shienbrood3e20a232012-02-16 11:35:56 -050014#include <base/bind.h>
Chris Masone3bd3c8c2011-06-13 08:20:26 -070015#include <base/logging.h>
Darin Petkove9d12e02011-07-27 15:09:37 -070016#include <base/stringprintf.h>
Chris Masoneb925cc82011-06-22 15:39:57 -070017#include <chromeos/dbus/service_constants.h>
Darin Petkovbec79a22011-08-01 14:47:17 -070018#include <mm/mm-modem.h>
Darin Petkov137884a2011-10-26 18:52:47 +020019#include <mobile_provider.h>
Chris Masone3bd3c8c2011-06-13 08:20:26 -070020
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050021#include "shill/adaptor_interfaces.h"
Darin Petkovdaf43862011-10-27 11:37:28 +020022#include "shill/cellular_capability_cdma.h"
23#include "shill/cellular_capability_gsm.h"
Chris Masone3bd3c8c2011-06-13 08:20:26 -070024#include "shill/cellular_service.h"
25#include "shill/control_interface.h"
26#include "shill/device.h"
27#include "shill/device_info.h"
Darin Petkov4d6d9412011-08-24 13:19:54 -070028#include "shill/error.h"
Paul Stewart26b327e2011-10-19 11:38:09 -070029#include "shill/event_dispatcher.h"
Chris Masone3bd3c8c2011-06-13 08:20:26 -070030#include "shill/manager.h"
Chris Masone7aa5f902011-07-11 11:13:35 -070031#include "shill/profile.h"
Chris Masone889666b2011-07-03 12:58:50 -070032#include "shill/property_accessor.h"
Darin Petkove9d12e02011-07-27 15:09:37 -070033#include "shill/proxy_factory.h"
Darin Petkov0828f5f2011-08-11 10:18:52 -070034#include "shill/rtnl_handler.h"
Gaurav Shah435de2c2011-11-17 19:01:07 -080035#include "shill/technology.h"
Chris Masone3bd3c8c2011-06-13 08:20:26 -070036
Eric Shienbrood3e20a232012-02-16 11:35:56 -050037using base::Bind;
Eric Shienbrood9a245532012-03-07 14:20:39 -050038using base::Closure;
Darin Petkovc0865312011-09-16 15:31:20 -070039using std::map;
Chris Masone3bd3c8c2011-06-13 08:20:26 -070040using std::string;
Chris Masone889666b2011-07-03 12:58:50 -070041using std::vector;
Chris Masone3bd3c8c2011-06-13 08:20:26 -070042
43namespace shill {
44
Darin Petkov3335b372011-08-22 11:05:32 -070045Cellular::Operator::Operator() {
46 SetName("");
47 SetCode("");
48 SetCountry("");
49}
50
51Cellular::Operator::~Operator() {}
52
53void Cellular::Operator::CopyFrom(const Operator &oper) {
54 dict_ = oper.dict_;
55}
56
57const string &Cellular::Operator::GetName() const {
58 return dict_.find(flimflam::kOperatorNameKey)->second;
59}
60
61void Cellular::Operator::SetName(const string &name) {
62 dict_[flimflam::kOperatorNameKey] = name;
63}
64
65const string &Cellular::Operator::GetCode() const {
66 return dict_.find(flimflam::kOperatorCodeKey)->second;
67}
68
69void Cellular::Operator::SetCode(const string &code) {
70 dict_[flimflam::kOperatorCodeKey] = code;
71}
72
73const string &Cellular::Operator::GetCountry() const {
74 return dict_.find(flimflam::kOperatorCountryKey)->second;
75}
76
77void Cellular::Operator::SetCountry(const string &country) {
78 dict_[flimflam::kOperatorCountryKey] = country;
79}
80
81const Stringmap &Cellular::Operator::ToDict() const {
82 return dict_;
83}
84
Chris Masone3bd3c8c2011-06-13 08:20:26 -070085Cellular::Cellular(ControlInterface *control_interface,
86 EventDispatcher *dispatcher,
Thieu Le3426c8f2012-01-11 17:35:11 -080087 Metrics *metrics,
Chris Masone3bd3c8c2011-06-13 08:20:26 -070088 Manager *manager,
Darin Petkove9d12e02011-07-27 15:09:37 -070089 const string &link_name,
Darin Petkov3335b372011-08-22 11:05:32 -070090 const string &address,
Darin Petkove9d12e02011-07-27 15:09:37 -070091 int interface_index,
92 Type type,
93 const string &owner,
Darin Petkov137884a2011-10-26 18:52:47 +020094 const string &path,
95 mobile_provider_db *provider_db)
Chris Masone3bd3c8c2011-06-13 08:20:26 -070096 : Device(control_interface,
97 dispatcher,
Thieu Le3426c8f2012-01-11 17:35:11 -080098 metrics,
Chris Masone3bd3c8c2011-06-13 08:20:26 -070099 manager,
Darin Petkove9d12e02011-07-27 15:09:37 -0700100 link_name,
Chris Masone626719f2011-08-18 16:58:48 -0700101 address,
Gaurav Shah435de2c2011-11-17 19:01:07 -0800102 interface_index,
103 Technology::kCellular),
Darin Petkove9d12e02011-07-27 15:09:37 -0700104 state_(kStateDisabled),
Darin Petkovbac96002011-08-09 13:22:00 -0700105 modem_state_(kModemStateUnknown),
Darin Petkove9d12e02011-07-27 15:09:37 -0700106 dbus_owner_(owner),
107 dbus_path_(path),
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500108 provider_db_(provider_db) {
mukesh agrawalde29fa82011-09-16 16:16:36 -0700109 PropertyStore *store = this->mutable_store();
Paul Stewartac4ac002011-08-26 12:04:26 -0700110 store->RegisterConstString(flimflam::kDBusConnectionProperty, &dbus_owner_);
111 store->RegisterConstString(flimflam::kDBusObjectProperty, &dbus_path_);
Paul Stewartac4ac002011-08-26 12:04:26 -0700112 store->RegisterConstStringmap(flimflam::kHomeProviderProperty,
Darin Petkov3335b372011-08-22 11:05:32 -0700113 &home_provider_.ToDict());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500114 // For now, only a single capability is supported.
115 InitCapability(type, ProxyFactory::GetInstance());
Chris Masoneb925cc82011-06-22 15:39:57 -0700116
Darin Petkov5f316f62011-11-18 12:10:26 +0100117 VLOG(2) << "Cellular device " << this->link_name() << " initialized.";
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700118}
119
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500120Cellular::~Cellular() {
121}
Darin Petkove9d12e02011-07-27 15:09:37 -0700122
Darin Petkovcc044422011-08-17 13:30:06 -0700123// static
124string Cellular::GetStateString(State state) {
125 switch (state) {
Darin Petkove9d12e02011-07-27 15:09:37 -0700126 case kStateDisabled: return "CellularStateDisabled";
127 case kStateEnabled: return "CellularStateEnabled";
128 case kStateRegistered: return "CellularStateRegistered";
129 case kStateConnected: return "CellularStateConnected";
Darin Petkov0828f5f2011-08-11 10:18:52 -0700130 case kStateLinked: return "CellularStateLinked";
131 default: NOTREACHED();
Darin Petkove9d12e02011-07-27 15:09:37 -0700132 }
Darin Petkovcc044422011-08-17 13:30:06 -0700133 return StringPrintf("CellularStateUnknown-%d", state);
Darin Petkov0828f5f2011-08-11 10:18:52 -0700134}
135
136void Cellular::SetState(State state) {
Darin Petkovcc044422011-08-17 13:30:06 -0700137 VLOG(2) << GetStateString(state_) << " -> " << GetStateString(state);
Darin Petkov0828f5f2011-08-11 10:18:52 -0700138 state_ = state;
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700139}
140
Eric Shienbrood9a245532012-03-07 14:20:39 -0500141void Cellular::Start(Error *error,
142 const EnabledStateChangedCallback &callback) {
143 VLOG(2) << __func__ << ": " << GetStateString(state_);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500144 if (state_ != kStateDisabled) {
145 return;
146 }
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500147 if (modem_state_ == kModemStateEnabled) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500148 // Modem already enabled. Make sure shill
149 // state matches ModemManager state.
150 SetState(kStateEnabled);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500151 return;
152 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500153 capability_->StartModem(error,
154 Bind(&Cellular::OnModemStarted, this, callback));
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700155}
156
Eric Shienbrood9a245532012-03-07 14:20:39 -0500157void Cellular::Stop(Error *error,
158 const EnabledStateChangedCallback &callback) {
159 VLOG(2) << __func__ << ": " << GetStateString(state_);
160 if (service_) {
161 // TODO(ers): See whether we can/should do DestroyService() here.
162 manager()->DeregisterService(service_);
163 service_ = NULL;
164 }
165 capability_->StopModem(error,
166 Bind(&Cellular::OnModemStopped, this, callback));
167}
168
169void Cellular::OnModemStarted(const EnabledStateChangedCallback &callback,
170 const Error &error) {
171 VLOG(2) << __func__ << ": " << GetStateString(state_);
172 if (state_ == kStateDisabled)
173 SetState(kStateEnabled);
174 callback.Run(error);
175}
176
177void Cellular::OnModemStopped(const EnabledStateChangedCallback &callback,
178 const Error &error) {
179 VLOG(2) << __func__ << ": " << GetStateString(state_);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500180 if (state_ != kStateDisabled)
Eric Shienbrood9a245532012-03-07 14:20:39 -0500181 SetState(kStateDisabled);
182 callback.Run(error);
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700183}
184
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500185void Cellular::InitCapability(Type type, ProxyFactory *proxy_factory) {
Darin Petkov5f316f62011-11-18 12:10:26 +0100186 // TODO(petkov): Consider moving capability construction into a factory that's
187 // external to the Cellular class.
188 VLOG(2) << __func__ << "(" << type << ")";
189 switch (type) {
Darin Petkovdaf43862011-10-27 11:37:28 +0200190 case kTypeGSM:
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500191 capability_.reset(new CellularCapabilityGSM(this, proxy_factory));
Darin Petkovdaf43862011-10-27 11:37:28 +0200192 break;
193 case kTypeCDMA:
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500194 capability_.reset(new CellularCapabilityCDMA(this, proxy_factory));
Darin Petkovdaf43862011-10-27 11:37:28 +0200195 break;
David Rochbergfa1d31d2012-03-20 10:38:07 -0400196 case kTypeUniversal:
197 LOG(ERROR) << "Cannot InitCapability on MM1 modem";
198 break;
Darin Petkovdaf43862011-10-27 11:37:28 +0200199 default: NOTREACHED();
200 }
201}
202
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500203void Cellular::Activate(const std::string &carrier,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500204 Error *error, const ResultCallback &callback) {
205 capability_->Activate(carrier, error, callback);
Darin Petkov9ae310f2011-08-30 15:41:13 -0700206}
207
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500208void Cellular::RegisterOnNetwork(const string &network_id,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500209 Error *error,
210 const ResultCallback &callback) {
211 capability_->RegisterOnNetwork(network_id, error, callback);
Darin Petkova3d3be52011-11-14 21:34:16 +0100212}
213
Eric Shienbrood9a245532012-03-07 14:20:39 -0500214void Cellular::RequirePIN(const string &pin, bool require,
215 Error *error, const ResultCallback &callback) {
216 VLOG(2) << __func__ << "(" << require << ")";
217 capability_->RequirePIN(pin, require, error, callback);
Darin Petkove42e1012011-08-31 12:35:04 -0700218}
219
Eric Shienbrood9a245532012-03-07 14:20:39 -0500220void Cellular::EnterPIN(const string &pin,
221 Error *error, const ResultCallback &callback) {
222 VLOG(2) << __func__;
223 capability_->EnterPIN(pin, error, callback);
Darin Petkove42e1012011-08-31 12:35:04 -0700224}
225
Darin Petkovc64fe5e2012-01-11 12:46:13 +0100226void Cellular::UnblockPIN(const string &unblock_code,
227 const string &pin,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500228 Error *error, const ResultCallback &callback) {
229 VLOG(2) << __func__;
230 capability_->UnblockPIN(unblock_code, pin, error, callback);
Darin Petkove42e1012011-08-31 12:35:04 -0700231}
232
Eric Shienbrood9a245532012-03-07 14:20:39 -0500233void Cellular::ChangePIN(const string &old_pin, const string &new_pin,
234 Error *error, const ResultCallback &callback) {
235 VLOG(2) << __func__;
236 capability_->ChangePIN(old_pin, new_pin, error, callback);
Darin Petkove42e1012011-08-31 12:35:04 -0700237}
238
Eric Shienbrood9a245532012-03-07 14:20:39 -0500239void Cellular::Scan(Error *error) {
240 // TODO(ers): for now report immediate success or failure.
241 capability_->Scan(error, ResultCallback());
Darin Petkovceb68172011-07-29 14:47:48 -0700242}
243
Darin Petkovd9661952011-08-03 16:25:42 -0700244void Cellular::HandleNewRegistrationState() {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500245 VLOG(2) << __func__ << ": " << GetStateString(state_);
Darin Petkovb72cf402011-11-22 14:51:39 +0100246 if (!capability_->IsRegistered()) {
Darin Petkov2c377382012-01-11 11:40:43 +0100247 DestroyService();
Darin Petkov0828f5f2011-08-11 10:18:52 -0700248 if (state_ == kStateLinked ||
249 state_ == kStateConnected ||
250 state_ == kStateRegistered) {
251 SetState(kStateEnabled);
Darin Petkovd9661952011-08-03 16:25:42 -0700252 }
253 return;
254 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500255 // In Disabled state, defer creating a service until fully
256 // enabled. UI will ignore the appearance of a new service
257 // on a disabled device.
258 if (state_ == kStateDisabled) {
259 return;
260 }
Darin Petkovd9661952011-08-03 16:25:42 -0700261 if (state_ == kStateEnabled) {
Darin Petkov0828f5f2011-08-11 10:18:52 -0700262 SetState(kStateRegistered);
Darin Petkovd9661952011-08-03 16:25:42 -0700263 }
264 if (!service_.get()) {
Darin Petkovd9661952011-08-03 16:25:42 -0700265 CreateService();
266 }
Darin Petkov3e509242011-11-10 14:46:44 +0100267 capability_->GetSignalQuality();
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500268 if (state_ == kStateRegistered && modem_state_ == kModemStateConnected)
269 OnConnected();
Darin Petkovb72cf402011-11-22 14:51:39 +0100270 service_->SetNetworkTechnology(capability_->GetNetworkTechnologyString());
271 service_->SetRoamingState(capability_->GetRoamingStateString());
Darin Petkovd9661952011-08-03 16:25:42 -0700272}
273
Darin Petkovd9661952011-08-03 16:25:42 -0700274void Cellular::HandleNewSignalQuality(uint32 strength) {
275 VLOG(2) << "Signal strength: " << strength;
Darin Petkovd78ee7e2012-01-12 11:21:10 +0100276 if (service_) {
277 service_->SetStrength(strength);
Darin Petkovd9661952011-08-03 16:25:42 -0700278 }
279}
280
281void Cellular::CreateService() {
Darin Petkov0828f5f2011-08-11 10:18:52 -0700282 VLOG(2) << __func__;
Darin Petkovd9661952011-08-03 16:25:42 -0700283 CHECK(!service_.get());
284 service_ =
Thieu Le3426c8f2012-01-11 17:35:11 -0800285 new CellularService(control_interface(), dispatcher(), metrics(),
286 manager(), this);
Darin Petkovae0c64e2011-11-15 15:50:27 +0100287 capability_->OnServiceCreated();
Darin Petkov31332412012-01-28 01:50:02 +0100288 manager()->RegisterService(service_);
Darin Petkovf5f61e02011-07-29 11:35:40 -0700289}
290
Darin Petkov2c377382012-01-11 11:40:43 +0100291void Cellular::DestroyService() {
292 VLOG(2) << __func__;
293 DestroyIPConfig();
294 if (service_) {
295 manager()->DeregisterService(service_);
296 service_ = NULL;
297 }
298 SelectService(NULL);
299}
300
Paul Stewartfdd16072011-09-16 12:41:35 -0700301bool Cellular::TechnologyIs(const Technology::Identifier type) const {
302 return type == Technology::kCellular;
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700303}
304
Darin Petkov4d6d9412011-08-24 13:19:54 -0700305void Cellular::Connect(Error *error) {
Darin Petkovc5f56562011-08-06 16:40:05 -0700306 VLOG(2) << __func__;
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -0400307 if (state_ == kStateConnected || state_ == kStateLinked) {
Paul Stewartbe005172011-11-02 18:10:29 -0700308 Error::PopulateAndLog(error, Error::kAlreadyConnected,
309 "Already connected; connection request ignored.");
Darin Petkovc5f56562011-08-06 16:40:05 -0700310 return;
311 }
312 CHECK_EQ(kStateRegistered, state_);
Darin Petkovd2045802011-08-23 11:09:25 -0700313
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500314 if (!capability_->allow_roaming() &&
Darin Petkovd2045802011-08-23 11:09:25 -0700315 service_->roaming_state() == flimflam::kRoamingStateRoaming) {
Paul Stewartbe005172011-11-02 18:10:29 -0700316 Error::PopulateAndLog(error, Error::kNotOnHomeNetwork,
317 "Roaming disallowed; connection request ignored.");
Darin Petkovd2045802011-08-23 11:09:25 -0700318 return;
319 }
320
Darin Petkovc5f56562011-08-06 16:40:05 -0700321 DBusPropertiesMap properties;
Darin Petkovae0c64e2011-11-15 15:50:27 +0100322 capability_->SetupConnectProperties(&properties);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500323 // TODO(ers): use null callback until Connect is made fully asynchronous
324 capability_->Connect(properties, error, ResultCallback());
Darin Petkovc5f56562011-08-06 16:40:05 -0700325}
326
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500327void Cellular::OnConnected() {
Darin Petkovc5f56562011-08-06 16:40:05 -0700328 VLOG(2) << __func__;
Darin Petkov0828f5f2011-08-11 10:18:52 -0700329 SetState(kStateConnected);
Darin Petkov9c1dcef2012-02-07 15:58:26 +0100330 if (!capability_->allow_roaming() &&
331 service_->roaming_state() == flimflam::kRoamingStateRoaming) {
332 Disconnect(NULL);
333 } else {
334 EstablishLink();
335 }
Darin Petkovbac96002011-08-09 13:22:00 -0700336}
337
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -0400338void Cellular::OnConnectFailed(const Error &error) {
339 service()->SetFailure(Service::kFailureUnknown);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500340}
341
Darin Petkovfb0625e2012-01-16 13:05:56 +0100342void Cellular::Disconnect(Error *error) {
343 VLOG(2) << __func__;
Eric Shienbrood9a245532012-03-07 14:20:39 -0500344 if (state_ != kStateConnected && state_ != kStateLinked) {
Darin Petkovfb0625e2012-01-16 13:05:56 +0100345 Error::PopulateAndLog(
Eric Shienbrood9a245532012-03-07 14:20:39 -0500346 error, Error::kNotConnected, "Not connected; request ignored.");
Darin Petkovfb0625e2012-01-16 13:05:56 +0100347 return;
348 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500349 // TODO(ers): use null callback until Disconnect is made fully asynchronous
350 capability_->Disconnect(error, ResultCallback());
Darin Petkovfb0625e2012-01-16 13:05:56 +0100351}
352
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500353void Cellular::OnDisconnected() {
Darin Petkovfb0625e2012-01-16 13:05:56 +0100354 VLOG(2) << __func__;
Eric Shienbrood9a245532012-03-07 14:20:39 -0500355 if (state_ == kStateConnected || state_ == kStateLinked)
356 SetState(kStateRegistered);
357 else
358 LOG(WARNING) << "Disconnect occurred while in state "
359 << GetStateString(state_);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500360}
361
362void Cellular::OnDisconnectFailed() {
363 // TODO(ers): Signal failure.
Darin Petkovfb0625e2012-01-16 13:05:56 +0100364}
365
Darin Petkovbac96002011-08-09 13:22:00 -0700366void Cellular::EstablishLink() {
367 VLOG(2) << __func__;
Darin Petkov0828f5f2011-08-11 10:18:52 -0700368 CHECK_EQ(kStateConnected, state_);
369 unsigned int flags = 0;
Paul Stewartac4ac002011-08-26 12:04:26 -0700370 if (manager()->device_info()->GetFlags(interface_index(), &flags) &&
Darin Petkov0828f5f2011-08-11 10:18:52 -0700371 (flags & IFF_UP) != 0) {
372 LinkEvent(flags, IFF_UP);
373 return;
374 }
375 // TODO(petkov): Provide a timeout for a failed link-up request.
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700376 rtnl_handler()->SetInterfaceFlags(interface_index(), IFF_UP, IFF_UP);
Darin Petkov0828f5f2011-08-11 10:18:52 -0700377}
378
379void Cellular::LinkEvent(unsigned int flags, unsigned int change) {
380 Device::LinkEvent(flags, change);
381 if ((flags & IFF_UP) != 0 && state_ == kStateConnected) {
Paul Stewartac4ac002011-08-26 12:04:26 -0700382 LOG(INFO) << link_name() << " is up.";
Darin Petkov0828f5f2011-08-11 10:18:52 -0700383 SetState(kStateLinked);
Darin Petkov0828f5f2011-08-11 10:18:52 -0700384 // TODO(petkov): For GSM, remember the APN.
Paul Stewart2bf1d352011-12-06 15:02:55 -0800385 if (AcquireIPConfig()) {
Darin Petkov60b8c3b2011-08-25 11:03:20 -0700386 SelectService(service_);
387 SetServiceState(Service::kStateConfiguring);
388 } else {
389 LOG(ERROR) << "Unable to acquire DHCP config.";
390 }
Darin Petkov0828f5f2011-08-11 10:18:52 -0700391 } else if ((flags & IFF_UP) == 0 && state_ == kStateLinked) {
392 SetState(kStateConnected);
Darin Petkov2c377382012-01-11 11:40:43 +0100393 DestroyService();
Darin Petkov0828f5f2011-08-11 10:18:52 -0700394 }
Darin Petkovc5f56562011-08-06 16:40:05 -0700395}
396
Darin Petkovae0c64e2011-11-15 15:50:27 +0100397void Cellular::OnModemManagerPropertiesChanged(
398 const DBusPropertiesMap &properties) {
Darin Petkov721ac932011-11-16 15:43:09 +0100399 capability_->OnModemManagerPropertiesChanged(properties);
Chris Masone889666b2011-07-03 12:58:50 -0700400}
401
Darin Petkovae0c64e2011-11-15 15:50:27 +0100402void Cellular::set_home_provider(const Operator &oper) {
403 home_provider_.CopyFrom(oper);
404}
405
Darin Petkovac635a82012-01-10 16:51:58 +0100406string Cellular::CreateFriendlyServiceName() {
407 VLOG(2) << __func__;
408 return capability_.get() ? capability_->CreateFriendlyServiceName() : "";
409}
410
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700411} // namespace shill