1//
2// Copyright (C) 2012 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 SHILL_LINK_MONITOR_H_
18#define SHILL_LINK_MONITOR_H_
19
20#include <time.h>
21
22#include <memory>
23#include <string>
24
25#include <base/callback.h>
26#include <base/cancelable_callback.h>
27
28#include "shill/metrics.h"
29#include "shill/net/byte_string.h"
30#include "shill/refptr_types.h"
31
32namespace shill {
33
34class ActiveLinkMonitor;
35class DeviceInfo;
36class EventDispatcher;
37class PassiveLinkMonitor;
38class Time;
39
40class LinkMonitor {
41 public:
42  typedef base::Closure FailureCallback;
43  typedef base::Closure GatewayChangeCallback;
44
45  // The default number of milliseconds between ARP requests used by
46  // ActiveLinkMonitor. Needed by Metrics.
47  static const int kDefaultTestPeriodMilliseconds;
48
49  // The default list of technologies for which link monitoring is enabled.
50  // Needed by DefaultProfile.
51  static const char kDefaultLinkMonitorTechnologies[];
52
53  // Failure threshold count used by ActiveLinkMonitor.  Needed by Metrics.
54  static const int kFailureThreshold;
55
56  LinkMonitor(const ConnectionRefPtr& connection,
57              EventDispatcher* dispatcher,  // Owned by caller; can't be NULL.
58              Metrics* metrics,  // Owned by caller; must not be NULL.
59              DeviceInfo* device_info,
60              const FailureCallback& failure_callback,
61              const GatewayChangeCallback& gateway_change_callback);
62  virtual ~LinkMonitor();
63
64  // Starts link-monitoring on the selected connection.  Returns
65  // true if successful, false otherwise.
66  virtual bool Start();
67  // Stop link-monitoring on the selected connection. Clears any
68  // accumulated statistics.
69  virtual void Stop();
70
71  // Inform LinkMonitor that the system is resuming from sleep.
72  // LinkMonitor will immediately start the ActiveLinkMonitor, using a lower
73  // timeout than normal.
74  virtual void OnAfterResume();
75
76  // Return modified cumulative average of the gateway ARP response
77  // time.  Returns zero if no samples are available.  For each
78  // missed ARP response, the sample is assumed to be the full
79  // test period.
80  virtual int GetResponseTimeMilliseconds() const;
81
82  // Returns true if the LinkMonitor was ever able to find the default
83  // gateway via broadcast ARP.
84  virtual bool IsGatewayFound() const;
85
86  const ByteString& gateway_mac_address() const {
87    return gateway_mac_address_;
88  }
89
90 private:
91  friend class LinkMonitorTest;
92
93  void OnActiveLinkMonitorFailure(Metrics::LinkMonitorFailure failure,
94                                  int broadcast_failure_count,
95                                  int unicast_failure_count);
96  void OnActiveLinkMonitorSuccess();
97  void OnPassiveLinkMonitorResultCallback(bool status);
98
99  // The connection on which to perform link monitoring.
100  ConnectionRefPtr connection_;
101  // Dispatcher on which to create delayed tasks.
102  EventDispatcher* dispatcher_;
103  // Metrics instance on which to post performance results.
104  Metrics* metrics_;
105  // Failure callback method to call if LinkMonitor fails.
106  FailureCallback failure_callback_;
107  // Callback method to call if gateway mac address changes.
108  GatewayChangeCallback gateway_change_callback_;
109  std::unique_ptr<ActiveLinkMonitor> active_link_monitor_;
110  std::unique_ptr<PassiveLinkMonitor> passive_link_monitor_;
111  // The MAC address of the default gateway.
112  ByteString gateway_mac_address_;
113  // The time at which the link monitor started.
114  struct timeval started_monitoring_at_;
115  // Time instance for performing GetTimeMonotonic().
116  Time* time_;
117
118  DISALLOW_COPY_AND_ASSIGN(LinkMonitor);
119};
120
121}  // namespace shill
122
123#endif  // SHILL_LINK_MONITOR_H_
124