7#ifndef HA_COMMUNICATION_STATE_H 
    8#define HA_COMMUNICATION_STATE_H 
   17#include <boost/date_time/posix_time/posix_time.hpp> 
   18#include <boost/multi_index_container.hpp> 
   19#include <boost/multi_index/composite_key.hpp> 
   20#include <boost/multi_index/hashed_index.hpp> 
   21#include <boost/multi_index/indexed_by.hpp> 
   22#include <boost/multi_index/member.hpp> 
   23#include <boost/multi_index/ordered_index.hpp> 
   24#include <boost/scoped_ptr.hpp> 
   25#include <boost/shared_ptr.hpp> 
  122    void setPartnerStateInternal(
const std::string& state);
 
  137    void setCurrentPartnerStateTimeInternal();
 
  164                        const std::function<
void()>& heartbeat_impl);
 
  175    void startHeartbeatInternal(
const long interval = 0,
 
  176                                const std::function<
void()>& heartbeat_impl = 0);
 
  179    void stopHeartbeatInternal();
 
  228                                            const uint16_t option_type);
 
  352    template<
typename RejectedClientsType>
 
  354        if (rejected_clients.empty()) {
 
  357        auto& idx = rejected_clients.template 
get<1>();
 
  358        auto upper_limit = idx.upper_bound(time(NULL));
 
  359        if (upper_limit != idx.end()) {
 
  360            auto lower_limit = idx.cbegin();
 
  361            idx.erase(lower_limit, upper_limit);
 
  363        return (rejected_clients.size());
 
 
  381                                   const uint32_t lifetime = 86400);
 
  398                                                   const uint32_t lifetime) = 0;
 
  484    bool clockSkewShouldWarnInternal();
 
  522    bool clockSkewShouldTerminateInternal();
 
  530    bool isClockSkewGreater(
const long seconds) 
const;
 
  552    bool rejectedLeaseUpdatesShouldTerminateInternal();
 
  582    void setPartnerTimeInternal(
const std::string& time_text);
 
  588    void resetPartnerTimeInternal();
 
  596    std::string logFormatClockSkewInternal() 
const;
 
  624    int64_t getDurationInMillisecsInternal() 
const;
 
  638    boost::posix_time::time_duration updatePokeTimeInternal();
 
  661    void increaseUnsentUpdateCountInternal();
 
  682    bool hasPartnerNewUnsentUpdatesInternal() 
const;
 
  698    void setPartnerUnsentUpdateCountInternal(uint64_t unsent_update_count);
 
  776    const boost::scoped_ptr<std::mutex> 
mutex_;
 
 
  812    virtual void analyzeMessage(
const boost::shared_ptr<dhcp::Pkt>& message);
 
  865                                                   const uint32_t lifetime);
 
  919    template<
typename ClientData>
 
  921        boost::multi_index::composite_key<
 
  923            boost::multi_index::member<ClientData, std::vector<uint8_t>,
 
  924                                       &ClientData::hwaddr_>,
 
  925            boost::multi_index::member<ClientData, std::vector<uint8_t>,
 
  926                                       &ClientData::clientid_>
 
  940    typedef boost::multi_index_container<
 
  942        boost::multi_index::indexed_by<
 
  948            boost::multi_index::ordered_non_unique<
 
  949                boost::multi_index::member<ConnectingClient4, bool, &ConnectingClient4::unacked_>
 
  969    typedef boost::multi_index_container<
 
  971        boost::multi_index::indexed_by<
 
  973            boost::multi_index::ordered_non_unique<
 
 
 1011    virtual void analyzeMessage(
const boost::shared_ptr<dhcp::Pkt>& message);
 
 1064                                                   const uint32_t lifetime = 86400);
 
 1114    template<
typename ClientData>
 
 1116        boost::multi_index::member<ClientData, std::vector<uint8_t>,
 
 1129    typedef boost::multi_index_container<
 
 1131        boost::multi_index::indexed_by<
 
 1136            boost::multi_index::ordered_non_unique<
 
 1137                boost::multi_index::member<ConnectingClient6, bool, &ConnectingClient6::unacked_>
 
 1156    typedef boost::multi_index_container<
 
 1158        boost::multi_index::indexed_by<
 
 1160            boost::multi_index::ordered_non_unique<
 
 
