Kea  2.3.1-git
lease.h
Go to the documentation of this file.
1 // Copyright (C) 2013-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 LEASE_H
8 #define LEASE_H
9 
10 #include <asiolink/io_address.h>
11 #include <dhcp/duid.h>
12 #include <dhcp/option.h>
13 #include <dhcp/hwaddr.h>
14 #include <dhcpsrv/subnet_id.h>
15 #include <cc/user_context.h>
16 #include <cc/cfg_to_element.h>
17 #include <util/dhcp_space.h>
18 
19 namespace isc {
20 namespace dhcp {
21 
22 struct Lease;
23 
25 typedef boost::shared_ptr<Lease> LeasePtr;
26 
32 
34  static const uint32_t INFINITY_LFT = 0xffffffff;
35 
43  static std::string lifetimeToText(uint32_t lifetime);
44 
46  typedef enum {
47  TYPE_NA = 0,
48  TYPE_TA = 1,
49  TYPE_PD = 2,
50  TYPE_V4 = 3
51  } Type;
52 
56  static std::string typeToText(Type type);
57 
63  static Type textToType(const std::string& text);
64 
66 
67  static const uint32_t STATE_DEFAULT;
70 
72  static const uint32_t STATE_DECLINED;
73 
75  static const uint32_t STATE_EXPIRED_RECLAIMED;
76 
84  static std::string basicStatesToText(const uint32_t state);
85 
103  Lease(const isc::asiolink::IOAddress& addr,
104  uint32_t valid_lft, SubnetID subnet_id, time_t cltt,
105  const bool fqdn_fwd, const bool fqdn_rev,
106  const std::string& hostname,
107  const HWAddrPtr& hwaddr);
108 
110  virtual ~Lease() {}
111 
115  virtual Lease::Type getType() const = 0;
116 
121 
125  uint32_t valid_lft_;
126 
131 
138 
143  time_t cltt_;
144 
150 
155 
159  std::string hostname_;
160 
164  bool fqdn_fwd_;
165 
169  bool fqdn_rev_;
170 
175 
185  uint32_t state_;
186 
190  virtual std::string toText() const = 0;
191 
194  bool expired() const;
195 
200  bool stateExpiredReclaimed() const;
201 
205  bool stateDeclined() const;
206 
215  bool hasIdenticalFqdn(const Lease& other) const;
216 
225  const std::vector<uint8_t>& getHWAddrVector() const;
226 
231  int64_t getExpirationTime() const;
232 
243  virtual void decline(uint32_t probation_period) = 0;
244 
247 
258  static void syncCurrentExpirationTime(const Lease& from, Lease& to);
259 
268 
269 protected:
270 
279  static void fromElementCommon(const LeasePtr& lease,
280  const data::ConstElementPtr& element);
281 
282 };
283 
284 struct Lease4;
285 
287 typedef boost::shared_ptr<Lease4> Lease4Ptr;
288 
295 struct Lease4 : public Lease {
296 
302 
315  Lease4(const isc::asiolink::IOAddress& addr, const HWAddrPtr& hwaddr,
316  const uint8_t* clientid, size_t clientid_len, uint32_t valid_lft,
317  time_t cltt, uint32_t subnet_id,
318  const bool fqdn_fwd = false, const bool fqdn_rev = false,
319  const std::string& hostname = "")
320  : Lease(addr, valid_lft, subnet_id, cltt, fqdn_fwd, fqdn_rev,
321  hostname, hwaddr) {
322  if (clientid_len) {
323  client_id_.reset(new ClientId(clientid, clientid_len));
324  }
325  }
326 
338  Lease4(const isc::asiolink::IOAddress& address,
339  const HWAddrPtr& hw_address,
340  const ClientIdPtr& client_id,
341  const uint32_t valid_lifetime,
342  const time_t cltt,
343  const SubnetID subnet_id,
344  const bool fqdn_fwd = false,
345  const bool fqdn_rev = false,
346  const std::string& hostname = "");
347 
348 
352  Lease4() : Lease(0, 0, 0, 0, false, false, "", HWAddrPtr())
353  {
354  }
355 
359  Lease4(const Lease4& other);
360 
367  virtual Lease::Type getType() const {
368  return (Lease::TYPE_V4);
369  }
370 
379  static std::string statesToText(const uint32_t state);
380 
390  const std::vector<uint8_t>& getClientIdVector() const;
391 
452  bool belongsToClient(const HWAddrPtr& hw_address,
453  const ClientIdPtr& client_id) const;
454 
458  Lease4& operator=(const Lease4& other);
459 
463  bool operator==(const Lease4& other) const;
464 
468  bool operator!=(const Lease4& other) const {
469  return (!operator==(other));
470  }
471 
475  virtual std::string toText() const;
476 
482  void decline(uint32_t probation_period);
483 
485  virtual isc::data::ElementPtr toElement() const;
486 
492  static Lease4Ptr fromElement(const data::ConstElementPtr& element);
493 
495 };
496 
498 typedef std::vector<Lease4Ptr> Lease4Collection;
499 
501 typedef boost::shared_ptr<Lease4Collection> Lease4CollectionPtr;
502 
503 struct Lease6;
504 
506 typedef boost::shared_ptr<Lease6> Lease6Ptr;
507 
514 struct Lease6 : public Lease {
515 
520 
524  uint8_t prefixlen_;
525 
531  uint32_t iaid_;
532 
535 
540  uint32_t preferred_lft_;
541 
549 
551 
562  Lease6(Lease::Type type, const isc::asiolink::IOAddress& addr, DuidPtr duid,
563  uint32_t iaid, uint32_t preferred, uint32_t valid,
564  SubnetID subnet_id, const HWAddrPtr& hwaddr = HWAddrPtr(),
565  uint8_t prefixlen = 128);
566 
581  Lease6(Lease::Type type, const isc::asiolink::IOAddress& addr, DuidPtr duid,
582  uint32_t iaid, uint32_t preferred, uint32_t valid,
583  SubnetID subnet_id, const bool fqdn_fwd,
584  const bool fqdn_rev, const std::string& hostname,
585  const HWAddrPtr& hwaddr = HWAddrPtr(), uint8_t prefixlen = 128);
586 
590  Lease6();
591 
598  virtual Lease::Type getType() const {
599  return (type_);
600  }
601 
610  static std::string statesToText(const uint32_t state);
611 
620  const std::vector<uint8_t>& getDuidVector() const;
621 
627  void decline(uint32_t probation_period);
628 
632  bool operator==(const Lease6& other) const;
633 
637  bool operator!=(const Lease6& other) const {
638  return (!operator==(other));
639  }
640 
644  virtual std::string toText() const;
645 
647  virtual isc::data::ElementPtr toElement() const;
648 
654  static Lease6Ptr fromElement(const data::ConstElementPtr& element);
655 };
656 
658 typedef boost::shared_ptr<const Lease6> ConstLease6Ptr;
659 
661 typedef std::vector<Lease6Ptr> Lease6Collection;
662 
663 
665 typedef boost::shared_ptr<Lease6Collection> Lease6CollectionPtr;
666 
673 std::ostream&
674 operator<<(std::ostream& os, const Lease& lease);
675 
678 namespace {
679 
680 template <isc::util::DhcpSpace D>
681 struct AdapterLease {};
682 
683 template <>
684 struct AdapterLease<isc::util::DHCPv4> {
685  using type = Lease4;
686 };
687 
688 template <>
689 struct AdapterLease<isc::util::DHCPv6> {
690  using type = Lease6;
691 };
692 
693 } // namespace
694 
695 template <isc::util::DhcpSpace D>
696 using LeaseT = typename AdapterLease<D>::type;
697 
698 template <isc::util::DhcpSpace D>
699 using LeaseTPtr = boost::shared_ptr<LeaseT<D>>;
701 
702 }; // end of isc::dhcp namespace
703 }; // end of isc namespace
704 
705 #endif // LEASE_H
static std::string lifetimeToText(uint32_t lifetime)
Print lifetime.
Definition: lease.cc:29
uint32_t state_
Holds the lease state(s).
Definition: lease.h:185
boost::shared_ptr< DUID > DuidPtr
Definition: duid.h:20
HWAddrPtr hwaddr_
Client&#39;s MAC/hardware address.
Definition: lease.h:174
uint32_t iaid_
Identity Association Identifier (IAID)
Definition: lease.h:531
typename AdapterLease< D >::type LeaseT
Definition: lease.h:696
static const uint32_t STATE_EXPIRED_RECLAIMED
Expired and reclaimed lease.
Definition: lease.h:75
Structure that holds a lease for IPv4 address.
Definition: lease.h:295
uint32_t reuseable_preferred_lft_
Remaining preferred lifetime.
Definition: lease.h:548
bool fqdn_rev_
Reverse zone updated?
Definition: lease.h:169
virtual void decline(uint32_t probation_period)=0
Sets lease to DECLINED state.
boost::shared_ptr< HWAddr > HWAddrPtr
Shared pointer to a hardware address structure.
Definition: hwaddr.h:154
static std::string typeToText(Type type)
returns text representation of a lease type
Definition: lease.cc:52
const std::vector< uint8_t > & getHWAddrVector() const
Returns raw (as vector) hardware address.
Definition: lease.cc:355
Base class for user context.
Definition: user_context.h:22
time_t cltt_
Client last transmission time.
Definition: lease.h:143
uint32_t preferred_lft_
Preferred lifetime.
Definition: lease.h:540
bool fqdn_fwd_
Forward zone updated?
Definition: lease.h:164
std::vector< Lease4Ptr > Lease4Collection
A collection of IPv4 leases.
Definition: lease.h:498
virtual Lease::Type getType() const
Returns Lease type.
Definition: lease.h:367
the lease contains IPv6 prefix (for prefix delegation)
Definition: lease.h:49
boost::shared_ptr< Element > ElementPtr
Definition: data.h:24
std::string hostname_
Client hostname.
Definition: lease.h:159
boost::shared_ptr< const Lease6 > ConstLease6Ptr
Pointer to a const Lease6 structure.
Definition: lease.h:658
SubnetID subnet_id_
Subnet identifier.
Definition: lease.h:154
virtual std::string toText() const =0
Convert Lease to Printable Form.
boost::shared_ptr< Lease > LeasePtr
Pointer to the lease object.
Definition: lease.h:22
bool operator!=(const Lease4 &other) const
Compare two leases for inequality.
Definition: lease.h:468
bool operator==(const Element &a, const Element &b)
Definition: data.cc:210
static void syncCurrentExpirationTime(const Lease &from, Lease &to)
Sync lease current expiration time with new value from another lease, so that additional operations c...
Definition: lease.cc:291
int64_t getExpirationTime() const
Returns lease expiration time.
Definition: lease.cc:123
boost::shared_ptr< Lease4 > Lease4Ptr
Pointer to a Lease4 structure.
Definition: lease.h:284
virtual Lease::Type getType() const
Returns Lease type.
Definition: lease.h:598
Abstract class for configuration Cfg_* classes.
boost::shared_ptr< Lease4Collection > Lease4CollectionPtr
A shared pointer to the collection of IPv4 leases.
Definition: lease.h:501
Lease4()
Default constructor.
Definition: lease.h:352
boost::shared_ptr< LeaseT< D > > LeaseTPtr
Definition: lease.h:699
Lease4(const isc::asiolink::IOAddress &addr, const HWAddrPtr &hwaddr, const uint8_t *clientid, size_t clientid_len, uint32_t valid_lft, time_t cltt, uint32_t subnet_id, const bool fqdn_fwd=false, const bool fqdn_rev=false, const std::string &hostname="")
Constructor.
Definition: lease.h:315
IPv4 lease.
Definition: lease.h:50
void updateCurrentExpirationTime()
Update lease current expiration time with new value, so that additional operations can be done withou...
Definition: lease.cc:286
virtual Lease::Type getType() const =0
Returns Lease type.
boost::shared_ptr< const Element > ConstElementPtr
Definition: data.h:27
DuidPtr duid_
Client identifier.
Definition: lease.h:534
Structure that holds a lease for IPv6 address and/or prefix.
Definition: lease.h:514
ClientIdPtr client_id_
Client identifier.
Definition: lease.h:301
Lease::Type type_
Lease type.
Definition: lease.h:519
Lease(const isc::asiolink::IOAddress &addr, uint32_t valid_lft, SubnetID subnet_id, time_t cltt, const bool fqdn_fwd, const bool fqdn_rev, const std::string &hostname, const HWAddrPtr &hwaddr)
Constructor.
Definition: lease.cc:39
uint8_t prefixlen_
IPv6 prefix length.
Definition: lease.h:524
std::vector< Lease6Ptr > Lease6Collection
A collection of IPv6 leases.
Definition: lease.h:661
boost::shared_ptr< ClientId > ClientIdPtr
Shared pointer to a Client ID.
Definition: duid.h:103
the lease contains temporary IPv6 address
Definition: lease.h:48
the lease contains non-temporary IPv6 address
Definition: lease.h:47
bool expired() const
returns true if the lease is expired
Definition: lease.cc:108
time_t current_cltt_
Current client last transmission time.
Definition: lease.h:149
Defines the logger used by the top-level component of kea-lfc.
static Type textToType(const std::string &text)
Converts type name to the actual type.
Definition: lease.cc:72
bool operator!=(const Lease6 &other) const
Compare two leases for inequality.
Definition: lease.h:637
bool stateExpiredReclaimed() const
Indicates if the lease is in the "expired-reclaimed" state.
Definition: lease.cc:113
static const uint32_t INFINITY_LFT
Infinity (means static, i.e. never expire)
Definition: lease.h:34
a common structure for IPv4 and IPv6 leases
Definition: lease.h:31
Type
Type of lease or pool.
Definition: lease.h:46
std::ostream & operator<<(std::ostream &os, const OpaqueDataTuple &tuple)
Inserts the OpaqueDataTuple as a string into stream.
Holds Client identifier or client IPv4 address.
Definition: duid.h:111
static std::string basicStatesToText(const uint32_t state)
Returns name(s) of the basic lease state(s).
Definition: lease.cc:90
boost::shared_ptr< Lease6Collection > Lease6CollectionPtr
A shared pointer to the collection of IPv6 leases.
Definition: lease.h:665
virtual ~Lease()
Destructor.
Definition: lease.h:110
uint32_t reuseable_valid_lft_
Remaining valid lifetime.
Definition: lease.h:137
isc::asiolink::IOAddress addr_
IPv4 ot IPv6 address.
Definition: lease.h:120
static const uint32_t STATE_DEFAULT
A lease in the default state.
Definition: lease.h:69
static const uint32_t STATE_DECLINED
Declined lease.
Definition: lease.h:72
bool stateDeclined() const
Indicates if the lease is in the "declined" state.
Definition: lease.cc:118
uint32_t valid_lft_
Valid lifetime.
Definition: lease.h:125
virtual isc::data::ElementPtr toElement() const =0
Unparse a configuration object.
static void fromElementCommon(const LeasePtr &lease, const data::ConstElementPtr &element)
Sets common (for v4 and v6) properties of the lease object.
Definition: lease.cc:135
boost::shared_ptr< Lease6 > Lease6Ptr
Pointer to a Lease6 structure.
Definition: lease.h:503
uint32_t current_valid_lft_
Current valid lifetime.
Definition: lease.h:130
bool hasIdenticalFqdn(const Lease &other) const
Returns true if the other lease has equal FQDN data.
Definition: lease.cc:128
uint32_t SubnetID
Defines unique IPv4 or IPv6 subnet identifier.
Definition: subnet_id.h:24