Kea  2.3.8
iface_mgr.h
Go to the documentation of this file.
1 // Copyright (C) 2011-2023 Internet Systems Consortium, Inc. ("ISC")
2 //
3 // This Source Code Form is subject to the terms of the Mozilla Public
4 // License, v. 2.0. If a copy of the MPL was not distributed with this
5 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
6 
7 #ifndef IFACE_MGR_H
8 #define IFACE_MGR_H
9 
10 #include <asiolink/io_address.h>
11 #include <dhcp/dhcp4.h>
12 #include <dhcp/dhcp6.h>
13 #include <dhcp/pkt4.h>
14 #include <dhcp/pkt6.h>
15 #include <dhcp/packet_queue_mgr4.h>
16 #include <dhcp/packet_queue_mgr6.h>
17 #include <dhcp/pkt_filter.h>
18 #include <dhcp/pkt_filter6.h>
19 #include <util/optional.h>
20 #include <util/watch_socket.h>
21 #include <util/watched_thread.h>
22 
23 #include <boost/multi_index/hashed_index.hpp>
24 #include <boost/multi_index/mem_fun.hpp>
25 #include <boost/multi_index/sequenced_index.hpp>
26 #include <boost/multi_index_container.hpp>
27 #include <boost/noncopyable.hpp>
28 #include <boost/scoped_array.hpp>
29 #include <boost/shared_ptr.hpp>
30 
31 #include <functional>
32 #include <list>
33 #include <vector>
34 #include <mutex>
35 
36 namespace isc {
37 
38 namespace dhcp {
39 
41 class IfaceDetectError : public Exception {
42 public:
43  IfaceDetectError(const char* file, size_t line, const char* what) :
44  isc::Exception(file, line, what) { };
45 };
46 
49 public:
50  PacketFilterChangeDenied(const char* file, size_t line, const char* what) :
51  isc::Exception(file, line, what) { };
52 };
53 
56 public:
57  SignalInterruptOnSelect(const char* file, size_t line, const char* what) :
58  isc::Exception(file, line, what) { };
59 };
60 
63 class SocketConfigError : public Exception {
64 public:
65  SocketConfigError(const char* file, size_t line, const char* what) :
66  isc::Exception(file, line, what) { };
67 };
68 
71 class SocketReadError : public Exception {
72 public:
73  SocketReadError(const char* file, size_t line, const char* what) :
74  isc::Exception(file, line, what) { };
75 };
76 
79 class SocketWriteError : public Exception {
80 public:
81  SocketWriteError(const char* file, size_t line, const char* what) :
82  isc::Exception(file, line, what) { };
83 };
84 
86 class IfaceNotFound : public Exception {
87 public:
88  IfaceNotFound(const char* file, size_t line, const char* what) :
89  isc::Exception(file, line, what) { };
90 };
91 
93 class SocketNotFound : public Exception {
94 public:
95  SocketNotFound(const char* file, size_t line, const char* what) :
96  isc::Exception(file, line, what) { };
97 };
98 
118 class Iface : public boost::noncopyable {
119 public:
120 
122  static const unsigned int MAX_MAC_LEN = 20;
123 
126 
128  typedef std::list<Address> AddressCollection;
129 
139  typedef std::list<SocketInfo> SocketCollection;
140 
142  using ErrorBuffer = std::vector<std::string>;
143 
151  Iface(const std::string& name, unsigned int ifindex);
152 
154  ~Iface() { }
155 
157  void closeSockets();
158 
178  void closeSockets(const uint16_t family);
179 
183  std::string getFullName() const;
184 
188  std::string getPlainMac() const;
189 
194  void setMac(const uint8_t* mac, size_t macLen);
195 
199  size_t getMacLen() const { return mac_len_; }
200 
205  const uint8_t* getMac() const { return mac_; }
206 
214  void setFlags(uint64_t flags);
215 
219  unsigned int getIndex() const { return ifindex_; }
220 
224  std::string getName() const { return name_; };
225 
229  void setHWType(uint16_t type ) { hardware_type_ = type; }
230 
234  uint16_t getHWType() const { return hardware_type_; }
235 
254  const AddressCollection& getAddresses() const { return addrs_; }
255 
265  bool getAddress4(isc::asiolink::IOAddress& address) const;
266 
271  bool hasAddress(const isc::asiolink::IOAddress& address) const;
272 
279  void addAddress(const isc::asiolink::IOAddress& addr);
280 
292  void setActive(const isc::asiolink::IOAddress& address, const bool active);
293 
302  void setActive(const bool active);
303 
305  unsigned int countActive4() const;
306 
316  bool delAddress(const isc::asiolink::IOAddress& addr);
317 
321  void addSocket(const SocketInfo& sock) {
322  sockets_.push_back(sock);
323  }
324 
332  bool delSocket(uint16_t sockfd);
333 
347  const SocketCollection& getSockets() const { return sockets_; }
348 
353  void clearUnicasts() {
354  unicasts_.clear();
355  }
356 
361  void addUnicast(const isc::asiolink::IOAddress& addr);
362 
367  return unicasts_;
368  }
369 
379  uint8_t* getReadBuffer() {
380  if (read_buffer_.empty()) {
381  return (0);
382  }
383  return (&read_buffer_[0]);
384  }
385 
387  size_t getReadBufferSize() const {
388  return (read_buffer_.size());
389  }
390 
394  void resizeReadBuffer(const size_t new_size) {
395  read_buffer_.resize(new_size);
396  }
397 
401  void addError(std::string const& message);
402 
404  void clearErrors();
405 
409  ErrorBuffer const& getErrors() const;
410 
411 protected:
414 
416  std::string name_;
417 
419  unsigned int ifindex_;
420 
423 
426 
428  uint8_t mac_[MAX_MAC_LEN];
429 
431  size_t mac_len_;
432 
434  uint16_t hardware_type_;
435 
436 public:
439 
442 
444  bool flag_up_;
445 
449 
452 
455 
460  uint64_t flags_;
461 
465 
469 
470 private:
471 
475  std::vector<uint8_t> read_buffer_;
476 
483  ErrorBuffer errors_;
484 };
485 
487 typedef boost::shared_ptr<Iface> IfacePtr;
488 
491 public:
492 
502  typedef boost::multi_index_container<
503  // Container comprises elements of IfacePtr type.
504  IfacePtr,
505  // Here we start enumerating various indexes.
506  boost::multi_index::indexed_by<
507  // Sequenced index allows accessing elements in the same way
508  // as elements in std::list. Sequenced is the index #0.
509  boost::multi_index::sequenced<>,
510  // Start definition of index #1.
511  boost::multi_index::hashed_unique<
512  // Use the interface index as the key.
513  boost::multi_index::const_mem_fun<
514  Iface, unsigned int, &Iface::getIndex
515  >
516  >,
517  // Start definition of index #2.
518  boost::multi_index::hashed_unique<
519  // Use the interface name as the key.
520  boost::multi_index::const_mem_fun<
521  Iface, std::string, &Iface::getName
522  >
523  >
524  >
526 
530  IfaceContainer::const_iterator begin() const {
531  return (ifaces_container_.begin());
532  }
533 
537  IfaceContainer::const_iterator end() const {
538  return (ifaces_container_.end());
539  }
540 
544  bool empty() const {
545  return (ifaces_container_.empty());
546  }
547 
551  size_t size() const {
552  return (ifaces_container_.size());
553  }
554 
556  void clear() {
557  cache_.reset();
558  ifaces_container_.clear();
559  }
560 
566  void push_back(const IfacePtr& iface) {
567  ifaces_container_.push_back(iface);
568  }
569 
574  IfacePtr getIface(const unsigned int ifindex);
575 
580  IfacePtr getIface(const std::string& ifname);
581 
582 private:
588  IfacePtr getIfaceInternal(const unsigned int ifindex, const bool need_lock);
589 
597  IfacePtr getIfaceInternal(const std::string& ifname, const bool need_lock);
598 
601  std::mutex mutex_;
602 
612  IfacePtr cache_;
613 
615  IfaceContainer ifaces_container_;
616 };
617 
622 typedef boost::multi_index_container<
625  // Here we start enumerating the only index.
626  boost::multi_index::indexed_by<
627  // Start definition of index #0.
628  boost::multi_index::hashed_unique<
629  // Use the address in its network order integer form as the key.
630  boost::multi_index::const_mem_fun<
632  >
633  >
634  >
636 
638 class IfaceMgr;
639 
641 typedef boost::shared_ptr<IfaceMgr> IfaceMgrPtr;
642 
647 typedef
648 std::function<void(const std::string& errmsg)> IfaceMgrErrorMsgCallback;
649 
656 class IfaceMgr : public boost::noncopyable {
657 public:
660  typedef std::function<void (int fd)> SocketCallback;
661 
665  int socket_;
666 
669  };
670 
672  typedef std::list<SocketCallbackInfo> SocketCallbackInfoContainer;
673 
681  static const uint32_t RCVBUFSIZE = 1500;
682 
687  static IfaceMgr& instance();
688 
699  static const IfaceMgrPtr& instancePtr();
700 
704  virtual ~IfaceMgr();
705 
715  void setTestMode(const bool test_mode) {
716  test_mode_ = test_mode;
717  }
718 
722  bool isTestMode() const {
723  return (test_mode_);
724  }
725 
731  void setAllowLoopBack(const bool allow_loopback) {
732  allow_loopback_ = allow_loopback;
733  }
734 
743  bool isDirectResponseSupported() const;
744 
752  IfacePtr getIface(const unsigned int ifindex);
753 
760  IfacePtr getIface(const std::string& ifname);
761 
772  IfacePtr getIface(const PktPtr& pkt);
773 
781  const IfaceCollection& getIfaces() { return (ifaces_); }
782 
789  void clearIfaces();
790 
799  void detectIfaces(bool update_only = false);
800 
802  void clearUnicasts();
803 
805  void clearBoundAddresses();
806 
808  void collectBoundAddresses();
809 
823  uint16_t getSocket(const isc::dhcp::Pkt6Ptr& pkt);
824 
839 
843  void printIfaces(std::ostream& out = std::cout);
844 
856  bool send(const Pkt6Ptr& pkt);
857 
869  bool send(const Pkt4Ptr& pkt);
870 
882  Pkt6Ptr receive6(uint32_t timeout_sec, uint32_t timeout_usec = 0);
883 
895  Pkt4Ptr receive4(uint32_t timeout_sec, uint32_t timeout_usec = 0);
896 
915  int openSocket(const std::string& ifname,
916  const isc::asiolink::IOAddress& addr,
917  const uint16_t port,
918  const bool receive_bcast = false,
919  const bool send_bcast = false);
920 
938  int openSocketFromIface(const std::string& ifname,
939  const uint16_t port,
940  const uint8_t family);
941 
957  const uint16_t port);
958 
974  const uint16_t port);
975 
976 
1023  bool openSockets6(const uint16_t port = DHCP6_SERVER_PORT,
1024  IfaceMgrErrorMsgCallback error_handler = 0,
1025  const bool skip_opened = false);
1026 
1096  bool openSockets4(const uint16_t port = DHCP4_SERVER_PORT,
1097  const bool use_bcast = true,
1098  IfaceMgrErrorMsgCallback error_handler = 0,
1099  const bool skip_opened = false);
1100 
1107  void closeSockets();
1108 
1112  uint16_t countIfaces() { return ifaces_.size(); }
1113 
1121  void addExternalSocket(int socketfd, SocketCallback callback);
1122 
1126  void deleteExternalSocket(int socketfd);
1127 
1137  int purgeBadSockets();
1138 
1140  void deleteAllExternalSockets();
1141 
1157  void setPacketFilter(const PktFilterPtr& packet_filter);
1158 
1179  void setPacketFilter(const PktFilter6Ptr& packet_filter);
1180 
1197  void setMatchingPacketFilter(const bool direct_response_desired = false);
1198 
1205  void addInterface(const IfacePtr& iface);
1206 
1213  bool hasOpenSocket(const uint16_t family) const;
1214 
1231  bool hasOpenSocket(const isc::asiolink::IOAddress& addr) const;
1232 
1237  return (packet_queue_mgr4_);
1238  }
1239 
1247  return (packet_queue_mgr4_->getPacketQueue());
1248  }
1249 
1254  return (packet_queue_mgr6_);
1255  }
1256 
1264  return (packet_queue_mgr6_->getPacketQueue());
1265  }
1266 
1277  void startDHCPReceiver(const uint16_t family);
1278 
1283  void stopDHCPReceiver();
1284 
1287  bool isDHCPReceiverRunning() const {
1288  return (dhcp_receiver_ != 0 && dhcp_receiver_->isRunning());
1289  }
1290 
1304  bool configureDHCPPacketQueue(const uint16_t family,
1305  data::ConstElementPtr queue_control);
1306 
1314  static void addFDtoSet(int fd, int& maxfd, fd_set* sockets);
1315 
1316  // don't use private, we need derived classes in tests
1317 protected:
1318 
1323  IfaceMgr();
1324 
1338  int openSocket4(Iface& iface, const isc::asiolink::IOAddress& addr,
1339  const uint16_t port, const bool receive_bcast = false,
1340  const bool send_bcast = false);
1341 
1362  Pkt4Ptr receive4Direct(uint32_t timeout_sec, uint32_t timeout_usec = 0);
1363 
1384  Pkt4Ptr receive4Indirect(uint32_t timeout_sec, uint32_t timeout_usec = 0);
1385 
1400  int openSocket6(Iface& iface, const isc::asiolink::IOAddress& addr,
1401  uint16_t port, const bool join_multicast);
1402 
1423  Pkt6Ptr receive6Direct(uint32_t timeout_sec, uint32_t timeout_usec = 0);
1424 
1445  Pkt6Ptr receive6Indirect(uint32_t timeout_sec, uint32_t timeout_usec = 0);
1446 
1447 
1454  void stubDetectIfaces();
1455 
1458 
1461 
1462  // TODO: Also keep this interface on Iface once interface detection
1463  // is implemented. We may need it e.g. to close all sockets on
1464  // specific interface
1465  //int recvsock_; // TODO: should be fd_set eventually, but we have only
1466  //int sendsock_; // 2 sockets for now. Will do for until next release
1467 
1468  // We can't use the same socket, as receiving socket
1469  // is bound to multicast address. And we all know what happens
1470  // to people who try to use multicast as source address.
1471 
1472 private:
1488  getLocalAddress(const isc::asiolink::IOAddress& remote_addr,
1489  const uint16_t port);
1490 
1491 
1509  bool openMulticastSocket(Iface& iface,
1510  const isc::asiolink::IOAddress& addr,
1511  const uint16_t port,
1512  IfaceMgrErrorMsgCallback error_handler = 0);
1513 
1523  void receiveDHCP4Packets();
1524 
1535  void receiveDHCP4Packet(Iface& iface, const SocketInfo& socket_info);
1536 
1546  void receiveDHCP6Packets();
1547 
1557  void receiveDHCP6Packet(const SocketInfo& socket_info);
1558 
1562  void deleteExternalSocketInternal(int socketfd);
1563 
1572  PktFilterPtr packet_filter_;
1573 
1578  PktFilter6Ptr packet_filter6_;
1579 
1581  SocketCallbackInfoContainer callbacks_;
1582 
1584  std::mutex callbacks_mutex_;
1585 
1587  bool test_mode_;
1588 
1590  bool allow_loopback_;
1591 
1593  PacketQueueMgr4Ptr packet_queue_mgr4_;
1594 
1596  PacketQueueMgr6Ptr packet_queue_mgr6_;
1597 
1599  isc::util::WatchedThreadPtr dhcp_receiver_;
1600 };
1601 
1602 } // namespace isc::dhcp
1603 } // namespace isc
1604 
1605 #endif // IFACE_MGR_H
This is a base class for exceptions thrown from the DNS library module.
virtual const char * what() const
Returns a C-style character string of the cause of the exception.
Collection of pointers to network interfaces.
Definition: iface_mgr.h:490
boost::multi_index_container< IfacePtr, boost::multi_index::indexed_by< boost::multi_index::sequenced<>, boost::multi_index::hashed_unique< boost::multi_index::const_mem_fun< Iface, unsigned int, &Iface::getIndex > >, boost::multi_index::hashed_unique< boost::multi_index::const_mem_fun< Iface, std::string, &Iface::getName > > > > IfaceContainer
Multi index container for network interfaces.
Definition: iface_mgr.h:525
IfacePtr getIface(const unsigned int ifindex)
Lookup by interface index.
Definition: iface_mgr.cc:835
IfaceContainer::const_iterator end() const
End iterator.
Definition: iface_mgr.h:537
void clear()
Clear the collection.
Definition: iface_mgr.h:556
IfaceContainer::const_iterator begin() const
Begin iterator.
Definition: iface_mgr.h:530
size_t size() const
Return the number of interfaces.
Definition: iface_mgr.h:551
void push_back(const IfacePtr &iface)
Adds an interface to the collection.
Definition: iface_mgr.h:566
bool empty() const
Empty predicate.
Definition: iface_mgr.h:544
IfaceMgr exception thrown thrown when interface detection fails.
Definition: iface_mgr.h:41
IfaceDetectError(const char *file, size_t line, const char *what)
Definition: iface_mgr.h:43
Handles network interfaces, transmission and reception.
Definition: iface_mgr.h:656
void clearIfaces()
Removes detected interfaces.
Definition: iface_mgr.cc:925
static void addFDtoSet(int fd, int &maxfd, fd_set *sockets)
Convenience method for adding an descriptor to a set.
Definition: iface_mgr.cc:1413
int purgeBadSockets()
Scans registered socket set and removes any that are invalid.
Definition: iface_mgr.cc:365
void deleteExternalSocket(int socketfd)
Deletes external socket.
Definition: iface_mgr.cc:348
Pkt6Ptr receive6Indirect(uint32_t timeout_sec, uint32_t timeout_usec=0)
Receive IPv6 packets indirectly or data from external sockets.
Definition: iface_mgr.cc:1547
PacketQueueMgr6Ptr getPacketQueueMgr6()
Fetches the DHCPv6 packet queue manager.
Definition: iface_mgr.h:1253
bool openSockets4(const uint16_t port=DHCP4_SERVER_PORT, const bool use_bcast=true, IfaceMgrErrorMsgCallback error_handler=0, const bool skip_opened=false)
Opens IPv4 sockets on detected interfaces.
Definition: iface_mgr.cc:519
std::function< void(int fd)> SocketCallback
Defines callback used when data is received over external sockets.
Definition: iface_mgr.h:660
int openSocket(const std::string &ifname, const isc::asiolink::IOAddress &addr, const uint16_t port, const bool receive_bcast=false, const bool send_bcast=false)
Opens UDP/IP socket and binds it to address, interface and port.
Definition: iface_mgr.cc:956
int openSocketFromAddress(const isc::asiolink::IOAddress &addr, const uint16_t port)
Opens UDP/IP socket and binds to address specified.
Definition: iface_mgr.cc:1016
void printIfaces(std::ostream &out=std::cout)
Debugging method that prints out all available interfaces.
Definition: iface_mgr.cc:811
uint16_t countIfaces()
Returns number of detected interfaces.
Definition: iface_mgr.h:1112
IfacePtr getIface(const unsigned int ifindex)
Returns interface specified interface index.
Definition: iface_mgr.cc:903
int openSocket4(Iface &iface, const isc::asiolink::IOAddress &addr, const uint16_t port, const bool receive_bcast=false, const bool send_bcast=false)
Opens IPv4 socket.
Definition: iface_mgr.cc:1113
bool openSockets6(const uint16_t port=DHCP6_SERVER_PORT, IfaceMgrErrorMsgCallback error_handler=0, const bool skip_opened=false)
Opens IPv6 sockets on detected interfaces.
Definition: iface_mgr.cc:649
BoundAddresses bound_address_
Unordered set of IPv4 bound addresses.
Definition: iface_mgr.h:1460
void setPacketFilter(const PktFilterPtr &packet_filter)
Set packet filter object to handle sending and receiving DHCPv4 messages.
Definition: iface_mgr.cc:389
int openSocketFromIface(const std::string &ifname, const uint16_t port, const uint8_t family)
Opens UDP/IP socket and binds it to interface specified.
Definition: iface_mgr.cc:975
Pkt6Ptr receive6(uint32_t timeout_sec, uint32_t timeout_usec=0)
Receive IPv4 packets or data from external sockets.
Definition: iface_mgr.cc:1404
void detectIfaces(bool update_only=false)
Detects network interfaces.
IfaceCollection ifaces_
List of available interfaces.
Definition: iface_mgr.h:1457
void startDHCPReceiver(const uint16_t family)
Starts DHCP packet receiver.
Definition: iface_mgr.cc:765
PacketQueueMgr4Ptr getPacketQueueMgr4()
Fetches the DHCPv4 packet queue manager.
Definition: iface_mgr.h:1236
void clearUnicasts()
Clears unicast addresses on all interfaces.
Definition: iface_mgr.cc:950
static IfaceMgr & instance()
IfaceMgr is a singleton class.
Definition: iface_mgr.cc:53
bool isDHCPReceiverRunning() const
Returns true if there is a receiver exists and its thread is currently running.
Definition: iface_mgr.h:1287
bool hasOpenSocket(const uint16_t family) const
Checks if there is at least one socket of the specified family open.
Definition: iface_mgr.cc:431
virtual ~IfaceMgr()
Destructor.
Definition: iface_mgr.cc:315
void collectBoundAddresses()
Collect the addresses all sockets are bound to.
Definition: iface_mgr.cc:935
int openSocket6(Iface &iface, const isc::asiolink::IOAddress &addr, uint16_t port, const bool join_multicast)
Opens IPv6 socket.
bool isTestMode() const
Checks if the IfaceMgr is in the test mode.
Definition: iface_mgr.h:722
bool configureDHCPPacketQueue(const uint16_t family, data::ConstElementPtr queue_control)
Configures DHCP packet queue.
Definition: iface_mgr.cc:1968
void stubDetectIfaces()
Stub implementation of network interface detection.
Definition: iface_mgr.cc:480
int openSocketFromRemoteAddress(const isc::asiolink::IOAddress &remote_addr, const uint16_t port)
Opens UDP/IP socket to be used to connect to remote address.
Definition: iface_mgr.cc:1039
std::list< SocketCallbackInfo > SocketCallbackInfoContainer
Defines storage container for callbacks for external sockets.
Definition: iface_mgr.h:672
Pkt6Ptr receive6Direct(uint32_t timeout_sec, uint32_t timeout_usec=0)
Receive IPv6 packets directly or data from external sockets.
Definition: iface_mgr.cc:1425
bool isDirectResponseSupported() const
Check if packet be sent directly to the client having no address.
Definition: iface_mgr.cc:320
void clearBoundAddresses()
Clears the addresses all sockets are bound to.
Definition: iface_mgr.cc:930
void addExternalSocket(int socketfd, SocketCallback callback)
Adds external socket and a callback.
Definition: iface_mgr.cc:325
void addInterface(const IfacePtr &iface)
Adds an interface to list of known interfaces.
Definition: iface_mgr.cc:798
IfaceMgr()
Protected constructor.
Definition: iface_mgr.cc:185
bool send(const Pkt6Ptr &pkt)
Sends an IPv6 packet.
Definition: iface_mgr.cc:1124
Pkt4Ptr receive4Indirect(uint32_t timeout_sec, uint32_t timeout_usec=0)
Receive IPv4 packets indirectly or data from external sockets.
Definition: iface_mgr.cc:1157
void closeSockets()
Closes all open sockets.
Definition: iface_mgr.cc:287
const IfaceCollection & getIfaces()
Returns container with all interfaces.
Definition: iface_mgr.h:781
PacketQueue6Ptr getPacketQueue6()
Fetches the DHCPv6 receiver packet queue.
Definition: iface_mgr.h:1263
static const IfaceMgrPtr & instancePtr()
Returns pointer to the sole instance of the interface manager.
Definition: iface_mgr.cc:58
static const uint32_t RCVBUFSIZE
Packet reception buffer size.
Definition: iface_mgr.h:681
void deleteAllExternalSockets()
Deletes all external sockets.
Definition: iface_mgr.cc:383
void setMatchingPacketFilter(const bool direct_response_desired=false)
Set Packet Filter object to handle send/receive packets.
void stopDHCPReceiver()
Stops the DHCP packet receiver.
Definition: iface_mgr.cc:299
Pkt4Ptr receive4Direct(uint32_t timeout_sec, uint32_t timeout_usec=0)
Receive IPv4 packets directly or data from external sockets.
Definition: iface_mgr.cc:1279
void setTestMode(const bool test_mode)
Sets or clears the test mode for IfaceMgr.
Definition: iface_mgr.h:715
PacketQueue4Ptr getPacketQueue4()
Fetches the DHCPv4 receiver packet queue.
Definition: iface_mgr.h:1246
uint16_t getSocket(const isc::dhcp::Pkt6Ptr &pkt)
Return most suitable socket for transmitting specified IPv6 packet.
Definition: iface_mgr.cc:1878
void setAllowLoopBack(const bool allow_loopback)
Allows or disallows the loopback interface.
Definition: iface_mgr.h:731
Pkt4Ptr receive4(uint32_t timeout_sec, uint32_t timeout_usec=0)
Receive IPv4 packets or data from external sockets.
Definition: iface_mgr.cc:1149
IfaceMgr exception thrown when there is no suitable interface.
Definition: iface_mgr.h:86
IfaceNotFound(const char *file, size_t line, const char *what)
Definition: iface_mgr.h:88
Represents a single network interface.
Definition: iface_mgr.h:118
size_t getReadBufferSize() const
Returns the current size of the socket read buffer.
Definition: iface_mgr.h:387
std::string getPlainMac() const
Returns link-layer address a plain text.
Definition: iface_mgr.cc:130
size_t getMacLen() const
Returns MAC length.
Definition: iface_mgr.h:199
uint64_t flags_
Interface flags (this value is as is returned by OS, it may mean different things on different OSes).
Definition: iface_mgr.h:460
bool inactive4_
Indicates that IPv4 sockets should (true) or should not (false) be opened on this interface.
Definition: iface_mgr.h:464
size_t mac_len_
Length of link-layer address (usually 6).
Definition: iface_mgr.h:431
~Iface()
Destructor.
Definition: iface_mgr.h:154
void clearErrors()
Clears all errors.
Definition: iface_mgr.cc:2009
AddressCollection addrs_
List of assigned addresses.
Definition: iface_mgr.h:422
ErrorBuffer const & getErrors() const
Get the consistent list of error messages.
Definition: iface_mgr.cc:2014
std::vector< std::string > ErrorBuffer
Type definition for a list of error messages.
Definition: iface_mgr.h:142
std::string getFullName() const
Returns full interface name as "ifname/ifindex" string.
Definition: iface_mgr.cc:123
unsigned int ifindex_
Interface index (a value that uniquely identifies an interface).
Definition: iface_mgr.h:419
std::string name_
Network interface name.
Definition: iface_mgr.h:416
uint16_t hardware_type_
Hardware type.
Definition: iface_mgr.h:434
SocketCollection sockets_
Socket used to send data.
Definition: iface_mgr.h:413
bool flag_multicast_
Flag specifies if selected interface is multicast capable.
Definition: iface_mgr.h:451
void setActive(const isc::asiolink::IOAddress &address, const bool active)
Activates or deactivates address for the interface.
Definition: iface_mgr.cc:256
void addError(std::string const &message)
Add an error to the list of messages.
Definition: iface_mgr.cc:2004
std::string getName() const
Returns interface name.
Definition: iface_mgr.h:224
void setFlags(uint64_t flags)
Sets flag_*_ fields based on bitmask value returned by OS.
void clearUnicasts()
Removes any unicast addresses.
Definition: iface_mgr.h:353
Iface(const std::string &name, unsigned int ifindex)
Iface constructor.
Definition: iface_mgr.cc:63
uint16_t getHWType() const
Returns hardware type of the interface.
Definition: iface_mgr.h:234
bool delAddress(const isc::asiolink::IOAddress &addr)
Deletes an address from an interface.
Definition: iface_mgr.cc:157
unsigned int getIndex() const
Returns interface index.
Definition: iface_mgr.h:219
bool hasAddress(const isc::asiolink::IOAddress &address) const
Check if the interface has the specified address assigned.
Definition: iface_mgr.cc:239
void setMac(const uint8_t *mac, size_t macLen)
Sets MAC address of the interface.
Definition: iface_mgr.cc:144
bool flag_running_
Flag specifies if selected interface is running (e.g.
Definition: iface_mgr.h:448
void resizeReadBuffer(const size_t new_size)
Reallocates the socket read buffer.
Definition: iface_mgr.h:394
bool delSocket(uint16_t sockfd)
Closes socket.
Definition: iface_mgr.cc:168
std::list< Address > AddressCollection
Type that defines list of addresses.
Definition: iface_mgr.h:128
bool inactive6_
Indicates that IPv6 sockets should (true) or should not (false) be opened on this interface.
Definition: iface_mgr.h:468
std::list< SocketInfo > SocketCollection
Type that holds a list of socket information.
Definition: iface_mgr.h:139
static const unsigned int MAX_MAC_LEN
Maximum MAC address length (Infiniband uses 20 bytes)
Definition: iface_mgr.h:122
bool flag_loopback_
Specifies if selected interface is loopback.
Definition: iface_mgr.h:441
void addUnicast(const isc::asiolink::IOAddress &addr)
Adds unicast the server should listen on.
Definition: iface_mgr.cc:212
unsigned int countActive4() const
Returns a number of activated IPv4 addresses on the interface.
Definition: iface_mgr.cc:277
uint8_t mac_[MAX_MAC_LEN]
Link-layer address.
Definition: iface_mgr.h:428
uint8_t * getReadBuffer()
Returns the pointer to the buffer used for data reading.
Definition: iface_mgr.h:379
const uint8_t * getMac() const
Returns pointer to MAC address.
Definition: iface_mgr.h:205
const AddressCollection & getUnicasts() const
Returns a container of addresses the server should listen on.
Definition: iface_mgr.h:366
util::Optional< asiolink::IOAddress > Address
Address type.
Definition: iface_mgr.h:125
void addAddress(const isc::asiolink::IOAddress &addr)
Adds an address to an interface.
Definition: iface_mgr.cc:249
void closeSockets()
Closes all open sockets on interface.
Definition: iface_mgr.cc:76
void addSocket(const SocketInfo &sock)
Adds socket descriptor to an interface.
Definition: iface_mgr.h:321
const SocketCollection & getSockets() const
Returns collection of all sockets added to interface.
Definition: iface_mgr.h:347
bool flag_up_
Specifies if selected interface is up.
Definition: iface_mgr.h:444
const AddressCollection & getAddresses() const
Returns all addresses available on an interface.
Definition: iface_mgr.h:254
bool flag_broadcast_
Flag specifies if selected interface is broadcast capable.
Definition: iface_mgr.h:454
void setHWType(uint16_t type)
Sets up hardware type of the interface.
Definition: iface_mgr.h:229
AddressCollection unicasts_
List of unicast addresses the server should listen on.
Definition: iface_mgr.h:425
bool getAddress4(isc::asiolink::IOAddress &address) const
Returns IPv4 address assigned to the interface.
Definition: iface_mgr.cc:223
Exception thrown when it is not allowed to set new Packet Filter.
Definition: iface_mgr.h:48
PacketFilterChangeDenied(const char *file, size_t line, const char *what)
Definition: iface_mgr.h:50
Exception thrown when a call to select is interrupted by a signal.
Definition: iface_mgr.h:55
SignalInterruptOnSelect(const char *file, size_t line, const char *what)
Definition: iface_mgr.h:57
IfaceMgr exception thrown thrown when socket opening or configuration failed.
Definition: iface_mgr.h:63
SocketConfigError(const char *file, size_t line, const char *what)
Definition: iface_mgr.h:65
IfaceMgr exception thrown when there is no suitable socket found.
Definition: iface_mgr.h:93
SocketNotFound(const char *file, size_t line, const char *what)
Definition: iface_mgr.h:95
IfaceMgr exception thrown thrown when error occurred during reading data from socket.
Definition: iface_mgr.h:71
SocketReadError(const char *file, size_t line, const char *what)
Definition: iface_mgr.h:73
IfaceMgr exception thrown thrown when error occurred during sending data through socket.
Definition: iface_mgr.h:79
SocketWriteError(const char *file, size_t line, const char *what)
Definition: iface_mgr.h:81
A template representing an optional value.
Definition: optional.h:36
boost::shared_ptr< const Element > ConstElementPtr
Definition: data.h:29
boost::shared_ptr< isc::dhcp::Pkt > PktPtr
A pointer to either Pkt4 or Pkt6 packet.
Definition: pkt.h:859
boost::shared_ptr< IfaceMgr > IfaceMgrPtr
Type definition for the pointer to the IfaceMgr.
Definition: iface_mgr.h:638
boost::shared_ptr< PacketQueue< Pkt4Ptr > > PacketQueue4Ptr
Defines pointer to the DHCPv4 queue interface used at the application level.
Definition: packet_queue.h:131
boost::shared_ptr< Pkt4 > Pkt4Ptr
A pointer to Pkt4 object.
Definition: pkt4.h:547
boost::shared_ptr< PktFilter > PktFilterPtr
Pointer to a PktFilter object.
Definition: pkt_filter.h:134
boost::shared_ptr< Iface > IfacePtr
Type definition for the pointer to an Iface object.
Definition: iface_mgr.h:487
boost::multi_index_container< asiolink::IOAddress, boost::multi_index::indexed_by< boost::multi_index::hashed_unique< boost::multi_index::const_mem_fun< asiolink::IOAddress, uint32_t, &asiolink::IOAddress::toUint32 > > >> BoundAddresses
Type definition for the unordered set of IPv4 bound addresses.
Definition: iface_mgr.h:635
std::function< void(const std::string &errmsg)> IfaceMgrErrorMsgCallback
This type describes the callback function invoked when error occurs in the IfaceMgr.
Definition: iface_mgr.h:648
boost::shared_ptr< PacketQueue< Pkt6Ptr > > PacketQueue6Ptr
Defines pointer to the DHCPv6 queue interface used at the application level.
Definition: packet_queue.h:136
boost::shared_ptr< Pkt6 > Pkt6Ptr
A pointer to Pkt6 packet.
Definition: pkt6.h:28
boost::shared_ptr< PktFilter6 > PktFilter6Ptr
Pointer to a PktFilter object.
Definition: pkt_filter6.h:136
boost::shared_ptr< PacketQueueMgr4 > PacketQueueMgr4Ptr
Defines a shared pointer to PacketQueueMgr4.
boost::shared_ptr< PacketQueueMgr6 > PacketQueueMgr6Ptr
Defines a shared pointer to PacketQueueMgr6.
boost::shared_ptr< WatchedThread > WatchedThreadPtr
Defines a pointer to a WatchedThread.
Defines the logger used by the top-level component of kea-lfc.
Keeps callback information for external sockets.
Definition: iface_mgr.h:663
SocketCallback callback_
A callback that will be called when data arrives over socket_.
Definition: iface_mgr.h:668
int socket_
Socket descriptor of the external socket.
Definition: iface_mgr.h:665
Holds information about socket.
Definition: socket_info.h:19
Defines the class, WatchSocket.