blob: 62a77c2c82516b05dcaf3d6c5affbad6743b9a3f [file] [log] [blame]
Vitaly Buka4615e0d2015-10-14 15:35:12 -07001// Copyright 2015 The Weave Authors. All rights reserved.
Vitaly Buka7ce499f2015-06-09 08:04:11 -07002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Vitaly Buka912b6982015-07-06 11:13:03 -07005#ifndef LIBWEAVE_SRC_PRIVET_WIFI_BOOTSTRAP_MANAGER_H_
6#define LIBWEAVE_SRC_PRIVET_WIFI_BOOTSTRAP_MANAGER_H_
Vitaly Buka7ce499f2015-06-09 08:04:11 -07007
8#include <set>
9#include <string>
10#include <vector>
11
12#include <base/callback.h>
Vitaly Buka7ce499f2015-06-09 08:04:11 -070013#include <base/macros.h>
14#include <base/memory/weak_ptr.h>
15#include <base/scoped_observer.h>
Vitaly Buka658aa362015-09-15 20:59:12 -070016#include <base/time/time.h>
Vitaly Buka7ce499f2015-06-09 08:04:11 -070017
Stefan Sauer2d16dfa2015-09-25 17:08:35 +020018#include "src/privet/privet_types.h"
19#include "src/privet/wifi_delegate.h"
20#include "src/privet/wifi_ssid_generator.h"
Vitaly Buka7ce499f2015-06-09 08:04:11 -070021
Vitaly Bukab6f015a2015-07-09 14:59:23 -070022namespace weave {
Vitaly Buka387b4f42015-07-30 23:55:13 -070023
Vitaly Bukaf86b4d52015-09-28 15:12:03 -070024class Config;
25
Vitaly Buka1e363672015-09-25 14:01:16 -070026namespace provider {
27class Network;
Vitaly Buka658aa362015-09-15 20:59:12 -070028class TaskRunner;
Vitaly Buka1e363672015-09-25 14:01:16 -070029class Wifi;
30}
Vitaly Buka387b4f42015-07-30 23:55:13 -070031
Vitaly Bukab6f015a2015-07-09 14:59:23 -070032namespace privet {
Vitaly Buka7ce499f2015-06-09 08:04:11 -070033
Vitaly Buka7ce499f2015-06-09 08:04:11 -070034class CloudDelegate;
35class DeviceDelegate;
Vitaly Buka7ce499f2015-06-09 08:04:11 -070036
Vitaly Buka658aa362015-09-15 20:59:12 -070037class WifiBootstrapManager : public WifiDelegate {
Vitaly Buka7ce499f2015-06-09 08:04:11 -070038 public:
Vitaly Bukac8ba2282015-10-01 17:42:40 -070039 enum class State {
40 kDisabled,
41 kBootstrapping,
42 kMonitoring,
43 kConnecting,
44 };
Vitaly Buka7ce499f2015-06-09 08:04:11 -070045
Vitaly Buka41a90d62015-09-29 16:58:39 -070046 WifiBootstrapManager(Config* config,
Vitaly Buka1e363672015-09-25 14:01:16 -070047 provider::TaskRunner* task_runner,
48 provider::Network* shill_client,
49 provider::Wifi* wifi,
Vitaly Bukae27f5522015-06-19 18:58:19 -070050 CloudDelegate* gcd);
Vitaly Buka7ce499f2015-06-09 08:04:11 -070051 ~WifiBootstrapManager() override = default;
52 virtual void Init();
Vitaly Buka7ce499f2015-06-09 08:04:11 -070053
54 // Overrides from WifiDelegate.
55 const ConnectionState& GetConnectionState() const override;
56 const SetupState& GetSetupState() const override;
57 bool ConfigureCredentials(const std::string& ssid,
58 const std::string& passphrase,
Vitaly Buka0801a1f2015-08-14 10:03:46 -070059 ErrorPtr* error) override;
Vitaly Buka7ce499f2015-06-09 08:04:11 -070060 std::string GetCurrentlyConnectedSsid() const override;
61 std::string GetHostedSsid() const override;
62 std::set<WifiType> GetTypes() const override;
63
Vitaly Buka7ce499f2015-06-09 08:04:11 -070064 private:
65 // These Start* tasks:
66 // 1) Do state appropriate work for entering the indicated state.
67 // 2) Update the state variable to reflect that we're in a new state
68 // 3) Call StateListeners to notify that we've transitioned.
69 // These End* tasks perform cleanup on leaving indicated state.
70 void StartBootstrapping();
71 void EndBootstrapping();
72
73 void StartConnecting(const std::string& ssid, const std::string& passphrase);
74 void EndConnecting();
75
Vitaly Bukaa7c7a6b2015-10-28 13:12:34 -070076 void StartMonitoring(const base::TimeDelta& timeout);
Vitaly Buka65e1f212015-11-05 15:54:05 -080077 void ContinueMonitoring(const base::TimeDelta& timeout);
Vitaly Buka7ce499f2015-06-09 08:04:11 -070078 void EndMonitoring();
79
80 // Update the current state, post tasks to notify listeners accordingly to
81 // the MessageLoop.
82 void UpdateState(State new_state);
Vitaly Buka7ce499f2015-06-09 08:04:11 -070083
Vitaly Buka557d4522015-07-18 20:43:58 -070084 std::string GenerateSsid() const;
85
Vitaly Buka7ce499f2015-06-09 08:04:11 -070086 // If we've been bootstrapped successfully before, and we're bootstrapping
87 // again because we slipped offline for a sufficiently longtime, we want
88 // to return to monitoring mode periodically in case our connectivity issues
89 // were temporary.
90 void OnBootstrapTimeout();
Vitaly Buka74763422015-10-11 00:39:52 -070091 void OnConnectDone(const std::string& ssid, ErrorPtr error);
92 void OnConnectTimeout();
Vitaly Bukabf6840a2015-09-21 13:38:56 -070093 void OnConnectivityChange();
Vitaly Buka7ce499f2015-06-09 08:04:11 -070094 void OnMonitorTimeout();
95 void UpdateConnectionState();
96
Vitaly Buka0fa51e52015-07-10 00:12:25 -070097 State state_{State::kDisabled};
Vitaly Buka7ce499f2015-06-09 08:04:11 -070098 // Setup state is the temporal state of the most recent bootstrapping attempt.
99 // It is not persisted to disk.
100 SetupState setup_state_{SetupState::kNone};
101 ConnectionState connection_state_{ConnectionState::kDisabled};
Vitaly Bukaf86b4d52015-09-28 15:12:03 -0700102 Config* config_{nullptr};
Vitaly Buka1e363672015-09-25 14:01:16 -0700103 provider::TaskRunner* task_runner_{nullptr};
104 provider::Network* network_{nullptr};
105 provider::Wifi* wifi_{nullptr};
Vitaly Buka7ce499f2015-06-09 08:04:11 -0700106 WifiSsidGenerator ssid_generator_;
Vitaly Bukaca365fb2015-09-15 17:38:41 -0700107 base::Time monitor_until_;
Vitaly Buka7ce499f2015-06-09 08:04:11 -0700108
Vitaly Buka7ce499f2015-06-09 08:04:11 -0700109 bool currently_online_{false};
Vitaly Bukab6c8a3e2015-07-31 01:12:07 -0700110 std::string privet_ssid_;
Vitaly Buka7ce499f2015-06-09 08:04:11 -0700111
Vitaly Buka7ce499f2015-06-09 08:04:11 -0700112 // Helps to reset irrelevant tasks switching state.
113 base::WeakPtrFactory<WifiBootstrapManager> tasks_weak_factory_{this};
114
115 base::WeakPtrFactory<WifiBootstrapManager> lifetime_weak_factory_{this};
116
117 DISALLOW_COPY_AND_ASSIGN(WifiBootstrapManager);
118};
119
Vitaly Bukab6f015a2015-07-09 14:59:23 -0700120} // namespace privet
121} // namespace weave
Vitaly Buka7ce499f2015-06-09 08:04:11 -0700122
Vitaly Buka912b6982015-07-06 11:13:03 -0700123#endif // LIBWEAVE_SRC_PRIVET_WIFI_BOOTSTRAP_MANAGER_H_