diff --git a/doc/guide/dhcp6-srv.xml b/doc/guide/dhcp6-srv.xml index 618d4092dc..8af42516ed 100644 --- a/doc/guide/dhcp6-srv.xml +++ b/doc/guide/dhcp6-srv.xml @@ -1214,14 +1214,6 @@ temporarily override a list of interface names and listen on all interfaces. client-linklayer-addr79binaryfalse dhcp4o6-server-addr88ipv6-addresstrue -s46-rule89record (uint8, uint8, uint8, ipv4-address, ipv6-prefix)false -s46-br90ipv6-addressfalse -s46-dmr91ipv6-prefixfalse -s46-v4v6bind92record (ipv4-address, ipv6-prefix)false -s46-portparams93record(uint8, psid)false -s46-cont-mape94emptyfalse -s46-cont-mapt95emptyfalse -s46-cont-lw96emptyfalse @@ -1249,187 +1241,6 @@ temporarily override a list of interface names and listen on all interfaces. -
- Common Softwire46 Options - - Softwire46 options are involved in IPv4 over IPv6 provisioning by - means of tunneling or translation as specified in the - RFC 7598. - The following sections provide configuration examples of these - options. - - -
- Softwire46 Container Options - - S46 container options group rules and optional port parameters - for a specified domain. There are three container options specified - in the "dhcp6" (top level) option space: MAP-E Container option, - MAP-T Container option and S46 Lightweight 4over6 Container option. - These options only contain encapsulated options specified below. - They do not include any data fields. - - - - In order to configure the server to send specific container option - along with all encapsulated options, the container option must be - included in the server configuration as shown below: - -"Dhcp6": { - ... - "option-data": [ - { - "name": "s46-cont-mape" - } ], - ... -} - - - This configuration will cause the server to include MAP-E Container - option to the client. Use "s46-cont-mapt" or "s46-cont-lw" for the - MAP-T Container and S46 Lightweight 4over6 Container options - respectively. - - - - All remaining softwire options described below are included in one - of the container options. Thus, they have to be included in appropriate - option spaces by selecting a "space" name, which specifies in which - option they are supposed to be included. - -
- -
- S46 Rule Option - - The S46 Rule option is used for conveying the Basic Mapping Rule (BMR) - and Forwarding Mapping Rule (FMR). - -{ - "space": "s46-cont-mape-options", - "name": "s46-rule", - "data": "128, 0, 24, 192.0.2.0, 2001:db8:1::/64" -} - - Other possible "space" value is "s46-cont-mapt-options". - - - - The S46 Rule option conveys a number of parameters: - - - - flags, an unsigned 8 bits integer, with - currently only the most significant bit specified. It denotes whether - the rule can be used for forwarding (128) or not (0). - - - - - ea-len, an 8 bits long Embedded Address length. Allowed values - range from 0 to 48. - - - - IPv4 prefix length, 8 bits long; expresses the prefix length of the - Rule IPv4 prefix specified in the ipv4-prefix field. Allowed - values range from 0 to 32. - - - - IPv4 prefix, a fixed-length 32-bit field that specifies the IPv4 - prefix for the S46 rule. The bits in the prefix after prefix4-len - number of bits are reserved and MUST be initialized to zero by the - sender and ignored by the receiver. - - - - IPv6 prefix in prefix/length notation that specifies the IPv6 domain - prefix for the S46 rule. The field is padded on the right with zero - bits up to the nearest octet boundary when prefix6-len is not evenly - divisible by 8. - - - - -
-
- S46 BR Option - - The S46 BR option is used to convey the IPv6 address of the - Border Relay. This option is mandatory in the MAP-E - Container option and not permitted in the MAP-T and - S46 Lightweight 4over6 Container options. - -{ - "space": "s46-cont-mape-options", - "name": "s46-br", - "data": "2001:db8:cafe::1", -} - - Other possible "space" value is "s46-cont-lw-options". - -
- -
- S46 DMR Option - - The S46 DMR option is used to convey values for the Default - Mapping Rule (DMR). This option is mandatory in the MAP-T - container option and not permitted in the MAP-E and S46 - Lightweight 4over6 Container options. - -{ - "space": "s46-cont-mapt-options", - "name": "s46-dmr", - "data": "2001:db8:cafe::/64", -} - - This option must not be included in other containers. - -
- -
- S46 IPv4/IPv6 Address Binding option. - - The S46 IPv4/IPv6 Address Binding option may be used to specify - the full or shared IPv4 address of the Customer Edge (CE). - The IPv6 prefix field is used by the CE to identify the - correct prefix to use for the tunnel source. - -{ - "space": "s46-cont-lw", - "name": "s46-v4v6bind", - "data": "192.0.2.3, 2001:db8:1:cafe::/64" -} - - This option must not be included in other containers. - -
-
- S46 Port Parameters - - The S46 Port Parameters option specifies optional port set - information that MAY be provided to CEs - -{ - "space": "s46-rule-options", - "name": "s46-portparams", - "data": "2, 3/4", -} - - Other possible "space" value is "s46-v4v6bind" to include - this option in the S46 IPv4/IPv6 Address Binding option. - - - Note that the second value in the example above specifies the - PSID and PSID length fields in the format of PSID/PSID length. - This is equivalent to the values of PSID-len=4 and - PSID=12288 conveyed in the S46 Port Parameters option. - -
-
-
Custom DHCPv6 Options It is possible to define options in addition to the standard ones. @@ -4166,20 +3977,18 @@ If not specified, the default value is: different for each pool. - Let's consider a lightweight 4over6 deployment as an example. It is an - IPv6 transition technology that allows mapping IPv6 prefix into full - or parts of IPv4 addresses. In DHCP context, these are certain - parameters that are supposed to be delivered to clients in form of - additional options. Values of those options are correlated to - delegated prefixes, so it is reasonable to keep those parameters - together with the PD pool. On the other hand, lightweight 4over6 is - not a commonly used feature, so it is not a part of the base Kea - code. The solution to this problem is to use user context. For each PD - pool that is expected to be used for lightweight 4over6, user context - with extra parameters is defined. Those extra parameters will be used - by hook library that would be loaded only when dynamic calculation of - the lightweight 4over6 option is actually needed. An example - configuration looks as follows: + Let's consider an example where certain parameters are supposed + to be delivered to clients in form of additional options, + and the values of those options are correlated to delegated + prefixes. It seems reasonable to keep those parameters with + the the definition of the PD pool. On the other hand, this + functionality is is not part of the base Kea code so Kea will + not understand any hook-specific keywords in that definition. + The solution to this problem is to use user context. For + each PD pool that is expected to be used with this feature, + a "user context" is defined. This is a structure that holds the + parameters used by the hook library when it is loaded. + An example configuration could look as follows: "Dhcp4": { "subnet6": [ { @@ -4189,10 +3998,10 @@ If not specified, the default value is: "prefix-len": 56, "delegated-len": 64, "user-context": { - "lw4over6-sharing-ratio": 64, - "lw4over6-v4-pool": "192.0.2.0/24", - "lw4over6-sysports-exclude": true, - "lw4over6-bind-prefix-len": 56 + "sharing-ratio": 64, + "v4-pool": "192.0.2.0/24", + "sysports-exclude": true, + "bind-prefix-len": 56 } } ], "subnet": "2001:db8::/32" @@ -4202,8 +4011,8 @@ If not specified, the default value is: - It should be noted that Kea will not use any information in the user - context, but will simply store and make it available to the hook + Kea does not interpret or use the information in the user context: + it just stores it makes it available to the hook libraries. It is up to the hook library to extract that information and make use of it. @@ -4285,13 +4094,6 @@ If not specified, the default value is: 7550: All recommendations related to the DHCPv6 server operation are supported. - - DHCPv6 Options for Configuration of Softwire - Address and Port-Mapped Clients, - RFC - 7598: All options specified in this specification are - supported by the DHCPv6 server. -
diff --git a/src/lib/dhcp/dhcp6.h b/src/lib/dhcp/dhcp6.h index 65f636f96c..828f362a3a 100644 --- a/src/lib/dhcp/dhcp6.h +++ b/src/lib/dhcp/dhcp6.h @@ -104,14 +104,6 @@ //#define D6O_V6_PCP_SERVER 86 /* RFC7291 */ #define D6O_DHCPV4_MSG 87 /* RFC7341 */ #define D6O_DHCPV4_O_DHCPV6_SERVER 88 /* RFC7341 */ -#define D6O_S46_RULE 89 /* RFC7598 */ -#define D6O_S46_BR 90 /* RFC7598 */ -#define D6O_S46_DMR 91 /* RFC7598 */ -#define D6O_S46_V4V6BIND 92 /* RFC7598 */ -#define D6O_S46_PORTPARAMS 93 /* RFC7598 */ -#define D6O_S46_CONT_MAPE 94 /* RFC7598 */ -#define D6O_S46_CONT_MAPT 95 /* RFC7598 */ -#define D6O_S46_CONT_LW 96 /* RFC7598 */ //#define D6O_4RD 97 /* RFC7600 */ //#define D6O_4RD_MAP_RULE 98 /* RFC7600 */ //#define D6O_4RD_NON_MAP_RULE 99 /* RFC7600 */ diff --git a/src/lib/dhcp/std_option_defs.h b/src/lib/dhcp/std_option_defs.h index 457d00b61b..ec7af0e129 100644 --- a/src/lib/dhcp/std_option_defs.h +++ b/src/lib/dhcp/std_option_defs.h @@ -376,12 +376,6 @@ const OptionDefParams STANDARD_V6_OPTION_DEFINITIONS[] = { { "timestamp", D6O_TIMESTAMP, OPT_BINARY_TYPE, false, NO_RECORD_DEF, "" }, { "aftr-name", D6O_AFTR_NAME, OPT_FQDN_TYPE, false, NO_RECORD_DEF, "" }, - { "s46-cont-mape", D6O_S46_CONT_MAPE, OPT_EMPTY_TYPE, false, NO_RECORD_DEF, - MAPE_V6_OPTION_SPACE }, - { "s46-cont-mapt", D6O_S46_CONT_MAPT, OPT_EMPTY_TYPE, false, NO_RECORD_DEF, - MAPT_V6_OPTION_SPACE }, - { "s46-cont-lw", D6O_S46_CONT_LW, OPT_EMPTY_TYPE, false, NO_RECORD_DEF, - LW_V6_OPTION_SPACE } // @todo There is still a bunch of options for which we have to provide // definitions but we don't do it because they are not really @@ -393,14 +387,6 @@ const int STANDARD_V6_OPTION_DEFINITIONS_SIZE = sizeof(STANDARD_V6_OPTION_DEFINITIONS) / sizeof(STANDARD_V6_OPTION_DEFINITIONS[0]); -// Option definitions that belong to two or more option spaces are defined here. -const OptionDefParams OPTION_DEF_PARAMS_S46_BR = { "s46-br", D6O_S46_BR, - OPT_IPV6_ADDRESS_TYPE, false, NO_RECORD_DEF, "" }; -const OptionDefParams OPTION_DEF_PARAMS_S46_RULE = { "s46-rule", D6O_S46_RULE, - OPT_RECORD_TYPE, false, RECORD_DEF(S46_RULE), V4V6_RULE_OPTION_SPACE }; -const OptionDefParams OPTION_DEF_PARAMS_S46_PORTPARAMS = { "s46-portparams", - D6O_S46_PORTPARAMS, OPT_RECORD_TYPE, false, RECORD_DEF(S46_PORTPARAMS), "" }; - /// @brief Definitions of vendor-specific DHCPv6 options, defined by ISC. /// 4o6-* options are used for inter-process communication. For details, see /// http://kea.isc.org/wiki/Dhcp4o6Design @@ -420,52 +406,43 @@ const int ISC_V6_OPTION_DEFINITIONS_SIZE = /// @brief MAPE option definitions const OptionDefParams MAPE_V6_OPTION_DEFINITIONS[] = { - OPTION_DEF_PARAMS_S46_BR, - OPTION_DEF_PARAMS_S46_RULE }; const int MAPE_V6_OPTION_DEFINITIONS_SIZE = sizeof(MAPE_V6_OPTION_DEFINITIONS) / - sizeof(MAPE_V6_OPTION_DEFINITIONS[0]); + sizeof(const OptionDefParams); /// @brief MAPT option definitions const OptionDefParams MAPT_V6_OPTION_DEFINITIONS[] = { - OPTION_DEF_PARAMS_S46_RULE, - { "s46-dmr", D6O_S46_DMR, OPT_IPV6_PREFIX_TYPE, false, NO_RECORD_DEF, "" } }; const int MAPT_V6_OPTION_DEFINITIONS_SIZE = sizeof(MAPT_V6_OPTION_DEFINITIONS) / - sizeof(MAPT_V6_OPTION_DEFINITIONS[0]); + sizeof(const OptionDefParams); /// @brief LW option definitions const OptionDefParams LW_V6_OPTION_DEFINITIONS[] = { - OPTION_DEF_PARAMS_S46_BR, - { "s46-v4v6bind", D6O_S46_V4V6BIND, OPT_RECORD_TYPE, false, - RECORD_DEF(S46_V4V6BIND), V4V6_BIND_OPTION_SPACE } }; const int LW_V6_OPTION_DEFINITIONS_SIZE = sizeof(LW_V6_OPTION_DEFINITIONS) / - sizeof(LW_V6_OPTION_DEFINITIONS[0]); + sizeof(const OptionDefParams); /// @brief Rule option definitions const OptionDefParams V4V6_RULE_OPTION_DEFINITIONS[] = { - OPTION_DEF_PARAMS_S46_PORTPARAMS }; const int V4V6_RULE_OPTION_DEFINITIONS_SIZE = sizeof(V4V6_RULE_OPTION_DEFINITIONS) / - sizeof(V4V6_RULE_OPTION_DEFINITIONS[0]); + sizeof(const OptionDefParams); /// @brief Bind option definitions const OptionDefParams V4V6_BIND_OPTION_DEFINITIONS[] = { - OPTION_DEF_PARAMS_S46_PORTPARAMS }; const int V4V6_BIND_OPTION_DEFINITIONS_SIZE = sizeof(V4V6_BIND_OPTION_DEFINITIONS) / - sizeof(V4V6_BIND_OPTION_DEFINITIONS[0]); + sizeof(const OptionDefParams); } // unnamed namespace diff --git a/src/lib/dhcp/tests/libdhcp++_unittest.cc b/src/lib/dhcp/tests/libdhcp++_unittest.cc index dd71f0fee5..9d30aaf4c5 100644 --- a/src/lib/dhcp/tests/libdhcp++_unittest.cc +++ b/src/lib/dhcp/tests/libdhcp++_unittest.cc @@ -1588,31 +1588,6 @@ TEST_F(LibDhcpTest, stdOptionDefs6) { LibDhcpTest::testStdOptionDefs6(D6O_TIMESTAMP, begin, begin + 8, typeid(Option)); - // RFC7598 options - LibDhcpTest::testOptionDefs6(MAPE_V6_OPTION_SPACE, D6O_S46_RULE, begin, end, - typeid(OptionCustom), "s46-rule-options"); - LibDhcpTest::testOptionDefs6(MAPT_V6_OPTION_SPACE, D6O_S46_RULE, begin, end, - typeid(OptionCustom), "s46-rule-options"); - LibDhcpTest::testOptionDefs6(MAPE_V6_OPTION_SPACE, D6O_S46_BR, begin, end, - typeid(OptionCustom)); - LibDhcpTest::testOptionDefs6(LW_V6_OPTION_SPACE, D6O_S46_BR, begin, end, - typeid(OptionCustom)); - LibDhcpTest::testOptionDefs6(MAPT_V6_OPTION_SPACE, D6O_S46_DMR, begin, end, - typeid(OptionCustom)); - LibDhcpTest::testOptionDefs6(LW_V6_OPTION_SPACE, D6O_S46_V4V6BIND, begin, - end, typeid(OptionCustom), - "s46-v4v6bind-options"); - LibDhcpTest::testOptionDefs6(V4V6_RULE_OPTION_SPACE, D6O_S46_PORTPARAMS, - begin, end, typeid(OptionCustom), ""); - LibDhcpTest::testStdOptionDefs6(D6O_S46_CONT_MAPE, begin, end, - typeid(OptionCustom), - "s46-cont-mape-options"); - LibDhcpTest::testStdOptionDefs6(D6O_S46_CONT_MAPT, begin, end, - typeid(OptionCustom), - "s46-cont-mapt-options"); - LibDhcpTest::testStdOptionDefs6(D6O_S46_CONT_LW, begin, end, - typeid(OptionCustom), - "s46-cont-lw-options"); } diff --git a/src/lib/dhcpsrv/tests/dhcp_parsers_unittest.cc b/src/lib/dhcpsrv/tests/dhcp_parsers_unittest.cc index 69e09646b9..555d87f5d7 100644 --- a/src/lib/dhcpsrv/tests/dhcp_parsers_unittest.cc +++ b/src/lib/dhcpsrv/tests/dhcp_parsers_unittest.cc @@ -1047,56 +1047,6 @@ TEST_F(ParseConfigTest, optionDataCSVFormatWithOptionDef) { cfg2.runCfgOptionsTest(family_, config); } -// This test verifies that definitions of standard encapsulated -// options can be used. -TEST_F(ParseConfigTest, encapsulatedOptionData) { - std::string config = - "{ \"option-data\": [ {" - " \"space\": \"s46-cont-mape-options\"," - " \"name\": \"s46-rule\"," - " \"data\": \"1, 0, 24, 192.0.2.0, 2001:db8:1::/64\"" - " } ]" - "}"; - - // Make sure that we're using correct universe. - family_ = AF_INET6; - int rcode = 0; - ASSERT_NO_THROW(rcode = parseConfiguration(config)); - ASSERT_EQ(0, rcode); - - // Verify that the option data is correct. - OptionCustomPtr s46_rule = boost::dynamic_pointer_cast - (getOptionPtr(MAPE_V6_OPTION_SPACE, D6O_S46_RULE)); - ASSERT_TRUE(s46_rule); - - uint8_t flags; - uint8_t ea_len; - uint8_t prefix4_len; - IOAddress ipv4_prefix(IOAddress::IPV4_ZERO_ADDRESS()); - PrefixTuple ipv6_prefix(PrefixLen(0), IOAddress::IPV6_ZERO_ADDRESS());; - - ASSERT_NO_THROW({ - flags = s46_rule->readInteger(0); - ea_len = s46_rule->readInteger(1); - prefix4_len = s46_rule->readInteger(2); - ipv4_prefix = s46_rule->readAddress(3); - ipv6_prefix = s46_rule->readPrefix(4); - }); - - EXPECT_EQ(1, flags); - EXPECT_EQ(0, ea_len); - EXPECT_EQ(24, prefix4_len); - EXPECT_EQ("192.0.2.0", ipv4_prefix.toText()); - EXPECT_EQ(64, ipv6_prefix.first.asUnsigned()); - EXPECT_EQ("2001:db8:1::", ipv6_prefix.second.toText()); - - ElementPtr expected = Element::fromJSON(config); - ElementPtr opt_data = expected->get("option-data")->getNonConst(0); - opt_data->set("code", Element::create(D6O_S46_RULE)); - CfgOptionsTest cfg(CfgMgr::instance().getStagingCfg()); - cfg.runCfgOptionsTest(family_, expected); -} - // This test checks behavior of the configuration parser for option data // for different values of csv-format parameter and when there is no // option definition.