blob: 2441e3e05e0f7701d4aea66d52c3fc8162b5e9e1 [file] [log] [blame]
Alexander Afanasyeve6c65e22015-01-28 19:56:03 -08001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Davide Pesavento4d0d0962017-12-19 22:23:14 -05002/*
Davide Pesavento2bf35a62017-04-02 00:41:06 -04003 * Copyright (c) 2013-2017 Regents of the University of California.
Alexander Afanasyeve6c65e22015-01-28 19:56:03 -08004 *
5 * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
6 *
7 * ndn-cxx library is free software: you can redistribute it and/or modify it under the
8 * terms of the GNU Lesser General Public License as published by the Free Software
9 * Foundation, either version 3 of the License, or (at your option) any later version.
10 *
11 * ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
12 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
13 * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
14 *
15 * You should have received copies of the GNU General Public License and GNU Lesser
16 * General Public License along with ndn-cxx, e.g., in COPYING.md file. If not, see
17 * <http://www.gnu.org/licenses/>.
18 *
19 * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
Davide Pesavento2bf35a62017-04-02 00:41:06 -040020 *
21 * @author Alexander Afanasyev <alexander.afanasyev@ucla.edu>
22 * @author Davide Pesavento <davide.pesavento@lip6.fr>
Alexander Afanasyeve6c65e22015-01-28 19:56:03 -080023 */
24
Junxiao Shi25467942017-06-30 02:53:14 +000025#ifndef NDN_NET_NETWORK_MONITOR_HPP
26#define NDN_NET_NETWORK_MONITOR_HPP
Alexander Afanasyeve6c65e22015-01-28 19:56:03 -080027
Davide Pesavento4d0d0962017-12-19 22:23:14 -050028#include "asio-fwd.hpp"
Junxiao Shi2dc416d2017-07-03 04:46:16 +000029#include "network-interface.hpp"
Davide Pesavento2bf35a62017-04-02 00:41:06 -040030
Davide Pesavento4d0d0962017-12-19 22:23:14 -050031#include <vector>
Alexander Afanasyeve6c65e22015-01-28 19:56:03 -080032
33namespace ndn {
Junxiao Shi25467942017-06-30 02:53:14 +000034namespace net {
Alexander Afanasyeve6c65e22015-01-28 19:56:03 -080035
Junxiao Shi2dc416d2017-07-03 04:46:16 +000036class NetworkMonitorImpl;
Davide Pesavento2bf35a62017-04-02 00:41:06 -040037
Alexander Afanasyeve6c65e22015-01-28 19:56:03 -080038/**
Davide Pesavento43462902017-07-05 02:06:07 -040039 * @brief Network interface monitor
Alexander Afanasyeve6c65e22015-01-28 19:56:03 -080040 *
Davide Pesavento2bf35a62017-04-02 00:41:06 -040041 * Maintains an up-to-date view of every system network interface and notifies when an interface
42 * is added or removed.
Alexander Afanasyeve6c65e22015-01-28 19:56:03 -080043 *
Davide Pesavento43462902017-07-05 02:06:07 -040044 * @note The implementation of this class is highly platform dependent, and not all platform
45 * backends provide all the features. On macOS, @e SystemConfiguration and
46 * @e CFNotificationCenterAddObserver are used (notification of MTU change is not supported).
47 * On Linux, @e rtnetlink notifications from the kernel are used. See getCapabilities() for
48 * the detailed set of capabilities supported by the platform backend currently in use.
Alexander Afanasyeve6c65e22015-01-28 19:56:03 -080049 */
Davide Pesavento2bf35a62017-04-02 00:41:06 -040050class NetworkMonitor : noncopyable
Alexander Afanasyeve6c65e22015-01-28 19:56:03 -080051{
52public:
53 class Error : public std::runtime_error
54 {
55 public:
56 explicit
57 Error(const std::string& what)
58 : std::runtime_error(what)
59 {
60 }
61 };
62
63 /**
Davide Pesavento2bf35a62017-04-02 00:41:06 -040064 * @brief Construct instance, request enumeration of all network interfaces, and start
65 * monitoring for network state changes
66 *
Davide Pesavento43462902017-07-05 02:06:07 -040067 * @param io io_service instance that will dispatch events
Junxiao Shi2dc416d2017-07-03 04:46:16 +000068 * @throw Error error starting monitoring
Alexander Afanasyeve6c65e22015-01-28 19:56:03 -080069 */
70 explicit
71 NetworkMonitor(boost::asio::io_service& io);
72
Junxiao Shif4c1eb32017-05-30 17:05:10 +000073 enum Capability : uint32_t {
74 /// NetworkMonitor is not supported and is a no-op
75 CAP_NONE = 0,
76 /// listNetworkInterfaces() and getNetworkInterface() are supported
77 CAP_ENUM = 1 << 0,
78 /// NetworkMonitor onInterfaceAdded and onInterfaceRemoved signals are supported
79 CAP_IF_ADD_REMOVE = 1 << 1,
80 /// NetworkInterface onStateChanged signal is supported
81 CAP_STATE_CHANGE = 1 << 2,
82 /// NetworkInterface onMtuChanged signal is supported
83 CAP_MTU_CHANGE = 1 << 3,
84 /// NetworkInterface onAddressAdded and onAddressRemoved signals are supported
85 CAP_ADDR_ADD_REMOVE = 1 << 4
86 };
87
Davide Pesavento43462902017-07-05 02:06:07 -040088 /// Returns a bitwise OR'ed set of @ref Capability flags supported on the current platform
Junxiao Shif4c1eb32017-05-30 17:05:10 +000089 uint32_t
90 getCapabilities() const;
91
Davide Pesavento43462902017-07-05 02:06:07 -040092 /// Returns the NetworkInterface with the given name, or @c nullptr if it does not exist
Junxiao Shi2dc416d2017-07-03 04:46:16 +000093 shared_ptr<const NetworkInterface>
Davide Pesavento2bf35a62017-04-02 00:41:06 -040094 getNetworkInterface(const std::string& ifname) const;
95
Davide Pesavento43462902017-07-05 02:06:07 -040096 /**
97 * @brief Lists all network interfaces currently available on the system
98 * @warning May return incomplete results if called before the
99 * #onEnumerationCompleted signal has been emitted.
100 */
Junxiao Shi2dc416d2017-07-03 04:46:16 +0000101 std::vector<shared_ptr<const NetworkInterface>>
Davide Pesavento2bf35a62017-04-02 00:41:06 -0400102 listNetworkInterfaces() const;
103
Junxiao Shi2dc416d2017-07-03 04:46:16 +0000104protected:
105 explicit
106 NetworkMonitor(unique_ptr<NetworkMonitorImpl> impl);
107
108 NetworkMonitorImpl&
109 getImpl()
110 {
111 return *m_impl;
112 }
113
114private:
115 const unique_ptr<NetworkMonitorImpl> m_impl;
116 // Intentional violation of code-style rule 1.4: m_impl must be assigned before its signals can
117 // be assigned to references below.
118
Davide Pesavento2bf35a62017-04-02 00:41:06 -0400119public: // signals
Davide Pesavento43462902017-07-05 02:06:07 -0400120 /// Fires when network interfaces enumeration is complete
Junxiao Shi2dc416d2017-07-03 04:46:16 +0000121 util::Signal<NetworkMonitorImpl>& onEnumerationCompleted;
Davide Pesavento2bf35a62017-04-02 00:41:06 -0400122
Davide Pesavento43462902017-07-05 02:06:07 -0400123 /// Fires when a new interface is added
Junxiao Shi2dc416d2017-07-03 04:46:16 +0000124 util::Signal<NetworkMonitorImpl, shared_ptr<const NetworkInterface>>& onInterfaceAdded;
Davide Pesavento2bf35a62017-04-02 00:41:06 -0400125
126 /**
127 * @brief Fires when an interface is removed
Davide Pesavento43462902017-07-05 02:06:07 -0400128 * @note The NetworkInterface object is no longer present in the internal list of
129 * network interfaces when this signal is emitted.
Davide Pesavento2bf35a62017-04-02 00:41:06 -0400130 */
Junxiao Shi2dc416d2017-07-03 04:46:16 +0000131 util::Signal<NetworkMonitorImpl, shared_ptr<const NetworkInterface>>& onInterfaceRemoved;
Davide Pesavento2bf35a62017-04-02 00:41:06 -0400132
Davide Pesavento43462902017-07-05 02:06:07 -0400133 /// @deprecated Only for backward compatibility
Junxiao Shi2dc416d2017-07-03 04:46:16 +0000134 util::Signal<NetworkMonitorImpl>& onNetworkStateChanged;
135};
Alexander Afanasyeve6c65e22015-01-28 19:56:03 -0800136
Junxiao Shi2dc416d2017-07-03 04:46:16 +0000137class NetworkMonitorImpl : noncopyable
138{
139public:
140 virtual
141 ~NetworkMonitorImpl() = default;
142
143 virtual uint32_t
144 getCapabilities() const = 0;
145
146 virtual shared_ptr<const NetworkInterface>
147 getNetworkInterface(const std::string&) const = 0;
148
149 virtual std::vector<shared_ptr<const NetworkInterface>>
150 listNetworkInterfaces() const = 0;
151
152protected:
153 static shared_ptr<NetworkInterface>
154 makeNetworkInterface();
155
156public:
157 util::Signal<NetworkMonitorImpl> onEnumerationCompleted;
158 util::Signal<NetworkMonitorImpl, shared_ptr<const NetworkInterface>> onInterfaceAdded;
159 util::Signal<NetworkMonitorImpl, shared_ptr<const NetworkInterface>> onInterfaceRemoved;
160 util::Signal<NetworkMonitorImpl> onNetworkStateChanged;
161
162protected:
163 DECLARE_SIGNAL_EMIT(onEnumerationCompleted)
164 DECLARE_SIGNAL_EMIT(onInterfaceAdded)
165 DECLARE_SIGNAL_EMIT(onInterfaceRemoved)
166 DECLARE_SIGNAL_EMIT(onNetworkStateChanged)
Alexander Afanasyeve6c65e22015-01-28 19:56:03 -0800167};
168
Junxiao Shi25467942017-06-30 02:53:14 +0000169} // namespace net
Davide Pesavento2bf35a62017-04-02 00:41:06 -0400170} // namespace ndn
Alexander Afanasyeve6c65e22015-01-28 19:56:03 -0800171
Junxiao Shi25467942017-06-30 02:53:14 +0000172#endif // NDN_NET_NETWORK_MONITOR_HPP