virtual bool reportRejectedLeaseUpdateInternal(const dhcp::PktPtr &message, const uint32_t lifetime)
Marks that the lease update failed due to a conflict for the specified DHCP message.
virtual size_t getRejectedLeaseUpdatesCountInternal()
Returns the number of lease updates rejected by the partner.
virtual bool reportSuccessfulLeaseUpdateInternal(const dhcp::PktPtr &message)
Marks the lease update successful.
virtual size_t getUnackedClientsCount() const
Returns the current number of clients which haven't gotten a lease from the partner server.
boost::multi_index_container< RejectedClient4, boost::multi_index::indexed_by< ClientIdent4< RejectedClient4 >, boost::multi_index::ordered_non_unique< boost::multi_index::member< RejectedClient4, int64_t, &RejectedClient4::expire_ > > > > RejectedClients4
Multi index container holding information about the clients who have rejected leases.
virtual void clearRejectedLeaseUpdatesInternal()
Clears rejected client leases.
virtual void analyzeMessageInternal(const boost::shared_ptr< dhcp::Pkt > &message)
Checks if the DHCPv4 message appears to be unanswered.
virtual size_t getConnectingClientsCount() const
Returns the current number of clients which attempted to get a lease from the partner server.
virtual void analyzeMessage(const boost::shared_ptr< dhcp::Pkt > &message)
Checks if the DHCPv4 message appears to be unanswered.
RejectedClients4 rejected_clients_
Holds information about the clients for whom lease updates have been rejected by the partner.
virtual bool failureDetectedInternal() const
Checks if the partner failure has been detected based on the DHCP traffic analysis.
boost::multi_index::hashed_unique< boost::multi_index::composite_key< ClientData, boost::multi_index::member< ClientData, std::vector< uint8_t >, &ClientData::hwaddr_ >, boost::multi_index::member< ClientData, std::vector< uint8_t >, &ClientData::clientid_ > > > ClientIdent4
Hashed index used in the multi index containers to find clients by HW address and client identifier.
ConnectingClients4 connecting_clients_
Holds information about the clients attempting to contact the partner server while the servers are in...
virtual bool failureDetected() const
Checks if the partner failure has been detected based on the DHCP traffic analysis.
virtual void clearConnectingClients()
Removes information about the clients the partner server should respond to while communication with t...
boost::multi_index_container< ConnectingClient4, boost::multi_index::indexed_by< ClientIdent4< ConnectingClient4 >, boost::multi_index::ordered_non_unique< boost::multi_index::member< ConnectingClient4, bool, &ConnectingClient4::unacked_ > > > > ConnectingClients4
Multi index container holding information about the clients attempting to get leases from the partner...
CommunicationState4(const asiolink::IOServicePtr &io_service, const HAConfigPtr &config)
Constructor.
virtual void analyzeMessage(const boost::shared_ptr< dhcp::Pkt > &message)
Checks if the DHCPv6 message appears to be unanswered.
RejectedClients6 rejected_clients_
Holds information about the clients for whom lease updates have been rejected by the partner.
virtual size_t getRejectedLeaseUpdatesCountInternal()
Returns the number of lease updates rejected by the partner.
ConnectingClients6 connecting_clients_
Holds information about the clients attempting to contact the partner server while the servers are in...
boost::multi_index_container< ConnectingClient6, boost::multi_index::indexed_by< ClientIdent6< ConnectingClient6 >, boost::multi_index::ordered_non_unique< boost::multi_index::member< ConnectingClient6, bool, &ConnectingClient6::unacked_ > > > > ConnectingClients6
Multi index container holding information about the clients attempting to get leases from the partner...
CommunicationState6(const asiolink::IOServicePtr &io_service, const HAConfigPtr &config)
Constructor.
virtual bool reportSuccessfulLeaseUpdateInternal(const dhcp::PktPtr &message)
Marks the lease update successful.
virtual void clearConnectingClients()
Removes information about the clients the partner server should respond to while communication with t...
virtual bool failureDetected() const
Checks if the partner failure has been detected based on the DHCP traffic analysis.
virtual size_t getUnackedClientsCount() const
Returns the current number of clients which haven't gotten a lease from the partner server.
virtual bool failureDetectedInternal() const
Checks if the partner failure has been detected based on the DHCP traffic analysis.
virtual void analyzeMessageInternal(const boost::shared_ptr< dhcp::Pkt > &message)
Checks if the DHCPv6 message appears to be unanswered.
virtual bool reportRejectedLeaseUpdateInternal(const dhcp::PktPtr &message, const uint32_t lifetime=86400)
Marks that the lease update failed due to a conflict for the specified DHCP message.
virtual size_t getConnectingClientsCount() const
Returns the current number of clients which attempted to get a lease from the partner server.
boost::multi_index_container< RejectedClient6, boost::multi_index::indexed_by< ClientIdent6< RejectedClient6 >, boost::multi_index::ordered_non_unique< boost::multi_index::member< RejectedClient6, int64_t, &RejectedClient6::expire_ > > > > RejectedClients6
Multi index container holding information about the clients who have rejected leases.
boost::multi_index::hashed_unique< boost::multi_index::member< ClientData, std::vector< uint8_t >, &ClientData::duid_ > > ClientIdent6
Hashed index used in the multi index containers to find clients by DUID.
virtual void clearRejectedLeaseUpdatesInternal()
Clears rejected client leases.
virtual size_t getConnectingClientsCount() const =0
Returns the current number of clients which attempted to get a lease from the partner server.
virtual bool reportRejectedLeaseUpdateInternal(const dhcp::PktPtr &message, const uint32_t lifetime)=0
Marks that the lease update failed due to a conflict for the specified DHCP message.
boost::posix_time::ptime partner_state_time_
Holds a time when partner was first seen in the current state.
virtual void clearRejectedLeaseUpdatesInternal()=0
Clears rejected client leases.
virtual size_t getUnackedClientsCount() const =0
Returns the current number of clients which haven't got the lease from the partner server.
virtual void clearConnectingClients()=0
Removes information about the clients the partner server should respond to while communication with t...
void clearRejectedLeaseUpdates()
Clears rejected client leases (MT safe).
void startHeartbeat(const long interval, const std::function< void()> &heartbeat_impl)
Starts recurring heartbeat (public interface).
uint64_t unsent_update_count_
Total number of unsent lease updates.
bool isCommunicationInterrupted() const
Checks if communication with the partner is interrupted.
void setPartnerScopes(data::ConstElementPtr new_scopes)
Sets partner scopes.
int getPartnerState() const
Returns last known state of the partner.
bool clockSkewShouldWarn()
Issues a warning about high clock skew between the active servers if one is warranted.
std::string logFormatClockSkew() const
Returns current clock skew value in the logger friendly format.
void setPartnerUnsentUpdateCount(uint64_t unsent_update_count)
Saves new total number of unsent lease updates from the partner.
void setPartnerState(const std::string &state)
Sets partner state.
bool clockSkewShouldTerminate()
Indicates whether the HA service should enter "terminated" state as a result of the clock skew exceed...
std::pair< uint64_t, uint64_t > partner_unsent_update_count_
Previous and current total number of unsent lease updates from the partner.
std::set< std::string > getPartnerScopes() const
Returns scopes served by the partner server.
virtual ~CommunicationState()
Destructor.
HAConfigPtr config_
High availability configuration.
bool isHeartbeatRunning() const
Checks if recurring heartbeat is running.
static size_t getRejectedLeaseUpdatesCountFromContainer(RejectedClientsType &rejected_clients)
Extracts the number of lease updates rejected by the partner from the specified container.
long interval_
Interval specified for the heartbeat.
void setPartnerUnavailable()
Sets partner state unavailable.
void stopHeartbeat()
Stops recurring heartbeat.
void increaseUnsentUpdateCount()
Increases a total number of unsent lease updates by 1.
void setPartnerTime(const std::string &time_text)
Provide partner's notion of time so the new clock skew can be calculated.
bool hasPartnerNewUnsentUpdates() const
Checks if the partner allocated new leases for which it hasn't sent any lease updates.
virtual bool reportSuccessfulLeaseUpdateInternal(const dhcp::PktPtr &message)=0
Marks the lease update successful.
asiolink::IOServicePtr io_service_
Pointer to the common IO service instance.
virtual size_t getRejectedLeaseUpdatesCountInternal()=0
Returns the number of lease updates rejected by the partner.
virtual void analyzeMessage(const boost::shared_ptr< dhcp::Pkt > &message)=0
Checks if the DHCP message appears to be unanswered.
void modifyPokeTime(const long secs)
Modifies poke time by adding seconds to it.
const boost::scoped_ptr< std::mutex > mutex_
The mutex used to protect internal state.
data::ElementPtr getReport() const
Returns the report about current communication state.
boost::posix_time::ptime getPartnerTimeAtSkew() const
Retrieves the time of the partner node when skew was last calculated.
boost::posix_time::time_duration clock_skew_
Clock skew between the active servers.
size_t getAnalyzedMessagesCount() const
Returns the number of analyzed messages while being in the communications interrupted state.
size_t analyzed_messages_count_
Total number of analyzed messages to be responded by partner.
std::function< void()> heartbeat_impl_
Pointer to the function providing heartbeat implementation.
boost::posix_time::ptime poke_time_
Last poke time.
boost::posix_time::time_duration updatePokeTime()
Update the poke time and compute the duration.
bool reportSuccessfulLeaseUpdate(const dhcp::PktPtr &message)
Marks the lease update successful (MT safe).
boost::posix_time::ptime partner_time_at_skew_
Partner reported time when skew was calculated.
CommunicationState(const asiolink::IOServicePtr &io_service, const HAConfigPtr &config)
Constructor.
boost::posix_time::time_duration getDurationSincePartnerStateTime() const
Returns the duration since the partner was first seen in the current state.
int partner_state_
Last known state of the partner server.
boost::posix_time::ptime last_clock_skew_warn_
Holds a time when last warning about too high clock skew was issued.
std::set< std::string > partner_scopes_
Last known set of scopes served by the partner server.
static std::vector< uint8_t > getClientId(const dhcp::PktPtr &message, const uint16_t option_type)
Convenience function attempting to retrieve client identifier from the DHCP message.
uint64_t getUnsentUpdateCount() const
Returns a total number of unsent lease updates.
bool rejectedLeaseUpdatesShouldTerminate()
Indicates whether the HA service should enter "terminated" state due to excessive number of rejected ...
boost::posix_time::ptime getMyTimeAtSkew() const
Retrieves the time of the local node when skew was last calculated.
boost::posix_time::ptime my_time_at_skew_
My time when skew was calculated.
int64_t getDurationInMillisecs() const
Returns duration between the poke time and current time.
bool reportRejectedLeaseUpdate(const dhcp::PktPtr &message, const uint32_t lifetime=86400)
Marks that the lease update failed due to a conflict for the specified DHCP message (MT safe).
virtual bool failureDetected() const =0
Checks if the partner failure has been detected based on the DHCP traffic analysis.
size_t getRejectedLeaseUpdatesCount()
Returns the number of lease updates rejected by the partner (MT safe).
asiolink::IntervalTimerPtr timer_
Interval timer triggering heartbeat commands.
void poke()
Pokes the communication state.
int get(CalloutHandle &handle)
The gss-tsig-get command.
boost::shared_ptr< isc::asiolink::IntervalTimer > IntervalTimerPtr
boost::shared_ptr< IOService > IOServicePtr
Defines a smart pointer to an IOService instance.
boost::shared_ptr< const Element > ConstElementPtr
boost::shared_ptr< Element > ElementPtr
boost::shared_ptr< isc::dhcp::Pkt > PktPtr
A pointer to either Pkt4 or Pkt6 packet.
boost::shared_ptr< CommunicationState > CommunicationStatePtr
Type of the pointer to the CommunicationState object.
boost::shared_ptr< CommunicationState4 > CommunicationState4Ptr
Pointer to the CommunicationState4 object.
boost::shared_ptr< HAConfig > HAConfigPtr
Pointer to the High Availability configuration structure.
boost::shared_ptr< CommunicationState6 > CommunicationState6Ptr
Pointer to the CommunicationState6 object.
Defines the logger used by the top-level component of kea-lfc.
Structure holding information about the client which has sent the packet being analyzed.
std::vector< uint8_t > clientid_
std::vector< uint8_t > hwaddr_
Structure holding information about the client who has a rejected lease update.
std::vector< uint8_t > hwaddr_
std::vector< uint8_t > clientid_
Structure holding information about a client which sent a packet being analyzed.
std::vector< uint8_t > duid_
Structure holding information about the client who has a rejected lease update.
std::vector< uint8_t > duid_