From: Francis Dupont Date: Sat, 31 Oct 2015 08:02:00 +0000 (+0100) Subject: [4106] Changed to use the private options X-Git-Tag: trac4106_update_base~4^2~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5f1a2a197a3ca002a316b06bcc06035922e2062c;p=thirdparty%2Fkea.git [4106] Changed to use the private options --- diff --git a/src/bin/dhcp4/dhcp4_dhcp4o6_ipc.cc b/src/bin/dhcp4/dhcp4_dhcp4o6_ipc.cc index bf2644bfad..dc2e60a65a 100644 --- a/src/bin/dhcp4/dhcp4_dhcp4o6_ipc.cc +++ b/src/bin/dhcp4/dhcp4_dhcp4o6_ipc.cc @@ -55,7 +55,6 @@ void Dhcp4o6Ipc::handler() { return; } - pkt->unpack(); OptionCollection msgs = pkt->getOptions(D6O_DHCPV4_MSG); if (msgs.size() != 1) { return; diff --git a/src/bin/dhcp6/dhcp6_dhcp4o6_ipc.cc b/src/bin/dhcp6/dhcp6_dhcp4o6_ipc.cc index d3b758657f..987d9cb866 100644 --- a/src/bin/dhcp6/dhcp6_dhcp4o6_ipc.cc +++ b/src/bin/dhcp6/dhcp6_dhcp4o6_ipc.cc @@ -54,14 +54,18 @@ void Dhcp4o6Ipc::handler() { if (!pkt) { return; } + isc::util::OutputBuffer& buf = pkt->getBuffer(); - pkt->repack(); + buf.clear(); + pkt->pack(); + uint8_t msg_type = buf[0]; if ((msg_type == DHCPV6_RELAY_FORW) || (msg_type == DHCPV6_RELAY_REPL)) { pkt->setRemotePort(DHCP6_SERVER_PORT); } else { pkt->setRemotePort(DHCP6_CLIENT_PORT); } + IfaceMgr::instance().send(pkt); // processStatsSent(pkt); } diff --git a/src/lib/dhcp/Makefile.am b/src/lib/dhcp/Makefile.am index 3e3f74c278..72c4083545 100644 --- a/src/lib/dhcp/Makefile.am +++ b/src/lib/dhcp/Makefile.am @@ -15,7 +15,7 @@ CLEANFILES = *.gcno *.gcda lib_LTLIBRARIES = libkea-dhcp++.la libkea_dhcp___la_SOURCES = libkea_dhcp___la_SOURCES += classify.cc classify.h -libkea_dhcp___la_SOURCES += dhcp6.h dhcp4.h dhcp4o6.h +libkea_dhcp___la_SOURCES += dhcp6.h dhcp4.h libkea_dhcp___la_SOURCES += duid.cc duid.h libkea_dhcp___la_SOURCES += duid_factory.cc duid_factory.h libkea_dhcp___la_SOURCES += hwaddr.cc hwaddr.h diff --git a/src/lib/dhcp/dhcp4o6.h b/src/lib/dhcp/dhcp4o6.h deleted file mode 100644 index 898080996b..0000000000 --- a/src/lib/dhcp/dhcp4o6.h +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (C) 2015 Internet Systems Consortium, Inc. ("ISC") -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH -// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -// AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, -// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE -// OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -// PERFORMANCE OF THIS SOFTWARE. - -#ifndef DHCP4O6_H -#define DHCP4O6_H - -/* Offsets and sizes into interserver messages. */ -#define DHCP4O6_IFNAME_OFFSET 0 -#define DHCP4O6_IFNAME_SIZE 16 -#define DHCP4O6_RADDR_OFFSET 16 -#define DHCP4O6_RADDR_SIZE 16 -#define DHCP4O6_DHCP6_OFFSET 32 - -#endif /* DHCP4O6_H */ diff --git a/src/lib/dhcpsrv/dhcp4o6_ipc.cc b/src/lib/dhcpsrv/dhcp4o6_ipc.cc index 9fcd1246ee..19ac9c5e79 100644 --- a/src/lib/dhcpsrv/dhcp4o6_ipc.cc +++ b/src/lib/dhcpsrv/dhcp4o6_ipc.cc @@ -14,8 +14,11 @@ #include -#include +#include #include +#include +#include +#include #include #include @@ -132,25 +135,38 @@ Pkt6Ptr Dhcp4o6IpcBase::receive() { if (cc < 0) { isc_throw(Unexpected, "Failed to receive on DHCP4o6 socket."); } - if (cc < DHCP4O6_DHCP6_OFFSET + Pkt6::DHCPV6_PKT_HDR_LEN) { - // Ignore too short messages + Pkt6Ptr pkt = Pkt6Ptr(new Pkt6(buf, cc)); + pkt->updateTimestamp(); + + // Get interface name and remote address + pkt->unpack(); + OptionVendorPtr vendor = + boost::dynamic_pointer_cast(pkt->getOption(D6O_VENDOR_OPTS)); + if (!vendor || vendor->getVendorId() != ENTERPRISE_ID_ISC) { + return (Pkt6Ptr()); + } + OptionStringPtr ifname = + boost::dynamic_pointer_cast(vendor->getOption(ISC_V6_4O6_INTERFACE)); + if (!ifname) { return (Pkt6Ptr()); } - char name[DHCP4O6_IFNAME_SIZE + 1]; - memcpy(name, buf, DHCP4O6_IFNAME_SIZE); - IfacePtr iface = IfaceMgr::instance().getIface(string(name)); + IfacePtr iface = IfaceMgr::instance().getIface(ifname->getValue()); if (!iface) { - // Can't get the interface: ignore return (Pkt6Ptr()); } - uint8_t raddr[DHCP4O6_RADDR_SIZE]; - memcpy(raddr, buf + DHCP4O6_RADDR_OFFSET, DHCP4O6_RADDR_SIZE); - IOAddress from = IOAddress::fromBytes(AF_INET6, raddr); - Pkt6Ptr pkt; - pkt = Pkt6Ptr(new Pkt6(buf + DHCP4O6_DHCP6_OFFSET, - cc - DHCP4O6_DHCP6_OFFSET)); - pkt->updateTimestamp(); - pkt->setRemoteAddr(from); + Option6AddrLstPtr srcs = + boost::dynamic_pointer_cast(vendor->getOption(ISC_V6_4O6_SRC_ADDRESS)); + if (!srcs) { + return (Pkt6Ptr()); + } + Option6AddrLst::AddressContainer addrs = srcs->getAddresses(); + if (addrs.size() != 1) { + return (Pkt6Ptr()); + } + + // Update the packet and return it + static_cast(pkt->delOption(D6O_VENDOR_OPTS)); + pkt->setRemoteAddr(addrs[0]); pkt->setIface(iface->getName()); pkt->setIndex(iface->getIndex()); return (pkt); @@ -167,37 +183,24 @@ void Dhcp4o6IpcBase::send(Pkt6Ptr pkt) { return; } - // Get interface name - string name = pkt->getIface(); - if (name.empty() || name.size() > DHCP4O6_IFNAME_SIZE) { - // Bad interface name: ignore - return; - } - name.resize(DHCP4O6_IFNAME_SIZE); + // Get a vendor option + OptionVendorPtr vendor(new OptionVendor(Option::V6, ENTERPRISE_ID_ISC)); - // Get remote address - IOAddress from = pkt->getRemoteAddr(); - vector raddr = from.toBytes(); - if (raddr.size() != DHCP4O6_RADDR_SIZE) { - // Bad remote address: ignore - return; - } + // Push interface name and source address in it + vendor->addOption(OptionPtr(new OptionString(Option::V6, + ISC_V6_4O6_INTERFACE, + pkt->getIface()))); + vendor->addOption(OptionPtr(new Option6AddrLst(ISC_V6_4O6_SRC_ADDRESS, + pkt->getRemoteAddr()))); + pkt->addOption(vendor); // Get packet content - OutputBuffer& pbuf = pkt->getBuffer(); - if (!pbuf.getLength()) { - // Empty buffer: content is not (yet) here, get it - pkt->repack(); - } - - // Fill buffer - vector buf(DHCP4O6_DHCP6_OFFSET + pbuf.getLength()); - memcpy(&buf[0], name.c_str(), DHCP4O6_IFNAME_SIZE); - memcpy(&buf[0] + DHCP4O6_RADDR_OFFSET, &raddr[0], DHCP4O6_RADDR_SIZE); - memcpy(&buf[0] + DHCP4O6_DHCP6_OFFSET, pbuf.getData(), pbuf.getLength()); + OutputBuffer& buf = pkt->getBuffer(); + buf.clear(); + pkt->pack(); // Send - static_cast(::send(socket_fd_, &buf[0], buf.size(), 0)); + static_cast(::send(socket_fd_, buf.getData(), buf.getLength(), 0)); return; }