From b87d5fcc5e20bc7d9cf33b567a70cd823ee2676b Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Thu, 29 Sep 2022 17:58:41 +0200 Subject: [PATCH 1/2] [#2357] Filled dhcp-agent-options-space --- src/lib/dhcp/dhcp4.h | 47 +++++++++++----------- src/lib/dhcp/libdhcp++.cc | 1 + src/lib/dhcp/std_option_defs.h | 50 ++++++++++++++++++++++++ src/lib/dhcp/tests/libdhcp++_unittest.cc | 19 +++++---- 4 files changed, 86 insertions(+), 31 deletions(-) diff --git a/src/lib/dhcp/dhcp4.h b/src/lib/dhcp/dhcp4.h index 042f1e3fda..00da578623 100644 --- a/src/lib/dhcp/dhcp4.h +++ b/src/lib/dhcp/dhcp4.h @@ -259,29 +259,30 @@ static const uint16_t DHCP4_SERVER_PORT = 67; /// extensions field). static const uint32_t DHCP_OPTIONS_COOKIE = 0x63825363; -/* Relay Agent Information option subtypes: */ - -static const uint16_t RAI_OPTION_AGENT_CIRCUIT_ID = 1; // RFC3046 -static const uint16_t RAI_OPTION_REMOTE_ID = 2; // RFC3046 -/* option 3 is reserved and will never be assigned */ -static const uint16_t RAI_OPTION_DOCSIS_DEVICE_CLASS = 4; // RFC3256 -static const uint16_t RAI_OPTION_LINK_SELECTION = 5; // RFC3527 -static const uint16_t RAI_OPTION_SUBSCRIBER_ID = 6; //RFC3993 -static const uint16_t RAI_OPTION_RADIUS = 7; //RFC4014 -static const uint16_t RAI_OPTION_AUTH = 8; //RFC4030 -static const uint16_t RAI_OPTION_VSI = 9; // RFC4243 -static const uint16_t RAI_OPTION_RELAY_FLAGS = 10; // RFC5010 -static const uint16_t RAI_OPTION_SERVER_ID_OVERRIDE = 11; // RFC5107 -static const uint16_t RAI_OPTION_RELAY_ID = 12; //RFC6925 -static const uint16_t RAI_OPTION_ACCESS_TECHNO_TYPE = 13; // RFC7839 -static const uint16_t RAI_OPTION_ACCESS_NETWORK_NAME = 14; // RFC7839 -static const uint16_t RAI_OPTION_ACCESS_POINT_NAME = 15; // RFC7839 -static const uint16_t RAI_OPTION_ACCESS_POINT_BSSID = 16; // RFC7839 -static const uint16_t RAI_OPTION_OPERATOR_ID = 17; // RFC7839 -static const uint16_t RAI_OPTION_OPERATOR_REALM = 18; // RFC7839 -static const uint16_t RAI_OPTION_RELAY_PORT = 19; // RFC8357 -static const uint16_t RAI_OPTION_VIRTUAL_SUBNET_SELECT = 151; //RFC6607 -static const uint16_t RAI_OPTION_VIRTUAL_SUBNET_SELECT_CTRL = 152; //RFC6607 +/// Relay Agent Information suboption types. +enum RAISubOptionType { + RAI_OPTION_AGENT_CIRCUIT_ID = 1, // RFC3046 + RAI_OPTION_REMOTE_ID = 2, // RFC3046 + /* option 3 is reserved and will never be assigned */ + RAI_OPTION_DOCSIS_DEVICE_CLASS = 4, // RFC3256 + RAI_OPTION_LINK_SELECTION = 5, // RFC3527 + RAI_OPTION_SUBSCRIBER_ID = 6, // RFC3993 + RAI_OPTION_RADIUS = 7, // RFC4014 + RAI_OPTION_AUTH = 8, // RFC4030 + RAI_OPTION_VSI = 9, // RFC4243 + RAI_OPTION_RELAY_FLAGS = 10, // RFC5010 + RAI_OPTION_SERVER_ID_OVERRIDE = 11, // RFC5107 + RAI_OPTION_RELAY_ID = 12, // RFC6925 + RAI_OPTION_ACCESS_TECHNO_TYPE = 13, // RFC7839 + RAI_OPTION_ACCESS_NETWORK_NAME = 14, // RFC7839 + RAI_OPTION_ACCESS_POINT_NAME = 15, // RFC7839 + RAI_OPTION_ACCESS_POINT_BSSID = 16, // RFC7839 + RAI_OPTION_OPERATOR_ID = 17, // RFC7839 + RAI_OPTION_OPERATOR_REALM = 18, // RFC7839 + RAI_OPTION_RELAY_PORT = 19, // RFC8357 + RAI_OPTION_VIRTUAL_SUBNET_SELECT = 151, // RFC6607 + RAI_OPTION_VIRTUAL_SUBNET_SELECT_CTRL = 152 // RFC6607 +}; // TODO: Following are leftovers from dhcp.h import from ISC DHCP // They will be converted to C++-style defines once they will start diff --git a/src/lib/dhcp/libdhcp++.cc b/src/lib/dhcp/libdhcp++.cc index 805925dc9a..c74e27f89e 100644 --- a/src/lib/dhcp/libdhcp++.cc +++ b/src/lib/dhcp/libdhcp++.cc @@ -51,6 +51,7 @@ const OptionDefParamsEncapsulation OPTION_DEF_PARAMS[] = { { LW_V6_OPTION_DEFINITIONS, LW_V6_OPTION_DEFINITIONS_SIZE, LW_V6_OPTION_SPACE }, { V4V6_RULE_OPTION_DEFINITIONS, V4V6_RULE_OPTION_DEFINITIONS_SIZE, V4V6_RULE_OPTION_SPACE }, { V4V6_BIND_OPTION_DEFINITIONS, V4V6_BIND_OPTION_DEFINITIONS_SIZE, V4V6_BIND_OPTION_SPACE }, + { DHCP_AGENT_OPTION_DEFINITIONS, DHCP_AGENT_OPTION_DEFINITIONS_SIZE, DHCP_AGENT_OPTION_SPACE }, { LAST_RESORT_V4_OPTION_DEFINITIONS, LAST_RESORT_V4_OPTION_DEFINITIONS_SIZE, LAST_RESORT_V4_OPTION_SPACE }, { NULL, 0, "" } }; diff --git a/src/lib/dhcp/std_option_defs.h b/src/lib/dhcp/std_option_defs.h index a5f527e1a1..a28ca774cf 100644 --- a/src/lib/dhcp/std_option_defs.h +++ b/src/lib/dhcp/std_option_defs.h @@ -377,6 +377,56 @@ const int STANDARD_V4_OPTION_DEFINITIONS_SIZE = sizeof(STANDARD_V4_OPTION_DEFINITIONS) / sizeof(STANDARD_V4_OPTION_DEFINITIONS[0]); +/// Definitions of DHCPv4 agent options. +const OptionDefParams DHCP_AGENT_OPTION_DEFINITIONS[] = { + { "circuit-id", RAI_OPTION_AGENT_CIRCUIT_ID, + DHCP_AGENT_OPTION_SPACE, OPT_STRING_TYPE, false, NO_RECORD_DEF, "" }, + { "remote-id", RAI_OPTION_REMOTE_ID, + DHCP_AGENT_OPTION_SPACE, OPT_STRING_TYPE, false, NO_RECORD_DEF, "" }, + { "docsis-device-class", RAI_OPTION_DOCSIS_DEVICE_CLASS, + DHCP_AGENT_OPTION_SPACE, OPT_UINT32_TYPE, false, NO_RECORD_DEF, "" }, + { "link-selection", RAI_OPTION_LINK_SELECTION, + DHCP_AGENT_OPTION_SPACE, OPT_IPV4_ADDRESS_TYPE, false, + NO_RECORD_DEF, "" }, + { "subscriber-id", RAI_OPTION_SUBSCRIBER_ID, + DHCP_AGENT_OPTION_SPACE, OPT_STRING_TYPE, false, NO_RECORD_DEF, "" }, + { "radius", RAI_OPTION_RADIUS, + DHCP_AGENT_OPTION_SPACE, OPT_BINARY_TYPE, false, NO_RECORD_DEF, "" }, + { "auth", RAI_OPTION_AUTH, + DHCP_AGENT_OPTION_SPACE, OPT_BINARY_TYPE, false, NO_RECORD_DEF, "" }, + { "vendor-specific-info", RAI_OPTION_VSI, + DHCP_AGENT_OPTION_SPACE, OPT_BINARY_TYPE, false, NO_RECORD_DEF, "" }, + { "relay-flags", RAI_OPTION_RELAY_FLAGS, + DHCP_AGENT_OPTION_SPACE, OPT_UINT8_TYPE, false, NO_RECORD_DEF, "" }, + { "server-id-override", RAI_OPTION_SERVER_ID_OVERRIDE, + DHCP_AGENT_OPTION_SPACE, OPT_IPV4_ADDRESS_TYPE, false, + NO_RECORD_DEF, "" }, + { "relay-id", RAI_OPTION_RELAY_ID, + DHCP_AGENT_OPTION_SPACE, OPT_BINARY_TYPE, false, NO_RECORD_DEF, "" }, + { "access-techno-type", RAI_OPTION_ACCESS_TECHNO_TYPE, + DHCP_AGENT_OPTION_SPACE, OPT_UINT16_TYPE, false, NO_RECORD_DEF, "" }, + { "access-network-name", RAI_OPTION_ACCESS_NETWORK_NAME, + DHCP_AGENT_OPTION_SPACE, OPT_STRING_TYPE, false, NO_RECORD_DEF, "" }, + { "access-point-name", RAI_OPTION_ACCESS_POINT_NAME, + DHCP_AGENT_OPTION_SPACE, OPT_STRING_TYPE, false, NO_RECORD_DEF, "" }, + { "access-point-bssid", RAI_OPTION_ACCESS_POINT_BSSID, + DHCP_AGENT_OPTION_SPACE, OPT_BINARY_TYPE, false, NO_RECORD_DEF, "" }, + { "operator-id", RAI_OPTION_OPERATOR_ID, + DHCP_AGENT_OPTION_SPACE, OPT_UINT32_TYPE, false, NO_RECORD_DEF, "" }, + { "operator-realm", RAI_OPTION_OPERATOR_REALM, + DHCP_AGENT_OPTION_SPACE, OPT_STRING_TYPE, false, NO_RECORD_DEF, "" }, + { "relay-port", RAI_OPTION_RELAY_PORT, + DHCP_AGENT_OPTION_SPACE, OPT_UINT16_TYPE, false, NO_RECORD_DEF, "" }, + { "virtual-subnet-select", RAI_OPTION_VIRTUAL_SUBNET_SELECT, + DHCP_AGENT_OPTION_SPACE, OPT_BINARY_TYPE, false, NO_RECORD_DEF, "" }, + { "virtual-subnet-select-ctrl", RAI_OPTION_VIRTUAL_SUBNET_SELECT_CTRL, + DHCP_AGENT_OPTION_SPACE, OPT_EMPTY_TYPE, false, NO_RECORD_DEF, "" } +}; + +const int DHCP_AGENT_OPTION_DEFINITIONS_SIZE = + sizeof(DHCP_AGENT_OPTION_DEFINITIONS) / + sizeof(DHCP_AGENT_OPTION_DEFINITIONS[0]); + /// Last resort definitions (only option 43 for now, these definitions /// are applied in deferred unpacking when none is found). const OptionDefParams LAST_RESORT_V4_OPTION_DEFINITIONS[] = { diff --git a/src/lib/dhcp/tests/libdhcp++_unittest.cc b/src/lib/dhcp/tests/libdhcp++_unittest.cc index 608b1e7488..2dae427ddb 100644 --- a/src/lib/dhcp/tests/libdhcp++_unittest.cc +++ b/src/lib/dhcp/tests/libdhcp++_unittest.cc @@ -1276,22 +1276,25 @@ TEST_F(LibDhcpTest, unpackOptions4) { // space called "dhcp4" and other option spaces. These sub-options do not // belong to standard option space and should be parsed using different // option definitions. - // @todo Currently, definitions for option space "dhcp-agent-options-space" - // are not defined. Therefore all suboptions will be represented here by - // the generic Option class. // Check that Circuit ID option is among parsed options. OptionPtr rai_option = rai->getOption(RAI_OPTION_AGENT_CIRCUIT_ID); ASSERT_TRUE(rai_option); - EXPECT_EQ(RAI_OPTION_AGENT_CIRCUIT_ID, rai_option->getType()); - ASSERT_EQ(6, rai_option->len()); - EXPECT_EQ(0, memcmp(&rai_option->getData()[0], v4_opts + 46, 4)); + boost::shared_ptr circuit_id = + boost::dynamic_pointer_cast(rai_option); + ASSERT_TRUE(circuit_id); + EXPECT_EQ(RAI_OPTION_AGENT_CIRCUIT_ID, circuit_id->getType()); + ASSERT_EQ(6, circuit_id->len()); + EXPECT_EQ(0, memcmp(&circuit_id->getData()[0], v4_opts + 46, 4)); // Check that Remote ID option is among parsed options. rai_option = rai->getOption(RAI_OPTION_REMOTE_ID); ASSERT_TRUE(rai_option); - EXPECT_EQ(RAI_OPTION_REMOTE_ID, rai_option->getType()); - ASSERT_EQ(8, rai_option->len()); + boost::shared_ptr remote_id = + boost::dynamic_pointer_cast(rai_option); + ASSERT_TRUE(remote_id); + EXPECT_EQ(RAI_OPTION_REMOTE_ID, remote_id->getType()); + ASSERT_EQ(8, remote_id->len()); EXPECT_EQ(0, memcmp(&rai_option->getData()[0], v4_opts + 52, 6)); // Check that Vendor Specific Information option is among parsed options. -- GitLab From a2ac5d9c8d9f461824b483f73a47ca1dae9110b9 Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Thu, 29 Sep 2022 18:10:53 +0200 Subject: [PATCH 2/2] [#2357] Updated doc --- doc/sphinx/arm/dhcp4-srv.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/doc/sphinx/arm/dhcp4-srv.rst b/doc/sphinx/arm/dhcp4-srv.rst index d8ad4f28e9..6b3a76db7d 100644 --- a/doc/sphinx/arm/dhcp4-srv.rst +++ b/doc/sphinx/arm/dhcp4-srv.rst @@ -1988,13 +1988,15 @@ to be configured with those options. +--------------------+------+----------------------------------------------------------------------+ | remote-id | 2 | Can be used with flex-id to identify hosts. | +--------------------+------+----------------------------------------------------------------------+ - | link selection | 5 | If present, is used to select the appropriate subnet. | + | link-selection | 5 | If present, is used to select the appropriate subnet. | +--------------------+------+----------------------------------------------------------------------+ | subscriber-id | 6 | Can be used with flex-id to identify hosts. | +--------------------+------+----------------------------------------------------------------------+ | server-id-override | 11 | If sent by the relay, Kea accepts it as the `server-id`. | +--------------------+------+----------------------------------------------------------------------+ - | relay-source-port | 19 | If sent by the relay, Kea sends back its responses to this port. | + | relay-id | 12 | Identifies the relay | + +--------------------+------+----------------------------------------------------------------------+ + | relay-port | 19 | If sent by the relay, Kea sends back its responses to this port. | +--------------------+------+----------------------------------------------------------------------+ All other RAI sub-options can be used in client classification to classify incoming packets to specific classes -- GitLab