From: Marcin Siodelski Date: Tue, 20 Aug 2013 10:47:53 +0000 (+0200) Subject: [master] Merge branch 'trac3036' X-Git-Tag: bind10-1.2.0beta1-release~257 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=209f3964b9f12afbf36f3fa6b62964e03049ec6e;p=thirdparty%2Fkea.git [master] Merge branch 'trac3036' Conflicts: src/lib/dhcp/option_definition.cc src/lib/dhcp/option_definition.h --- 209f3964b9f12afbf36f3fa6b62964e03049ec6e diff --cc src/bin/dhcp6/tests/Makefile.am index 928598ec4a,b53393fc5e..7ea71634bb --- a/src/bin/dhcp6/tests/Makefile.am +++ b/src/bin/dhcp6/tests/Makefile.am @@@ -79,8 -66,8 +79,9 @@@ dhcp6_unittests_LDADD += $(top_builddir dhcp6_unittests_LDADD += $(top_builddir)/src/lib/cc/libb10-cc.la dhcp6_unittests_LDADD += $(top_builddir)/src/lib/config/libb10-cfgclient.la dhcp6_unittests_LDADD += $(top_builddir)/src/lib/dhcp/libb10-dhcp++.la + dhcp6_unittests_LDADD += $(top_builddir)/src/lib/dhcp_ddns/libb10-dhcp_ddns.la dhcp6_unittests_LDADD += $(top_builddir)/src/lib/dhcpsrv/libb10-dhcpsrv.la +dhcp6_unittests_LDADD += $(top_builddir)/src/lib/hooks/libb10-hooks.la dhcp6_unittests_LDADD += $(top_builddir)/src/lib/exceptions/libb10-exceptions.la dhcp6_unittests_LDADD += $(top_builddir)/src/lib/log/libb10-log.la dhcp6_unittests_LDADD += $(top_builddir)/src/lib/util/libb10-util.la diff --cc src/lib/dhcp/option_definition.cc index 1b87bff6ed,ac1369ca17..be24021777 --- a/src/lib/dhcp/option_definition.cc +++ b/src/lib/dhcp/option_definition.cc @@@ -185,11 -189,11 +191,15 @@@ OptionDefinition::optionFactory(Option: // option only for the same reasons as described in // for IA_NA and IA_PD above. return (factoryIAAddr6(type, begin, end)); + } else if (code_ == D6O_CLIENT_FQDN && haveClientFqdnFormat()) { + // FQDN option requires special processing. Thus, there is + // a specialized class to handle it. + return (OptionPtr(new Option6ClientFqdn(begin, end))); } + } else { + if ((code_ == DHO_FQDN) && haveFqdn4Format()) { + return (OptionPtr(new Option4ClientFqdn(begin, end))); + } } } return (OptionPtr(new OptionCustom(*this, u, begin, end))); @@@ -347,18 -354,18 +360,28 @@@ OptionDefinition::haveIAAddr6Format() c return (haveIAx6Format(OPT_IPV6_ADDRESS_TYPE)); } +bool +OptionDefinition::haveFqdn4Format() const { + return (haveType(OPT_RECORD_TYPE) && + record_fields_.size() == 4 && + record_fields_[0] == OPT_UINT8_TYPE && + record_fields_[1] == OPT_UINT8_TYPE && + record_fields_[2] == OPT_UINT8_TYPE && + record_fields_[3] == OPT_FQDN_TYPE); +} + + bool + OptionDefinition::haveClientFqdnFormat() const { + return (haveType(OPT_RECORD_TYPE) && + (record_fields_.size() == 2) && + (record_fields_[0] == OPT_UINT8_TYPE) && + (record_fields_[1] == OPT_FQDN_TYPE)); + } + template - T OptionDefinition::lexicalCastWithRangeCheck(const std::string& value_str) const { + T + OptionDefinition::lexicalCastWithRangeCheck(const std::string& value_str) + const { // Lexical cast in case of our data types make sense only // for uintX_t, intX_t and bool type. if (!OptionDataTypeTraits::integer_type && diff --cc src/lib/dhcp/option_definition.h index 0472d012fd,99a57f504c..884a4adabd --- a/src/lib/dhcp/option_definition.h +++ b/src/lib/dhcp/option_definition.h @@@ -275,21 -275,12 +275,27 @@@ public /// @return true if specified format is IAADDR option format. bool haveIAAddr6Format() const; + /// @brief Check if specified format is OPTION_CLIENT_FQDN option format. + /// + /// @return true of specified format is OPTION_CLIENT_FQDN option format, + /// false otherwise. + bool haveClientFqdnFormat() const; + + /// @brief Check if option has format of the DHCPv4 Client FQDN + /// %Option. + /// + /// The encoding of the domain-name carried by the FQDN option is + /// conditional and is specified in the flags field of the option. + /// The domain-name can be encoded in the ASCII format or canonical + /// wire format. The ASCII format is deprecated, therefore canonical + /// format is selected for the FQDN option definition and this function + /// returns true if the option definition comprises the domain-name + /// field encoded in canonical format. + /// + /// @return true if option has the format of DHCPv4 Client FQDN + /// %Option. + bool haveFqdn4Format() const; + /// @brief Option factory. /// /// This function creates an instance of DHCP option using diff --cc src/lib/dhcp/tests/Makefile.am index 84e99defc6,358f613458..3baac04c15 --- a/src/lib/dhcp/tests/Makefile.am +++ b/src/lib/dhcp/tests/Makefile.am @@@ -31,8 -31,8 +31,9 @@@ libdhcp___unittests_SOURCES += hwaddr_u libdhcp___unittests_SOURCES += iface_mgr_unittest.cc libdhcp___unittests_SOURCES += libdhcp++_unittest.cc libdhcp___unittests_SOURCES += option4_addrlst_unittest.cc +libdhcp___unittests_SOURCES += option4_client_fqdn_unittest.cc libdhcp___unittests_SOURCES += option6_addrlst_unittest.cc + libdhcp___unittests_SOURCES += option6_client_fqdn_unittest.cc libdhcp___unittests_SOURCES += option6_ia_unittest.cc libdhcp___unittests_SOURCES += option6_iaaddr_unittest.cc libdhcp___unittests_SOURCES += option_int_unittest.cc diff --cc src/lib/dhcp/tests/libdhcp++_unittest.cc index e4d723fd9c,dad4ad5522..f7f5ffcc28 --- a/src/lib/dhcp/tests/libdhcp++_unittest.cc +++ b/src/lib/dhcp/tests/libdhcp++_unittest.cc @@@ -18,8 -18,8 +18,9 @@@ #include #include #include +#include #include + #include #include #include #include