MySqlBinding::createInteger<float>(), // t1_percent
MySqlBinding::createInteger<float>(), // t2_percent
MySqlBinding::createInteger<uint8_t>(), // authoritative
+ MySqlBinding::createInteger<uint32_t>(), // min_valid_lifetime
+ MySqlBinding::createInteger<uint32_t>(), // max_valid_lifetime
MySqlBinding::createString(SERVER_TAG_BUF_LENGTH) // server_tag
};
auto renew_timer = createTriplet(out_bindings[13]);
// rebind_timer
auto rebind_timer = createTriplet(out_bindings[11]);
- // valid_lifetime
- auto valid_lifetime = createTriplet(out_bindings[19]);
+ // valid_lifetime (and {min,max)_valid_lifetime)
+ auto valid_lifetime = createTriplet(out_bindings[19],
+ out_bindings[53],
+ out_bindings[54]);
// Create subnet with basic settings.
last_subnet = Subnet4::create(prefix_pair.first, prefix_pair.second,
last_subnet->setAuthoritative(out_bindings[52]->getBool());
}
+ // {min,max}_valid_lifetime
+
// server_tag
- last_subnet->setServerTag(out_bindings[53]->getString());
+ last_subnet->setServerTag(out_bindings[55]->getString());
// Subnet ready. Add it to the list.
auto ret = subnets.push_back(last_subnet);
shared_network_binding,
createInputContextBinding(subnet),
createBinding(subnet->getValid(Network::Inheritance::NONE)),
+ createMinBinding(subnet->getValid(Network::Inheritance::NONE)),
+ createMaxBinding(subnet->getValid(Network::Inheritance::NONE)),
MySqlBinding::condCreateBool(subnet->getCalculateTeeTimes(Network::Inheritance::NONE)),
MySqlBinding::condCreateFloat(subnet->getT1Percent(Network::Inheritance::NONE)),
MySqlBinding::condCreateFloat(subnet->getT2Percent(Network::Inheritance::NONE)),
MySqlBinding::createString(BOOT_FILE_NAME_BUF_LENGTH), // boot_file_name
MySqlBinding::createInteger<uint32_t>(), // next_server
MySqlBinding::createString(SERVER_HOSTNAME_BUF_LENGTH), // server_hostname
+ MySqlBinding::createInteger<uint32_t>(), // min_valid_lifetime
+ MySqlBinding::createInteger<uint32_t>(), // max_valid_lifetime
MySqlBinding::createString(SERVER_TAG_BUF_LENGTH) // server_tag
};
last_network->setContext(user_context);
}
- // valid_lifetime
+ // valid_lifetime (and {min,max)_valid_lifetime)
if (!out_bindings[12]->amNull()) {
- last_network->setValid(createTriplet(out_bindings[12]));
+ last_network->setValid(createTriplet(out_bindings[12],
+ out_bindings[32],
+ out_bindings[33]));
}
// calculate_tee_times
last_network->setSiaddr(IOAddress(out_bindings[30]->getInteger<uint32_t>()));
}
- // server_hostaname
+ // server_hostname
if (!out_bindings[31]->amNull()) {
last_network->setSname(out_bindings[31]->getString());
}
+ // {min,max}_valid_lifetime
+
// server_tag
- last_network->setServerTag(out_bindings[32]->getString());
+ last_network->setServerTag(out_bindings[34]->getString());
// Add the shared network.
auto ret = shared_networks.push_back(last_network);
hr_mode_binding,
createInputContextBinding(shared_network),
createBinding(shared_network->getValid(Network::Inheritance::NONE)),
+ createMinBinding(shared_network->getValid(Network::Inheritance::NONE)),
+ createMaxBinding(shared_network->getValid(Network::Inheritance::NONE)),
MySqlBinding::condCreateBool(shared_network->getCalculateTeeTimes(Network::Inheritance::NONE)),
MySqlBinding::condCreateFloat(shared_network->getT1Percent(Network::Inheritance::NONE)),
MySqlBinding::condCreateFloat(shared_network->getT2Percent(Network::Inheritance::NONE)),
" shared_network_name,"
" user_context,"
" valid_lifetime,"
+ " min_valid_lifetime,"
+ " max_valid_lifetime,"
" calculate_tee_times,"
" t1_percent,"
" t2_percent,"
" authoritative"
- ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,"
+ ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,"
"?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" },
// Insert association of the subnet with a server.
" reservation_mode,"
" user_context,"
" valid_lifetime,"
+ " min_valid_lifetime,"
+ " max_valid_lifetime,"
" calculate_tee_times,"
" t1_percent,"
" t2_percent,"
" boot_file_name,"
" next_server,"
" server_hostname"
- ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" },
+ ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,"
+ " ?, ?, ?, ?, ?, ?, ?, ?, ?)" },
// Insert association of the shared network with a server.
{ MySqlConfigBackendDHCPv4Impl::INSERT_SHARED_NETWORK4_SERVER,
" shared_network_name = ?,"
" user_context = ?,"
" valid_lifetime = ?,"
+ " min_valid_lifetime = ?,"
+ " max_valid_lifetime = ?,"
" calculate_tee_times = ?,"
" t1_percent = ?,"
" t2_percent = ?,"
" reservation_mode = ?,"
" user_context = ?,"
" valid_lifetime = ?,"
+ " min_valid_lifetime = ?,"
+ " max_valid_lifetime = ?,"
" calculate_tee_times = ?,"
" t1_percent = ?,"
" t2_percent = ?,"
MySqlBinding::createInteger<float>(), // t1_percent
MySqlBinding::createInteger<float>(), // t2_percent
MySqlBinding::createBlob(INTERFACE_ID_BUF_LENGTH), // interface_id
+ MySqlBinding::createInteger<uint32_t>(), // min_preferred_lifetime
+ MySqlBinding::createInteger<uint32_t>(), // max_preferred_lifetime
+ MySqlBinding::createInteger<uint32_t>(), // min_valid_lifetime
+ MySqlBinding::createInteger<uint32_t>(), // max_valid_lifetime
MySqlBinding::createString(SERVER_TAG_BUF_LENGTH) // server_tag
};
std::string subnet_prefix = out_bindings[1]->getString();
auto prefix_pair = Subnet6::parsePrefix(subnet_prefix);
- // preferred_lifetime
- auto preferred_lifetime = createTriplet(out_bindings[5]);
+ // preferred_lifetime (and {min,max)_preferred_lifetime)
+ auto preferred_lifetime = createTriplet(out_bindings[5],
+ out_bindings[69],
+ out_bindings[70]);
// renew_timer
auto renew_timer = createTriplet(out_bindings[9]);
// rebind_timer
auto rebind_timer = createTriplet(out_bindings[7]);
- // valid_lifetime
- auto valid_lifetime = createTriplet(out_bindings[14]);
+ // valid_lifetime (and {min,max)_valid_lifetime)
+ auto valid_lifetime = createTriplet(out_bindings[14],
+ out_bindings[71],
+ out_bindings[72]);
// Create subnet with basic settings.
last_subnet = Subnet6::create(prefix_pair.first, prefix_pair.second,
}
}
+ // 69 and 70 are {min,max}_preferred_lifetime
+
+ // 71 and 72 are {min,max}_valid_lifetime
+
// server_tag
- last_subnet->setServerTag(out_bindings[69]->getString());
+ last_subnet->setServerTag(out_bindings[73]->getString());
// Subnet ready. Add it to the list.
auto ret = subnets.push_back(last_subnet);
MySqlBinding::condCreateString(subnet->getIface(Network::Inheritance::NONE)),
MySqlBinding::createTimestamp(subnet->getModificationTime()),
createBinding(subnet->getPreferred(Network::Inheritance::NONE)),
+ createMinBinding(subnet->getPreferred(Network::Inheritance::NONE)),
+ createMaxBinding(subnet->getPreferred(Network::Inheritance::NONE)),
MySqlBinding::condCreateBool(subnet->getRapidCommit(Network::Inheritance::NONE)),
createBinding(subnet->getT2(Network::Inheritance::NONE)),
createInputRelayBinding(subnet),
shared_network_binding,
createInputContextBinding(subnet),
createBinding(subnet->getValid(Network::Inheritance::NONE)),
+ createMinBinding(subnet->getValid(Network::Inheritance::NONE)),
+ createMaxBinding(subnet->getValid(Network::Inheritance::NONE)),
MySqlBinding::condCreateBool(subnet->getCalculateTeeTimes(Network::Inheritance::NONE)),
MySqlBinding::condCreateFloat(subnet->getT1Percent(Network::Inheritance::NONE)),
MySqlBinding::condCreateFloat(subnet->getT2Percent(Network::Inheritance::NONE)),
MySqlBinding::createInteger<float>(), // t1_percent
MySqlBinding::createInteger<float>(), // t2_percent
MySqlBinding::createBlob(INTERFACE_ID_BUF_LENGTH), // interface_id
+ MySqlBinding::createInteger<uint32_t>(), // min_preferred_lifetime
+ MySqlBinding::createInteger<uint32_t>(), // max_preferred_lifetime
+ MySqlBinding::createInteger<uint32_t>(), // min_valid_lifetime
+ MySqlBinding::createInteger<uint32_t>(), // max_valid_lifetime
MySqlBinding::createString(SERVER_TAG_BUF_LENGTH) // server_tag
};
// modification_ts
last_network->setModificationTime(out_bindings[4]->getTimestamp());
- // preferred_lifetime
+ // preferred_lifetime (and {min,max)_preferred_lifetime)
if (!out_bindings[5]->amNull()) {
- last_network->setPreferred(createTriplet(out_bindings[5]));
+ last_network->setPreferred(createTriplet(out_bindings[5],
+ out_bindings[31],
+ out_bindings[32]));
}
// rapid_commit
last_network->setContext(user_context);
}
- // valid_lifetime
+ // valid_lifetime (and {min,max)_valid_lifetime)
if (!out_bindings[13]->amNull()) {
- last_network->setValid(createTriplet(out_bindings[13]));
+ last_network->setValid(createTriplet(out_bindings[13],
+ out_bindings[33],
+ out_bindings[34]));
}
// calculate_tee_times
}
}
+ // {min,max)_preferred_lifetime
+
+ // {min,max)_valid_lifetime
+
// server_tag
- last_network->setServerTag(out_bindings[31]->getString());
+ last_network->setServerTag(out_bindings[35]->getString());
// Add the shared network.
auto ret = shared_networks.push_back(last_network);
MySqlBinding::condCreateString(shared_network->getIface(Network::Inheritance::NONE)),
MySqlBinding::createTimestamp(shared_network->getModificationTime()),
createBinding(shared_network->getPreferred(Network::Inheritance::NONE)),
+ createMinBinding(shared_network->getPreferred(Network::Inheritance::NONE)),
+ createMaxBinding(shared_network->getPreferred(Network::Inheritance::NONE)),
MySqlBinding::condCreateBool(shared_network->getRapidCommit(Network::Inheritance::NONE)),
createBinding(shared_network->getT2(Network::Inheritance::NONE)),
createInputRelayBinding(shared_network),
hr_mode_binding,
createInputContextBinding(shared_network),
createBinding(shared_network->getValid(Network::Inheritance::NONE)),
+ createMinBinding(shared_network->getValid(Network::Inheritance::NONE)),
+ createMaxBinding(shared_network->getValid(Network::Inheritance::NONE)),
MySqlBinding::condCreateBool(shared_network->getCalculateTeeTimes(Network::Inheritance::NONE)),
MySqlBinding::condCreateFloat(shared_network->getT1Percent(Network::Inheritance::NONE)),
MySqlBinding::condCreateFloat(shared_network->getT2Percent(Network::Inheritance::NONE)),
" interface,"
" modification_ts,"
" preferred_lifetime,"
+ " min_preferred_lifetime,"
+ " max_preferred_lifetime,"
" rapid_commit,"
" rebind_timer,"
" relay,"
" shared_network_name,"
" user_context,"
" valid_lifetime,"
+ " min_valid_lifetime,"
+ " max_valid_lifetime,"
" calculate_tee_times,"
" t1_percent,"
" t2_percent,"
" interface_id"
- ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" },
+ ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,"
+ " ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" },
// Insert association of the subnet with a server.
{ MySqlConfigBackendDHCPv6Impl::INSERT_SUBNET6_SERVER,
" interface,"
" modification_ts,"
" preferred_lifetime,"
+ " min_preferred_lifetime,"
+ " max_preferred_lifetime,"
" rapid_commit,"
" rebind_timer,"
" relay,"
" reservation_mode,"
" user_context,"
" valid_lifetime,"
+ " min_valid_lifetime,"
+ " max_valid_lifetime,"
" calculate_tee_times,"
" t1_percent,"
" t2_percent,"
" interface_id"
- ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" },
+ ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,"
+ " ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" },
// Insert association of the shared network with a server.
{ MySqlConfigBackendDHCPv6Impl::INSERT_SHARED_NETWORK6_SERVER,
" interface = ?,"
" modification_ts = ?,"
" preferred_lifetime = ?,"
+ " min_preferred_lifetime = ?,"
+ " max_preferred_lifetime = ?,"
" rapid_commit = ?,"
" rebind_timer = ?,"
" relay = ?,"
" shared_network_name = ?,"
" user_context = ?,"
" valid_lifetime = ?,"
+ " min_valid_lifetime = ?,"
+ " max_valid_lifetime = ?,"
" calculate_tee_times = ?,"
" t1_percent = ?,"
" t2_percent = ?,"
" interface = ?,"
" modification_ts = ?,"
" preferred_lifetime = ?,"
+ " min_preferred_lifetime = ?,"
+ " max_preferred_lifetime = ?,"
" rapid_commit = ?,"
" rebind_timer = ?,"
" relay = ?,"
" reservation_mode = ?,"
" user_context = ?,"
" valid_lifetime = ?,"
+ " min_valid_lifetime = ?,"
+ " max_valid_lifetime = ?,"
" calculate_tee_times = ?,"
" t1_percent = ?,"
" t2_percent = ?,"
return (MySqlBinding::createInteger<uint32_t>(triplet.get()));
}
+MySqlBindingPtr
+MySqlConfigBackendImpl::createMinBinding(const Triplet<uint32_t>& triplet) {
+ if (triplet.unspecified() || (triplet.getMin() == triplet.get())) {
+ return (MySqlBinding::createNull());
+ }
+ return (MySqlBinding::createInteger<uint32_t>(triplet.getMin()));
+}
+
+MySqlBindingPtr
+MySqlConfigBackendImpl::createMaxBinding(const Triplet<uint32_t>& triplet) {
+ if (triplet.unspecified() || (triplet.getMax() == triplet.get())) {
+ return (MySqlBinding::createNull());
+ }
+ return (MySqlBinding::createInteger<uint32_t>(triplet.getMax()));
+}
+
Triplet<uint32_t>
MySqlConfigBackendImpl::createTriplet(const MySqlBindingPtr& binding) {
if (!binding) {
return (Triplet<uint32_t>(binding->getInteger<uint32_t>()));
}
+Triplet<uint32_t>
+MySqlConfigBackendImpl::createTriplet(const MySqlBindingPtr& def_binding,
+ const MySqlBindingPtr& min_binding,
+ const MySqlBindingPtr& max_binding) {
+ if (!def_binding || !min_binding || !max_binding) {
+ isc_throw(Unexpected, "MySQL configuration backend internal error: "
+ "binding pointer is NULL when creating a triplet value");
+ }
+
+ // This code assumes the database was filled using the API, e.g. it
+ // is not possible (so not handled) to have only the min_binding not NULL.
+ if (def_binding->amNull()) {
+ return (Triplet<uint32_t>());
+ }
+
+ uint32_t value = def_binding->getInteger<uint32_t>();
+ uint32_t min_value = value;
+ if (!min_binding->amNull()) {
+ min_value = min_binding->getInteger<uint32_t>();
+ }
+ uint32_t max_value = value;
+ if (!max_binding->amNull()) {
+ max_value = max_binding->getInteger<uint32_t>();
+ }
+
+ return (Triplet<uint32_t>(min_value, value, max_value));
+}
+
void
MySqlConfigBackendImpl::createAuditRevision(const int index,
const ServerSelector& server_selector,
/// otherwise.
static db::MySqlBindingPtr createBinding(const Triplet<uint32_t>& triplet);
+ /// @brief Creates MySQL binding from a @c Triplet max value.
+ ///
+ /// @param triplet Triplet value from which the binding should be created.
+ /// @return Pointer to a null binding if the triplet is "unspecified" or
+ /// the max value is the same than the default value, or a pointer to
+ /// a binding representing 32-bit unsigned integer value from the max
+ /// value otherwise.
+ static db::MySqlBindingPtr createMaxBinding(const Triplet<uint32_t>& triplet);
+
+ /// @brief Creates MySQL binding from a @c Triplet min value.
+ ///
+ /// @param triplet Triplet value from which the binding should be created.
+ /// @return Pointer to a null binding if the triplet is "unspecified" or
+ /// the min value is the same than the default value, or a pointer to
+ /// a binding representing 32-bit unsigned integer value from the min
+ /// value otherwise.
+ static db::MySqlBindingPtr createMinBinding(const Triplet<uint32_t>& triplet);
+
/// @brief Creates @c Triplet object from MySQL binding.
///
/// @param binding Pointer to the MySQL binding.
/// a 32-bit unsigned integer.
static Triplet<uint32_t> createTriplet(const db::MySqlBindingPtr& binding);
+ /// @brief Creates @c Triplet object from MySQL bindings.
+ ///
+ /// @param def_binding Pointer to the MySQL binding of the default.
+ /// @param min_binding Pointer to the MySQL binding of the min value.
+ /// @param max_binding Pointer to the MySQL binding of the max value.
+ /// @return Triplet value set to "unspecified" if the MySQL binding
+ /// represents a NULL value or a Triplet value encapsulating 32-bit
+ /// unsigned integer if the MySQL represents an integer.
+ /// When max or max bindings are not NULL their values are used.
+ /// @throw isc::Unexpected if the provided binding pointer is NULL.
+ /// @throw isc::InvalidOperation if the binding does not represent
+ /// a 32-bit unsigned integer.
+ static Triplet<uint32_t> createTriplet(const db::MySqlBindingPtr& def_binding,
+ const db::MySqlBindingPtr& min_binding,
+ const db::MySqlBindingPtr& max_binding);
+
/// @brief Returns server tags associated with the particular selector.
///
/// @param server_selector Server selector.
" s.t1_percent," \
" s.t2_percent," \
" s.authoritative," \
+ " s.min_valid_lifetime," \
+ " s.max_valid_lifetime," \
" srv.tag " \
"FROM dhcp4_subnet AS s " \
"INNER JOIN dhcp4_subnet_server AS a " \
" s.t1_percent," \
" s.t2_percent," \
" s.interface_id," \
+ " s.min_preferred_lifetime," \
+ " s.max_preferred_lifetime," \
+ " s.min_valid_lifetime," \
+ " s.max_valid_lifetime," \
" srv.tag " \
"FROM dhcp6_subnet AS s " \
"INNER JOIN dhcp6_subnet_server AS a " \
" n.boot_file_name," \
" n.next_server," \
" n.server_hostname," \
+ " n.min_valid_lifetime," \
+ " n.max_valid_lifetime," \
" s.tag " \
"FROM dhcp4_shared_network AS n " \
"INNER JOIN dhcp4_shared_network_server AS a " \
" n.t1_percent," \
" n.t2_percent," \
" n.interface_id," \
+ " n.min_preferred_lifetime," \
+ " n.max_preferred_lifetime," \
+ " n.min_valid_lifetime," \
+ " n.max_valid_lifetime," \
" s.tag " \
"FROM dhcp6_shared_network AS n " \
"INNER JOIN dhcp6_shared_network_server AS a " \