summaryrefslogtreecommitdiffstats
path: root/src/lib/dhcpsrv/dhcp4o6_ipc.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/dhcpsrv/dhcp4o6_ipc.h')
-rw-r--r--src/lib/dhcpsrv/dhcp4o6_ipc.h131
1 files changed, 131 insertions, 0 deletions
diff --git a/src/lib/dhcpsrv/dhcp4o6_ipc.h b/src/lib/dhcpsrv/dhcp4o6_ipc.h
new file mode 100644
index 0000000..d67f2d2
--- /dev/null
+++ b/src/lib/dhcpsrv/dhcp4o6_ipc.h
@@ -0,0 +1,131 @@
+// Copyright (C) 2015-2017 Internet Systems Consortium, Inc. ("ISC")
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef DHCP4O6_IPC_H
+#define DHCP4O6_IPC_H
+
+/// @file dhcp4o6_ipc.h Defines the Dhcp4o6IpcBase class.
+/// This file defines the class Kea uses as a base for
+/// DHCPv4-over-DHCPv6 communication between servers.
+///
+
+#include <exceptions/exceptions.h>
+#include <dhcp/pkt6.h>
+#include <boost/noncopyable.hpp>
+#include <stdint.h>
+
+namespace isc {
+namespace dhcp {
+
+/// @brief Exception thrown when error occurs as a result of use of IPC.
+class Dhcp4o6IpcError : public Exception {
+public:
+ Dhcp4o6IpcError(const char* file, size_t line, const char* what) :
+ isc::Exception(file, line, what) { };
+};
+
+/// @brief This class implements the communication between the DHCPv4
+/// and DHCPv6 servers to allow for transmission of the DHCPv4 query
+/// and DHCPv4 response messages.
+///
+/// When the DHCPv6 server receives the DHCPv4 query message it needs
+/// to forward it to the DHCPv4 server for processing. The DHCPv4
+/// server processes the message and answers with the DHCPv4 response
+/// message to the DHCPv6 server. The server forwards it back to the
+/// client. This class implements the communication between the DHCPv4
+/// and DHCPv6 servers to allow for transmission of the DHCPv4 query
+/// and DHCPv6 response messages.
+///
+/// This class creates a socket (when @c open is called) and binds it
+/// to a port, depending on the configuration. The port number is
+/// explicitly specified in the server configuration. This explicit
+/// port value is used directly on the DHCPv6 server side. The DHCPv4
+/// server uses the port specified + 1.
+///
+/// The DHCPv4 and DHCPv6 servers use distinct instances of classes derived
+/// from this base class. Each of these instances is used to send and
+/// receive messages sent by the other server.
+///
+/// In order to make address allocation decisions, the DHCPv4 server
+/// requires information about the interface and the source address of
+/// the original DHCPv4 query message sent by the client. This
+/// information is known by the DHCPv6 server and needs to be conveyed
+/// to the DHCPv4 server. The IPC conveys it in the
+/// @c ISC_V6_4O6_INTERFACE, @c ISC_V6_4O6_SRC_ADDRESS and @c
+/// ISC_V6_4O6_SRC_PORT options within the Vendor Specific Information
+/// option, with ISC enterprise id. These options are added by the IPC
+/// sender and removed by the IPC receiver.
+class Dhcp4o6IpcBase : public boost::noncopyable {
+public:
+
+ /// @brief Endpoint type: DHCPv4 or DHCPv6 server.
+ enum EndpointType {
+ ENDPOINT_TYPE_V4 = 4,
+ ENDPOINT_TYPE_V6 = 6
+ };
+
+protected:
+ /// @brief Constructor
+ ///
+ /// Default constructor
+ Dhcp4o6IpcBase();
+
+ /// @brief Destructor.
+ virtual ~Dhcp4o6IpcBase();
+
+ /// @brief Open communication socket (from base class).
+ ///
+ /// @param port Port number to use. The socket is bound to this port
+ /// if the endpoint type is DHCPv6 server, otherwise the port + 1
+ /// value is used.
+ /// @param endpoint_type Endpoint type (DHCPv4 or DHCPv6 server).
+ ///
+ /// @return New socket descriptor.
+ /// @throw isc::dhcp::Dhcp4o6IpcError on system call errors.
+ int open(uint16_t port, EndpointType endpoint_type);
+
+public:
+
+ /// @brief Open communication socket (for derived classes).
+ virtual void open() = 0;
+
+ /// @brief Close communication socket.
+ void close();
+
+ /// @brief Receive message over IPC.
+ ///
+ /// @return a pointer to a DHCPv6 message with interface and remote
+ /// address set from the IPC message
+ /// @throw isc::dhcp::Dhcp4o6IpcError on system call error or
+ /// malformed packets.
+ Pkt6Ptr receive();
+
+ /// @brief Send message over IPC.
+ ///
+ /// The IPC uses @c ISC_V6_4O6_INTERFACE, @c ISC_V6_4O6_SRC_ADDRESS
+ /// and @c ISC_V6_4O6_SRC_PORT options conveyed within the Vendor
+ /// Specific Information option, with ISC enterprise id, to communicate
+ /// the client remote address and the interface on which the DHCPv4 query
+ /// was received. These options will be removed by the receiver.
+ ///
+ /// @param pkt Pointer to a DHCPv6 message with interface and remote
+ /// address.
+ /// @throw isc::dhcp::Dhcp4o6IpcError.
+ void send(const Pkt6Ptr& pkt);
+
+protected:
+
+ /// @brief Port number configured for IPC communication.
+ uint16_t port_;
+
+ /// @brief Socket descriptor.
+ int socket_fd_;
+};
+
+} // namespace isc
+} // namespace dhcp
+
+#endif