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>
118 void setPartnerStateInternal(
const std::string& state);
144 const std::function<
void()>& heartbeat_impl);
155 void startHeartbeatInternal(
const long interval = 0,
156 const std::function<
void()>& heartbeat_impl = 0);
159 void stopHeartbeatInternal();
229 virtual void analyzeMessage(
const boost::shared_ptr<dhcp::Pkt>& message) = 0;
339 bool clockSkewShouldWarnInternal();
377 bool clockSkewShouldTerminateInternal()
const;
385 bool isClockSkewGreater(
const long seconds)
const;
414 void setPartnerTimeInternal(
const std::string& time_text);
422 std::string logFormatClockSkewInternal()
const;
450 int64_t getDurationInMillisecsInternal()
const;
464 boost::posix_time::time_duration updatePokeTimeInternal();
510 const boost::scoped_ptr<std::mutex>
mutex_;
546 virtual void analyzeMessage(
const boost::shared_ptr<dhcp::Pkt>& message);
621 typedef boost::multi_index_container<
623 boost::multi_index::indexed_by<
626 boost::multi_index::hashed_unique<
627 boost::multi_index::composite_key<
629 boost::multi_index::member<ConnectingClient4, std::vector<uint8_t>,
631 boost::multi_index::member<ConnectingClient4, std::vector<uint8_t>,
637 boost::multi_index::ordered_non_unique<
638 boost::multi_index::member<ConnectingClient4, bool, &ConnectingClient4::unacked_>
675 virtual void analyzeMessage(
const boost::shared_ptr<dhcp::Pkt>& message);
743 typedef boost::multi_index_container<
745 boost::multi_index::indexed_by<
747 boost::multi_index::hashed_unique<
748 boost::multi_index::member<ConnectingClient6, std::vector<uint8_t>,
753 boost::multi_index::ordered_non_unique<
754 boost::multi_index::member<ConnectingClient6, bool, &ConnectingClient6::unacked_>
CommunicationState6(const asiolink::IOServicePtr &io_service, const HAConfigPtr &config)
Constructor.
boost::shared_ptr< CommunicationState6 > CommunicationState6Ptr
Pointer to the CommunicationState6 object.
virtual size_t getConnectingClientsCount() const =0
Returns the current number of clients which attempted to get a lease from the partner server...
virtual bool failureDetected() const
Checks if the partner failure has been detected based on the DHCP traffic analysis.
virtual void clearConnectingClients()=0
Removes information about the clients the partner server should respond to while communication with t...
bool isCommunicationInterrupted() const
Checks if communication with the partner is interrupted.
void setPartnerTime(const std::string &time_text)
Provide partner's notion of time so the new clock skew can be calculated.
Holds communication state between the two HA peers.
boost::shared_ptr< CommunicationState4 > CommunicationState4Ptr
Pointer to the CommunicationState4 object.
ConnectingClients4 connecting_clients_
Holds information about the clients attempting to contact the partner server while the servers are in...
virtual bool failureDetectedInternal() 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...
std::vector< uint8_t > duid_
boost::shared_ptr< IOService > IOServicePtr
Defines a smart pointer to an IOService instance.
boost::shared_ptr< Element > ElementPtr
std::function< void()> heartbeat_impl_
Pointer to the function providing heartbeat implementation.
asiolink::IOServicePtr io_service_
Pointer to the common IO service instance.
Structure holding information about a client which sent a packet being analyzed.
virtual void clearConnectingClients()
Removes information about the clients the partner server should respond to while communication with t...
virtual void analyzeMessageInternal(const boost::shared_ptr< dhcp::Pkt > &message)
Checks if the DHCPv6 message appears to be unanswered.
boost::multi_index_container< ConnectingClient6, boost::multi_index::indexed_by< boost::multi_index::hashed_unique< boost::multi_index::member< ConnectingClient6, std::vector< uint8_t >,&ConnectingClient6::duid_ > >, 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...
boost::posix_time::time_duration updatePokeTime()
Update the poke time and compute the duration.
boost::posix_time::ptime partner_time_at_skew_
Partner reported time when skew was calculated.
long interval_
Interval specified for the heartbeat.
boost::posix_time::ptime poke_time_
Last poke time.
Holds communication state between DHCPv4 servers.
virtual bool failureDetected() const
Checks if the partner failure has been detected based on the DHCP traffic analysis.
int getPartnerState() const
Returns last known state of 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.
int partner_state_
Last known state of the partner server.
const boost::scoped_ptr< std::mutex > mutex_
The mutex used to protect internal state.
std::vector< uint8_t > clientid_
size_t getAnalyzedMessagesCount() const
Returns the number of analyzed messages while being in the communications interrupted state...
boost::shared_ptr< const Element > ConstElementPtr
virtual void analyzeMessage(const boost::shared_ptr< dhcp::Pkt > &message)
Checks if the DHCPv6 message appears to be unanswered.
boost::shared_ptr< isc::asiolink::IntervalTimer > IntervalTimerPtr
std::set< std::string > getPartnerScopes() const
Returns scopes served by the partner server.
void stopHeartbeat()
Stops recurring heartbeat.
virtual size_t getUnackedClientsCount() const
Returns the current number of clients which haven't gotten a lease from the partner server...
virtual bool failureDetected() const =0
Checks if the partner failure has been detected based on the DHCP traffic analysis.
Defines the logger used by the top-level component of kea-dhcp-ddns.
bool clockSkewShouldTerminate() const
Indicates whether the HA service should enter "terminated" state as a result of the clock skew exceed...
void poke()
Pokes the communication state.
boost::posix_time::time_duration clock_skew_
Clock skew between the active servers.
CommunicationState4(const asiolink::IOServicePtr &io_service, const HAConfigPtr &config)
Constructor.
virtual void analyzeMessage(const boost::shared_ptr< dhcp::Pkt > &message)
Checks if the DHCPv4 message appears to be unanswered.
bool isHeartbeatRunning() const
Checks if recurring heartbeat is running.
virtual bool failureDetectedInternal() const
Checks if the partner failure has been detected based on the DHCP traffic analysis.
ConnectingClients6 connecting_clients_
Holds information about the clients attempting to contact the partner server while the servers are in...
std::vector< uint8_t > hwaddr_
data::ElementPtr getReport() const
Returns the report about current communication state.
boost::posix_time::ptime my_time_at_skew_
My time when skew was calculated.
void setPartnerState(const std::string &state)
Sets partner state.
void startHeartbeat(const long interval, const std::function< void()> &heartbeat_impl)
Starts recurring heartbeat (public interface).
std::set< std::string > partner_scopes_
Last known set of scopes served by the partner server.
virtual ~CommunicationState()
Destructor.
Structure holding information about the client which has send the packet being analyzed.
bool clockSkewShouldWarn()
Issues a warning about high clock skew between the active servers if one is warranted.
boost::posix_time::ptime last_clock_skew_warn_
Holds a time when last warning about too high clock skew was issued.
std::string logFormatClockSkew() const
Returns current clock skew value in the logger friendly format.
asiolink::IntervalTimerPtr timer_
Interval timer triggering heartbeat commands.
void setPartnerScopes(data::ConstElementPtr new_scopes)
Sets partner scopes.
int64_t getDurationInMillisecs() const
Returns duration between the poke time and current time.
virtual size_t getUnackedClientsCount() const =0
Returns the current number of clients which haven't got the lease from the partner server...
HAConfigPtr config_
High availability configuration.
virtual void clearConnectingClients()
Removes information about the clients the partner server should respond to while communication with t...
virtual size_t getConnectingClientsCount() const
Returns the current number of clients which attempted to get a lease from the partner server...
boost::shared_ptr< CommunicationState > CommunicationStatePtr
Type of the pointer to the CommunicationState object.
virtual void analyzeMessageInternal(const boost::shared_ptr< dhcp::Pkt > &message)
Checks if the DHCPv4 message appears to be unanswered.
boost::shared_ptr< HAConfig > HAConfigPtr
Pointer to the High Availability configuration structure.
virtual size_t getConnectingClientsCount() const
Returns the current number of clients which attempted to get a lease from the partner server...
size_t analyzed_messages_count_
Total number of analyzed messages to be responded by partner.
boost::multi_index_container< ConnectingClient4, boost::multi_index::indexed_by< boost::multi_index::hashed_unique< boost::multi_index::composite_key< ConnectingClient4, boost::multi_index::member< ConnectingClient4, std::vector< uint8_t >,&ConnectingClient4::hwaddr_ >, boost::multi_index::member< ConnectingClient4, std::vector< uint8_t >,&ConnectingClient4::clientid_ > > >, 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...
Holds communication state between DHCPv6 servers.
CommunicationState(const asiolink::IOServicePtr &io_service, const HAConfigPtr &config)
Constructor.