OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
udp_server.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #ifndef SRC_IO_UDP_SERVER_H_
6 #define SRC_IO_UDP_SERVER_H_
7 
8 #include <string>
9 #include <vector>
10 #include <boost/asio.hpp>
11 #include <boost/intrusive_ptr.hpp>
12 #include "io/event_manager.h"
13 #include "io/server_manager.h"
14 #include "io/io_utils.h"
15 
16 class SocketIOStats;
17 
18 class UdpServer {
19 public:
20  typedef boost::asio::ip::udp::endpoint Endpoint;
21  typedef boost::asio::ip::udp::socket Socket;
22 
23  enum ServerState {
24  OK = 42,
28  };
29  static const int kDefaultBufferSize = 4 * 1024;
30 
31  explicit UdpServer(EventManager *evm, int buffer_size = kDefaultBufferSize);
32  explicit UdpServer(boost::asio::io_context *io_service,
33  int buffer_size = kDefaultBufferSize);
34  virtual ~UdpServer();
35 
36  virtual bool Initialize(unsigned short port);
37  virtual bool Initialize(const std::string &ipaddress, unsigned short port);
38  virtual bool Initialize(boost::asio::ip::udp::endpoint local_endpoint);
39  virtual void Shutdown();
40 
41  // tx-rx
42  // Assumes mutex is locked or called from the main thread
43  void StartSend(boost::asio::ip::udp::endpoint ep, std::size_t bytes_to_send,
44  boost::asio::const_buffer buffer);
45  // Assumes mutex is locked or called from the main thread
46  void StartReceive();
47  // state
48  ServerState GetServerState() const { return state_; }
49  boost::asio::ip::udp::endpoint GetLocalEndpoint(
50  boost::system::error_code *error) const;
51  std::string GetLocalEndpointAddress() const;
52  int GetLocalEndpointPort() const;
53 
54  // buffers
55  // Assumes mutex is locked or called from the main thread
56  boost::asio::mutable_buffer AllocateBuffer();
57  boost::asio::mutable_buffer AllocateBuffer(std::size_t s);
58  // Assumes mutex is locked or called from the main thread
59  void DeallocateBuffer(const boost::asio::const_buffer &buffer);
60 
61  // statistics
62  const io::SocketStats &GetSocketStats() const { return stats_; }
63  void GetRxSocketStats(SocketIOStats *socket_stats) const;
64  void GetTxSocketStats(SocketIOStats *socket_stats) const;
65 
66 protected:
68  virtual bool DisableSandeshLogMessages() { return false; }
69  virtual std::string ToString() { return name_; }
70 
71  // Assumes mutex is locked, deallocates the buffer
72  virtual void HandleReceive(
73  const boost::asio::const_buffer &recv_buffer,
74  boost::asio::ip::udp::endpoint remote_endpoint,
75  std::size_t bytes_transferred,
76  const boost::system::error_code& error);
77 
78  virtual void OnRead(const boost::asio::const_buffer &recv_buffer,
79  const boost::asio::ip::udp::endpoint &remote_endpoint);
80 
81  virtual int reader_task_id() const {
82  return reader_task_id_;
83  }
84  // This function returns the instance to run ReaderTask.
85  // Returning Task::kTaskInstanceAny would allow multiple reader tasks to
86  // run in parallel.
87  // Derived class may override implementation if it expects that all the
88  // tasks of the reader to run in specific instance
89  // Note: Two tasks of same task ID and task instance can't run
90  // at in parallel
91  // E.g. User can create task per remote endpoint to ensure that
92  // there is one ReaderTask per remote endpoint
93  virtual int reader_task_instance(
94  const boost::asio::ip::udp::endpoint &remote_endpoint) const;
95 
96  // Assumes mutex is locked, deallocates the buffer
97  virtual void HandleSend(boost::asio::const_buffer send_buffer,
98  boost::asio::ip::udp::endpoint remote_endpoint,
99  std::size_t bytes_transferred,
100  const boost::system::error_code& error);
101 
102 private:
103  class Reader;
104  friend void intrusive_ptr_add_ref(UdpServer *server);
105  friend void intrusive_ptr_release(UdpServer *server);
106  void SetName(boost::asio::ip::udp::endpoint ep);
107 
108  // Locks the mutex
110  boost::asio::const_buffer recv_buffer,
111  std::size_t bytes_transferred,
112  const boost::system::error_code& error);
113 
114  // Locks the mutex
115  void HandleSendInternal(boost::asio::const_buffer send_buffer,
116  boost::asio::ip::udp::endpoint remote_endpoint,
117  std::size_t bytes_transferred,
118  const boost::system::error_code& error);
119 
120  static int reader_task_id_;
121  boost::asio::ip::udp::socket socket_;
125  std::string name_;
126  boost::asio::ip::udp::endpoint remote_endpoint_;
127  tbb::mutex state_guard_;
128  tbb::mutex pbuf_guard_;
129  std::vector<uint8_t *> pbuf_;
130  tbb::atomic<int> refcount_;
132 
134 };
135 
136 typedef boost::intrusive_ptr<UdpServer> UdpServerPtr;
137 
138 inline void intrusive_ptr_add_ref(UdpServer *server) {
139  server->refcount_.fetch_and_increment();
140 }
141 
142 inline void intrusive_ptr_release(UdpServer *server) {
143  int prev = server->refcount_.fetch_and_decrement();
144  if (prev == 1) {
145  delete server;
146  }
147 }
148 
150 public:
151  static void AddServer(UdpServer *server);
152  static void DeleteServer(UdpServer *server);
153 
154 private:
156 };
157 
158 #endif // SRC_IO_UDP_SERVER_H_
int intrusive_ptr_add_ref(const AsPath *cpath)
Definition: bgp_aspath.h:147
boost::intrusive_ptr< UdpServer > UdpServerPtr
Definition: udp_server.h:136
virtual ~UdpServer()
Definition: udp_server.cc:86
ServerState state_
Definition: udp_server.h:123
boost::asio::ip::udp::endpoint remote_endpoint_
Definition: udp_server.h:126
virtual int reader_task_instance(const boost::asio::ip::udp::endpoint &remote_endpoint) const
Definition: udp_server.cc:75
boost::asio::ip::udp::socket Socket
Definition: udp_server.h:21
boost::asio::ip::udp::endpoint Endpoint
Definition: udp_server.h:20
virtual void Shutdown()
Definition: udp_server.cc:98
void DeallocateBuffer(const boost::asio::const_buffer &buffer)
Definition: udp_server.cc:182
friend void intrusive_ptr_add_ref(UdpServer *server)
Definition: udp_server.h:138
std::string name_
Definition: udp_server.h:125
const io::SocketStats & GetSocketStats() const
Definition: udp_server.h:62
EventManager * evm_
Definition: udp_server.h:124
boost::asio::mutable_buffer AllocateBuffer()
Definition: udp_server.cc:178
static ServerManager< UdpServer, UdpServerPtr > impl_
Definition: udp_server.h:155
virtual std::string ToString()
Definition: udp_server.h:69
void HandleReceiveInternal(boost::asio::const_buffer recv_buffer, std::size_t bytes_transferred, const boost::system::error_code &error)
Definition: udp_server.cc:251
virtual void HandleSend(boost::asio::const_buffer send_buffer, boost::asio::ip::udp::endpoint remote_endpoint, std::size_t bytes_transferred, const boost::system::error_code &error)
Definition: udp_server.cc:294
void GetRxSocketStats(SocketIOStats *socket_stats) const
Definition: udp_server.cc:321
tbb::atomic< int > refcount_
Definition: udp_server.h:130
void GetTxSocketStats(SocketIOStats *socket_stats) const
Definition: udp_server.cc:325
io::SocketStats stats_
Definition: udp_server.h:131
boost::asio::ip::udp::socket socket_
Definition: udp_server.h:121
void SetName(boost::asio::ip::udp::endpoint ep)
Definition: udp_server.cc:79
EventManager * event_manager()
Definition: udp_server.h:67
virtual void OnRead(const boost::asio::const_buffer &recv_buffer, const boost::asio::ip::udp::endpoint &remote_endpoint)
Definition: udp_server.cc:288
std::vector< uint8_t * > pbuf_
Definition: udp_server.h:129
void StartSend(boost::asio::ip::udp::endpoint ep, std::size_t bytes_to_send, boost::asio::const_buffer buffer)
Definition: udp_server.cc:194
virtual int reader_task_id() const
Definition: udp_server.h:81
static const int kDefaultBufferSize
Definition: udp_server.h:29
virtual 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)
Definition: udp_server.cc:276
boost::asio::ip::udp::endpoint GetLocalEndpoint(boost::system::error_code *error) const
Definition: udp_server.cc:300
UdpServer(EventManager *evm, int buffer_size=kDefaultBufferSize)
Definition: udp_server.cc:62
DISALLOW_COPY_AND_ASSIGN(UdpServer)
void HandleSendInternal(boost::asio::const_buffer send_buffer, boost::asio::ip::udp::endpoint remote_endpoint, std::size_t bytes_transferred, const boost::system::error_code &error)
Definition: udp_server.cc:210
tbb::mutex state_guard_
Definition: udp_server.h:127
friend void intrusive_ptr_release(UdpServer *server)
Definition: udp_server.h:142
static int reader_task_id_
Definition: udp_server.h:120
static void DeleteServer(UdpServer *server)
Definition: udp_server.cc:338
void intrusive_ptr_release(const AsPath *cpath)
Definition: bgp_aspath.h:155
std::string GetLocalEndpointAddress() const
Definition: udp_server.cc:305
static void AddServer(UdpServer *server)
Definition: udp_server.cc:334
virtual bool DisableSandeshLogMessages()
Definition: udp_server.h:68
void StartReceive()
Definition: udp_server.cc:235
int GetLocalEndpointPort() const
Definition: udp_server.cc:313
ServerState GetServerState() const
Definition: udp_server.h:48
tbb::mutex pbuf_guard_
Definition: udp_server.h:128
virtual bool Initialize(unsigned short port)
Definition: udp_server.cc:136
int buffer_size_
Definition: udp_server.h:122
static EventManager evm