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 =
228 kMinimalPacketLength);
230 boost::asio::buffer_cast<uint8_t *>(buffer), kMinimalPacketLength);
231 if (pktSize != kMinimalPacketLength) {
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);
const SessionKey & key() const
int detection_time_multiplier
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
SessionConfig nextConfig_
void UnregisterChangeCallback(ClientId client_id)
int EncodeControlPacket(const ControlPacket *msg, uint8_t *data, size_t size)
The TaskScheduler keeps track of what tasks are currently schedulable. When a task is enqueued it is ...
void PreparePacket(const SessionConfig &config, ControlPacket *packet)
TimeInterval desiredMinTxInterval
BFDState local_state_non_locking() const
std::string toString() const
Connection * communicator_
TimeInterval tx_interval()
boost::scoped_ptr< StateMachine > sm_
SessionConfig currentConfig_
Discriminator discriminator
TimeInterval requiredMinRxInterval
boost::random::taus88 randomGen
BFDRemoteSessionState remote_state() const
void CallStateChangeCallbacks(const SessionKey &key, const BFD::BFDState &new_state)
TimeInterval detection_time()
TimeInterval minRxInterval
uint32_t send_timer_expired_count
BFD::Discriminator sender_discriminator
BFD::Discriminator receiver_discriminator
boost::posix_time::time_duration TimeInterval
TimeInterval required_min_rx_interval
void RegisterChangeCallback(ClientId client_id, ChangeCb cb)
BFDRemoteSessionState remoteSession_
boost::asio::ip::udp::endpoint remote_endpoint_
Discriminator localDiscriminator_
SessionConfig config() const
const int kMinimalPacketLength
StateMachine * CreateStateMachine(EventManager *evm, Session *session)
boost::function< void(const SessionKey &key, const BFD::BFDState &state)> ChangeCb
boost::asio::ip::udp::endpoint local_endpoint_
bool Start(int time, Handler handler, ErrorHandler error_handler=NULL)
uint32_t receive_timer_expired_count
BFDState local_state() const
#define LOG(_Level, _Msg)
TimeInterval desired_min_tx_interval
ResultCode ProcessControlPacket(const ControlPacket *packet)
Discriminator local_discriminator() const
bool Reschedule(int time)
int64_t GetElapsedTime() const
void SendPacket(const ControlPacket *packet)
int detectionTimeMultiplier
const std::string to_string() const
TimeInterval minTxInterval
int detectionTimeMultiplier
void ScheduleRecvDeadlineTimer()
void UpdateConfig(const SessionConfig &config)
static bool DeleteTimer(Timer *Timer)
uint16_t GetRandomLocalPort() const