Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6312)

Unified Diff: chromeos/network/network_state_handler.cc

Issue 2819993002: [CrOS Tether] Add the notion of a tether DeviceState. (Closed)
Patch Set: Rebased. Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chromeos/network/network_state_handler.cc
diff --git a/chromeos/network/network_state_handler.cc b/chromeos/network/network_state_handler.cc
index d1fe75c1ebad0dac0bd732bcc7960573fac3f965..f0d363aaa26c6bd2be2851b1f715c36b45eebcd5 100644
--- a/chromeos/network/network_state_handler.cc
+++ b/chromeos/network/network_state_handler.cc
@@ -126,9 +126,7 @@ NetworkStateHandler::TechnologyState NetworkStateHandler::GetTechnologyState(
std::string technology = GetTechnologyForType(type);
if (technology == kTypeTether) {
- bool is_tether_enabled = base::CommandLine::ForCurrentProcess()->HasSwitch(
- chromeos::switches::kEnableTether);
- return is_tether_enabled ? TECHNOLOGY_ENABLED : TECHNOLOGY_UNAVAILABLE;
+ return tether_state_;
}
TechnologyState state;
@@ -154,6 +152,13 @@ void NetworkStateHandler::SetTechnologyEnabled(
const network_handler::ErrorCallback& error_callback) {
std::vector<std::string> technologies = GetTechnologiesForType(type);
for (const std::string& technology : technologies) {
+ if (technology == kTypeTether) {
+ // Tether does not exist in Shill, so call SetTetherTechnologyState() and
Ryan Hansberry 2017/04/20 01:38:35 The comment suggests that SetTetherTechnologyState
Kyle Horimoto 2017/04/20 02:16:08 Done.
+ // skip the below interactions with |shill_property_handler_|.
+ tether_state_ = enabled ? TECHNOLOGY_ENABLED : TECHNOLOGY_AVAILABLE;
+ continue;
+ }
+
if (!shill_property_handler_->IsTechnologyAvailable(technology))
continue;
NET_LOG_USER("SetTechnologyEnabled",
@@ -165,11 +170,53 @@ void NetworkStateHandler::SetTechnologyEnabled(
NotifyDeviceListChanged();
}
+void NetworkStateHandler::SetTetherTechnologyState(
+ TechnologyState technology_state) {
+ if (tether_state_ == technology_state)
+ return;
+
+ tether_state_ = technology_state;
+
+ // Signal Device/Technology state changed.
+ NotifyDeviceListChanged();
+}
+
+void NetworkStateHandler::SetTetherScanState(bool is_scanning) {
+ DeviceState* tether_device_state =
+ GetModifiableDeviceState(kTetherDevicePath);
+ DCHECK(tether_device_state);
+
+ bool was_scanning = tether_device_state->scanning();
+ tether_device_state->set_scanning(is_scanning);
+
+ if (was_scanning && !is_scanning) {
+ // If a scan was in progress but has completed, notify observers.
+ NotifyScanCompleted(tether_device_state);
+ }
+}
+
void NetworkStateHandler::SetProhibitedTechnologies(
const std::vector<std::string>& prohibited_technologies,
const network_handler::ErrorCallback& error_callback) {
- shill_property_handler_->SetProhibitedTechnologies(prohibited_technologies,
- error_callback);
+ // Make a copy of |prohibited_technologies| since the list may be edited
+ // within this function.
+ std::vector<std::string> prohibited_technologies_copy =
+ prohibited_technologies;
+
+ for (auto it = prohibited_technologies_copy.begin();
+ it < prohibited_technologies_copy.end(); ++it) {
+ if (*it == kTypeTether) {
+ // If tethering is prohibited, set |tether_state_| and remove tethering
Ryan Hansberry 2017/04/20 01:38:35 Tether*
Kyle Horimoto 2017/04/20 02:16:08 Done.
+ // from the list before passing it to |shill_property_handler_| below.
+ // Shill does not have a concept of tether networks, so it cannot
+ // prohibit that technology type.
+ tether_state_ = TECHNOLOGY_PROHIBITED;
+ it = prohibited_technologies_copy.erase(it);
+ }
+ }
+
+ shill_property_handler_->SetProhibitedTechnologies(
+ prohibited_technologies_copy, error_callback);
// Signal Device/Technology state changed.
NotifyDeviceListChanged();
}
@@ -323,9 +370,14 @@ const NetworkState* NetworkStateHandler::FirstNetworkByType(
std::string NetworkStateHandler::FormattedHardwareAddressForType(
const NetworkTypePattern& type) const {
const NetworkState* network = ConnectedNetworkByType(type);
+ if (network && network->type() == kTypeTether) {
+ // If this is a tether network, get the MAC address corresponding to that
+ // network instead.
+ network = GetNetworkStateFromGuid(network->tether_guid());
Ryan Hansberry 2017/04/20 01:38:35 Just return empty string here instead.
Kyle Horimoto 2017/04/20 02:16:08 I don't think we should - we should return the MAC
Ryan Hansberry 2017/04/20 16:53:54 But we know at this point that the network does no
Kyle Horimoto 2017/04/20 19:38:46 stevenjb@, can you comment on this?
stevenjb 2017/04/20 20:01:10 Why wouldn't a tether network show the MAC address
Ryan Hansberry 2017/04/20 21:27:02 If that's the case, then we should return the mac_
Kyle Horimoto 2017/04/20 21:28:45 That's what I'm already doing ;)
+ }
const DeviceState* device = network ? GetDeviceState(network->device_path())
: GetDeviceStateByType(type);
- if (!device)
+ if (!device || device->mac_address().empty())
return std::string();
return network_util::FormattedMacAddress(device->mac_address());
}
@@ -431,6 +483,7 @@ void NetworkStateHandler::AddTetherNetworkState(const std::string& guid,
DCHECK(!guid.empty());
DCHECK(battery_percentage >= 0 && battery_percentage <= 100);
DCHECK(signal_strength >= 0 && signal_strength <= 100);
+ DCHECK(tether_state_ == TECHNOLOGY_ENABLED);
// If the network already exists, do nothing.
if (GetNetworkStateFromGuid(guid)) {
@@ -463,6 +516,8 @@ bool NetworkStateHandler::UpdateTetherNetworkProperties(
const std::string& carrier,
int battery_percentage,
int signal_strength) {
+ DCHECK(tether_state_ == TECHNOLOGY_ENABLED);
+
NetworkState* tether_network_state = GetModifiableNetworkStateFromGuid(guid);
if (!tether_network_state)
return false;
@@ -494,6 +549,8 @@ void NetworkStateHandler::RemoveTetherNetworkState(const std::string& guid) {
bool NetworkStateHandler::AssociateTetherNetworkStateWithWifiNetwork(
const std::string& tether_network_guid,
const std::string& wifi_network_guid) {
+ DCHECK(tether_state_ == TECHNOLOGY_ENABLED);
+
NetworkState* tether_network =
GetModifiableNetworkStateFromGuid(tether_network_guid);
if (!tether_network) {
@@ -693,6 +750,17 @@ void NetworkStateHandler::UpdateManagedList(ManagedState::ManagedType type,
ManagedStateList* managed_list = GetManagedList(type);
NET_LOG_DEBUG("UpdateManagedList: " + ManagedState::TypeToString(type),
base::StringPrintf("%" PRIuS, entries.GetSize()));
+
+ // Create a copy of |entries| since it may be edited below.
+ base::ListValue entries_copy(entries);
+ if (type == ManagedState::ManagedType::MANAGED_TYPE_DEVICE) {
+ // If a device list update is received from Shill, the list supplied will
+ // never contain an entry for tether networks since Shill does not recognize
+ // tether networks as a device type. Before processing the list, add an
+ // entry for the tether device type with the constant tether device path.
+ entries_copy.Append(base::MakeUnique<base::Value>(kTetherDevicePath));
+ }
+
// Create a map of existing entries. Assumes all entries in |managed_list|
// are unique.
std::map<std::string, std::unique_ptr<ManagedState>> managed_map;
@@ -705,7 +773,7 @@ void NetworkStateHandler::UpdateManagedList(ManagedState::ManagedType type,
managed_list->clear();
// Updates managed_list and request updates for new entries.
std::set<std::string> list_entries;
- for (auto& iter : entries) {
+ for (auto& iter : entries_copy) {
std::string path;
iter.GetAsString(&path);
if (path.empty() || path == shill::kFlimflamServicePath) {
@@ -718,7 +786,17 @@ void NetworkStateHandler::UpdateManagedList(ManagedState::ManagedType type,
NET_LOG_ERROR("Duplicate entry in list", path);
continue;
}
- managed_list->push_back(ManagedState::Create(type, path));
+ std::unique_ptr<ManagedState> state = ManagedState::Create(type, path);
+ if (type == ManagedState::ManagedType::MANAGED_TYPE_DEVICE &&
+ path == kTetherDevicePath) {
+ // If adding the tether DeviceState, set appropriate properties since
+ // it will never receive a properties update from Shill.
+ state->set_update_received();
+ state->set_update_requested(false);
+ state->set_name(kTetherDeviceName);
+ state->set_type(kTypeTether);
+ }
+ managed_list->push_back(std::move(state));
} else {
managed_list->push_back(std::move(found->second));
managed_map.erase(found);
@@ -1275,6 +1353,8 @@ std::vector<std::string> NetworkStateHandler::GetTechnologiesForType(
technologies.emplace_back(shill::kTypeBluetooth);
if (type.MatchesType(shill::kTypeVPN))
technologies.emplace_back(shill::kTypeVPN);
+ if (type.MatchesType(kTypeTether))
+ technologies.emplace_back(kTypeTether);
CHECK_GT(technologies.size(), 0ul);
return technologies;

Powered by Google App Engine
This is Rietveld 408576698