Kea 2.5.7
pkt.h
Go to the documentation of this file.
1// Copyright (C) 2014-2024 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 <limits>
21#include <utility>
22
23namespace isc {
24
25namespace dhcp {
26
30constexpr unsigned int UNSET_IFINDEX = std::numeric_limits<unsigned int>::max();
31
45template<typename PktType>
47public:
48
50 typedef boost::shared_ptr<PktType> PktTypePtr;
51
59 const PktTypePtr& pkt2 = PktTypePtr())
60 : pkts_(pkt1, pkt2) {
61 if (pkt1) {
62 pkt1->setCopyRetrievedOptions(true);
63 }
64 if (pkt2) {
65 pkt2->setCopyRetrievedOptions(true);
66 }
67 }
68
73 if (pkts_.first) {
74 pkts_.first->setCopyRetrievedOptions(false);
75 }
76 if (pkts_.second) {
77 pkts_.second->setCopyRetrievedOptions(false);
78 }
79 }
80
81private:
82
84 std::pair<PktTypePtr, PktTypePtr> pkts_;
85};
86
87
89class PktEvent {
90public:
93 static const std::string SOCKET_RECEIVED;
94
97 static const std::string BUFFER_READ;
98
101 static const std::string RESPONSE_SENT;
102
107 PktEvent(const std::string& label, boost::posix_time::ptime timestamp)
108 : label_(label), timestamp_(timestamp) {
109 }
110
112 ~PktEvent() = default;
113
117 static boost::posix_time::ptime now() {
118 return (boost::posix_time::microsec_clock::universal_time());
119 }
120
124 static boost::posix_time::ptime EMPTY_TIME() {
125 static boost::posix_time::ptime empty_time;
126 return (empty_time);
127 }
128
130 std::string label_;
131
133 boost::posix_time::ptime timestamp_;
134};
135
146protected:
147
160 Pkt(uint32_t transid, const isc::asiolink::IOAddress& local_addr,
161 const isc::asiolink::IOAddress& remote_addr, uint16_t local_port,
162 uint16_t remote_port);
163
177 Pkt(const uint8_t* buf, uint32_t len,
178 const isc::asiolink::IOAddress& local_addr,
179 const isc::asiolink::IOAddress& remote_addr, uint16_t local_port,
180 uint16_t remote_port);
181
182public:
183
199 virtual void pack() = 0;
200
215 virtual void unpack() = 0;
216
230 return (buffer_out_);
231 }
232
240 virtual void addOption(const OptionPtr& opt);
241
250 bool delOption(uint16_t type);
251
259 virtual std::string getLabel() const {
260 isc_throw(NotImplemented, "Pkt::getLabel()");
261 }
262
272 virtual std::string toText() const = 0;
273
284 virtual size_t len() = 0;
285
293 virtual uint8_t getType() const = 0;
294
302 virtual void setType(uint8_t type) = 0;
303
313 virtual const char* getName() const = 0;
314
318 void setTransid(uint32_t transid) {
319 transid_ = transid;
320 }
321
325 uint32_t getTransid() const {
326 return (transid_);
327 }
328
333 bool inClass(const isc::dhcp::ClientClass& client_class);
334
343 void addClass(const isc::dhcp::ClientClass& client_class,
344 bool required = false);
345
354 void addSubClass(const isc::dhcp::ClientClass& class_def,
355 const isc::dhcp::ClientClass& subclass);
356
364 const ClientClasses& getClasses(bool required = false) const {
365 return (!required ? classes_ : required_classes_);
366 }
367
378 return (subclasses_);
379 }
380
390
391protected:
392
404 OptionPtr getNonCopiedOption(const uint16_t type) const;
405
418 OptionCollection getNonCopiedOptions(const uint16_t opt_type) const;
419
420public:
421
426
437 OptionPtr getOption(const uint16_t type);
438
446 isc::dhcp::OptionCollection getOptions(const uint16_t type);
447
472 virtual void setCopyRetrievedOptions(const bool copy) {
474 }
475
483 }
484
491 void updateTimestamp();
492
499 const boost::posix_time::ptime& getTimestamp() const {
500 return timestamp_;
501 }
502
506 void setTimestamp(boost::posix_time::ptime& timestamp) {
507 timestamp_ = timestamp;
508 }
509
515 void addPktEvent(const std::string& label,
516 const boost::posix_time::ptime& timestamp = PktEvent::now());
517
524 void addPktEvent(const std::string& label, const struct timeval& timestamp);
525
535 void setPktEvent(const std::string& label,
536 const boost::posix_time::ptime& timestamp = PktEvent::now());
537
541 void clearPktEvents();
542
547 boost::posix_time::ptime getPktEventTime(const std::string& label) const;
548
552 const std::list<PktEvent>& getPktEvents() {
553 return (events_);
554 }
555
560 std::string dumpPktEvents(bool verbose = false) const;
561
568 void repack();
569
574 remote_addr_ = remote;
575 }
576
581 return (remote_addr_);
582 }
583
588 local_addr_ = local;
589 }
590
595 return (local_addr_);
596 }
597
604 void setLocalPort(uint16_t local) {
605 local_port_ = local;
606 }
607
614 uint16_t getLocalPort() const {
615 return (local_port_);
616 }
617
624 void setRemotePort(uint16_t remote) {
625 remote_port_ = remote;
626 }
627
631 uint16_t getRemotePort() const {
632 return (remote_port_);
633 }
634
638 void setIndex(const unsigned int ifindex) {
639 ifindex_ = ifindex;
640 }
641
643 void resetIndex() {
645 }
646
650 int getIndex() const {
651 return (ifindex_);
652 }
653
657 bool indexSet() const {
658 return (ifindex_ != UNSET_IFINDEX);
659 }
660
667 std::string getIface() const {
668 return (iface_);
669 }
670
677 void setIface(const std::string& iface) {
678 iface_ = iface;
679 }
680
692 void setRemoteHWAddr(const HWAddrPtr& hw_addr);
693
712 void setRemoteHWAddr(const uint8_t htype, const uint8_t hlen,
713 const std::vector<uint8_t>& hw_addr);
714
719 return (remote_hwaddr_);
720 }
721
739 HWAddrPtr getMAC(uint32_t hw_addr_src);
740
746 virtual ~Pkt() {
747 }
748
756
764
772
782
783protected:
784
805
821
835
849
865
878
891
893 uint32_t transid_;
894
896 std::string iface_;
897
903 unsigned int ifindex_;
904
910
916
918 uint16_t local_port_;
919
921 uint16_t remote_port_;
922
932
938
940 boost::posix_time::ptime timestamp_;
941
942 // remote HW address (src if receiving packet, dst if sending packet)
944
945private:
946
958 virtual void setHWAddrMember(const uint8_t htype, const uint8_t hlen,
959 const std::vector<uint8_t>& hw_addr,
960 HWAddrPtr& storage);
961
963 std::list<PktEvent> events_;
964};
965
967typedef boost::shared_ptr<isc::dhcp::Pkt> PktPtr;
968
982public:
983
989 ScopedSubOptionsCopy(const OptionPtr& opt) : option_(opt) {
990 if (opt) {
991 options_ = opt->getMutableOptions();
992 }
993 }
994
999 if (option_) {
1000 option_->getMutableOptions() = options_;
1001 }
1002 }
1003
1004private:
1005
1007 OptionPtr option_;
1008
1010 OptionCollection options_;
1011};
1012
1025template<typename PktType>
1027public:
1028
1034 ScopedPktOptionsCopy(PktType& pkt) : pkt_(pkt), options_(pkt.options_) {
1035 pkt_.options_ = pkt_.cloneOptions();
1036 }
1037
1042 pkt_.options_ = options_;
1043 }
1044
1045private:
1046
1048 PktType& pkt_;
1049
1051 OptionCollection options_;
1052};
1053
1054} // end of namespace isc::dhcp
1055} // end of namespace isc
1056
1057#endif
Defines elements for storing the names of client classes.
A generic exception that is thrown when a function is not implemented.
Container for storing client class names.
Definition: classify.h:108
Describes an event during the life cycle of a packet.
Definition: pkt.h:89
static boost::posix_time::ptime EMPTY_TIME()
Fetch an empty timestamp, used for logic comparisons.
Definition: pkt.h:124
~PktEvent()=default
Destructor.
static boost::posix_time::ptime now()
Fetch the current UTC system time, microsecond precision.
Definition: pkt.h:117
std::string label_
Label identifying this event.
Definition: pkt.h:130
PktEvent(const std::string &label, boost::posix_time::ptime timestamp)
Constructor.
Definition: pkt.h:107
static const std::string BUFFER_READ
Event that marks when a packet is read from the socket buffer by application.
Definition: pkt.h:97
boost::posix_time::ptime timestamp_
Timestamp at which the event occurred.
Definition: pkt.h:133
static const std::string SOCKET_RECEIVED
Event that marks when a packet is placed in the socket buffer by the kernel.
Definition: pkt.h:93
static const std::string RESPONSE_SENT
Event that marks when a packet is been written to the socket by application.
Definition: pkt.h:101
Base class for classes representing DHCP messages.
Definition: pkt.h:145
bool delOption(uint16_t type)
Attempts to delete first suboption of requested type.
Definition: pkt.cc:110
virtual HWAddrPtr getMACFromDocsisModem()=0
Attempts to extract MAC/Hardware address from DOCSIS options inserted by the modem itself.
virtual uint8_t getType() const =0
Returns message type (e.g.
isc::dhcp::OptionCollection getOptions(const uint16_t type)
Returns all instances of specified type.
Definition: pkt.cc:91
isc::asiolink::IOAddress remote_addr_
Remote IP address.
Definition: pkt.h:915
virtual HWAddrPtr getMACFromDocsisCMTS()=0
Attempts to extract MAC/Hardware address from DOCSIS options inserted by the CMTS (the relay agent)
virtual const char * getName() const =0
Returns name of the DHCP message.
virtual void setType(uint8_t type)=0
Sets message type (e.g.
ClientClasses required_classes_
Classes which are required to be evaluated.
Definition: pkt.h:763
bool isCopyRetrievedOptions() const
Returns whether the copying of retrieved options is enabled.
Definition: pkt.h:481
uint16_t local_port_
local TDP or UDP port
Definition: pkt.h:918
int getIndex() const
Returns interface index.
Definition: pkt.h:650
const SubClassRelationContainer & getSubClassesRelations() const
Returns the class set including template classes associated with subclasses.
Definition: pkt.h:377
void resetIndex()
Resets interface index to negative value.
Definition: pkt.h:643
uint32_t transid_
Transaction-id (32 bits for v4, 24 bits for v6)
Definition: pkt.h:893
const ClientClasses & getClasses(bool required=false) const
Returns the class set.
Definition: pkt.h:364
void repack()
Copies content of input buffer to output buffer.
Definition: pkt.cc:151
isc::asiolink::IOAddress local_addr_
Local IP (v4 or v6) address.
Definition: pkt.h:909
virtual void pack()=0
Prepares on-wire format of DHCP (either v4 or v6) packet.
virtual HWAddrPtr getMACFromRemoteIdRelayOption()=0
Attempts to obtain MAC address from remote-id relay option.
virtual void unpack()=0
Parses on-wire form of DHCP (either v4 or v6) packet.
OptionBuffer data_
Unparsed data (in received packets).
Definition: pkt.h:389
const isc::asiolink::IOAddress & getLocalAddr() const
Returns local IP address.
Definition: pkt.h:594
HWAddrPtr getRemoteHWAddr() const
Returns the remote HW address obtained from raw sockets.
Definition: pkt.h:718
virtual HWAddrPtr getMACFromSrcLinkLocalAddr()=0
Attempts to obtain MAC address from source link-local IPv6 address.
const std::list< PktEvent > & getPktEvents()
Fetches the current event stack contents.
Definition: pkt.h:552
const isc::asiolink::IOAddress & getRemoteAddr() const
Returns remote IP address.
Definition: pkt.h:580
ClientClasses classes_
Classes this packet belongs to.
Definition: pkt.h:755
void setPktEvent(const std::string &label, const boost::posix_time::ptime &timestamp=PktEvent::now())
Updates (or adds) an event in the event stack.
Definition: pkt.cc:326
virtual size_t len()=0
Returns packet size in binary format.
void setIface(const std::string &iface)
Sets interface name.
Definition: pkt.h:677
bool indexSet() const
Checks if interface index has been set.
Definition: pkt.h:657
isc::util::OutputBuffer & getBuffer()
Returns reference to output buffer.
Definition: pkt.h:229
uint16_t getLocalPort() const
Returns local UDP (and soon TCP) port.
Definition: pkt.h:614
void setLocalPort(uint16_t local)
Sets local UDP (and soon TCP) port.
Definition: pkt.h:604
uint16_t remote_port_
remote TCP or UDP port
Definition: pkt.h:921
void setIndex(const unsigned int ifindex)
Sets interface index.
Definition: pkt.h:638
HWAddrPtr remote_hwaddr_
Definition: pkt.h:943
uint32_t getTransid() const
Returns value of transaction-id field.
Definition: pkt.h:325
isc::dhcp::OptionCollection options_
Collection of options present in this message.
Definition: pkt.h:781
isc::util::OutputBuffer buffer_out_
Output buffer (used during message transmission)
Definition: pkt.h:931
std::string getIface() const
Returns interface name.
Definition: pkt.h:667
virtual HWAddrPtr getMACFromDUID()=0
Attempts to obtain MAC address from DUID-LL or DUID-LLT.
virtual void setCopyRetrievedOptions(const bool copy)
Controls whether the option retrieved by the Pkt::getOption should be copied before being returned.
Definition: pkt.h:472
const boost::posix_time::ptime & getTimestamp() const
Returns packet timestamp.
Definition: pkt.h:499
SubClassRelationContainer subclasses_
SubClasses this packet belongs to.
Definition: pkt.h:771
void addPktEvent(const std::string &label, const boost::posix_time::ptime &timestamp=PktEvent::now())
Adds an event to the end of the event stack.
void clearPktEvents()
Discards contents of the packet event stack.
Definition: pkt.cc:358
OptionCollection getNonCopiedOptions(const uint16_t opt_type) const
Returns all option instances of specified type without copying.
Definition: pkt.cc:84
void setTimestamp(boost::posix_time::ptime &timestamp)
Set socket receive timestamp.
Definition: pkt.h:506
boost::posix_time::ptime getPktEventTime(const std::string &label) const
Fetches the timestamp for a given event in the stack.
Definition: pkt.cc:347
OptionCollection cloneOptions()
Clones all options so that they can be safely modified.
Definition: pkt.cc:48
uint16_t getRemotePort() const
Returns remote port.
Definition: pkt.h:631
OptionPtr getOption(const uint16_t type)
Returns the first option of specified type.
Definition: pkt.cc:71
void setRemoteHWAddr(const HWAddrPtr &hw_addr)
Sets remote hardware address.
Definition: pkt.cc:164
void addSubClass(const isc::dhcp::ClientClass &class_def, const isc::dhcp::ClientClass &subclass)
Adds a specified subclass to the packet.
Definition: pkt.cc:135
bool inClass(const isc::dhcp::ClientClass &client_class)
Checks whether a client belongs to a given class.
Definition: pkt.cc:121
virtual HWAddrPtr getMACFromIPv6RelayOpt()=0
Attempts to obtain MAC address from relay option client-linklayer-addr.
unsigned int ifindex_
Interface index.
Definition: pkt.h:903
boost::posix_time::ptime timestamp_
packet timestamp
Definition: pkt.h:940
void setTransid(uint32_t transid)
Sets transaction-id value.
Definition: pkt.h:318
HWAddrPtr getMAC(uint32_t hw_addr_src)
Returns MAC address.
Definition: pkt.cc:180
virtual std::string toText() const =0
Returns text representation of the packet.
void updateTimestamp()
Update packet timestamp.
Definition: pkt.cc:147
bool copy_retrieved_options_
Indicates if a copy of the retrieved option should be returned when Pkt::getOption is called.
Definition: pkt.h:937
std::string iface_
Name of the network interface the packet was received/to be sent over.
Definition: pkt.h:896
std::string dumpPktEvents(bool verbose=false) const
Creates a dump of the stack contents to a string for logging.
Definition: pkt.cc:363
void addClass(const isc::dhcp::ClientClass &client_class, bool required=false)
Adds a specified class to the packet.
Definition: pkt.cc:126
OptionPtr getNonCopiedOption(const uint16_t type) const
Returns the first option of specified type without copying.
Definition: pkt.cc:62
void setRemoteAddr(const isc::asiolink::IOAddress &remote)
Sets remote IP address.
Definition: pkt.h:573
HWAddrPtr getMACFromIPv6(const isc::asiolink::IOAddress &addr)
Attempts to convert IPv6 address into MAC.
Definition: pkt.cc:277
void setLocalAddr(const isc::asiolink::IOAddress &local)
Sets local IP address.
Definition: pkt.h:587
void setRemotePort(uint16_t remote)
Sets remote UDP (and soon TCP) port.
Definition: pkt.h:624
virtual std::string getLabel() const
Returns text representation primary packet identifiers.
Definition: pkt.h:259
virtual void addOption(const OptionPtr &opt)
Adds an option to this packet.
Definition: pkt.cc:57
virtual ~Pkt()
Virtual destructor.
Definition: pkt.h:746
RAII object enabling copying options retrieved from the packet.
Definition: pkt.h:46
ScopedEnableOptionsCopy(const PktTypePtr &pkt1, const PktTypePtr &pkt2=PktTypePtr())
Constructor.
Definition: pkt.h:58
boost::shared_ptr< PktType > PktTypePtr
Pointer to an encapsulated packet.
Definition: pkt.h:50
~ScopedEnableOptionsCopy()
Destructor.
Definition: pkt.h:72
RAII object enabling duplication of the stored options and restoring the original options on destruct...
Definition: pkt.h:1026
~ScopedPktOptionsCopy()
Destructor.
Definition: pkt.h:1041
ScopedPktOptionsCopy(PktType &pkt)
Constructor.
Definition: pkt.h:1034
RAII object enabling duplication of the stored options and restoring the original options on destruct...
Definition: pkt.h:981
ScopedSubOptionsCopy(const OptionPtr &opt)
Constructor.
Definition: pkt.h:989
~ScopedSubOptionsCopy()
Destructor.
Definition: pkt.h:998
Base class for classes which need to be associated with a CalloutHandle object.
The OutputBuffer class is a buffer abstraction for manipulating mutable data.
Definition: buffer.h:294
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
ElementPtr copy(ConstElementPtr from, int level)
Copy the data up to a nesting level.
Definition: data.cc:1420
boost::shared_ptr< isc::dhcp::Pkt > PktPtr
A pointer to either Pkt4 or Pkt6 packet.
Definition: pkt.h:967
std::string ClientClass
Defines a single class name.
Definition: classify.h:42
std::multimap< unsigned int, OptionPtr > OptionCollection
A collection of DHCP (v4 or v6) options.
Definition: option.h:40
boost::multi_index_container< SubClassRelation, boost::multi_index::indexed_by< boost::multi_index::sequenced< boost::multi_index::tag< TemplateClassSequenceTag > >, boost::multi_index::hashed_unique< boost::multi_index::tag< TemplateClassNameTag >, boost::multi_index::member< SubClassRelation, ClientClass, &SubClassRelation::class_def_ > > > > SubClassRelationContainer
the subclass multi-index.
Definition: classify.h:102
boost::shared_ptr< HWAddr > HWAddrPtr
Shared pointer to a hardware address structure.
Definition: hwaddr.h:154
constexpr unsigned int UNSET_IFINDEX
A value used to signal that the interface index was not set.
Definition: pkt.h:30
std::vector< uint8_t > OptionBuffer
buffer types used in DHCP code.
Definition: option.h:24
boost::shared_ptr< Option > OptionPtr
Definition: option.h:37
Defines the logger used by the top-level component of kea-lfc.