Kea  2.3.5-git
isc::ha::CommunicationState4 Class Reference

Holds communication state between DHCPv4 servers. More...

#include <communication_state.h>

+ Inheritance diagram for isc::ha::CommunicationState4:

Classes

struct  ConnectingClient4
 Structure holding information about the client which has sent the packet being analyzed. More...
 
struct  RejectedClient4
 Structure holding information about the client who has a rejected lease update. More...
 

Public Member Functions

 CommunicationState4 (const asiolink::IOServicePtr &io_service, const HAConfigPtr &config)
 Constructor. More...
 
virtual void analyzeMessage (const boost::shared_ptr< dhcp::Pkt > &message)
 Checks if the DHCPv4 message appears to be unanswered. More...
 
virtual bool failureDetected () const
 Checks if the partner failure has been detected based on the DHCP traffic analysis. More...
 
virtual size_t getConnectingClientsCount () const
 Returns the current number of clients which attempted to get a lease from the partner server. More...
 
virtual size_t getUnackedClientsCount () const
 Returns the current number of clients which haven't gotten a lease from the partner server. More...
 
- Public Member Functions inherited from isc::ha::CommunicationState
 CommunicationState (const asiolink::IOServicePtr &io_service, const HAConfigPtr &config)
 Constructor. More...
 
virtual ~CommunicationState ()
 Destructor. More...
 
void clearRejectedLeaseUpdates ()
 Clears rejected client leases (MT safe). More...
 
bool clockSkewShouldTerminate ()
 Indicates whether the HA service should enter "terminated" state as a result of the clock skew exceeding maximum value. More...
 
bool clockSkewShouldWarn ()
 Issues a warning about high clock skew between the active servers if one is warranted. More...
 
size_t getAnalyzedMessagesCount () const
 Returns the number of analyzed messages while being in the communications interrupted state. More...
 
int64_t getDurationInMillisecs () const
 Returns duration between the poke time and current time. More...
 
std::set< std::string > getPartnerScopes () const
 Returns scopes served by the partner server. More...
 
int getPartnerState () const
 Returns last known state of the partner. More...
 
size_t getRejectedLeaseUpdatesCount ()
 Returns the number of lease updates rejected by the partner (MT safe). More...
 
data::ElementPtr getReport () const
 Returns the report about current communication state. More...
 
uint64_t getUnsentUpdateCount () const
 Returns a total number of unsent lease updates. More...
 
bool hasPartnerNewUnsentUpdates () const
 Checks if the partner allocated new leases for which it hasn't sent any lease updates. More...
 
void increaseUnsentUpdateCount ()
 Increases a total number of unsent lease updates by 1. More...
 
bool isCommunicationInterrupted () const
 Checks if communication with the partner is interrupted. More...
 
bool isHeartbeatRunning () const
 Checks if recurring heartbeat is running. More...
 
std::string logFormatClockSkew () const
 Returns current clock skew value in the logger friendly format. More...
 
void modifyPokeTime (const long secs)
 Modifies poke time by adding seconds to it. More...
 
void poke ()
 Pokes the communication state. More...
 
bool rejectedLeaseUpdatesShouldTerminate ()
 Indicates whether the HA service should enter "terminated" state due to excessive number of rejected lease updates. More...
 
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). More...
 
bool reportSuccessfulLeaseUpdate (const dhcp::PktPtr &message)
 Marks the lease update successful (MT safe). More...
 
void setPartnerScopes (data::ConstElementPtr new_scopes)
 Sets partner scopes. More...
 
void setPartnerState (const std::string &state)
 Sets partner state. More...
 
void setPartnerTime (const std::string &time_text)
 Provide partner's notion of time so the new clock skew can be calculated. More...
 
void setPartnerUnsentUpdateCount (uint64_t unsent_update_count)
 Saves new total number of unsent lease updates from the partner. More...
 
void startHeartbeat (const long interval, const std::function< void()> &heartbeat_impl)
 Starts recurring heartbeat (public interface). More...
 
void stopHeartbeat ()
 Stops recurring heartbeat. More...
 

Protected Types

template<typename ClientData >
using ClientIdent4 = 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_ > > >
 Hashed index used in the multi index containers to find clients by HW address and client identifier. More...
 
typedef 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 server. More...
 
typedef 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. More...
 

