2
0
mirror of https://gitlab.isc.org/isc-projects/kea synced 2025-08-30 21:45:37 +00:00

[#3141] config parsers boilerplate

This commit is contained in:
Piotrek Zadroga
2024-02-12 22:04:39 +01:00
parent 5618d3b0b6
commit e1a3fc7817
4 changed files with 97 additions and 53 deletions

View File

@@ -48,42 +48,48 @@ Option4Dnr::pack(OutputBuffer& buf, bool check) const {
void void
Option4Dnr::unpack(OptionBufferConstIter begin, OptionBufferConstIter end) { Option4Dnr::unpack(OptionBufferConstIter begin, OptionBufferConstIter end) {
setData(begin, end); if (convenient_notation_) {
while (begin != end) { // parse convenient notation
DnrInstance dnr_instance(V4); std::string config_txt = std::string(begin, end);
if (std::distance(begin, end) < dnr_instance.getMinimalLength()) { parseConfigData(config_txt);
isc_throw(OutOfRange, dnr_instance.getLogPrefix() } else {
<< "DNR instance data truncated to size " setData(begin, end);
<< std::distance(begin, end)); while (begin != end) {
} DnrInstance dnr_instance(V4);
if (std::distance(begin, end) < dnr_instance.getMinimalLength()) {
isc_throw(OutOfRange, dnr_instance.getLogPrefix()
<< "DNR instance data truncated to size "
<< std::distance(begin, end));
}
// Unpack DnrInstanceDataLength. // Unpack DnrInstanceDataLength.
dnr_instance.unpackDnrInstanceDataLength(begin, end); dnr_instance.unpackDnrInstanceDataLength(begin, end);
const OptionBufferConstIter dnr_instance_end = begin + const OptionBufferConstIter dnr_instance_end = begin +
dnr_instance.getDnrInstanceDataLength(); dnr_instance.getDnrInstanceDataLength();
// Unpack Service priority. // Unpack Service priority.
dnr_instance.unpackServicePriority(begin); dnr_instance.unpackServicePriority(begin);
// Unpack ADN len + ADN. // Unpack ADN len + ADN.
dnr_instance.unpackAdn(begin, dnr_instance_end); dnr_instance.unpackAdn(begin, dnr_instance_end);
if (begin == dnr_instance_end) {
// ADN only mode, other fields are not included.
addDnrInstance(dnr_instance);
continue;
}
dnr_instance.setAdnOnlyMode(false);
// Unpack Addr Len + IPv4 Address(es).
dnr_instance.unpackAddresses(begin, dnr_instance_end);
// SvcParams (variable length) field is last.
dnr_instance.unpackSvcParams(begin, dnr_instance_end);
if (begin == dnr_instance_end) {
// ADN only mode, other fields are not included.
addDnrInstance(dnr_instance); addDnrInstance(dnr_instance);
continue;
} }
dnr_instance.setAdnOnlyMode(false);
// Unpack Addr Len + IPv4 Address(es).
dnr_instance.unpackAddresses(begin, dnr_instance_end);
// SvcParams (variable length) field is last.
dnr_instance.unpackSvcParams(begin, dnr_instance_end);
addDnrInstance(dnr_instance);
} }
} }
@@ -119,6 +125,11 @@ Option4Dnr::addDnrInstance(DnrInstance& dnr_instance) {
dnr_instances_.push_back(dnr_instance); dnr_instances_.push_back(dnr_instance);
} }
void
Option4Dnr::parseConfigData(const std::string& config_txt) {
// TBD
}
const std::unordered_set<std::string> DnrInstance::FORBIDDEN_SVC_PARAMS = {"ipv4hint", "ipv6hint"}; const std::unordered_set<std::string> DnrInstance::FORBIDDEN_SVC_PARAMS = {"ipv4hint", "ipv6hint"};
DnrInstance::DnrInstance(Option::Universe universe) DnrInstance::DnrInstance(Option::Universe universe)

View File

@@ -546,6 +546,17 @@ private:
/// @brief Flag stating whether the %Option was constructed with a convenient notation string, /// @brief Flag stating whether the %Option was constructed with a convenient notation string,
/// that needs custom parsing, or binary data. /// that needs custom parsing, or binary data.
bool convenient_notation_; bool convenient_notation_;
/// @brief Parses a convenient notation of the option data, which may be used in config.
///
/// As an alternative to the binary format,
/// we provide convenience option definition as a string in format:
/// TBD
///
/// @param config_txt convenient notation of the option data received as string
///
/// @throw BadValue Thrown in case parser found wrong format of received string.
void parseConfigData(const std::string& config_txt);
}; };
/// A pointer to the @c OptionDnr4 object. /// A pointer to the @c OptionDnr4 object.

