Changed now NetworkManager detects connectivity status Now it constantly pings with 10s delay. Added command line to force bootstrapping. BUG: 24111116 Change-Id: Id23b3f42dc276f488ec4ccf17fd2b0341372e13c Reviewed-on: https://weave-review.googlesource.com/1110 Reviewed-by: Alex Vakulenko <avakulenko@google.com>
diff --git a/libweave/examples/ubuntu/main.cc b/libweave/examples/ubuntu/main.cc index b5766a3..2a96ee2 100644 --- a/libweave/examples/ubuntu/main.cc +++ b/libweave/examples/ubuntu/main.cc
@@ -12,11 +12,31 @@ #include "libweave/examples/ubuntu/file_config_store.h" #include "libweave/examples/ubuntu/network_manager.h" -int main() { +namespace { +void ShowUsage(const std::string& name) { + LOG(ERROR) << "\nUsage: " << name << " <option(s)>" + << "\nOptions:\n" + << "\t-h,--help Show this help message\n" + << "\t-b,--bootstrapping Force WiFi bootstrapping\n"; +} +} + +int main(int argc, char** argv) { + bool force_bootstrapping = false; + for (int i = 1; i < argc; ++i) { + std::string arg = argv[i]; + if (arg == "-h" || arg == "--help") { + ShowUsage(argv[0]); + return 0; + } + if (arg == "-b" || arg == "--bootstrapping") + force_bootstrapping = true; + } + weave::examples::FileConfigStore config_store; weave::examples::EventTaskRunner task_runner; weave::examples::CurlHttpClient http_client{&task_runner}; - weave::examples::NetworkImpl network{&task_runner}; + weave::examples::NetworkImpl network{&task_runner, force_bootstrapping}; weave::examples::MdnsImpl mdns; weave::examples::HttpServerImpl http_server{&task_runner}; weave::examples::BluetoothImpl bluetooth;
diff --git a/libweave/examples/ubuntu/network_manager.cc b/libweave/examples/ubuntu/network_manager.cc index a054d24..2f96c09 100644 --- a/libweave/examples/ubuntu/network_manager.cc +++ b/libweave/examples/ubuntu/network_manager.cc
@@ -185,11 +185,13 @@ } // namespace -NetworkImpl::NetworkImpl(TaskRunner* task_runner) : task_runner_{task_runner} { +NetworkImpl::NetworkImpl(TaskRunner* task_runner, bool force_bootstrapping) + : task_runner_{task_runner}, force_bootstrapping_{force_bootstrapping} { SSL_load_error_strings(); SSL_library_init(); DisableAccessPoint(); + UpdateNetworkState(); } NetworkImpl::~NetworkImpl() { DisableAccessPoint(); @@ -220,13 +222,8 @@ essid.resize(wreq.u.essid.length); close(sockf_d); - if (ssid == essid) { - task_runner_->PostDelayedTask( - FROM_HERE, base::Bind(&NetworkImpl::NotifyNetworkChanged, - weak_ptr_factory_.GetWeakPtr()), - {}); + if (ssid == essid) return task_runner_->PostDelayedTask(FROM_HERE, on_success, {}); - } pid = 0; // Try again. } } @@ -236,13 +233,8 @@ {"dev", "wifi", "connect", ssid, "password", passphrase}); } - if (base::Time::Now() >= until) { - task_runner_->PostDelayedTask(FROM_HERE, - base::Bind(&NetworkImpl::NotifyNetworkChanged, - weak_ptr_factory_.GetWeakPtr()), - {}); + if (base::Time::Now() >= until) return; - } task_runner_->PostDelayedTask( FROM_HERE, @@ -255,6 +247,7 @@ const std::string& passphrase, const base::Closure& on_success, ErrorPtr* error) { + force_bootstrapping_ = false; CHECK(!hostapd_started_); if (hostapd_started_) { Error::AddTo(error, FROM_HERE, "wifi", "busy", "Running Access Point."); @@ -265,26 +258,37 @@ base::Time::Now() + base::TimeDelta::FromMinutes(1), on_success); } -NetworkState NetworkImpl::GetConnectionState() const { - // Forced soft AP. - return NetworkState::kOffline; - +void NetworkImpl::UpdateNetworkState() { + network_state_ = NetworkState::kOffline; + if (force_bootstrapping_) + return; if (std::system("ping talk.google.com -c 1") == 0) - return NetworkState::kConnected; + network_state_ = NetworkState::kConnected; + else if (std::system("nmcli dev")) + network_state_ = NetworkState::kFailure; + else if (std::system("nmcli dev | grep connecting") == 0) + network_state_ = NetworkState::kConnecting; - if (std::system("nmcli dev")) - return NetworkState::kFailure; + task_runner_->PostDelayedTask(FROM_HERE, + base::Bind(&NetworkImpl::UpdateNetworkState, + weak_ptr_factory_.GetWeakPtr()), + base::TimeDelta::FromSeconds(10)); - if (std::system("nmcli dev | grep connecting") == 0) - return NetworkState::kConnecting; + bool online = GetConnectionState() == NetworkState::kConnected; + for (const auto& cb : callbacks_) + cb.Run(); +} - return NetworkState::kOffline; +NetworkState NetworkImpl::GetConnectionState() const { + return network_state_; } void NetworkImpl::EnableAccessPoint(const std::string& ssid) { if (hostapd_started_) return; + network_state_ = NetworkState::kOffline; + // Release wlan0 interface. CHECK_EQ(0, std::system("nmcli nm wifi off")); CHECK_EQ(0, std::system("rfkill unblock wlan")); @@ -319,10 +323,6 @@ } CHECK_EQ(0, std::system(("dnsmasq --conf-file=" + dnsmasq_conf).c_str())); - task_runner_->PostDelayedTask(FROM_HERE, - base::Bind(&NetworkImpl::NotifyNetworkChanged, - weak_ptr_factory_.GetWeakPtr()), - {}); } void NetworkImpl::DisableAccessPoint() { @@ -330,16 +330,6 @@ res = std::system("pkill -f hostapd.*/tmp/weave"); CHECK_EQ(0, std::system("nmcli nm wifi on")); hostapd_started_ = false; - - task_runner_->PostDelayedTask(FROM_HERE, - base::Bind(&NetworkImpl::NotifyNetworkChanged, - weak_ptr_factory_.GetWeakPtr()), - {}); -} - -void NetworkImpl::NotifyNetworkChanged() { - for (const auto& i : callbacks_) - i.Run(); } void NetworkImpl::OpenSslSocket(
diff --git a/libweave/examples/ubuntu/network_manager.h b/libweave/examples/ubuntu/network_manager.h index c9d6ff4..8abc80d 100644 --- a/libweave/examples/ubuntu/network_manager.h +++ b/libweave/examples/ubuntu/network_manager.h
@@ -22,7 +22,7 @@ // Production version of SSL socket needs secure server certificate check. class NetworkImpl : public Network { public: - explicit NetworkImpl(TaskRunner* task_runner); + explicit NetworkImpl(TaskRunner* task_runner, bool force_bootstrapping); ~NetworkImpl(); void AddOnConnectionChangedCallback( @@ -46,11 +46,13 @@ int pid, base::Time until, const base::Closure& on_success); - void NotifyNetworkChanged(); + void UpdateNetworkState(); + bool force_bootstrapping_{false}; bool hostapd_started_{false}; TaskRunner* task_runner_{nullptr}; std::vector<OnConnectionChangedCallback> callbacks_; + NetworkState network_state_{NetworkState::kOffline}; base::WeakPtrFactory<NetworkImpl> weak_ptr_factory_{this}; };