10 #include <boost/asio.hpp>
11 #include <boost/random.hpp>
23 localDiscriminator_(localDiscriminator),
26 "BFD TX",
TaskScheduler::GetInstance()->GetTaskId(
"BFD"), 0)),
28 "BFD RX",
TaskScheduler::GetInstance()->GetTaskId(
"BFD"), 0)),
29 currentConfig_(config),
33 communicator_(communicator),
34 local_endpoint_(key.local_address, GetRandomLocalPort()),
35 remote_endpoint_(key.remote_address, key.remote_port),
40 sm_->SetCallback(boost::optional<ChangeCb>(
74 sm_->ProcessTimeout();
81 std::ostringstream out;
100 int remaining_time_ms;
108 if (elapsed_time_ms < 0) {
109 remaining_time_ms = 0;
111 remaining_time_ms = ti.total_milliseconds() - elapsed_time_ms;
115 remaining_time_ms = ti.total_milliseconds();
118 if (remaining_time_ms > 0) {
140 return sm_->GetState();
202 sm_->ProcessRemoteState(packet->
state);
208 newPacket.
poll =
false;
209 newPacket.
final =
true;
226 boost::asio::mutable_buffer buffer =
233 "Unable to encode packet: pktSize " << pktSize
236 const uint8_t *p = boost::asio::buffer_cast<const uint8_t *>(buffer);
258 minInterval = negotiatedInterval * 3/4;
260 maxInterval = negotiatedInterval * 9/10;
262 maxInterval = negotiatedInterval;
265 boost::random::uniform_int_distribution<>
266 dist(minInterval.total_microseconds(),
267 maxInterval.total_microseconds());
268 return boost::posix_time::microseconds(dist(
randomGen));
281 sm_->SetCallback(boost::optional<ChangeCb>());
299 for (Callbacks::const_iterator it =
callbacks_.begin();
301 it->second(
key, new_state);
virtual void SendPacket(const boost::asio::ip::udp::endpoint &local_endpoint, const boost::asio::ip::udp::endpoint &remote_endpoint, const SessionIndex &session_index, const boost::asio::mutable_buffer &packet, int pktSize)=0
ResultCode ProcessControlPacket(const ControlPacket *packet)
BFDRemoteSessionState remoteSession_
void CallStateChangeCallbacks(const SessionKey &key, const BFD::BFDState &new_state)
boost::asio::ip::udp::endpoint remote_endpoint_
void UpdateConfig(const SessionConfig &config)
TimeInterval tx_interval()
void RegisterChangeCallback(ClientId client_id, ChangeCb cb)
boost::scoped_ptr< StateMachine > sm_
BFDState local_state() const
BFDState local_state_non_locking() const
void PreparePacket(const SessionConfig &config, ControlPacket *packet)
boost::asio::ip::udp::endpoint local_endpoint_
std::string toString() const
Connection * communicator_
void SendPacket(const ControlPacket *packet)
SessionConfig config() const
void UnregisterChangeCallback(ClientId client_id)
uint16_t GetRandomLocalPort() const
void ScheduleRecvDeadlineTimer()
Discriminator local_discriminator() const
TimeInterval detection_time()
SessionConfig currentConfig_
const SessionKey & key() const
Discriminator localDiscriminator_
SessionConfig nextConfig_
BFDRemoteSessionState remote_state() const
The TaskScheduler keeps track of what tasks are currently schedulable. When a task is enqueued it is ...
static bool DeleteTimer(Timer *Timer)
int64_t GetElapsedTime() const
bool Start(int time, Handler handler, ErrorHandler error_handler=NULL)
bool Reschedule(int time)
#define LOG(_Level, _Msg)
boost::function< void(const SessionKey &key, const BFD::BFDState &state)> ChangeCb
int EncodeControlPacket(const ControlPacket *msg, uint8_t *data, size_t size)
boost::posix_time::time_duration TimeInterval
const int kMinimalPacketLength
StateMachine * CreateStateMachine(EventManager *evm, Session *session)
boost::random::taus88 randomGen
Discriminator discriminator
TimeInterval minTxInterval
int detectionTimeMultiplier
TimeInterval minRxInterval
uint32_t send_timer_expired_count
uint32_t receive_timer_expired_count
TimeInterval desired_min_tx_interval
int detection_time_multiplier
TimeInterval required_min_rx_interval
BFD::Discriminator receiver_discriminator
BFD::Discriminator sender_discriminator
TimeInterval desiredMinTxInterval
int detectionTimeMultiplier
TimeInterval requiredMinRxInterval
const std::string to_string() const