OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
bfd_server.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2014 CodiLime, Inc. All rights reserved.
3  */
4 
5 #ifndef SRC_BFD_BFD_SERVER_H_
6 #define SRC_BFD_BFD_SERVER_H_
7 
8 #include "base/queue_task.h"
9 #include "bfd/bfd_common.h"
10 
11 #include <map>
12 #include <set>
13 #include <boost/asio.hpp>
14 #include <boost/asio/ip/address.hpp>
15 #include <boost/scoped_ptr.hpp>
16 
17 class EventManager;
18 
19 namespace BFD {
20 class Connection;
21 class Session;
22 struct ControlPacket;
24 
25 typedef std::set<SessionKey> Sessions;
26 
27 // This class manages sessions with other BFD peers.
28 class Server {
29  struct Event;
30  public:
32  virtual ~Server();
35  const boost::asio::ip::udp::endpoint &local_endpoint,
36  const boost::asio::ip::udp::endpoint &remote_endpoint,
37  const SessionIndex &session_index,
38  const boost::asio::const_buffer &recv_buffer,
39  std::size_t bytes_transferred, const boost::system::error_code& error);
40 
41  // If a BFD session with specified [remoteHost] already exists, its
42  // configuration is updated with [config], otherwise it gets created.
43  // ! TODO implement configuration update
45  const SessionConfig &config,
46  Discriminator *assignedDiscriminator);
47 
48  // Instances of BFD::Session are removed after last IP address
49  // reference is gone.
51  Session *SessionByKey(const boost::asio::ip::address &address,
52  const SessionIndex &index = SessionIndex());
53  Session *SessionByKey(const SessionKey &key);
54  Session *SessionByKey(const SessionKey &key) const;
55  Connection *communicator() const { return communicator_; }
56  void AddSession(const SessionKey &key, const SessionConfig &config,
57  ChangeCb cb);
58  void DeleteSession(const SessionKey &key);
59  void DeleteClientSessions();
60  Sessions *GetSessions() { return &sessions_; }
62 
63  private:
64  class SessionManager : boost::noncopyable {
65  public:
66  explicit SessionManager(EventManager *evm) : evm_(evm) {}
68 
70  const SessionConfig &config,
71  Connection *communicator,
72  Discriminator *assignedDiscriminator);
73 
74  // see: Server:RemoveSessionReference
76 
78  Session *SessionByKey(const SessionKey &key);
79  Session *SessionByKey(const SessionKey &key) const;
80 
81  private:
82  typedef std::map<Discriminator, Session *> DiscriminatorSessionMap;
83  typedef std::map<SessionKey, Session *> KeySessionMap;
84  typedef std::map<Session *, unsigned int> RefcountMap;
85 
87 
92  };
93 
94  enum EventType {
101  };
102 
103  struct Event {
105  const SessionConfig &config, ChangeCb cb) :
106  type(type), key(key), config(config), cb(cb) {
107  }
109  type(type), key(key) {
110  }
111  Event(EventType type, boost::asio::ip::udp::endpoint local_endpoint,
112  boost::asio::ip::udp::endpoint remote_endpoint,
113  const SessionIndex &session_index,
114  const boost::asio::const_buffer &recv_buffer,
115  std::size_t bytes_transferred) :
116  type(type), local_endpoint(local_endpoint),
117  remote_endpoint(remote_endpoint), session_index(session_index),
118  recv_buffer(recv_buffer), bytes_transferred(bytes_transferred) {
119  }
120  Event(EventType type) : type(type) {
121  }
122 
127  boost::asio::ip::udp::endpoint local_endpoint;
128  boost::asio::ip::udp::endpoint remote_endpoint;
130  const boost::asio::const_buffer recv_buffer;
131  std::size_t bytes_transferred;
132  };
133 
134  void AddSession(Event *event);
135  void DeleteSession(Event *event);
136  void DeleteClientSessions(Event *event);
137  void ProcessControlPacket(Event *event);
138  void EnqueueEvent(Event *event);
139  bool EventCallback(Event *event);
140 
141  Session *GetSession(const ControlPacket *packet);
142 
146  boost::scoped_ptr<WorkQueue<Event *> > event_queue_;
148 };
149 
150 } // namespace BFD
151 
152 #endif // SRC_BFD_BFD_SERVER_H_
uint32_t Discriminator
Definition: bfd_common.h:17
void AddSession(const SessionKey &key, const SessionConfig &config, ChangeCb cb)
Definition: bfd_server.cc:34
SessionKey key
Definition: bfd_server.h:124
Session * SessionByKey(const SessionKey &key)
Definition: bfd_server.cc:255
std::map< Discriminator, Session * > DiscriminatorSessionMap
Definition: bfd_server.h:82
void ProcessControlPacket(const boost::asio::ip::udp::endpoint &local_endpoint, const boost::asio::ip::udp::endpoint &remote_endpoint, const SessionIndex &session_index, const boost::asio::const_buffer &recv_buffer, std::size_t bytes_transferred, const boost::system::error_code &error)
Definition: bfd_server.cc:178
Discriminator GenerateUniqueDiscriminator()
Definition: bfd_server.cc:310
std::map< Session *, unsigned int > RefcountMap
Definition: bfd_server.h:84
const SessionIndex session_index
Definition: bfd_server.h:129
Session * SessionByKey(const boost::asio::ip::address &address, const SessionIndex &index=SessionIndex())
Definition: bfd_server.cc:165
Session * SessionByDiscriminator(Discriminator discriminator)
Definition: bfd_server.cc:246
Event(EventType type, boost::asio::ip::udp::endpoint local_endpoint, boost::asio::ip::udp::endpoint remote_endpoint, const SessionIndex &session_index, const boost::asio::const_buffer &recv_buffer, std::size_t bytes_transferred)
Definition: bfd_server.h:111
const boost::asio::const_buffer recv_buffer
Definition: bfd_server.h:130
WorkQueue< Event * > * event_queue()
Definition: bfd_server.h:61
virtual ~Server()
Definition: bfd_server.cc:31
SessionManager session_manager_
Definition: bfd_server.h:145
ResultCode ConfigureSession(const SessionKey &key, const SessionConfig &config, Connection *communicator, Discriminator *assignedDiscriminator)
Definition: bfd_server.cc:282
SessionManager(EventManager *evm)
Definition: bfd_server.h:66
ResultCode RemoveSessionReference(const SessionKey &key)
Definition: bfd_server.cc:265
bool EventCallback(Event *event)
Definition: bfd_server.cc:85
boost::scoped_ptr< WorkQueue< Event * > > event_queue_
Definition: bfd_server.h:146
Event(EventType type, const SessionKey &key)
Definition: bfd_server.h:108
boost::asio::ip::udp::endpoint remote_endpoint
Definition: bfd_server.h:128
Event(EventType type)
Definition: bfd_server.h:120
ResultCode ProcessControlPacketActual(const ControlPacket *packet)
Definition: bfd_server.cc:209
SessionConfig config
Definition: bfd_server.h:125
Connection * communicator() const
Definition: bfd_server.h:55
void EnqueueEvent(Event *event)
Definition: bfd_server.cc:81
std::set< SessionKey > Sessions
Definition: bfd_server.h:23
Event(EventType type, const SessionKey &key, const SessionConfig &config, ChangeCb cb)
Definition: bfd_server.h:104
ResultCode
Definition: bfd_common.h:41
std::map< SessionKey, Session * > KeySessionMap
Definition: bfd_server.h:83
DiscriminatorSessionMap by_discriminator_
Definition: bfd_server.h:89
boost::function< void(const SessionKey &key, const BFD::BFDState &state)> ChangeCb
Definition: bfd_common.h:131
Session * GetSession(const ControlPacket *packet)
Definition: bfd_server.cc:104
ResultCode RemoveSessionReference(const SessionKey &key)
Definition: bfd_server.cc:242
EventManager * evm_
Definition: bfd_server.h:143
Connection * communicator_
Definition: bfd_server.h:144
void DeleteSession(const SessionKey &key)
Definition: bfd_server.cc:51
std::size_t bytes_transferred
Definition: bfd_server.h:131
Sessions * GetSessions()
Definition: bfd_server.h:60
Server(EventManager *evm, Connection *communicator)
Definition: bfd_server.cc:21
boost::asio::ip::udp::endpoint local_endpoint
Definition: bfd_server.h:127
ResultCode ConfigureSession(const SessionKey &key, const SessionConfig &config, Discriminator *assignedDiscriminator)
Definition: bfd_server.cc:235
void DeleteClientSessions()
Definition: bfd_server.cc:66
static EventManager evm
Sessions sessions_
Definition: bfd_server.h:147