5 #include <boost/asio.hpp>
6 #include <boost/scoped_ptr.hpp>
7 #include <boost/random.hpp>
28 this->callback_ = callback;
32 const boost::asio::const_buffer &recv_buffer,
33 boost::asio::ip::udp::endpoint remote_endpoint,
34 std::size_t bytes_transferred,
35 const boost::system::error_code &error) {
37 callback_.get()(remote_endpoint, recv_buffer, bytes_transferred, error);
41 boost::system::error_code err;
42 parent_->HandleReceive(recv_buffer, GetLocalEndpoint(&err),
49 :
UdpServer(evm), remotePort_(remotePort) {
53 LOG(DEBUG,
"Bind UDPCommunicator to localport: " << localPort);
73 LOG(ERROR,
"Unable to listen on port " << recvPort);
92 boost::asio::mutable_buffer send =
94 kMinimalPacketLength);
96 boost::asio::buffer_cast<uint8_t *>(send),
97 kMinimalPacketLength);
98 if (pktSize != kMinimalPacketLength) {
99 LOG(ERROR,
"Unable to encode packet");
100 const uint8_t *p = boost::asio::buffer_cast<
const uint8_t *>(send);
104 boost::asio::ip::udp::endpoint remote_endpoint(remoteHost,
106 SendPacket(boost::asio::ip::udp::endpoint(), remote_endpoint, 0, send,
111 const boost::asio::ip::udp::endpoint &local_endpoint,
112 const boost::asio::ip::udp::endpoint &remote_endpoint,
113 const SessionIndex &index,
const boost::asio::mutable_buffer &send,
int EncodeControlPacket(const ControlPacket *msg, uint8_t *data, size_t size)
UDPRecvServer(UDPConnectionManager *parent, EventManager *evm, int recvPort)
void RegisterCallback(RecvCallback callback)
UDPConnectionManager(EventManager *evm, int recvPort=kSingleHop, int remotePort=kSingleHop)
void HandleReceive(const boost::asio::const_buffer &recv_buffer, boost::asio::ip::udp::endpoint remote_endpoint, std::size_t bytes_transferred, const boost::system::error_code &error)
BFD::UDPConnectionManager::UDPCommunicator * udpSend_
boost::random::taus88 randomGen
void StartSend(boost::asio::ip::udp::endpoint ep, std::size_t bytes_to_send, boost::asio::const_buffer buffer)
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 &send, int pktSize)
BFD::UDPConnectionManager::UDPRecvServer * udpRecv_
UDPCommunicator(EventManager *evm, int remotePort)
const int kMinimalPacketLength
virtual Server * GetServer() const
virtual void SetServer(Server *server)
static void DeleteServer(UdpServer *server)
#define LOG(_Level, _Msg)
void RegisterCallback(RecvCallback callback)
boost::function< void(boost::asio::ip::udp::endpoint remote_endpoint, const boost::asio::const_buffer &recv_buffer, std::size_t bytes_transferred, const boost::system::error_code &error)> RecvCallback
ServerState GetServerState() const
virtual void NotifyStateChange(const SessionKey &key, const bool &up)
virtual bool Initialize(unsigned short port)