Kea  1.9.9-git
pkt.h
Go to the documentation of this file.
1 // Copyright (C) 2014-2019 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 PKT_H
8 #define PKT_H
9 
10 #include <asiolink/io_address.h>
11 #include <util/buffer.h>
12 #include <dhcp/option.h>
13 #include <dhcp/hwaddr.h>
14 #include <dhcp/classify.h>
16 
17 #include <boost/date_time/posix_time/posix_time.hpp>
18 #include <boost/shared_ptr.hpp>
19 
20 #include <utility>
21 
22 namespace isc {
23 
24 namespace dhcp {
25 
39 template<typename PktType>
41 public:
42 
44  typedef boost::shared_ptr<PktType> PktTypePtr;
45 
52  ScopedEnableOptionsCopy(const PktTypePtr& pkt1,
53  const PktTypePtr& pkt2 = PktTypePtr())
54  : pkts_(pkt1, pkt2) {
55  if (pkt1) {
56  pkt1->setCopyRetrievedOptions(true);
57  }
58  if (pkt2) {
59  pkt2->setCopyRetrievedOptions(true);
60  }
61  }
62 
67  if (pkts_.first) {
68  pkts_.first->setCopyRetrievedOptions(false);
69  }
70  if (pkts_.second) {
71  pkts_.second->setCopyRetrievedOptions(false);
72  }
73  }
74 
75 private:
76 
78  std::pair<PktTypePtr, PktTypePtr> pkts_;
79 };
80 
91 protected:
92 
105  Pkt(uint32_t transid, const isc::asiolink::IOAddress& local_addr,
106  const isc::asiolink::IOAddress& remote_addr, uint16_t local_port,
107  uint16_t remote_port);
108 
122  Pkt(const uint8_t* buf, uint32_t len,
123  const isc::asiolink::IOAddress& local_addr,
124  const isc::asiolink::IOAddress& remote_addr, uint16_t local_port,
125  uint16_t remote_port);
126 
127 public:
128 
144  virtual void pack() = 0;
145 
160  virtual void unpack() = 0;
161 
175 
183  virtual void addOption(const OptionPtr& opt);
184 
193  bool delOption(uint16_t type);
194 
202  virtual std::string getLabel() const {
203  isc_throw(NotImplemented, "Pkt::getLabel()");
204  }
205 
215  virtual std::string toText() const = 0;
216 
227  virtual size_t len() = 0;
228 
236  virtual uint8_t getType() const = 0;
237 
245  virtual void setType(uint8_t type) = 0;
246 
256  virtual const char* getName() const = 0;
257 
261  void setTransid(uint32_t transid) { transid_ = transid; }
262 
266  uint32_t getTransid() const { return (transid_); };
267 
272  bool inClass(const isc::dhcp::ClientClass& client_class);
273 
290  void addClass(const isc::dhcp::ClientClass& client_class,
291  bool required = false);
292 
300  const ClientClasses& getClasses(bool required = false) const {
301  return (!required ? classes_ : required_classes_);
302  }
303 
313 
314 protected:
315 
327  OptionPtr getNonCopiedOption(const uint16_t type) const;
328 
329 public:
330 
342  OptionPtr getOption(const uint16_t type);
343 
368  virtual void setCopyRetrievedOptions(const bool copy) {
370  }
371 
377  bool isCopyRetrievedOptions() const {
378  return (copy_retrieved_options_);
379  }
380 
387  void updateTimestamp();
388 
395  const boost::posix_time::ptime& getTimestamp() const {
396  return timestamp_;
397  }
398 
403  void setTimestamp(boost::posix_time::ptime& timestamp) {
404  timestamp_ = timestamp;
405  }
406 
413  void repack();
414 
419  remote_addr_ = remote;
420  }
421 
426  return (remote_addr_);
427  }
428 
433  local_addr_ = local;
434  }
435 
440  return (local_addr_);
441  }
442 
449  void setLocalPort(uint16_t local) {
450  local_port_ = local;
451  }
452 
459  uint16_t getLocalPort() const {
460  return (local_port_);
461  }
462 
469  void setRemotePort(uint16_t remote) {
470  remote_port_ = remote;
471  }
472 
476  uint16_t getRemotePort() const {
477  return (remote_port_);
478  }
479 
483  void setIndex(uint32_t ifindex) {
484  ifindex_ = ifindex;
485  };
486 
488  void resetIndex() {
489  ifindex_ = -1;
490  }
491 
495  uint32_t getIndex() const {
496  return (ifindex_);
497  };
498 
502  bool indexSet() const {
503  return (ifindex_ >= 0);
504  }
505 
512  std::string getIface() const { return (iface_); };
513 
520  void setIface(const std::string& iface ) { iface_ = iface; };
521 
533  void setRemoteHWAddr(const HWAddrPtr& hw_addr);
534 
553  void setRemoteHWAddr(const uint8_t htype, const uint8_t hlen,
554  const std::vector<uint8_t>& hw_addr);
555 
560  return (remote_hwaddr_);
561  }
562 
580  HWAddrPtr getMAC(uint32_t hw_addr_src);
581 
587  virtual ~Pkt() {
588  }
589 
597 
605 
615 
616 protected:
617 
638 
653  virtual HWAddrPtr getMACFromIPv6RelayOpt() = 0;
654 
667  virtual HWAddrPtr getMACFromDUID() = 0;
668 
682 
696  HWAddrPtr
698 
710  virtual HWAddrPtr getMACFromDocsisModem() = 0;
711 
723  virtual HWAddrPtr getMACFromDocsisCMTS() = 0;
724 
726  uint32_t transid_;
727 
729  std::string iface_;
730 
736  int64_t ifindex_;
737 
743 
749 
751  uint16_t local_port_;
752 
754  uint16_t remote_port_;
755 
765 
771 
773  boost::posix_time::ptime timestamp_;
774 
775  // remote HW address (src if receiving packet, dst if sending packet)
777 
778 private:
779 
791  virtual void setHWAddrMember(const uint8_t htype, const uint8_t hlen,
792  const std::vector<uint8_t>& hw_addr,
793  HWAddrPtr& storage);
794 };
795 
797 typedef boost::shared_ptr<isc::dhcp::Pkt> PktPtr;
798 
799 }; // namespace isc::dhcp
800 }; // namespace isc
801 
802 #endif
virtual HWAddrPtr getMACFromRemoteIdRelayOption()=0
Attempts to obtain MAC address from remote-id relay option.
isc::asiolink::IOAddress local_addr_
Local IP (v4 or v6) address.
Definition: pkt.h:742
HWAddrPtr getMACFromIPv6(const isc::asiolink::IOAddress &addr)
Attempts to convert IPv6 address into MAC.
Definition: pkt.cc:243
int64_t ifindex_
Interface index.
Definition: pkt.h:736
const ClientClasses & getClasses(bool required=false) const
Returns the class set.
Definition: pkt.h:300
virtual ~Pkt()
Virtual destructor.
Definition: pkt.h:587
OptionBuffer data_
Unparsed data (in received packets).
Definition: pkt.h:312
A generic exception that is thrown when a function is not implemented.
virtual void pack()=0
Prepares on-wire format of DHCP (either v4 or v6) packet.
Pkt(uint32_t transid, const isc::asiolink::IOAddress &local_addr, const isc::asiolink::IOAddress &remote_addr, uint16_t local_port, uint16_t remote_port)
Constructor.
Definition: pkt.cc:17
std::string iface_
Name of the network interface the packet was received/to be sent over.
Definition: pkt.h:729
bool inClass(const isc::dhcp::ClientClass &client_class)
Checks whether a client belongs to a given class.
Definition: pkt.cc:95
boost::shared_ptr< HWAddr > HWAddrPtr
Shared pointer to a hardware address structure.
Definition: hwaddr.h:154
uint16_t getRemotePort() const
Returns remote port.
Definition: pkt.h:476
virtual size_t len()=0
Returns packet size in binary format.
uint16_t getLocalPort() const
Returns local UDP (and soon TCP) port.
Definition: pkt.h:459
virtual const char * getName() const =0
Returns name of the DHCP message.
uint32_t transid_
Transaction-id (32 bits for v4, 24 bits for v6)
Definition: pkt.h:726
Defines elements for storing the names of client classes.
Base class for classes representing DHCP messages.
Definition: pkt.h:90
boost::shared_ptr< Option > OptionPtr
Definition: option.h:36
virtual HWAddrPtr getMACFromDocsisModem()=0
Attempts to extract MAC/Hardware address from DOCSIS options inserted by the modem itself...
void setTransid(uint32_t transid)
Sets transaction-id value.
Definition: pkt.h:261
virtual void addOption(const OptionPtr &opt)
Adds an option to this packet.
Definition: pkt.cc:56
virtual void setCopyRetrievedOptions(const bool copy)
Controls whether the option retrieved by the Pkt::getOption should be copied before being returned...
Definition: pkt.h:368
void setIface(const std::string &iface)
Sets interface name.
Definition: pkt.h:520
OptionPtr getNonCopiedOption(const uint16_t type) const
Returns the first option of specified type without copying.
Definition: pkt.cc:61
bool indexSet() const
Checks if interface index has been set.
Definition: pkt.h:502
const isc::asiolink::IOAddress & getLocalAddr() const
Returns local IP address.
Definition: pkt.h:439
RAII object enabling copying options retrieved from the packet.
Definition: pkt.h:40
std::vector< uint8_t > OptionBuffer
buffer types used in DHCP code.
Definition: option.h:24
virtual void setType(uint8_t type)=0
Sets message type (e.g.
void setRemoteAddr(const isc::asiolink::IOAddress &remote)
Sets remote IP address.
Definition: pkt.h:418
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
ClientClasses classes_
Classes this packet belongs to.
Definition: pkt.h:596
virtual HWAddrPtr getMACFromDocsisCMTS()=0
Attempts to extract MAC/Hardware address from DOCSIS options inserted by the CMTS (the relay agent) ...
ElementPtr copy(ConstElementPtr from, int level)
Copy the data up to a nesting level.
Definition: data.cc:1097
virtual void unpack()=0
Parses on-wire form of DHCP (either v4 or v6) packet.
Base class for classes which need to be associated with a CalloutHandle object.
void setLocalAddr(const isc::asiolink::IOAddress &local)
Sets local IP address.
Definition: pkt.h:432
bool delOption(uint16_t type)
Attempts to delete first suboption of requested type.
Definition: pkt.cc:83
void setRemotePort(uint16_t remote)
Sets remote UDP (and soon TCP) port.
Definition: pkt.h:469
void setLocalPort(uint16_t local)
Sets local UDP (and soon TCP) port.
Definition: pkt.h:449
void resetIndex()
Resets interface index to negative value.
Definition: pkt.h:488
std::multimap< unsigned int, OptionPtr > OptionCollection
A collection of DHCP (v4 or v6) options.
Definition: option.h:40
isc::util::OutputBuffer & getBuffer()
Returns reference to output buffer.
Definition: pkt.h:174
boost::shared_ptr< isc::dhcp::Pkt > PktPtr
A pointer to either Pkt4 or Pkt6 packet.
Definition: pkt.h:797
The OutputBuffer class is a buffer abstraction for manipulating mutable data.
Definition: buffer.h:294
HWAddrPtr getRemoteHWAddr() const
Returns the remote HW address obtained from raw sockets.
Definition: pkt.h:559
~ScopedEnableOptionsCopy()
Destructor.
Definition: pkt.h:66
void setTimestamp(boost::posix_time::ptime &timestamp)
Set packet timestamp.
Definition: pkt.h:403
bool copy_retrieved_options_
Indicates if a copy of the retrieved option should be returned when Pkt::getOption is called...
Definition: pkt.h:770
uint16_t remote_port_
remote TCP or UDP port
Definition: pkt.h:754
const boost::posix_time::ptime & getTimestamp() const
Returns packet timestamp.
Definition: pkt.h:395
void setRemoteHWAddr(const HWAddrPtr &hw_addr)
Sets remote hardware address.
Definition: pkt.cc:129
ScopedEnableOptionsCopy(const PktTypePtr &pkt1, const PktTypePtr &pkt2=PktTypePtr())
Constructor.
Definition: pkt.h:52
Defines the logger used by the top-level component of kea-dhcp-ddns.
void updateTimestamp()
Update packet timestamp.
Definition: pkt.cc:112
HWAddrPtr remote_hwaddr_
Definition: pkt.h:776
uint16_t local_port_
local TDP or UDP port
Definition: pkt.h:751
virtual HWAddrPtr getMACFromIPv6RelayOpt()=0
Attempts to obtain MAC address from relay option client-linklayer-addr.
void addClass(const isc::dhcp::ClientClass &client_class, bool required=false)
Adds packet to a specified class.
Definition: pkt.cc:100
virtual std::string toText() const =0
Returns text representation of the packet.
virtual HWAddrPtr getMACFromDUID()=0
Attempts to obtain MAC address from DUID-LL or DUID-LLT.
uint32_t getTransid() const
Returns value of transaction-id field.
Definition: pkt.h:266
void setIndex(uint32_t ifindex)
Sets interface index.
Definition: pkt.h:483
isc::asiolink::IOAddress remote_addr_
Remote IP address.
Definition: pkt.h:748
OptionPtr getOption(const uint16_t type)
Returns the first option of specified type.
Definition: pkt.cc:70
void repack()
Copies content of input buffer to output buffer.
Definition: pkt.cc:116
uint32_t getIndex() const
Returns interface index.
Definition: pkt.h:495
std::string getIface() const
Returns interface name.
Definition: pkt.h:512
bool isCopyRetrievedOptions() const
Returns whether the copying of retrieved options is enabled.
Definition: pkt.h:377
const isc::asiolink::IOAddress & getRemoteAddr() const
Returns remote IP address.
Definition: pkt.h:425
std::string ClientClass
Defines a single class name.
Definition: classify.h:37
isc::util::OutputBuffer buffer_out_
Output buffer (used during message transmission)
Definition: pkt.h:764
virtual HWAddrPtr getMACFromSrcLinkLocalAddr()=0
Attempts to obtain MAC address from source link-local IPv6 address.
boost::shared_ptr< PktType > PktTypePtr
Pointer to an encapsulated packet.
Definition: pkt.h:44
ClientClasses required_classes_
Classes which are required to be evaluated.
Definition: pkt.h:604
isc::dhcp::OptionCollection options_
Collection of options present in this message.
Definition: pkt.h:614
Container for storing client class names.
Definition: classify.h:43
virtual std::string getLabel() const
Returns text representation primary packet identifiers.
Definition: pkt.h:202
boost::posix_time::ptime timestamp_
packet timestamp
Definition: pkt.h:773
virtual uint8_t getType() const =0
Returns message type (e.g.
HWAddrPtr getMAC(uint32_t hw_addr_src)
Returns MAC address.
Definition: pkt.cc:146