View File

@@ -55,31 +55,37 @@ Option6Dnr::packAddresses(util::OutputBuffer& buf) const {
void void
Option6Dnr::unpack(OptionBufferConstIter begin, OptionBufferConstIter end) { Option6Dnr::unpack(OptionBufferConstIter begin, OptionBufferConstIter end) {
if (std::distance(begin, end) < getMinimalLength()) { if (convenient_notation_) {
isc_throw(OutOfRange, getLogPrefix() // parse convenient notation
<< "data truncated to size " << std::distance(begin, end)); std::string config_txt = std::string(begin, end);
parseConfigData(config_txt);
} else {
if (std::distance(begin, end) < getMinimalLength()) {
isc_throw(OutOfRange, getLogPrefix()
<< "data truncated to size " << std::distance(begin, end));
}
setData(begin, end);
// First two octets of Option data is Service Priority - this is mandatory field.
unpackServicePriority(begin);
// Next come two octets of ADN Length plus the ADN data itself (variable length).
// This is Opaque Data Tuple so let's use this class to retrieve the ADN data.
unpackAdn(begin, end);
if (begin == end) {
// ADN only mode, other fields are not included.
return;
}
adn_only_mode_ = false;
unpackAddresses(begin, end);
// SvcParams (variable length) field is last.
unpackSvcParams(begin, end);
} }
setData(begin, end);
// First two octets of Option data is Service Priority - this is mandatory field.
unpackServicePriority(begin);
// Next come two octets of ADN Length plus the ADN data itself (variable length).
// This is Opaque Data Tuple so let's use this class to retrieve the ADN data.
unpackAdn(begin, end);
if (begin == end) {
// ADN only mode, other fields are not included.
return;
}
adn_only_mode_ = false;
unpackAddresses(begin, end);
// SvcParams (variable length) field is last.
unpackSvcParams(begin, end);
} }
std::string std::string
@@ -143,5 +149,10 @@ Option6Dnr::unpackAddresses(OptionBufferConstIter& begin, OptionBufferConstIter
} }
} }
void
Option6Dnr::parseConfigData(const std::string& config_txt){
// TBD
}
} // namespace dhcp } // namespace dhcp
} // namespace isc } // namespace isc

View File

@@ -146,6 +146,17 @@ private:
/// @brief Flag stating whether the %Option was constructed with a convenient notation string, /// @brief Flag stating whether the %Option was constructed with a convenient notation string,
/// that needs custom parsing, or binary data. /// that needs custom parsing, or binary data.
bool convenient_notation_; bool convenient_notation_;
/// @brief Parses a convenient notation of the option data, which may be used in config.
///
/// As an alternative to the binary format,
/// we provide convenience option definition as a string in format:
/// TBD
///
/// @param config_txt convenient notation of the option data received as string
///
/// @throw BadValue Thrown in case parser found wrong format of received string.
void parseConfigData(const std::string& config_txt);
}; };
/// A pointer to the @c Option6Dnr object. /// A pointer to the @c Option6Dnr object.