network-interface.cpp
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
24 #include "network-interface.hpp"
25 #include "detail/linux-if-constants.hpp"
26 #include "../util/logger.hpp"
27 #include "../util/string-helper.hpp"
28 
29 #include <net/if.h>
30 
31 NDN_LOG_INIT(ndn.NetworkMonitor);
32 
33 namespace ndn {
34 namespace net {
35 
36 NetworkInterface::NetworkInterface()
37  : m_index(0)
38  , m_type(InterfaceType::UNKNOWN)
39  , m_flags(0)
40  , m_state(InterfaceState::UNKNOWN)
41  , m_mtu(0)
42 {
43 }
44 
45 bool
47 {
48  if (!address.getIp().is_unspecified()) {
49  // need to erase the existing address before inserting
50  // because the address flags may have changed
51  bool isNew = m_netAddresses.erase(address) == 0;
52  m_netAddresses.insert(address);
53  if (isNew) {
54  NDN_LOG_DEBUG("added address " << address << " to " << m_name);
55  onAddressAdded(address);
56  return true;
57  }
58  }
59  return false;
60 }
61 
62 bool
64 {
65  if (m_netAddresses.erase(address) > 0) {
66  NDN_LOG_DEBUG("removed address " << address << " from " << m_name);
67  onAddressRemoved(address);
68  return true;
69  }
70  return false;
71 }
72 
73 void
75 {
76  m_index = index;
77 }
78 
79 void
80 NetworkInterface::setName(const std::string& name)
81 {
82  BOOST_ASSERT(!name.empty());
83  m_name = name;
84 }
85 
86 void
88 {
89  m_type = type;
90 }
91 
92 void
94 {
95  m_flags = flags;
96 }
97 
98 void
100 {
101  if (m_state != state) {
102  std::swap(m_state, state);
103  onStateChanged(state, m_state);
104  }
105 }
106 
107 void
109 {
110  if (m_mtu != mtu) {
111  std::swap(m_mtu, mtu);
112  onMtuChanged(mtu, m_mtu);
113  }
114 }
115 
116 void
118 {
119  m_etherAddress = address;
120 }
121 
122 void
124 {
125  m_etherBrdAddress = address;
126 }
127 
128 std::ostream&
129 operator<<(std::ostream& os, InterfaceType type)
130 {
131  switch (type) {
133  return os << "unknown";
135  return os << "loopback";
137  return os << "ether";
138  }
139  return os;
140 }
141 
142 std::ostream&
143 operator<<(std::ostream& os, InterfaceState state)
144 {
145  switch (state) {
147  return os << "unknown";
149  return os << "down";
151  return os << "no-carrier";
153  return os << "dormant";
155  return os << "running";
156  }
157  return os;
158 }
159 
160 static void
161 printFlag(std::ostream& os, uint32_t& flags, uint32_t flagVal, const char* flagStr)
162 {
163  if (flags & flagVal) {
164  flags &= ~flagVal;
165  os << flagStr << (flags ? "," : "");
166  }
167 }
168 
169 std::ostream&
170 operator<<(std::ostream& os, const NetworkInterface& netif)
171 {
172  os << netif.getIndex() << ": " << netif.getName() << ": ";
173 
174  auto flags = netif.getFlags();
175  os << "<";
176 #define PRINT_IFF(flag) printFlag(os, flags, IFF_##flag, #flag)
177  PRINT_IFF(UP);
178  PRINT_IFF(BROADCAST);
179  PRINT_IFF(DEBUG);
181  PRINT_IFF(POINTOPOINT);
182 #if defined(IFF_NOTRAILERS)
183  PRINT_IFF(NOTRAILERS);
184 #endif
186  PRINT_IFF(NOARP);
187  PRINT_IFF(PROMISC);
188  PRINT_IFF(ALLMULTI);
189  PRINT_IFF(MULTICAST);
190 #if defined(__linux__)
191  PRINT_IFF(MASTER);
192  PRINT_IFF(SLAVE);
193  PRINT_IFF(PORTSEL);
194  PRINT_IFF(AUTOMEDIA);
195  PRINT_IFF(DYNAMIC);
196 #elif defined(__APPLE__) || defined(__FreeBSD__)
197  PRINT_IFF(OACTIVE);
198  PRINT_IFF(SIMPLEX);
199  PRINT_IFF(LINK0);
200  PRINT_IFF(LINK1);
201  PRINT_IFF(LINK2);
202 #endif
203 #if defined(__FreeBSD__)
204  PRINT_IFF(CANTCONFIG);
205  PRINT_IFF(PPROMISC);
206  PRINT_IFF(MONITOR);
207  PRINT_IFF(STATICARP);
208  PRINT_IFF(DYING);
209  PRINT_IFF(RENAMING);
210 #endif
211 #undef PRINT_IFF
212 #if defined(__linux__)
213 #define PRINT_IF_FLAG(flag) printFlag(os, flags, linux_if::FLAG_##flag, #flag)
214  PRINT_IF_FLAG(LOWER_UP);
215  PRINT_IF_FLAG(DORMANT);
216  PRINT_IF_FLAG(ECHO);
217 #undef PRINT_IF_FLAG
218 #endif
219  if (flags) {
220  // print unknown flags in hex
221  os << AsHex{flags};
222  }
223  os << ">";
224 
225  os << " state " << netif.getState() << " mtu " << netif.getMtu() << "\n"
226  << " link/" << netif.getType() << " " << netif.getEthernetAddress()
227  << " brd " << netif.getEthernetBroadcastAddress() << "\n";
228 
229  for (const auto& addr : netif.getNetworkAddresses()) {
230  os << " " << (addr.getFamily() == AddressFamily::V4 ? "inet " : "inet6 ") << addr;
231  if (netif.canBroadcast() && !addr.getBroadcast().is_unspecified())
232  os << " brd " << addr.getBroadcast();
233  os << " scope " << addr.getScope() << "\n";
234  }
235 
236  return os;
237 }
238 
239 } // namespace net
240 } // namespace ndn
interface is administratively down
Copyright (c) 2013-2017 Regents of the University of California.
Definition: common.hpp:66
#define PRINT_IFF(flag)
interface can be used to send and receive packets
interface is administratively up but has no carrier
uint32_t getMtu() const
Returns the MTU (maximum transmission unit) of the interface.
void setState(InterfaceState state)
Helper class to convert a number to hexadecimal format, for use with stream insertion operators...
boost::asio::ip::address getIp() const
Returns the IP address (v4 or v6)
InterfaceType
Indicates the hardware type of a network interface.
InterfaceState
Indicates the state of a network interface.
void setEthernetAddress(const ethernet::Address &address)
#define NDN_LOG_DEBUG(expression)
log at DEBUG level
Definition: logger.hpp:150
#define NDN_LOG_INIT(name)
declare a log module
Definition: logger.hpp:101
void setEthernetBroadcastAddress(const ethernet::Address &address)
ethernet::Address getEthernetBroadcastAddress() const
Returns the link-layer (Ethernet) broadcast address of the interface.
Represents one network interface attached to the host.
Stores one IP address supported by a network interface.
int getIndex() const
Returns an opaque ID that uniquely identifies the interface on the system.
bool removeNetworkAddress(const NetworkAddress &address)
InterfaceType getType() const
Returns the hardware type of the interface.
void setName(const std::string &name)
void setFlags(uint32_t flags)
std::string getName() const
Returns the name of the interface, unique on the system.
const std::set< NetworkAddress > & getNetworkAddresses() const
Returns a list of all network-layer addresses present on the interface.
interface has a carrier but it cannot send or receive normal user traffic yet
bool addNetworkAddress(const NetworkAddress &address)
represents an Ethernet hardware address
Definition: ethernet.hpp:52
uint32_t getFlags() const
Returns a bitset of platform-specific flags enabled on the interface.
std::ostream & operator<<(std::ostream &os, AddressScope scope)
ethernet::Address getEthernetAddress() const
Returns the link-layer (Ethernet) address of the interface.
void setType(InterfaceType type)
InterfaceState getState() const
Returns the current state of the interface.
bool canBroadcast() const
Returns true if the interface supports broadcast communication.
static void printFlag(std::ostream &os, uint32_t &flags, uint32_t flagVal, const char *flagStr)