Protected Member Functions

virtual void analyzeMessageInternal (const boost::shared_ptr< dhcp::Pkt > &message)
 Checks if the DHCPv4 message appears to be unanswered. More...
 
virtual void clearConnectingClients ()
 Removes information about the clients the partner server should respond to while communication with the partner was interrupted. More...
 
virtual void clearRejectedLeaseUpdatesInternal ()
 Clears rejected client leases. More...
 
virtual bool failureDetectedInternal () const
 Checks if the partner failure has been detected based on the DHCP traffic analysis. More...
 
virtual size_t getRejectedLeaseUpdatesCountInternal ()
 Returns the number of lease updates rejected by the partner. More...
 
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. More...
 
virtual bool reportSuccessfulLeaseUpdateInternal (const dhcp::PktPtr &message)
 Marks the lease update successful. More...
 
- Protected Member Functions inherited from isc::ha::CommunicationState
boost::posix_time::time_duration updatePokeTime ()
 Update the poke time and compute the duration. More...
 

Protected Attributes

ConnectingClients4 connecting_clients_
 Holds information about the clients attempting to contact the partner server while the servers are in communications interrupted state. More...
 
RejectedClients4 rejected_clients_
 Holds information about the clients for whom lease updates have been rejected by the partner. More...
 
- Protected Attributes inherited from isc::ha::CommunicationState
size_t analyzed_messages_count_
 Total number of analyzed messages to be responded by partner. More...
 
boost::posix_time::time_duration clock_skew_
 Clock skew between the active servers. More...
 
HAConfigPtr config_
 High availability configuration. More...
 
std::function< void()> heartbeat_impl_
 Pointer to the function providing heartbeat implementation. More...
 
long interval_
 Interval specified for the heartbeat. More...
 
asiolink::IOServicePtr io_service_
 Pointer to the common IO service instance. More...
 
boost::posix_time::ptime last_clock_skew_warn_
 Holds a time when last warning about too high clock skew was issued. More...
 
const boost::scoped_ptr< std::mutex > mutex_
 The mutex used to protect internal state. More...
 
boost::posix_time::ptime my_time_at_skew_
 My time when skew was calculated. More...
 
std::set< std::string > partner_scopes_
 Last known set of scopes served by the partner server. More...
 
int partner_state_
 Last known state of the partner server. More...
 
boost::posix_time::ptime partner_time_at_skew_
 Partner reported time when skew was calculated. More...
 
std::pair< uint64_t, uint64_t > partner_unsent_update_count_
 Previous and current total number of unsent lease updates from the partner. More...
 
boost::posix_time::ptime poke_time_
 Last poke time. More...
 
asiolink::IntervalTimerPtr timer_
 Interval timer triggering heartbeat commands. More...
 
uint64_t unsent_update_count_
 Total number of unsent lease updates. More...
 

Additional Inherited Members

- Static Protected Member Functions inherited from isc::ha::CommunicationState
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. More...
 
template<typename RejectedClientsType >
static size_t getRejectedLeaseUpdatesCountFromContainer (RejectedClientsType &rejected_clients)
 Extracts the number of lease updates rejected by the partner from the specified container. More...
 

Detailed Description

Holds communication state between DHCPv4 servers.

This class implements DHCPv4 failure detection by monitoring the value of the "secs" field in received DHCPv4 messages as described in CommunicationState::analyzeMessage.

Definition at line 744 of file communication_state.h.

Member Typedef Documentation

◆ ClientIdent4

template<typename ClientData >
using isc::ha::CommunicationState4::ClientIdent4 = 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_> > >
protected

Hashed index used in the multi index containers to find clients by HW address and client identifier.

Template Parameters
ClientDataType of a structure holding client information.

Definition at line 884 of file communication_state.h.

◆ ConnectingClients4

typedef 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_> > > > isc::ha::CommunicationState4::ConnectingClients4
protected

Multi index container holding information about the clients attempting to get leases from the partner server.

Definition at line 908 of file communication_state.h.

◆ RejectedClients4

typedef 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_> > > > isc::ha::CommunicationState4::RejectedClients4
protected

Multi index container holding information about the clients who have rejected leases.

Definition at line 934 of file communication_state.h.

Constructor & Destructor Documentation

◆ CommunicationState4()

