OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
bfd_udp_connection.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2014 CodiLime, Inc. All rights reserved.
3  */
4 
5 #ifndef SRC_BFD_UDP_CONNECTION_H_
6 #define SRC_BFD_UDP_CONNECTION_H_
7 
8 #include "bfd/bfd_connection.h"
9 
10 #include <boost/optional.hpp>
11 
12 #include "io/udp_server.h"
13 
14 namespace BFD {
16  public:
17  typedef boost::function<void(boost::asio::ip::udp::endpoint remote_endpoint,
18  const boost::asio::const_buffer &recv_buffer,
19  std::size_t bytes_transferred,
20  const boost::system::error_code& error)>
22 
24  int remotePort = kSingleHop);
26  void RegisterCallback(RecvCallback callback);
27 
28  virtual void SendPacket(
29  const boost::asio::ip::udp::endpoint &local_endpoint,
30  const boost::asio::ip::udp::endpoint &remote_endpoint,
31  const SessionIndex &session_index,
32  const boost::asio::mutable_buffer &send, int pktSize);
33  void SendPacket(boost::asio::ip::address remoteHost,
34  const ControlPacket *packet);
35  virtual Server *GetServer() const;
36  virtual void SetServer(Server *server);
37  virtual void NotifyStateChange(const SessionKey &key, const bool &up);
38 
39  private:
40 
41  class UDPRecvServer : public UdpServer {
42  public:
44  EventManager *evm, int recvPort);
45  void RegisterCallback(RecvCallback callback);
46  void HandleReceive(const boost::asio::const_buffer &recv_buffer,
47  boost::asio::ip::udp::endpoint remote_endpoint,
48  std::size_t bytes_transferred,
49  const boost::system::error_code &error);
50 
51  private:
53  boost::optional<RecvCallback> callback_;
54  } *udpRecv_;
55 
56  class UDPCommunicator : public UdpServer {
57  public:
59  // TODO(bfd) add multiple instances to randomize source port (RFC5881)
60  int remotePort() const { return remotePort_; }
61  private:
62  const int remotePort_;
63  } *udpSend_;
64 
66 };
67 } // namespace BFD
68 
69 #endif // SRC_BFD_UDP_CONNECTION_H_
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_
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)
virtual Server * GetServer() const
boost::optional< RecvCallback > callback_
virtual void SetServer(Server *server)
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
virtual void NotifyStateChange(const SessionKey &key, const bool &up)
static EventManager evm