Kea  2.3.3-git
pkt6.h
Go to the documentation of this file.
1 // Copyright (C) 2011-2022 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 
24 namespace isc {
25 
26 namespace dhcp {
27 
28 class Pkt6;
29 
31 typedef boost::shared_ptr<Pkt6> Pkt6Ptr;
32 
44 class Pkt6 : public Pkt {
45 public:
47  const static size_t DHCPV6_PKT_HDR_LEN = 4;
48 
50  const static size_t DHCPV6_RELAY_HDR_LEN = 34;
51 
53  enum DHCPv6Proto {
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 
101  uint16_t relay_msg_len_;
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  return (proto_);
151  }
152 
156  void setProto(DHCPv6Proto proto = UDP) {
157  proto_ = proto;
158  }
159 
172  static std::string makeLabel(const DuidPtr duid, const uint32_t transid,
173  const HWAddrPtr& hwaddr);
174 
183  static std::string makeLabel(const DuidPtr duid, const HWAddrPtr& hwaddr);
184 
196  virtual std::string getLabel() const;
197 
203  virtual std::string toText() const;
204 
215  virtual size_t len();
216 
220  virtual uint8_t getType() const { return (msg_type_); }
221 
225  virtual void setType(uint8_t type) { msg_type_=type; };
226 
232  DuidPtr getClientId() const;
233 
234 
235 protected:
236 
250  OptionPtr getNonCopiedRelayOption(const uint16_t opt_type,
251  const uint8_t relay_level) const;
252 
266  OptionCollection getNonCopiedRelayOptions(const uint16_t opt_type,
267  const uint8_t relay_level) const;
268 
269 public:
270 
286  OptionPtr getRelayOption(uint16_t option_code, uint8_t nesting_level);
287 
303  OptionCollection getRelayOptions(uint16_t option_code,
304  uint8_t nesting_level);
305 
306 private:
307 
324  void prepareGetAnyRelayOption(const RelaySearchOrder& order,
325  int& start, int& end, int& direction) const;
326 
327 protected:
328 
341  OptionPtr getNonCopiedAnyRelayOption(const uint16_t option_code,
342  const RelaySearchOrder& order) const;
343 
356  OptionCollection getNonCopiedAllRelayOptions(const uint16_t option_code,
357  const RelaySearchOrder& order) const;
358 
359 public:
360 
371  OptionPtr getAnyRelayOption(const uint16_t option_code,
372  const RelaySearchOrder& order);
373 
386  OptionCollection getAllRelayOptions(const uint16_t option_code,
387  const RelaySearchOrder& order);
388 
403  getRelay6LinkAddress(uint8_t relay_level) const;
404 
419  getRelay6PeerAddress(uint8_t relay_level) const;
420 
421 protected:
422 
435  OptionCollection getNonCopiedOptions(const uint16_t opt_type) const;
436 
437 public:
438 
446  isc::dhcp::OptionCollection getOptions(const uint16_t type);
447 
454  void addRelayInfo(const RelayInfo& relay);
455 
467  static const char* getName(const uint8_t type);
468 
477  const char* getName() const;
478 
485  void copyRelayInfo(const Pkt6Ptr& question);
486 
500  std::vector<RelayInfo> relay_info_;
501 
502 protected:
503 
513 
515  // option inserted by a relay agent (RFC6939).
518  // client-linklayer-addr option inserted by the relay agent closest to
519  // the client.
523 
532  virtual HWAddrPtr getMACFromDUID();
533 
547 
560 
570 
576  void packTCP();
577 
581  void packUDP();
582 
593  void unpackTCP();
594 
603  void unpackUDP();
604 
614  void unpackMsg(OptionBuffer::const_iterator begin,
615  OptionBuffer::const_iterator end);
616 
624  void unpackRelayMsg();
625 
631  uint16_t getRelayOverhead(const RelayInfo& relay) const;
632 
635  uint16_t calculateRelaySizes();
636 
641  uint16_t directLen() const;
642 
645 
647  uint8_t msg_type_;
648 
649 }; // Pkt6 class
650 
651 } // isc::dhcp namespace
652 } // isc namespace
653 
654 #endif
boost::shared_ptr< DUID > DuidPtr
Definition: duid.h:20
const isc::asiolink::IOAddress & getRelay6LinkAddress(uint8_t relay_level) const
return the link address field from a relay option
Definition: pkt6.cc:327
boost::shared_ptr< HWAddr > HWAddrPtr
Shared pointer to a hardware address structure.
Definition: hwaddr.h:154
isc::dhcp::OptionCollection options_
options received from a specified relay, except relay-msg option
Definition: pkt6.h:104
OptionCollection getRelayOptions(uint16_t option_code, uint8_t nesting_level)
Returns options inserted by relay.
Definition: pkt6.cc:298
void packUDP()
Builds on wire packet for UDP transmission.
Definition: pkt6.cc:395
virtual void setType(uint8_t type)
Sets message type (e.g.
Definition: pkt6.h:225
uint16_t relay_msg_len_
length of the relay_msg_len Used when calculating length during pack/unpack
Definition: pkt6.h:101
Pkt6(uint8_t msg_type, uint32_t transid, DHCPv6Proto proto=UDP)
Constructor, used in replying to a message.
Definition: pkt6.cc:58
Base class for classes representing DHCP messages.
Definition: pkt.h:90
void copyRelayInfo(const Pkt6Ptr &question)
copies relay information from client&#39;s packet to server&#39;s response
Definition: pkt6.cc:890
boost::shared_ptr< Option > OptionPtr
Definition: option.h:36
OptionPtr getNonCopiedAnyRelayOption(const uint16_t option_code, const RelaySearchOrder &order) const
Returns pointer to an instance of specified option.
Definition: pkt6.cc:107
Represents a DHCPv6 packet.
Definition: pkt6.h:44
void unpackRelayMsg()
Unpacks relayed message (RELAY-FORW or RELAY-REPL).
Definition: pkt6.cc:551
void setProto(DHCPv6Proto proto=UDP)
Sets protocol of this packet.
Definition: pkt6.h:156
OptionPtr getRelayOption(uint16_t option_code, uint8_t nesting_level)
Returns option inserted by relay.
Definition: pkt6.cc:261
OptionCollection getNonCopiedRelayOptions(const uint16_t opt_type, const uint8_t relay_level) const
Returns all option instances inserted by relay agent.
Definition: pkt6.cc:282
virtual HWAddrPtr getMACFromDocsisCMTS()
Attempts to extract MAC/Hardware address from DOCSIS options.
Definition: pkt6.cc:991
virtual std::string getLabel() const
Returns text representation of the primary packet identifiers.
Definition: pkt6.cc:727
virtual HWAddrPtr getMACFromSrcLinkLocalAddr()
Attempts to generate MAC/Hardware address from IPv6 link-local address.
Definition: pkt6.cc:924
const isc::asiolink::IOAddress & getRelay6PeerAddress(uint8_t relay_level) const
return the peer address field from a relay option
Definition: pkt6.cc:337
std::vector< RelayInfo > relay_info_
Relay information.
Definition: pkt6.h:500
void unpackUDP()
Parses on-wire form of UDP DHCPv6 packet.
Definition: pkt6.cc:477
boost::shared_ptr< Pkt6 > Pkt6Ptr
A pointer to Pkt6 packet.
Definition: pkt6.h:28
structure that describes a single relay information
Definition: pkt6.h:85
static const size_t DHCPV6_RELAY_HDR_LEN
specifies relay DHCPv6 packet header length (over UDP)
Definition: pkt6.h:50
virtual void unpack()
Dispatch method that handles binary packet parsing.
Definition: pkt6.cc:465
virtual size_t len()
Returns length of the packet.
Definition: pkt6.cc:63
const char * getName() const
Returns name of the DHCPv6 message.
Definition: pkt6.cc:886
virtual HWAddrPtr getMACFromDocsisModem()
Attempts to extract MAC/Hardware address from DOCSIS options inserted by the modem itself...
Definition: pkt6.cc:963
uint8_t msg_type_
DHCPv6 message type.
Definition: pkt6.h:647
DHCPv6Proto
DHCPv6 transport protocol.
Definition: pkt6.h:53
std::multimap< unsigned int, OptionPtr > OptionCollection
A collection of DHCP (v4 or v6) options.
Definition: option.h:40
static const size_t DHCPV6_PKT_HDR_LEN
specifies non-relayed DHCPv6 packet header length (over UDP)
Definition: pkt6.h:47
virtual void pack()
Prepares on-wire format.
Definition: pkt6.cc:381
virtual HWAddrPtr getMACFromIPv6RelayOpt()
Extract MAC/Hardware address from client link-layer address.
Definition: pkt6.cc:935
OptionCollection getNonCopiedAllRelayOptions(const uint16_t option_code, const RelaySearchOrder &order) const
Returns pointers to instances of specified option.
Definition: pkt6.cc:172
DHCPv6Proto getProto()
Returns protocol of this packet (UDP or TCP).
Definition: pkt6.h:149
void packTCP()
Builds on wire packet for TCP transmission.
Definition: pkt6.cc:458
Defines the logger used by the top-level component of kea-lfc.
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:696
void unpackMsg(OptionBuffer::const_iterator begin, OptionBuffer::const_iterator end)
Unpacks direct (non-relayed) message.
Definition: pkt6.cc:507
RelaySearchOrder
defines relay search pattern
Definition: pkt6.h:74
uint16_t getRelayOverhead(const RelayInfo &relay) const
Calculates overhead introduced in specified relay.
Definition: pkt6.cc:346
uint8_t hop_count_
number of traversed relays (up to 32)
Definition: pkt6.h:95
std::string toText() const
Returns printable representation of the relay information.
Definition: pkt6.cc:40
OptionPtr getAnyRelayOption(const uint16_t option_code, const RelaySearchOrder &order)
Return first instance of a specified option.
Definition: pkt6.cc:139
OptionCollection getAllRelayOptions(const uint16_t option_code, const RelaySearchOrder &order)
Return first instances of a specified option.
Definition: pkt6.cc:202
RelayInfo()
default constructor
Definition: pkt6.cc:35
uint16_t directLen() const
Calculates size of the message as if it was not relayed at all.
Definition: pkt6.cc:369
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:243
virtual uint8_t getType() const
Returns message type (e.g.
Definition: pkt6.h:220
OptionCollection getNonCopiedOptions(const uint16_t opt_type) const
Returns all option instances of specified type without copying.
Definition: pkt6.cc:781
isc::dhcp::OptionCollection getOptions(const uint16_t type)
Returns all instances of specified type.
Definition: pkt6.cc:788
virtual HWAddrPtr getMACFromDUID()
Extract MAC/Hardware address from client-id.
Definition: pkt6.cc:644
isc::asiolink::IOAddress linkaddr_
fixed field in relay-forw/relay-reply
Definition: pkt6.h:96
DHCPv6Proto proto_
UDP (usually) or TCP (bulk leasequery or failover)
Definition: pkt6.h:644
DuidPtr getClientId() const
Retrieves the DUID from the Client Identifier option.
Definition: pkt6.cc:764
isc::asiolink::IOAddress peeraddr_
fixed field in relay-forw/relay-reply
Definition: pkt6.h:97
void unpackTCP()
Parses on-wire form of TCP DHCPv6 packet.
Definition: pkt6.cc:638
uint16_t calculateRelaySizes()
Calculates overhead for all relays defined for this message.
Definition: pkt6.cc:357
void addRelayInfo(const RelayInfo &relay)
add information about one traversed relay
Definition: pkt6.cc:628
virtual HWAddrPtr getMACFromRemoteIdRelayOption()
Attempts to obtain MAC address from remote-id relay option.
Definition: pkt6.cc:1025
uint8_t msg_type_
message type (RELAY-FORW oro RELAY-REPL)
Definition: pkt6.h:94