/// @note This is abstract class. Please instantiate derived classes
/// such as @c Pkt4 or @c Pkt6.
class Pkt {
+<<<<<<< HEAD
+=======
+public:
+
+ /// @defgroup hw_sources Specifies where a given MAC/hardware address was
+ /// obtained.
+ ///
+ /// @brief The list covers all possible MAC/hw address sources.
+ ///
+ /// @note The uncommented ones are currently supported. When you implement
+ /// a new method, please uncomment appropriate line here.
+ ///
+ /// @{
+
+ /// Not really a type, only used in getMAC() calls.
+ static const uint32_t HWADDR_SOURCE_ANY = 0xffff;
+
+ /// Used when actual origin is not known, e.g. when reading from a
+ /// lease database that didn't store that information.
+ static const uint32_t HWADDR_SOURCE_UNKNOWN = 0x0000;
+
+ /// Obtained first hand from raw socket (100% reliable).
+ static const uint32_t HWADDR_SOURCE_RAW = 0x0001;
+
+ /// Extracted from DUID-LL or DUID-LLT (not 100% reliable as the client
+ /// can send fake DUID).
+ static const uint32_t HWADDR_SOURCE_DUID = 0x0002;
+
+ /// Extracted from IPv6 link-local address. Not 100% reliable, as the
+ /// client can use different IID other than EUI-64, e.g. Windows supports
+ /// RFC4941 and uses random values instead of EUI-64.
+ static const uint32_t HWADDR_SOURCE_IPV6_LINK_LOCAL = 0x0004;
+
+ /// Get it from RFC6939 option. (A relay agent can insert client link layer
+ /// address option). Note that a skilled attacker can fake that by sending
+ /// his request relayed, so the legitimate relay will think it's a second
+ /// relay.
+ static const uint32_t HWADDR_SOURCE_CLIENT_ADDR_RELAY_OPTION = 0x0008;
+
+ /// A relay can insert remote-id. In some deployments it contains a MAC
+ /// address (RFC4649).
+ //static const uint32_t HWADDR_SOURCE_REMOTE_ID = 0x0010;
+
+ /// A relay can insert a subscriber-id option. In some deployments it
+ /// contains a MAC address (RFC4580).
+ //static const uint32_t HWADDR_SOURCE_SUBSCRIBER_ID = 0x0020;
+
+ /// A CMTS (acting as DHCP relay agent) that supports DOCSIS standard
+ /// can insert DOCSIS options that contain client's MAC address.
+ /// Client in this context would be a cable modem.
+ //static const uint32_t HWADDR_SOURCE_DOCSIS_OPTIONS = 0x0040;
+
+ /// @}
+
+>>>>>>> [3548] Patch as provided by Adam Kalmus
protected:
/// @brief Constructor.
/// @return hardware address (or NULL)
virtual HWAddrPtr getMACFromIPv6RelayOpt() = 0;
+ virtual HWAddrPtr getMACFromDUID() = 0;
+
/// @brief Attempts to convert IPv6 address into MAC.
///
/// Utility method that attempts to convert link-local IPv6 address to the
HWAddrPtr
getMACFromIPv6(const isc::asiolink::IOAddress& addr);
+
+
/// Transaction-id (32 bits for v4, 24 bits for v6)
uint32_t transid_;
#include <dhcp/pkt6.h>
#include <util/io_utilities.h>
#include <exceptions/exceptions.h>
+#include <dhcp/duid.h>
#include <iostream>
#include <sstream>
"not implemented yet.");
}
+HWAddrPtr
+Pkt6::getMACFromDUID() {
+ OptionPtr opt_duid = getOption(D6O_CLIENTID);
+ uint8_t hlen = opt_duid->getData().size();
+ vector<uint8_t> hw_addr(hlen, 0);
+ std::vector<unsigned char> duid_data = opt_duid->getData();
+
+
+ uint16_t hwtype = 0;
+ std::memcpy(&hwtype, &duid_data[2], 2); // TODO nie jestem tego pewien
+
+
+ // checking if DUID is LLT or LL type
+ if ((duid_data[0] == 0x00) && (duid_data[1]== 0x01)){
+ hlen -= 8;
+ std::memcpy(&hw_addr, &duid_data[8], hlen);
+
+ }
+ else if ((duid_data[0] == 0x00) && (duid_data[1]== 0x03)){
+ hlen -= 4;
+ std::memcpy(&hw_addr, &duid_data[4], hlen);
+ }
+ // if none of them return NULL
+ else return HWAddrPtr();
+
+ hw_addr.resize(hlen);
+ hwaddr_= HWAddrPtr(new HWAddr(hw_addr, hwtype));
+ return (hwaddr_);
+}
+
std::string
Pkt6::toText() {