1//
2// Copyright (C) 2015 The Android Open Source Project
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8//      http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15//
16
17#ifndef APMANAGER_HOSTAPD_MONITOR_H_
18#define APMANAGER_HOSTAPD_MONITOR_H_
19
20#include <string>
21
22#include <base/cancelable_callback.h>
23#include <base/macros.h>
24#include <base/memory/weak_ptr.h>
25
26#include "apmanager/event_dispatcher.h"
27
28namespace shill {
29
30struct InputData;
31class IOHandler;
32class IOHandlerFactory;
33class Sockets;
34
35}  // namespace shill
36
37namespace apmanager {
38
39// Class for monitoring events from hostapd control interface.
40class HostapdMonitor {
41 public:
42  enum Event {
43    kHostapdFailed,
44    kHostapdStarted,
45    kStationConnected,
46    kStationDisconnected,
47  };
48
49  typedef base::Callback<void(Event event, const std::string& data)>
50      EventCallback;
51
52  HostapdMonitor(const EventCallback& callback_,
53                 const std::string& control_interface_path,
54                 const std::string& network_interface_name);
55  virtual ~HostapdMonitor();
56
57  virtual void Start();
58
59 private:
60  friend class HostapdMonitorTest;
61
62  static const char kLocalPathFormat[];
63  static const char kHostapdCmdAttach[];
64  static const char kHostapdRespOk[];
65  static const char kHostapdEventStationConnected[];
66  static const char kHostapdEventStationDisconnected[];
67  static const int kHostapdCtrlIfaceCheckIntervalMs;
68  static const int kHostapdCtrlIfaceCheckMaxAttempts;
69  static const int kHostapdAttachTimeoutMs;
70  static const int kInvalidSocket;
71
72  // Task for checking if hostapd control interface is up or not.
73  void HostapdCtrlIfaceCheckTask();
74
75  // Attach to hostapd control interface to receive unsolicited event
76  // notifications.
77  void AttachToHostapd();
78  void AttachTimeoutHandler();
79
80  bool SendMessage(const char* message, size_t length);
81  void ParseMessage(shill::InputData* data);
82  void OnReadError(const std::string& error_msg);
83
84  std::unique_ptr<shill::Sockets> sockets_;
85  EventCallback event_callback_;
86
87  // File path for interprocess communication with hostapd.
88  std::string dest_path_;
89  std::string local_path_;
90
91  // Socket descriptor for communication with hostapd.
92  int hostapd_socket_;
93
94  base::Callback<void(shill::InputData *)> hostapd_callback_;
95  std::unique_ptr<shill::IOHandler> hostapd_input_handler_;
96  shill::IOHandlerFactory *io_handler_factory_;
97  EventDispatcher* event_dispatcher_;
98  base::WeakPtrFactory<HostapdMonitor> weak_ptr_factory_;
99
100  int hostapd_ctrl_iface_check_count_;
101  base::CancelableClosure attach_timeout_callback_;
102
103  bool started_;
104
105  DISALLOW_COPY_AND_ASSIGN(HostapdMonitor);
106};
107
108}  // namespace apmanager
109
110#endif  // APMANAGER_HOSTAPD_MONITOR_H_
111