selector.client_classes_ = query->classes_;
selector.iface_name_ = query->getIface();
+ // If the link-selection sub-option is present, extract its value.
+ // "The link-selection sub-option is used by any DHCP relay agent
+ // that desires to specify a subnet/link for a DHCP client request
+ // that it is relaying but needs the subnet/link specification to
+ // be different from the IP address the DHCP server should use
+ // when communicating with the relay agent." (RFC 3257)
OptionPtr rai = query->getOption(DHO_DHCP_AGENT_OPTIONS);
if (rai) {
- OptionCustomPtr oc = boost::dynamic_pointer_cast<OptionCustom>(rai);
- if (oc) {
- OptionPtr ols = oc->getOption(RAI_OPTION_LINK_SELECTION);
- if (ols) {
- OptionBuffer lsb = ols->getData();
- if (lsb.size() == sizeof(uint32_t)) {
+ OptionCustomPtr rai_custom =
+ boost::dynamic_pointer_cast<OptionCustom>(rai);
+ if (rai_custom) {
+ OptionPtr link_select =
+ rai_custom->getOption(RAI_OPTION_LINK_SELECTION);
+ if (link_select) {
+ OptionBuffer link_select_buf = link_select->getData();
+ if (link_select_buf.size() == sizeof(uint32_t)) {
selector.option_select_ =
- IOAddress::fromBytes(AF_INET, &lsb[0]);
+ IOAddress::fromBytes(AF_INET, &link_select_buf[0]);
}
}
}