23 #include <boost/function.hpp> 24 #include <boost/noncopyable.hpp> 25 #include <boost/scoped_array.hpp> 26 #include <boost/shared_ptr.hpp> 114 class Iface :
public boost::noncopyable {
143 Iface(
const std::string& name,
int ifindex);
186 void setMac(
const uint8_t* mac,
size_t macLen);
372 if (read_buffer_.empty()) {
375 return (&read_buffer_[0]);
380 return (read_buffer_.size());
387 read_buffer_.resize(new_size);
454 std::vector<uint8_t> read_buffer_;
544 test_mode_ = test_mode;
560 allow_loopback_ = allow_loopback;
725 const bool receive_bcast =
false,
726 const bool send_bcast =
false);
747 const uint8_t family);
764 const uint16_t port);
781 const uint16_t port);
829 bool openSockets6(
const uint16_t port = DHCP6_SERVER_PORT,
900 bool openSockets4(
const uint16_t port = DHCP4_SERVER_PORT,
901 const bool use_bcast =
true,
1023 return (packet_queue_mgr4_);
1033 return (packet_queue_mgr4_->getPacketQueue());
1040 return (packet_queue_mgr6_);
1050 return (packet_queue_mgr6_->getPacketQueue());
1074 return (dhcp_receiver_ != 0 && dhcp_receiver_->isRunning());
1100 static void addFDtoSet(
int fd,
int& maxfd, fd_set* sockets);
1125 const uint16_t port,
const bool receive_bcast =
false,
1126 const bool send_bcast =
false);
1187 uint16_t port,
const bool join_multicast);
1275 const uint16_t port);
1295 bool openMulticastSocket(
Iface& iface,
1297 const uint16_t port,
1309 void receiveDHCP4Packets();
1332 void receiveDHCP6Packets();
1343 void receiveDHCP6Packet(
const SocketInfo& socket_info);
1368 bool allow_loopback_;
1383 #endif // IFACE_MGR_H SocketCallback callback_
A callback that will be called when data arrives over socket_.
std::list< IfacePtr > IfaceCollection
Type that holds a list of pointers to interfaces.
void clearIfaces()
Removes detected interfaces.
IfacePtr getIface(int ifindex)
Returns interface specified interface index.
int openSocketFromRemoteAddress(const isc::asiolink::IOAddress &remote_addr, const uint16_t port)
Opens UDP/IP socket to be used to connect to remote address.
boost::shared_ptr< WatchedThread > WatchedThreadPtr
Defines a pointer to a WatchedThread.
bool isTestMode() const
Checks if the IfaceMgr is in the test mode.
Pkt4Ptr receive4Direct(uint32_t timeout_sec, uint32_t timeout_usec=0)
Receive IPv4 packets directly or data from external sockets.
void setAllowLoopBack(const bool allow_loopback)
Allows or disallows the loopback interface.
Simple class representing an optional value.
IfaceMgr exception thrown thrown when socket opening or configuration failed.
void setFlags(uint64_t flags)
Sets flag_*_ fields based on bitmask value returned by OS.
uint64_t flags_
Interface flags (this value is as is returned by OS, it may mean different things on different OSes).
bool hasAddress(const isc::asiolink::IOAddress &address) const
Check if the interface has the specified address assigned.
void addSocket(const SocketInfo &sock)
Adds socket descriptor to an interface.
IfaceMgr exception thrown when there is no suitable socket found.
void setPacketFilter(const PktFilterPtr &packet_filter)
Set packet filter object to handle sending and receiving DHCPv4 messages.
util::OptionalValue< asiolink::IOAddress > Address
Address type.
static const unsigned int MAX_MAC_LEN
Maximum MAC address length (Infiniband uses 20 bytes)
size_t mac_len_
Length of link-layer address (usually 6).
PacketQueueMgr4Ptr getPacketQueueMgr4()
Fetches the DHCPv4 packet queue manager.
Pkt6Ptr receive6Indirect(uint32_t timeout_sec, uint32_t timeout_usec=0)
Receive IPv6 packets indirectly or data from external sockets.
void addExternalSocket(int socketfd, SocketCallback callback)
Adds external socket and a callback.
bool delSocket(uint16_t sockfd)
Closes socket.
IfaceMgr exception thrown thrown when interface detection fails.
bool flag_up_
Specifies if selected interface is up.
void addUnicast(const isc::asiolink::IOAddress &addr)
Adds unicast the server should listen on.
void setHWType(uint16_t type)
Sets up hardware type of the interface.
boost::shared_ptr< Iface > IfacePtr
void startDHCPReceiver(const uint16_t family)
Starts DHCP packet receiver.
int ifindex_
Interface index (a value that uniquely identifies an interface).
bool flag_loopback_
Specifies if selected interface is loopback.
Represents a DHCPv6 packet.
void setActive(const isc::asiolink::IOAddress &address, const bool active)
Activates or deactivates address for the interface.
std::list< SocketInfo > SocketCollection
Type that holds a list of socket information.
AddressCollection unicasts_
List of unicast addresses the server should listen on.
bool openSockets6(const uint16_t port=DHCP6_SERVER_PORT, IfaceMgrErrorMsgCallback error_handler=0)
Opens IPv6 sockets on detected interfaces.
PacketQueue6Ptr getPacketQueue6()
Fetches the DHCPv6 receiver packet queue.
size_t getMacLen() const
Returns MAC length.
Handles network interfaces, transmission and reception.
Represents a single network interface.
SocketWriteError(const char *file, size_t line, const char *what)
int openSocketFromAddress(const isc::asiolink::IOAddress &addr, const uint16_t port)
Opens UDP/IP socket and binds to address specified.
boost::shared_ptr< PacketQueueMgr6 > PacketQueueMgr6Ptr
Defines a shared pointer to PacketQueueMgr6.
virtual const char * what() const
Returns a C-style character string of the cause of the exception.
boost::shared_ptr< PktFilter > PktFilterPtr
Pointer to a PktFilter object.
boost::shared_ptr< PacketQueue< Pkt4Ptr > > PacketQueue4Ptr
Defines pointer to the DHCPv4 queue interface used at the application level.
const IfaceCollection & getIfaces()
Returns container with all interfaces.
const uint8_t * getMac() const
Returns pointer to MAC address.
Defines the class, WatchSocket.
bool send(const Pkt6Ptr &pkt)
Sends an IPv6 packet.
void closeSockets()
Closes all open sockets on interface.
void setMatchingPacketFilter(const bool direct_response_desired=false)
Set Packet Filter object to handle send/receive packets.
size_t getReadBufferSize() const
Returns the current size of the socket read buffer.
Keeps callback information for external sockets.
boost::shared_ptr< Pkt6 > Pkt6Ptr
A pointer to Pkt6 packet.
std::string getPlainMac() const
Returns link-layer address a plain text.
Pkt4Ptr receive4(uint32_t timeout_sec, uint32_t timeout_usec=0)
Receive IPv4 packets or data from external sockets.
bool inactive6_
Indicates that IPv6 sockets should (true) or should not (false) be opened on this interface.
bool flag_multicast_
Flag specifies if selected interface is multicast capable.
IfaceMgr exception thrown when there is no suitable interface.
uint16_t getHWType() const
Returns hardware type of the interface.
void deleteExternalSocket(int socketfd)
Deletes external socket.
unsigned int countActive4() const
Returns a number of activated IPv4 addresses on the interface.
bool hasOpenSocket(const uint16_t family) const
Checks if there is at least one socket of the specified family open.
boost::function< void(const std::string &errmsg)> IfaceMgrErrorMsgCallback
This type describes the callback function invoked when error occurs in the IfaceMgr.
boost::function< void()> SocketCallback
Defines callback used when data is received over external sockets.
static const IfaceMgrPtr & instancePtr()
Returns pointer to the sole instance of the interface manager.
boost::shared_ptr< Pkt4 > Pkt4Ptr
A pointer to Pkt4 object.
boost::shared_ptr< const Element > ConstElementPtr
void clearUnicasts()
Clears unicast addresses on all interfaces.
boost::shared_ptr< PacketQueue< Pkt6Ptr > > PacketQueue6Ptr
Defines pointer to the DHCPv6 queue interface used at the application level.
std::string getName() const
Returns interface name.
IfaceMgr exception thrown thrown when error occurred during reading data from socket.
bool flag_broadcast_
Flag specifies if selected interface is broadcast capable.
void deleteAllExternalSockets()
Deletes all external sockets.
void addInterface(const IfacePtr &iface)
Adds an interface to list of known interfaces.
const AddressCollection & getUnicasts() const
Returns a container of addresses the server should listen on.
PacketQueueMgr6Ptr getPacketQueueMgr6()
Fetches the DHCPv6 packet queue manager.
static const uint32_t RCVBUFSIZE
Packet reception buffer size.
This is a base class for exceptions thrown from the DNS library module.
Defines the logger used by the top-level component of kea-dhcp-ddns.
AddressCollection addrs_
List of assigned addresses.
bool inactive4_
Indicates that IPv4 sockets should (true) or should not (false) be opened on this interface.
std::list< Address > AddressCollection
Type that defines list of addresses.
IfaceNotFound(const char *file, size_t line, const char *what)
Represents DHCPv4 packet.
boost::shared_ptr< PktFilter6 > PktFilter6Ptr
Pointer to a PktFilter object.
bool getAddress4(isc::asiolink::IOAddress &address) const
Returns IPv4 address assigned to the interface.
SignalInterruptOnSelect(const char *file, size_t line, const char *what)
Exception thrown when a call to select is interrupted by a signal.
bool flag_running_
Flag specifies if selected interface is running (e.g.
std::string getFullName() const
Returns full interface name as "ifname/ifindex" string.
PacketFilterChangeDenied(const char *file, size_t line, const char *what)
SocketConfigError(const char *file, size_t line, const char *what)
void closeSockets()
Closes all open sockets.
IfaceDetectError(const char *file, size_t line, const char *what)
static IfaceMgr & instance()
IfaceMgr is a singleton class.
bool isDHCPReceiverRunning() const
Returns true if there is a receiver exists and its thread is currently running.
void resizeReadBuffer(const size_t new_size)
Reallocates the socket read buffer.
SocketCollection sockets_
Socket used to send data.
bool delAddress(const isc::asiolink::IOAddress &addr)
Deletes an address from an interface.
SocketNotFound(const char *file, size_t line, const char *what)
uint8_t mac_[MAX_MAC_LEN]
Link-layer address.
uint16_t getIndex() const
Returns interface index.
void detectIfaces()
Detects network interfaces.
void addAddress(const isc::asiolink::IOAddress &addr)
Adds an address to an interface.
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.
virtual ~IfaceMgr()
Destructor.
int openSocketFromIface(const std::string &ifname, const uint16_t port, const uint8_t family)
Opens UDP/IP socket and binds it to interface specified.
static void addFDtoSet(int fd, int &maxfd, fd_set *sockets)
Convenience method for adding an descriptor to a set.
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.
PacketQueue4Ptr getPacketQueue4()
Fetches the DHCPv4 receiver packet queue.
bool isDirectResponseSupported() const
Check if packet be sent directly to the client having no address.
boost::shared_ptr< PacketQueueMgr4 > PacketQueueMgr4Ptr
Defines a shared pointer to PacketQueueMgr4.
IfaceMgr()
Protected constructor.
void clearUnicasts()
Removes any unicast addresses.
const SocketCollection & getSockets() const
Returns collection of all sockets added to interface.
Pkt6Ptr receive6(uint32_t timeout_sec, uint32_t timeout_usec=0)
Receive IPv4 packets or data from external sockets.
void setTestMode(const bool test_mode)
Sets or clears the test mode for IfaceMgr.
The IOAddress class represents an IP addresses (version agnostic)
int openSocket6(Iface &iface, const isc::asiolink::IOAddress &addr, uint16_t port, const bool join_multicast)
Opens IPv6 socket.
Iface(const std::string &name, int ifindex)
Iface constructor.
int socket_
Socket descriptor of the external socket.
void printIfaces(std::ostream &out=std::cout)
Debugging method that prints out all available interfaces.
uint8_t * getReadBuffer()
Returns the pointer to the buffer used for data reading.
Pkt6Ptr receive6Direct(uint32_t timeout_sec, uint32_t timeout_usec=0)
Receive IPv6 packets directly or data from external sockets.
std::string name_
Network interface name.
uint16_t countIfaces()
Returns number of detected interfaces.
uint16_t hardware_type_
Hardware type.
void stopDHCPReceiver()
Stops the DHCP packet receiver.
Pkt4Ptr receive4Indirect(uint32_t timeout_sec, uint32_t timeout_usec=0)
Receive IPv4 packets indirectly or data from external sockets.
boost::shared_ptr< IfaceMgr > IfaceMgrPtr
Type definition for the pointer to the IfaceMgr.
uint16_t getSocket(const isc::dhcp::Pkt6 &pkt)
Return most suitable socket for transmitting specified IPv6 packet.
void stubDetectIfaces()
Stub implementation of network interface detection.
bool openSockets4(const uint16_t port=DHCP4_SERVER_PORT, const bool use_bcast=true, IfaceMgrErrorMsgCallback error_handler=0)
Opens IPv4 sockets on detected interfaces.
const AddressCollection & getAddresses() const
Returns all addresses available on an interface.
IfaceMgr exception thrown thrown when error occurred during sending data through socket.
std::list< SocketCallbackInfo > SocketCallbackInfoContainer
Defines storage container for callbacks for external sockets.
Holds information about socket.
Exception thrown when it is not allowed to set new Packet Filter.
IfaceCollection ifaces_
List of available interfaces.
SocketReadError(const char *file, size_t line, const char *what)
bool configureDHCPPacketQueue(const uint16_t family, data::ConstElementPtr queue_control)
Configures DHCP packet queue.
void setMac(const uint8_t *mac, size_t macLen)
Sets MAC address of the interface.