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> 115 void setPartnerStateInternal(
const std::string& state);
141 const std::function<
void()>& heartbeat_impl);
152 void startHeartbeatInternal(
const long interval = 0,
153 const std::function<
void()>& heartbeat_impl = 0);
156 void stopHeartbeatInternal();
205 const uint16_t option_type);
239 virtual void analyzeMessage(
const boost::shared_ptr<dhcp::Pkt>& message) = 0;
329 template<
typename RejectedClientsType>
331 if (rejected_clients.empty()) {
334 auto& idx = rejected_clients.template get<1>();
335 auto upper_limit = idx.upper_bound(time(NULL));
336 if (upper_limit != idx.end()) {
337 auto lower_limit = idx.cbegin();
338 idx.erase(lower_limit, upper_limit);
340 return (rejected_clients.size());
358 const uint32_t lifetime = 86400);
375 const uint32_t lifetime) = 0;
461 bool clockSkewShouldWarnInternal();
499 bool clockSkewShouldTerminateInternal();
507 bool isClockSkewGreater(
const long seconds)
const;
529 bool rejectedLeaseUpdatesShouldTerminateInternal();
558 void setPartnerTimeInternal(
const std::string& time_text);
566 std::string logFormatClockSkewInternal()
const;
594 int64_t getDurationInMillisecsInternal()
const;
608 boost::posix_time::time_duration updatePokeTimeInternal();
631 void increaseUnsentUpdateCountInternal();
652 bool hasPartnerNewUnsentUpdatesInternal()
const;
668 void setPartnerUnsentUpdateCountInternal(uint64_t unsent_update_count);
732 const boost::scoped_ptr<std::mutex>
mutex_;
768 virtual void analyzeMessage(
const boost::shared_ptr<dhcp::Pkt>& message);
821 const uint32_t lifetime);
853 virtual void analyzeMessageInternal(
const boost::shared_ptr<dhcp::Pkt>& message);
862 virtual bool failureDetectedInternal()
const;
875 template<
typename ClientData>
877 boost::multi_index::composite_key<
879 boost::multi_index::member<ClientData, std::vector<uint8_t>,
880 &ClientData::hwaddr_>,
881 boost::multi_index::member<ClientData, std::vector<uint8_t>,
882 &ClientData::clientid_>
896 typedef boost::multi_index_container<
898 boost::multi_index::indexed_by<
904 boost::multi_index::ordered_non_unique<
905 boost::multi_index::member<ConnectingClient4, bool, &ConnectingClient4::unacked_>
925 typedef boost::multi_index_container<
927 boost::multi_index::indexed_by<
929 boost::multi_index::ordered_non_unique<
930 boost::multi_index::member<RejectedClient4, int64_t,
931 &RejectedClient4::expire_>
967 virtual void analyzeMessage(
const boost::shared_ptr<dhcp::Pkt>& message);
1020 const uint32_t lifetime = 86400);
1048 virtual void analyzeMessageInternal(
const boost::shared_ptr<dhcp::Pkt>& message);
1057 virtual bool failureDetectedInternal()
const;
1070 template<
typename ClientData>
1071 using ClientIdent6 = boost::multi_index::hashed_unique<
1072 boost::multi_index::member<ClientData, std::vector<uint8_t>,
1085 typedef boost::multi_index_container<
1087 boost::multi_index::indexed_by<
1092 boost::multi_index::ordered_non_unique<
1093 boost::multi_index::member<ConnectingClient6, bool, &ConnectingClient6::unacked_>
1112 typedef boost::multi_index_container<
1114 boost::multi_index::indexed_by<
1116 boost::multi_index::ordered_non_unique<
1117 boost::multi_index::member<RejectedClient6, int64_t,
1118 &RejectedClient6::expire_>
std::set< std::string > getPartnerScopes() const
Returns scopes served by the partner server.
data::ElementPtr getReport() const
Returns the report about current communication state.
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 void clearConnectingClients()=0
Removes information about the clients the partner server should respond to while communication with t...
virtual void clearRejectedLeaseUpdatesInternal()=0
Clears rejected client leases.
int64_t getDurationInMillisecs() const
Returns duration between the poke time and current time.
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.
uint64_t getUnsentUpdateCount() const
Returns a total number of unsent lease updates.
boost::shared_ptr< CommunicationState4 > CommunicationState4Ptr
Pointer to the CommunicationState4 object.
void clearRejectedLeaseUpdates()
Clears rejected client leases (MT safe).
RejectedClients6 rejected_clients_
Holds information about the clients for whom lease updates have been rejected by the partner...
std::vector< uint8_t > clientid_
ConnectingClients4 connecting_clients_
Holds information about the clients attempting to contact the partner server while the servers are in...
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...
static size_t getRejectedLeaseUpdatesCountFromContainer(RejectedClientsType &rejected_clients)
Extracts the number of lease updates rejected by the partner from the specified container.
size_t getRejectedLeaseUpdatesCount()
Returns the number of lease updates rejected by the partner (MT safe).
std::vector< uint8_t > duid_
boost::shared_ptr< IOService > IOServicePtr
Defines a smart pointer to an IOService instance.
boost::shared_ptr< Element > ElementPtr
bool isCommunicationInterrupted() const
Checks if communication with the partner is interrupted.
std::function< void()> heartbeat_impl_
Pointer to the function providing heartbeat implementation.
asiolink::IOServicePtr io_service_
Pointer to the common IO service instance.
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)...
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.
uint64_t unsent_update_count_
Total number of unsent lease updates.
int getPartnerState() const
Returns last known state of the partner.
bool hasPartnerNewUnsentUpdates() const
Checks if the partner allocated new leases for which it hasn't sent any lease updates.
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.
Structure holding information about the client who has a rejected lease update.
Structure holding information about a client which sent a packet being analyzed.
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.
Structure holding information about the client who has a rejected lease update.
long interval_
Interval specified for the heartbeat.
std::pair< uint64_t, uint64_t > partner_unsent_update_count_
Previous and current total number of unsent lease updates from the partner.
boost::posix_time::ptime poke_time_
Last poke time.
Holds communication state between DHCPv4 servers.
RejectedClients4 rejected_clients_
Holds information about the clients for whom lease updates have been 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.
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_
bool clockSkewShouldTerminate()
Indicates whether the HA service should enter "terminated" state as a result of the clock skew exceed...
boost::shared_ptr< const Element > ConstElementPtr
bool isHeartbeatRunning() const
Checks if recurring heartbeat is running.
std::vector< uint8_t > duid_
boost::shared_ptr< isc::asiolink::IntervalTimer > IntervalTimerPtr
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_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...
boost::shared_ptr< isc::dhcp::Pkt > PktPtr
A pointer to either Pkt4 or Pkt6 packet.
void stopHeartbeat()
Stops recurring heartbeat.
virtual bool failureDetected() const =0
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...
Defines the logger used by the top-level component of kea-lfc.
void poke()
Pokes the communication state.
bool reportSuccessfulLeaseUpdate(const dhcp::PktPtr &message)
Marks the lease update successful (MT safe).
boost::posix_time::time_duration clock_skew_
Clock skew between the active servers.
void increaseUnsentUpdateCount()
Increases a total number of unsent lease updates by 1.
ConnectingClients6 connecting_clients_
Holds information about the clients attempting to contact the partner server while the servers are in...
std::vector< uint8_t > hwaddr_
boost::posix_time::ptime my_time_at_skew_
My time when skew was calculated.
void setPartnerState(const std::string &state)
Sets partner state.
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.
void startHeartbeat(const long interval, const std::function< void()> &heartbeat_impl)
Starts recurring heartbeat (public interface).
size_t getAnalyzedMessagesCount() const
Returns the number of analyzed messages while being in the communications interrupted state...
std::string logFormatClockSkew() const
Returns current clock skew value in the logger friendly format.
virtual size_t getRejectedLeaseUpdatesCountInternal()=0
Returns the number of lease updates rejected by the partner.
std::set< std::string > partner_scopes_
Last known set of scopes served by the partner server.
virtual ~CommunicationState()
Destructor.
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.
Structure holding information about the client which has sent the packet being analyzed.
bool rejectedLeaseUpdatesShouldTerminate()
Indicates whether the HA service should enter "terminated" state due to excessive number of rejected ...
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.
asiolink::IntervalTimerPtr timer_
Interval timer triggering heartbeat commands.
void setPartnerScopes(data::ConstElementPtr new_scopes)
Sets partner scopes.
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.
std::vector< uint8_t > hwaddr_
boost::shared_ptr< CommunicationState > CommunicationStatePtr
Type of the pointer to the CommunicationState object.
virtual bool reportSuccessfulLeaseUpdateInternal(const dhcp::PktPtr &message)=0
Marks the lease update successful.
boost::shared_ptr< HAConfig > HAConfigPtr
Pointer to the High Availability configuration structure.
void setPartnerUnsentUpdateCount(uint64_t unsent_update_count)
Saves new total number of unsent lease updates from the partner.
size_t analyzed_messages_count_
Total number of analyzed messages to be responded by partner.
Holds communication state between DHCPv6 servers.
CommunicationState(const asiolink::IOServicePtr &io_service, const HAConfigPtr &config)
Constructor.