OpenSDN source code
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
boost::asio::ip::address IpAddress
Definition: address.h:13
boost::intrusive_ptr< const Interface > InterfaceConstRef
Definition: agent.h:51
boost::intrusive_ptr< CryptTunnelEntry > CryptTunnelEntryRef
Definition: agent.h:130
class boost::shared_ptr< AgentSandesh > AgentSandeshPtr
Definition: agent_db.h:18
Agent * agent() const
Definition: agent_db.h:213
uint32_t GetRefCount() const
Definition: agent_db.h:54
Definition: agent.h:360
CryptTunnelEntry(IpAddress remote_ip)
Definition: crypt_tunnel.h:52
bool GetVRToVRCrypt() const
Definition: crypt_tunnel.h:68
virtual string ToString() const
Definition: crypt_tunnel.cc:38
void UpdateTunnelReference()
void SendObjectLog(SandeshTraceBufferPtr ptr, AgentLogEvent::type event) const
CryptTunnelTaskBase * StartCryptTunnel()
virtual KeyPtr GetDBRequestKey() const
Definition: crypt_tunnel.cc:42
bool DBEntrySandesh(Sandesh *sresp, std::string &name) const
bool GetTunnelAvailable() const
Definition: crypt_tunnel.h:67
const IpAddress * GetRemoteIp() const
Definition: crypt_tunnel.h:69
void SetVRToVRCrypt(bool crypt)
Definition: crypt_tunnel.h:72
virtual ~CryptTunnelEntry()
Definition: crypt_tunnel.h:55
DISALLOW_COPY_AND_ASSIGN(CryptTunnelEntry)
CryptTunnelTask * tunnel_task_
Definition: crypt_tunnel.h:84
virtual bool IsLess(const DBEntry &rhs) const
Definition: crypt_tunnel.cc:33
void SetTunnelAvailable(bool available)
Definition: crypt_tunnel.h:71
uint32_t GetRefCount() const
Definition: crypt_tunnel.h:61
IpAddress source_ip_
Definition: crypt_tunnel.h:81
const IpAddress * GetSourceIp() const
Definition: crypt_tunnel.h:70
IpAddress remote_ip_
Definition: crypt_tunnel.h:80
virtual void SetKey(const DBRequestKey *key)
Definition: crypt_tunnel.cc:47
bool IsCryptPathAvailable(const std::string &remote_ip)
Definition: crypt_tunnel.cc:94
virtual DBEntry * Add(const DBRequest *req)
bool TunnelEventProcess(CryptTunnelEvent *event)
void Process(DBRequest &req)
Definition: crypt_tunnel.cc:75
bool ChangeHandler(CryptTunnelEntry *entry, const DBRequest *req)
void TunnelEventEnqueue(CryptTunnelEvent *event)
static DBTableBase * CreateTable(Agent *agent, DB *db, const std::string &name)
DISALLOW_COPY_AND_ASSIGN(CryptTunnelTable)
virtual size_t Hash(const DBRequestKey *key) const
Definition: crypt_tunnel.h:108
void CryptAvailability(const std::string &remote_ip, bool &crypt_traffic, bool &crypt_path_available)
Definition: crypt_tunnel.cc:82
static CryptTunnelTable * crypt_tunnel_table_
Definition: crypt_tunnel.h:126
virtual AgentSandeshPtr GetAgentSandesh(const AgentSandeshArguments *args, const std::string &context)
virtual std::unique_ptr< DBEntry > AllocEntry(const DBRequestKey *k) const
void set_vr_crypt(bool vr_crypt)
Definition: crypt_tunnel.h:95
CryptTunnelEntry * Find(const std::string &remote_ip)
virtual bool Resync(DBEntry *entry, const DBRequest *req)
InterfaceConstRef crypt_interface_
Definition: crypt_tunnel.h:129
virtual bool OnChange(DBEntry *entry, const DBRequest *req)
std::vector< std::string > TunnelEndpointList
Definition: crypt_tunnel.h:90
virtual size_t Hash(const DBEntry *entry) const
Definition: crypt_tunnel.h:107
void Create(const std::string &remote_ip, bool crypt)
WorkQueue< CryptTunnelEvent * > tunnel_event_queue_
Definition: crypt_tunnel.h:130
void set_crypt_interface(const Interface *interface)
Definition: crypt_tunnel.h:96
CryptTunnelTable(Agent *agent, DB *db, const std::string &name)
bool VRToVRCrypt() const
Definition: crypt_tunnel.h:97
bool IsCryptTraffic(const std::string &remote_ip)
virtual ~CryptTunnelTable()
static CryptTunnelTable * GetInstance()
Definition: crypt_tunnel.h:120
void Delete(const std::string &remote_ip)
virtual bool RunTunnelTask(CommandType cmd_type)=0
void StopTask(CryptTunnelEntry *service)
CryptTunnelEntryRef entry_
Definition: crypt_tunnel.h:200
DISALLOW_COPY_AND_ASSIGN(CryptTunnelTaskBase)
void set_tunnel_entry(CryptTunnelEntry *entry)
CryptTunnelEntry * entry() const
Definition: crypt_tunnel.h:193
void UpdateTunnel(const CryptTunnelEntry *entry, bool available) const
virtual bool IsRunning() const
Definition: crypt_tunnel.h:192
virtual bool UpdateTunnelTask()
Definition: crypt_tunnel.h:177
void OnExit(const boost::system::error_code &ec)
virtual bool StopTunnelTask()=0
CryptTunnelTaskBase(CryptTunnelEntry *entry)
void SetTunnelEntry(CryptTunnelEntry *entry)
virtual ~CryptTunnelTaskBase()
const std::string & last_update_time() const
Definition: crypt_tunnel.h:194
std::string to_string()
void OnRead(const std::string &data)
std::string last_update_time_
Definition: crypt_tunnel.h:205
virtual bool DestroyTunnelTask()=0
virtual bool CreateTunnelTask()=0
CryptTunnelTask(CryptTunnelEntry *entry)
void UpdateTunnelTaskCommand(CommandType cmd_type)
InstanceTaskExecvp CryptTunnelProcessTunnel
Definition: crypt_tunnel.h:217
virtual bool DestroyTunnelTask()
virtual bool CreateTunnelTask()
virtual ~CryptTunnelTask()
DISALLOW_COPY_AND_ASSIGN(CryptTunnelTask)
boost::scoped_ptr< CryptTunnelProcessTunnel > task_
Definition: crypt_tunnel.h:234
virtual bool RunTunnelTask(CommandType cmd_type)
virtual bool StopTunnelTask()
static const std::string kCryptTunnelCmd
Definition: crypt_tunnel.h:218
virtual bool IsRunning() const
std::unique_ptr< DBRequestKey > KeyPtr
Definition: db_entry.h:25
const std::string & name() const
Definition: db_table.h:110
Definition: db.h:24
SandeshTraceBufferPtr CryptTunnelTraceBuf
uint8_t type
Definition: load_balance.h:2
boost::shared_ptr< TraceBuffer< SandeshTrace > > SandeshTraceBufferPtr
Definition: sandesh_trace.h:18
CryptTunnelAvailableData(bool available)
Definition: crypt_tunnel.h:44
virtual ~CryptTunnelAvailableData()
Definition: crypt_tunnel.h:46
CryptTunnelConfigData(bool vr_crypt)
Definition: crypt_tunnel.h:37
virtual ~CryptTunnelConfigData()
Definition: crypt_tunnel.h:39
DISALLOW_COPY_AND_ASSIGN(CryptTunnelEvent)
virtual ~CryptTunnelEvent()
CryptTunnelTaskBase * tunnel_task_
Definition: crypt_tunnel.h:150
std::string message_
Definition: crypt_tunnel.h:153
CryptTunnelEvent(CryptTunnelTaskBase *inst, CryptTunnelEntry *entry, EventType type, const std::string &message)
CryptTunnelEntry * entry_
Definition: crypt_tunnel.h:151
IpAddress remote_ip_
Definition: crypt_tunnel.h:32
virtual ~CryptTunnelKey()
Definition: crypt_tunnel.h:32
CryptTunnelKey(IpAddress remote_ip)
Definition: crypt_tunnel.h:31