isc::ha::CommunicationState4::CommunicationState4 ( const asiolink::IOServicePtr io_service,
const HAConfigPtr config 
)

Constructor.

Parameters
io_servicepointer to the common IO service instance.
configpointer to the HA configuration.

Definition at line 611 of file communication_state.cc.

Member Function Documentation

◆ analyzeMessage()

void isc::ha::CommunicationState4::analyzeMessage ( const boost::shared_ptr< dhcp::Pkt > &  message)
virtual

Checks if the DHCPv4 message appears to be unanswered.

This method uses "secs" field value for detecting client communication failures as described in the CommunicationState::analyzeMessage. Some misbehaving Windows clients were reported to swap "secs" field bytes. In this case the first byte is set to non-zero byte and the second byte is set to 0. This method handles such cases and corrects bytes order before comparing against the threshold.

Parameters
messageDHCPv4 message to be analyzed. This must be the message which belongs to the partner, i.e. the caller must filter out messages belonging to the partner prior to calling this method.

Implements isc::ha::CommunicationState.

Definition at line 618 of file communication_state.cc.

References analyzeMessageInternal(), and isc::ha::CommunicationState::mutex_.

+ Here is the call graph for this function:

◆ analyzeMessageInternal()

void isc::ha::CommunicationState4::analyzeMessageInternal ( const boost::shared_ptr< dhcp::Pkt > &  message)
protectedvirtual

Checks if the DHCPv4 message appears to be unanswered.

Should be called in a thread safe context.

This method uses "secs" field value for detecting client communication failures as described in the CommunicationState::analyzeMessage. Some misbehaving Windows clients were reported to swap "secs" field bytes. In this case the first byte is set to non-zero byte and the second byte is set to 0. This method handles such cases and corrects bytes order before comparing against the threshold.

Parameters
messageDHCPv4 message to be analyzed. This must be the message which belongs to the partner, i.e. the caller must filter out messages belonging to the partner prior to calling this method.

Definition at line 628 of file communication_state.cc.

References isc::ha::CommunicationState::analyzed_messages_count_, isc::ha::CommunicationState::config_, connecting_clients_, isc::dhcp::DHO_DHCP_CLIENT_IDENTIFIER, isc::ha::CommunicationState::getClientId(), isc::ha::HA_COMMUNICATION_INTERRUPTED_CLIENT4, isc::ha::HA_COMMUNICATION_INTERRUPTED_CLIENT4_UNACKED, isc::ha::ha_logger, isc::ha::CommunicationState4::ConnectingClient4::hwaddr_, isc_throw, and LOG_INFO.

Referenced by analyzeMessage().

+ Here is the call graph for this function:

◆ clearConnectingClients()

void isc::ha::CommunicationState4::clearConnectingClients ( )
protectedvirtual

Removes information about the clients the partner server should respond to while communication with the partner was interrupted.

See CommunicationState::analyzeMessage for details.

Implements isc::ha::CommunicationState.

Definition at line 741 of file communication_state.cc.

References connecting_clients_.

◆ clearRejectedLeaseUpdatesInternal()

void isc::ha::CommunicationState4::clearRejectedLeaseUpdatesInternal ( )
protectedvirtual

Clears rejected client leases.

Implements isc::ha::CommunicationState.

Definition at line 787 of file communication_state.cc.

References rejected_clients_.

◆ failureDetected()

bool isc::ha::CommunicationState4::failureDetected ( ) const
virtual

Checks if the partner failure has been detected based on the DHCP traffic analysis.

Returns
true if the partner failure has been detected, false otherwise.

Implements isc::ha::CommunicationState.

Definition at line 704 of file communication_state.cc.

References failureDetectedInternal(), and isc::ha::CommunicationState::mutex_.

+ Here is the call graph for this function:

◆ failureDetectedInternal()

bool isc::ha::CommunicationState4::failureDetectedInternal ( ) const
protectedvirtual

Checks if the partner failure has been detected based on the DHCP traffic analysis.

Should be called in a thread safe context.

Returns
true if the partner failure has been detected, false otherwise.

Definition at line 714 of file communication_state.cc.

References isc::ha::CommunicationState::config_, and connecting_clients_.

Referenced by failureDetected().

◆ getConnectingClientsCount()

size_t isc::ha::CommunicationState4::getConnectingClientsCount ( ) const
virtual

