OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
crypt_tunnel.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2018 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #ifndef SRC_VNSW_AGENT_OPER_CRYPT_TUNNEL_H_
6 #define SRC_VNSW_AGENT_OPER_CRYPT_TUNNEL_H_
7 
8 #include <cmn/agent_cmn.h>
9 #include <cmn/agent.h>
10 #include <agent_types.h>
11 #include <oper/oper_db.h>
12 
14 #define CRYPT_TUNNEL_TASK_TRACE(obj, ...)\
15 do {\
16  CryptTunnelTask##obj::TraceMsg(CryptTunnelTraceBuf, __FILE__, __LINE__,\
17  __VA_ARGS__); \
18 } while (false)
19 
20 class Interface;
21 class CryptTunnelTable;
22 class CryptTunnelEntry;
23 class InstanceTask;
24 class InstanceTaskExecvp;
25 class CryptTunnelTask;
27 struct CryptTunnelEvent;
28 
29 
30 struct CryptTunnelKey : public AgentKey {
31  CryptTunnelKey(IpAddress remote_ip) : AgentKey(), remote_ip_(remote_ip) {} ;
32  virtual ~CryptTunnelKey() { };
34 };
35 
37  CryptTunnelConfigData(bool vr_crypt) : AgentData(),
38  vr_to_vr_crypt_(vr_crypt) { };
39  virtual ~CryptTunnelConfigData() { }
41 };
42 
44  CryptTunnelAvailableData(bool available) : AgentData(),
45  tunnel_available_(available) { };
48 };
49 
50 class CryptTunnelEntry : AgentRefCount<CryptTunnelEntry>, public AgentDBEntry {
51 public:
53  remote_ip_(remote_ip), tunnel_available_(false),
54  vr_to_vr_crypt_(false), tunnel_task_(NULL) { };
55  virtual ~CryptTunnelEntry() { };
56 
57  virtual bool IsLess(const DBEntry &rhs) const;
58  virtual KeyPtr GetDBRequestKey() const;
59  virtual void SetKey(const DBRequestKey *key);
60  virtual string ToString() const;
61  uint32_t GetRefCount() const {
63  }
64  bool DBEntrySandesh(Sandesh *sresp, std::string &name) const;
66  AgentLogEvent::type event) const;
67  bool GetTunnelAvailable() const { return tunnel_available_;}
68  bool GetVRToVRCrypt() const { return vr_to_vr_crypt_;}
69  const IpAddress *GetRemoteIp() const { return &remote_ip_;}
70  const IpAddress *GetSourceIp() const { return &source_ip_;}
71  void SetTunnelAvailable(bool available) { tunnel_available_ = available;}
72  void SetVRToVRCrypt(bool crypt) { vr_to_vr_crypt_ = crypt;}
73  void UpdateTunnelReference();
75  void StopCryptTunnel();
76  void ResyncNH();
77  void PostAdd();
78 private:
79  friend class CryptTunnelTable;
86 };
87 
89 public:
90  typedef std::vector<std::string> TunnelEndpointList;
91 
92  CryptTunnelTable(Agent *agent, DB *db, const std::string &name);
93  virtual ~CryptTunnelTable();
94 
95  void set_vr_crypt(bool vr_crypt) { vr_to_vr_crypt_ = vr_crypt;}
96  void set_crypt_interface(const Interface *interface) { crypt_interface_ = interface;}
97  bool VRToVRCrypt() const { return vr_to_vr_crypt_;};
98  void CryptAvailability(const std::string &remote_ip, bool &crypt_traffic, bool &crypt_path_available);
99 
100  bool IsCryptPathAvailable(const std::string &remote_ip);
101  bool IsCryptTraffic(const std::string &remote_ip);
102  void Create(const std::string &remote_ip, bool crypt);
103  void Delete(const std::string &remote_ip);
104  void Process(DBRequest &req);
105 
106  virtual std::unique_ptr<DBEntry> AllocEntry(const DBRequestKey *k) const;
107  virtual size_t Hash(const DBEntry *entry) const {return 0;};
108  virtual size_t Hash(const DBRequestKey *key) const {return 0;};
109 
110  CryptTunnelEntry *Find(const std::string &remote_ip);
111  virtual DBEntry *Add(const DBRequest *req);
112  virtual bool Resync(DBEntry *entry, const DBRequest *req);
113  virtual bool OnChange(DBEntry *entry, const DBRequest *req);
114  virtual bool Delete(DBEntry *entry, const DBRequest *req);
115 
117  const std::string &context);
118 
119  static DBTableBase *CreateTable(Agent *agent, DB *db, const std::string &name);
121 
124 
125 private:
127  bool ChangeHandler(CryptTunnelEntry *entry, const DBRequest *req);
132 };
133 
134 
136 public:
137  enum EventType {
143  };
144 
147  const std::string &message);
148  virtual ~CryptTunnelEvent();
149 
153  std::string message_;
155 };
156 
157 
159 public:
160  enum CommandType {
165  };
167  virtual ~CryptTunnelTaskBase();
168 
169  virtual bool CreateTunnelTask() = 0;
170 
171  // return true it instance is scheduled to destroy
172  // when API returns false caller need to assure delete of
173  // Crypt Tunnel Instance
174  virtual bool DestroyTunnelTask() = 0;
175  virtual bool RunTunnelTask(CommandType cmd_type) = 0;
176  virtual bool StopTunnelTask() = 0;
177  virtual bool UpdateTunnelTask() { return true; }
178 
179  // OnRead Callback for Task
180  void OnRead(const std::string &data);
181  // OnExit Callback for Task
182  void OnExit(const boost::system::error_code &ec);
183  // Callback to enqueue set tunnel entry
185  // Callback to enqueue stop task
186  void StopTask(CryptTunnelEntry *service);
187 
188  void UpdateTunnel(const CryptTunnelEntry *entry, bool available) const;
190  std::string to_string();
191  bool active() {return active_;}
192  virtual bool IsRunning() const { return true; }
193  CryptTunnelEntry *entry() const { return entry_.get(); }
194  const std::string &last_update_time() const { return last_update_time_; }
195 
196 protected:
197  friend class CryptTunnelTable;
198  // reference to crypt tunnel entry under
199  // which this instance is running
201 
202  // current status of Crypt tunnel
203  bool active_;
204  // last update time
205  std::string last_update_time_;
206  // instance is delete marked
207  bool deleted_;
208 
209 private:
211 };
212 
213 
214 // using the instance task infrastructure
216 public:
218  static const std::string kCryptTunnelCmd;
219 
221  virtual ~CryptTunnelTask();
222 
223  virtual bool CreateTunnelTask();
224  virtual bool DestroyTunnelTask();
225  virtual bool RunTunnelTask(CommandType cmd_type);
226  virtual bool StopTunnelTask();
227  virtual bool IsRunning() const;
228 
229 private:
230  friend class CryptTunnelTable;
231  void UpdateTunnelTaskCommand(CommandType cmd_type);
232 
233  // task managing external running script for status
234  boost::scoped_ptr<CryptTunnelProcessTunnel> task_;
235 
237 };
238 
239 #endif
virtual std::unique_ptr< DBEntry > AllocEntry(const DBRequestKey *k) const
void Delete(const std::string &remote_ip)
DISALLOW_COPY_AND_ASSIGN(CryptTunnelTask)
virtual KeyPtr GetDBRequestKey() const
Definition: crypt_tunnel.cc:42
uint32_t GetRefCount() const
Definition: agent_db.h:54
void TunnelEventEnqueue(CryptTunnelEvent *event)
virtual bool IsRunning() const
DISALLOW_COPY_AND_ASSIGN(CryptTunnelTable)
virtual bool IsLess(const DBEntry &rhs) const
Definition: crypt_tunnel.cc:33
virtual DBEntry * Add(const DBRequest *req)
void CryptAvailability(const std::string &remote_ip, bool &crypt_traffic, bool &crypt_path_available)
Definition: crypt_tunnel.cc:82
virtual bool DestroyTunnelTask()
boost::scoped_ptr< CryptTunnelProcessTunnel > task_
Definition: crypt_tunnel.h:234
virtual bool DestroyTunnelTask()=0
boost::asio::ip::address IpAddress
Definition: address.h:13
IpAddress source_ip_
Definition: crypt_tunnel.h:81
CryptTunnelConfigData(bool vr_crypt)
Definition: crypt_tunnel.h:37
virtual bool UpdateTunnelTask()
Definition: crypt_tunnel.h:177
Agent * agent() const
Definition: agent_db.h:213
virtual bool CreateTunnelTask()
virtual bool RunTunnelTask(CommandType cmd_type)
virtual bool CreateTunnelTask()=0
virtual bool StopTunnelTask()
DISALLOW_COPY_AND_ASSIGN(CryptTunnelEntry)
std::string message_
Definition: crypt_tunnel.h:153
bool GetTunnelAvailable() const
Definition: crypt_tunnel.h:67
bool IsCryptPathAvailable(const std::string &remote_ip)
Definition: crypt_tunnel.cc:94
virtual ~CryptTunnelTask()
boost::shared_ptr< TraceBuffer< SandeshTrace > > SandeshTraceBufferPtr
Definition: sandesh_trace.h:18
void UpdateTunnel(const CryptTunnelEntry *entry, bool available) const
std::unique_ptr< DBRequestKey > KeyPtr
Definition: db_entry.h:25
void Process(DBRequest &req)
Definition: crypt_tunnel.cc:75
CryptTunnelEvent(CryptTunnelTaskBase *inst, CryptTunnelEntry *entry, EventType type, const std::string &message)
const IpAddress * GetRemoteIp() const
Definition: crypt_tunnel.h:69
virtual void SetKey(const DBRequestKey *key)
Definition: crypt_tunnel.cc:47
static CryptTunnelTable * crypt_tunnel_table_
Definition: crypt_tunnel.h:126
virtual AgentSandeshPtr GetAgentSandesh(const AgentSandeshArguments *args, const std::string &context)
virtual bool IsRunning() const
Definition: crypt_tunnel.h:192
DISALLOW_COPY_AND_ASSIGN(CryptTunnelTaskBase)
Definition: db.h:24
CryptTunnelTaskBase * tunnel_task_
Definition: crypt_tunnel.h:150
std::string to_string()
bool GetVRToVRCrypt() const
Definition: crypt_tunnel.h:68
static CryptTunnelTable * GetInstance()
Definition: crypt_tunnel.h:120
void UpdateTunnelTaskCommand(CommandType cmd_type)
CryptTunnelTaskBase * StartCryptTunnel()
uint8_t type
Definition: load_balance.h:109
IpAddress remote_ip_
Definition: crypt_tunnel.h:32
Definition: agent.h:358
InterfaceConstRef crypt_interface_
Definition: crypt_tunnel.h:129
CryptTunnelTask(CryptTunnelEntry *entry)
virtual bool StopTunnelTask()=0
void SetTunnelAvailable(bool available)
Definition: crypt_tunnel.h:71
bool VRToVRCrypt() const
Definition: crypt_tunnel.h:97
DISALLOW_COPY_AND_ASSIGN(CryptTunnelEvent)
IpAddress remote_ip_
Definition: crypt_tunnel.h:80
CryptTunnelKey(IpAddress remote_ip)
Definition: crypt_tunnel.h:31
SandeshTraceBufferPtr CryptTunnelTraceBuf
CryptTunnelEntryRef entry_
Definition: crypt_tunnel.h:200
bool TunnelEventProcess(CryptTunnelEvent *event)
boost::intrusive_ptr< const Interface > InterfaceConstRef
Definition: agent.h:51
void set_tunnel_entry(CryptTunnelEntry *entry)
virtual ~CryptTunnelEvent()
class boost::shared_ptr< AgentSandesh > AgentSandeshPtr
Definition: agent_db.h:18
const std::string & name() const
Definition: db_table.h:110
virtual size_t Hash(const DBEntry *entry) const
Definition: crypt_tunnel.h:107
CryptTunnelTaskBase(CryptTunnelEntry *entry)
virtual bool OnChange(DBEntry *entry, const DBRequest *req)
bool IsCryptTraffic(const std::string &remote_ip)
CryptTunnelTask * tunnel_task_
Definition: crypt_tunnel.h:84
void OnRead(const std::string &data)
uint32_t GetRefCount() const
Definition: crypt_tunnel.h:61
CryptTunnelEntry * Find(const std::string &remote_ip)
virtual ~CryptTunnelAvailableData()
Definition: crypt_tunnel.h:46
virtual string ToString() const
Definition: crypt_tunnel.cc:38
boost::intrusive_ptr< CryptTunnelEntry > CryptTunnelEntryRef
Definition: agent.h:130
void SetTunnelEntry(CryptTunnelEntry *entry)
void SetVRToVRCrypt(bool crypt)
Definition: crypt_tunnel.h:72
virtual ~CryptTunnelConfigData()
Definition: crypt_tunnel.h:39
virtual bool RunTunnelTask(CommandType cmd_type)=0
virtual size_t Hash(const DBRequestKey *key) const
Definition: crypt_tunnel.h:108
bool DBEntrySandesh(Sandesh *sresp, std::string &name) const
virtual bool Resync(DBEntry *entry, const DBRequest *req)
CryptTunnelAvailableData(bool available)
Definition: crypt_tunnel.h:44
static const std::string kCryptTunnelCmd
Definition: crypt_tunnel.h:218
CryptTunnelEntry * entry() const
Definition: crypt_tunnel.h:193
WorkQueue< CryptTunnelEvent * > tunnel_event_queue_
Definition: crypt_tunnel.h:130
void SendObjectLog(SandeshTraceBufferPtr ptr, AgentLogEvent::type event) const
void Create(const std::string &remote_ip, bool crypt)
void StopTask(CryptTunnelEntry *service)
CryptTunnelTable(Agent *agent, DB *db, const std::string &name)
void set_crypt_interface(const Interface *interface)
Definition: crypt_tunnel.h:96
CryptTunnelEntry(IpAddress remote_ip)
Definition: crypt_tunnel.h:52
void OnExit(const boost::system::error_code &ec)
void UpdateTunnelReference()
const std::string & last_update_time() const
Definition: crypt_tunnel.h:194
CryptTunnelEntry * entry_
Definition: crypt_tunnel.h:151
InstanceTaskExecvp CryptTunnelProcessTunnel
Definition: crypt_tunnel.h:217
const IpAddress * GetSourceIp() const
Definition: crypt_tunnel.h:70
std::vector< std::string > TunnelEndpointList
Definition: crypt_tunnel.h:90
static DBTableBase * CreateTable(Agent *agent, DB *db, const std::string &name)
virtual ~CryptTunnelEntry()
Definition: crypt_tunnel.h:55
bool ChangeHandler(CryptTunnelEntry *entry, const DBRequest *req)
void set_vr_crypt(bool vr_crypt)
Definition: crypt_tunnel.h:95
std::string last_update_time_
Definition: crypt_tunnel.h:205
virtual ~CryptTunnelTaskBase()
virtual ~CryptTunnelKey()
Definition: crypt_tunnel.h:32
virtual ~CryptTunnelTable()