Kea 1.5.0
pkt6.h
Go to the documentation of this file.
1// Copyright (C) 2011-2017 Internet Systems Consortium, Inc. ("ISC")
2//
3// This Source Code Form is subject to the terms of the Mozilla Public
4// License, v. 2.0. If a copy of the MPL was not distributed with this
5// file, You can obtain one at http://mozilla.org/MPL/2.0/.
6
7#ifndef PKT6_H
8#define PKT6_H
9
10#include <asiolink/io_address.h>
11#include <dhcp/duid.h>
12#include <dhcp/option.h>
13#include <dhcp/pkt.h>
14
15#include <boost/date_time/posix_time/posix_time.hpp>
16#include <boost/shared_array.hpp>
17#include <boost/shared_ptr.hpp>
18
19#include <iostream>
20#include <set>
21
22#include <time.h>
23
24namespace isc {
25
26namespace dhcp {
27
28class Pkt6;
29
31typedef boost::shared_ptr<Pkt6> Pkt6Ptr;
32
44class Pkt6 : public Pkt {
45public:
47 const static size_t DHCPV6_PKT_HDR_LEN = 4;
48
50 const static size_t DHCPV6_RELAY_HDR_LEN = 34;
51
54 UDP = 0, // most packets are UDP
55 TCP = 1 // there are TCP DHCPv6 packets (bulk leasequery, failover)
56 };
57
79 };
80
85 struct RelayInfo {
86
88 RelayInfo();
89
92 std::string toText() const;
93
94 uint8_t msg_type_;
95 uint8_t hop_count_;
98
102
105 };
106
112 Pkt6(uint8_t msg_type,
113 uint32_t transid,
114 DHCPv6Proto proto = UDP);
115
123 Pkt6(const uint8_t* buf, uint32_t len, DHCPv6Proto proto = UDP);
124
136 virtual void pack();
137
144 virtual void unpack();
145
150
154 void setProto(DHCPv6Proto proto = UDP) {
155 proto_ = proto;
156 }
157
170 static std::string makeLabel(const DuidPtr duid, const uint32_t transid,
171 const HWAddrPtr& hwaddr);
172
181 static std::string makeLabel(const DuidPtr duid, const HWAddrPtr& hwaddr);
182
194 virtual std::string getLabel() const;
195
201 virtual std::string toText() const;
202
213 virtual size_t len();
214
218 virtual uint8_t getType() const { return (msg_type_); }
219
223 virtual void setType(uint8_t type) { msg_type_=type; };
224
230 DuidPtr getClientId() const;
231
232
233protected:
234
248 OptionPtr getNonCopiedRelayOption(const uint16_t opt_type,
249 const uint8_t relay_level) const;
250
251public:
252
268 OptionPtr getRelayOption(uint16_t option_code, uint8_t nesting_level);
269
270private:
271
288 void prepareGetAnyRelayOption(const RelaySearchOrder& order,
289 int& start, int& end, int& direction) const;
290
291protected:
292
305 OptionPtr getNonCopiedAnyRelayOption(const uint16_t option_code,
306 const RelaySearchOrder& order) const;
307
308public:
309
320 OptionPtr getAnyRelayOption(const uint16_t option_code,
321 const RelaySearchOrder& order);
322
337 getRelay6LinkAddress(uint8_t relay_level) const;
338
353 getRelay6PeerAddress(uint8_t relay_level) const;
354
355protected:
356
369 OptionCollection getNonCopiedOptions(const uint16_t opt_type) const;
370
371public:
372
380 isc::dhcp::OptionCollection getOptions(const uint16_t type);
381
388 void addRelayInfo(const RelayInfo& relay);
389
401 static const char* getName(const uint8_t type);
402
411 const char* getName() const;
412
419 void copyRelayInfo(const Pkt6Ptr& question);
420
434 std::vector<RelayInfo> relay_info_;
435
436protected:
437
447
449 // option inserted by a relay agent (RFC6939).
452 // client-linklayer-addr option inserted by the relay agent closest to
453 // the client.
457
466 virtual HWAddrPtr getMACFromDUID();
467
481
494
504
510 void packTCP();
511
515 void packUDP();
516
527 void unpackTCP();
528
537 void unpackUDP();
538
548 void unpackMsg(OptionBuffer::const_iterator begin,
549 OptionBuffer::const_iterator end);
550
558 void unpackRelayMsg();
559
565 uint16_t getRelayOverhead(const RelayInfo& relay) const;
566
569 uint16_t calculateRelaySizes();
570
575 uint16_t directLen() const;
576
579
581 uint8_t msg_type_;
582
583}; // Pkt6 class
584
585} // isc::dhcp namespace
586
587} // isc namespace
588
589#endif
Represents a DHCPv6 packet.
Definition: pkt6.h:44
virtual std::string toText() const
Returns text representation of the packet.
Definition: pkt6.cc:624
uint16_t calculateRelaySizes()
Calculates overhead for all relays defined for this message.
Definition: pkt6.cc:242
virtual HWAddrPtr getMACFromIPv6RelayOpt()
Extract MAC/Hardware address from client link-layer address.
Definition: pkt6.cc:826
OptionCollection getNonCopiedOptions(const uint16_t opt_type) const
Returns all option instances of specified type without copying.
Definition: pkt6.cc:672
DHCPv6Proto
DHCPv6 transport protocol.
Definition: pkt6.h:53
virtual std::string getLabel() const
Returns text representation of the primary packet identifiers.
Definition: pkt6.cc:616
virtual void setType(uint8_t type)
Sets message type (e.g.
Definition: pkt6.h:223
static const size_t DHCPV6_PKT_HDR_LEN
specifies non-relayed DHCPv6 packet header length (over UDP)
Definition: pkt6.h:47
virtual size_t len()
Returns length of the packet.
Definition: pkt6.cc:63
virtual void pack()
Prepares on-wire format.
Definition: pkt6.cc:268
OptionPtr getRelayOption(uint16_t option_code, uint8_t nesting_level)
Returns option inserted by relay.
Definition: pkt6.cc:190
virtual HWAddrPtr getMACFromRemoteIdRelayOption()
Attempts to obtain MAC address from remote-id relay option.
Definition: pkt6.cc:903
void unpackTCP()
Parses on-wire form of TCP DHCPv6 packet.
Definition: pkt6.cc:527
const char * getName() const
Returns name of the DHCPv6 message.
Definition: pkt6.cc:777
DHCPv6Proto getProto()
Returns protocol of this packet (UDP or TCP).
virtual HWAddrPtr getMACFromSrcLinkLocalAddr()
Attempts to generate MAC/Hardware address from IPv6 link-local address.
Definition: pkt6.cc:815
OptionPtr getNonCopiedRelayOption(const uint16_t opt_type, const uint8_t relay_level) const
Returns pointer to an option inserted by relay agent.
Definition: pkt6.cc:172
void unpackRelayMsg()
Unpacks relayed message (RELAY-FORW or RELAY-REPL).
Definition: pkt6.cc:440
RelaySearchOrder
defines relay search pattern
Definition: pkt6.h:74
@ RELAY_GET_LAST
Definition: pkt6.h:78
@ RELAY_SEARCH_FROM_CLIENT
Definition: pkt6.h:75
@ RELAY_GET_FIRST
Definition: pkt6.h:77
@ RELAY_SEARCH_FROM_SERVER
Definition: pkt6.h:76
static std::string makeLabel(const DuidPtr duid, const uint32_t transid, const HWAddrPtr &hwaddr)
Returns text representation of the given packet identifiers.
Definition: pkt6.cc:585
OptionPtr getAnyRelayOption(const uint16_t option_code, const RelaySearchOrder &order)
Return first instance of a specified option.
Definition: pkt6.cc:139
DuidPtr getClientId() const
Retrieves the DUID from the Client Identifier option.
Definition: pkt6.cc:655
void packTCP()
Builds on wire packet for TCP transmission.
Definition: pkt6.cc:347
OptionPtr getNonCopiedAnyRelayOption(const uint16_t option_code, const RelaySearchOrder &order) const
Returns pointer to an instance of specified option.
Definition: pkt6.cc:107
isc::dhcp::OptionCollection getOptions(const uint16_t type)
Returns all instances of specified type.
Definition: pkt6.cc:679
void copyRelayInfo(const Pkt6Ptr &question)
copies relay information from client's packet to server's response
Definition: pkt6.cc:781
DHCPv6Proto proto_
UDP (usually) or TCP (bulk leasequery or failover)
Definition: pkt6.h:578
const isc::asiolink::IOAddress & getRelay6PeerAddress(uint8_t relay_level) const
return the peer address field from a relay option
Definition: pkt6.cc:221
virtual void unpack()
Dispatch method that handles binary packet parsing.
Definition: pkt6.cc:354
virtual HWAddrPtr getMACFromDUID()
Extract MAC/Hardware address from client-id.
Definition: pkt6.cc:533
virtual HWAddrPtr getMACFromDocsisCMTS()
Attempts to extract MAC/Hardware address from DOCSIS options.
Definition: pkt6.cc:876
const isc::asiolink::IOAddress & getRelay6LinkAddress(uint8_t relay_level) const
return the link address field from a relay option
Definition: pkt6.cc:211
std::vector< RelayInfo > relay_info_
Relay information.
Definition: pkt6.h:434
void setProto(DHCPv6Proto proto=UDP)
Sets protocol of this packet.
Definition: pkt6.h:154
uint8_t msg_type_
DHCPv6 message type.
Definition: pkt6.h:581
void addRelayInfo(const RelayInfo &relay)
add information about one traversed relay
Definition: pkt6.cc:517
virtual HWAddrPtr getMACFromDocsisModem()
Attempts to extract MAC/Hardware address from DOCSIS options inserted by the modem itself.
Definition: pkt6.cc:854
void packUDP()
Builds on wire packet for UDP transmission.
Definition: pkt6.cc:282
void unpackUDP()
Parses on-wire form of UDP DHCPv6 packet.
Definition: pkt6.cc:366
void unpackMsg(OptionBuffer::const_iterator begin, OptionBuffer::const_iterator end)
Unpacks direct (non-relayed) message.
Definition: pkt6.cc:396
uint16_t directLen() const
Calculates size of the message as if it was not relayed at all.
Definition: pkt6.cc:254
uint16_t getRelayOverhead(const RelayInfo &relay) const
Calculates overhead introduced in specified relay.
Definition: pkt6.cc:230
virtual uint8_t getType() const
Returns message type (e.g.
Definition: pkt6.h:218
static const size_t DHCPV6_RELAY_HDR_LEN
specifies relay DHCPv6 packet header length (over UDP)
Definition: pkt6.h:50
Base class for classes representing DHCP messages.
Definition: pkt.h:90
boost::shared_ptr< DUID > DuidPtr
Definition: duid.h:21
std::multimap< unsigned int, OptionPtr > OptionCollection
A collection of DHCP (v4 or v6) options.
Definition: option.h:41
boost::shared_ptr< HWAddr > HWAddrPtr
Shared pointer to a hardware address structure.
Definition: hwaddr.h:154
boost::shared_ptr< Pkt6 > Pkt6Ptr
A pointer to Pkt6 packet.
Definition: pkt6.h:31
boost::shared_ptr< Option > OptionPtr
Definition: option.h:38
Defines the logger used by the top-level component of kea-dhcp-ddns.
structure that describes a single relay information
Definition: pkt6.h:85
RelayInfo()
default constructor
Definition: pkt6.cc:35
uint16_t relay_msg_len_
length of the relay_msg_len Used when calculating length during pack/unpack
Definition: pkt6.h:101
isc::dhcp::OptionCollection options_
options received from a specified relay, except relay-msg option
Definition: pkt6.h:104
uint8_t msg_type_
message type (RELAY-FORW oro RELAY-REPL)
Definition: pkt6.h:94
std::string toText() const
Returns printable representation of the relay information.
Definition: pkt6.cc:40
isc::asiolink::IOAddress linkaddr_
fixed field in relay-forw/relay-reply
Definition: pkt6.h:96
uint8_t hop_count_
number of traversed relays (up to 32)
Definition: pkt6.h:95
isc::asiolink::IOAddress peeraddr_
fixed field in relay-forw/relay-reply
Definition: pkt6.h:97