Returns the current number of clients which attempted to get a lease from the partner server.

The returned number is reset to 0 when the server successfully establishes communication with the partner. The number is incremented only in the communications interrupted case.

Returns
The number of clients including unacked clients.

Implements isc::ha::CommunicationState.

Definition at line 721 of file communication_state.cc.

References connecting_clients_, and isc::ha::CommunicationState::mutex_.

◆ getRejectedLeaseUpdatesCountInternal()

size_t isc::ha::CommunicationState4::getRejectedLeaseUpdatesCountInternal ( )
protectedvirtual

Returns the number of lease updates rejected by the partner.

Each rejected lease update is counted only once if it failed multiple times. Before returning the counter, it discards expired rejected lease updates.

Returns
Current rejected lease update number count.

Implements isc::ha::CommunicationState.

Definition at line 746 of file communication_state.cc.

References isc::ha::CommunicationState::getRejectedLeaseUpdatesCountFromContainer(), and rejected_clients_.

Referenced by reportSuccessfulLeaseUpdateInternal().

+ Here is the call graph for this function:

◆ getUnackedClientsCount()

size_t isc::ha::CommunicationState4::getUnackedClientsCount ( ) const
virtual

Returns the current number of clients which haven't gotten a lease from the partner server.

The returned number is reset to 0 when the server successfully establishes communication with the partner. The number is incremented only in the communications interrupted case.

Returns
Number of unacked clients.

Implements isc::ha::CommunicationState.

Definition at line 731 of file communication_state.cc.

References connecting_clients_, and isc::ha::CommunicationState::mutex_.

◆ reportRejectedLeaseUpdateInternal()

bool isc::ha::CommunicationState4::reportRejectedLeaseUpdateInternal ( const dhcp::PktPtr message,
const uint32_t  lifetime 
)
protectedvirtual

Marks that the lease update failed due to a conflict for the specified DHCP message.

If the conflict has been already reported for the given client, the rejected lease count remains unchanged.

Parameters
messageDHCP message for which a lease update failed due to a conflict.
lifetimea time in seconds after which the rejected lease update entry should be discarded.
Returns
true if the update was rejected for the first time, false otherwise.

Implements isc::ha::CommunicationState.

Definition at line 751 of file communication_state.cc.

References isc::dhcp::DHO_DHCP_CLIENT_IDENTIFIER, isc::ha::CommunicationState::getClientId(), isc::ha::CommunicationState4::RejectedClient4::hwaddr_, isc_throw, and rejected_clients_.

+ Here is the call graph for this function:

◆ reportSuccessfulLeaseUpdateInternal()

bool isc::ha::CommunicationState4::reportSuccessfulLeaseUpdateInternal ( const dhcp::PktPtr message)
protectedvirtual

Marks the lease update successful.

If the lease update was previously marked "in conflict", it is now cleared, effectively lowering the number of conflicted leases.

Parameters
messageDHCP message for which the lease update was successful.
Returns
true when the lease was marked "in conflict" and it is now cleared.

Implements isc::ha::CommunicationState.

Definition at line 768 of file communication_state.cc.

References isc::dhcp::DHO_DHCP_CLIENT_IDENTIFIER, isc::ha::CommunicationState::getClientId(), getRejectedLeaseUpdatesCountInternal(), isc_throw, and rejected_clients_.

+ Here is the call graph for this function:

Member Data Documentation

◆ connecting_clients_

ConnectingClients4 isc::ha::CommunicationState4::connecting_clients_
protected

Holds information about the clients attempting to contact the partner server while the servers are in communications interrupted state.

Definition at line 913 of file communication_state.h.

Referenced by analyzeMessageInternal(), clearConnectingClients(), failureDetectedInternal(), getConnectingClientsCount(), and getUnackedClientsCount().

◆ rejected_clients_

RejectedClients4 isc::ha::CommunicationState4::rejected_clients_
protected

Holds information about the clients for whom lease updates have been rejected by the partner.

Definition at line 938 of file communication_state.h.

Referenced by clearRejectedLeaseUpdatesInternal(), getRejectedLeaseUpdatesCountInternal(), reportRejectedLeaseUpdateInternal(), and reportSuccessfulLeaseUpdateInternal().


The documentation for this class was generated from the following files: