OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
mirror_table.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #ifndef vnsw_agent_mirror_table_hpp
6 #define vnsw_agent_mirror_table_hpp
7 
8 #include <cmn/agent_cmn.h>
9 #include <cmn/agent.h>
10 #include <agent_types.h>
11 
12 struct MirrorEntryKey : public AgentKey {
13  MirrorEntryKey(const std::string analyzer_name)
14  : analyzer_name_(analyzer_name) {
15  }
16  std::string analyzer_name_;
17 };
18 
19 struct MirrorEntryData : public AgentData {
25 
26  };
27 
28  MirrorEntryData(const std::string vrf_name, const IpAddress &sip,
29  const uint16_t sport, const IpAddress &dip,
30  const uint16_t dport, uint8_t mirror_flags,
31  uint32_t vni, const MacAddress &mac, bool createdvrf):
32  vrf_name_(vrf_name), sip_(sip), sport_(sport), dip_(dip),
33  dport_(dport), mirror_flags_(mirror_flags), vni_(vni),
34  mac_(mac), createdvrf_(createdvrf),
35  nic_assisted_mirroring_(false) { }
36 
37  MirrorEntryData(bool nic_assisted_mirroring,
38  uint16_t nic_assisted_mirroring_vlan):
39  nic_assisted_mirroring_(nic_assisted_mirroring),
40  nic_assisted_mirroring_vlan_(nic_assisted_mirroring_vlan) { }
41 
42 
43  std::string vrf_name_;
45  uint16_t sport_;
47  uint16_t dport_;
48  uint8_t mirror_flags_;
49  uint32_t vni_;
50  MacAddress mac_; // can be type of vtep mac or analyzer-mac based on type NH
54 };
55 
56 class MirrorEntry : AgentRefCount<MirrorEntry>, public AgentDBEntry {
57 public:
58  MirrorEntry(std::string analyzer_name) :
59  analyzer_name_(analyzer_name), vrf_(NULL, this), nh_(NULL),
60  vrf_name_(""), createdvrf_(false) { };
61  virtual ~MirrorEntry() { };
62 
63  virtual bool IsLess(const DBEntry &rhs) const;
64  virtual bool Change(const DBRequest *req) {return false;};
65 
66  virtual void SetKey(const DBRequestKey *key);
67  virtual KeyPtr GetDBRequestKey() const;
68  virtual std::string ToString() const { return "MirrorEntry";};
69 
70  uint32_t GetRefCount() const {
72  }
73  bool DBEntrySandesh(Sandesh *sresp, std::string &name) const;
74  void set_mirror_entrySandeshData(MirrorEntrySandeshData &data) const;
75  uint32_t vrf_id() const;
76  const VrfEntry *GetVrf() const;
77  const std::string GetAnalyzerName() const {return analyzer_name_;}
78  const IpAddress *GetSip() const {return &sip_;}
79  uint16_t GetSPort() const {return sport_;}
80  const IpAddress *GetDip() const {return &dip_;}
81  uint16_t GetDPort() const {return dport_;}
82  const NextHop *GetNH() const {return nh_.get();}
83  const std::string vrf_name() const {return vrf_name_;}
84  uint32_t GetVni() const {return vni_;}
85  uint8_t GetMirrorFlag() const {return mirror_flags_;}
86  const MacAddress *GetMac() const { return &mac_;}
87  bool GetCreatedVrf() const {return createdvrf_;}
88  uint16_t nic_assisted_mirroring_vlan() const {
90  bool nic_assisted_mirroring() const {
92  }
93  void set_mirror_index(uint32_t index) {mirror_index_ = index;}
94  uint32_t mirror_index() const { return mirror_index_; }
95 private:
96  std::string analyzer_name_;
99  uint16_t sport_;
101  uint16_t dport_;
103  std::string vrf_name_;
104  uint8_t mirror_flags_;
105  uint32_t vni_;
106  MacAddress mac_; // can be type of vtep mac or analyzer-mac based on type NH
107  // this vrf will be created if this mirror vrf is not known to compute node
108  // add it subscribes for the route information to get down loaded
112  uint32_t mirror_index_;
113  friend class MirrorTable;
114 };
115 
116 class MirrorTable : public AgentDBTable {
117 public:
118  const static unsigned bufLen = 512;
119  const static uint8_t kInvalidIndex = 0xFF;
120  typedef std::vector<MirrorEntry *> MirrorEntryList;
121  typedef std::map<std::string , MirrorEntryList> VrfMirrorEntryList;
122  typedef std::pair<std::string , MirrorEntryList> VrfMirrorEntry;
123 
124  MirrorTable(DB *db, const std::string &name) : AgentDBTable(db, name) {
125  }
126  virtual ~MirrorTable();
127  virtual std::unique_ptr<DBEntry> AllocEntry(const DBRequestKey *k) const;
128  virtual size_t Hash(const DBEntry *entry) const {return 0;}
129  virtual size_t Hash(const DBRequestKey *key) const {return 0;}
130 
131  virtual DBEntry *Add(const DBRequest *req);
132  virtual bool OnChange(DBEntry *entry, const DBRequest *req);
133  virtual bool Delete(DBEntry *entry, const DBRequest *request);
134  virtual bool Resync(DBEntry *entry, const DBRequest *req) {
135  bool ret = OnChange(entry, req);
136  return ret;
137  }
139  const std::string &context);
140  VrfEntry *FindVrfEntry(const std::string &vrf_name) const;
141  static void AddMirrorEntry(const std::string &analyzer_name,
142  const std::string &vrf_name,
143  const IpAddress &sip, uint16_t sport,
144  const IpAddress &dip, uint16_t dport);
145  static void AddMirrorEntry(const std::string &analyzer_name,
146  const std::string &vrf_name,
147  const IpAddress &sip, uint16_t sport,
148  const IpAddress &dip, uint16_t dport,
149  uint32_t vni, uint8_t mirror_flag,
150  const MacAddress &mac);
151  static void AddMirrorEntry(const std::string &analyzer_name,
152  uint32_t nic_assisted_mirroring_vlan);
153  static void DelMirrorEntry(const std::string &analyzer_name);
154  virtual void OnZeroRefcount(AgentDBEntry *e);
155  static DBTableBase *CreateTable(DB *db, const std::string &name);
157  void MirrorSockInit(void);
158  void ReadHandler(const boost::system::error_code& error, size_t bytes);
159  void AddUnresolved(MirrorEntry *entry);
160  void RemoveUnresolved(MirrorEntry *entry);
163  void ResyncMirrorEntry(VrfMirrorEntryList &list, const VrfEntry *vrf);
164  void ResyncResolvedMirrorEntry(const VrfEntry *vrf);
165  void ResyncUnresolvedMirrorEntry(const VrfEntry *vrf);
166  void Add(VrfMirrorEntryList &vrf_entry_map, MirrorEntry *entry);
167  void Delete(VrfMirrorEntryList &vrf_entry_map, MirrorEntry *entry);
168  void VrfListenerInit();
169  void VrfNotify(DBTablePartBase *root, DBEntryBase *entry);
170  void Shutdown();
171  void Initialize();
172  bool OnChange(MirrorEntry *mirror_entry);
174  MirrorVrfState() : DBState(), seen_(false),
176  bool seen_;
178  };
181  MirrorVrfState *state);
182  bool UnresolvedMirrorVrf(const VrfEntry *vrf, VrfMirrorEntryList &list);
183  MirrorEntry* GetMirrorEntry(VrfEntry *vrf, const MacAddress & mac,
184  VrfMirrorEntryList &list);
186  DecodeMirrorFlag (const std::string &nh_mode, bool juniper_header);
187  void DeleteMirrorVrf(MirrorEntry *entry, bool del_from_vrf_list);
188  bool IsConfigured();
189 private:
190  std::unique_ptr<boost::asio::ip::udp::socket> udp_sock_;
196 };
197 #endif
const NextHop * GetNH() const
Definition: mirror_table.h:82
uint16_t GetDPort() const
Definition: mirror_table.h:81
virtual std::unique_ptr< DBEntry > AllocEntry(const DBRequestKey *k) const
Definition: mirror_table.cc:46
uint32_t GetRefCount() const
Definition: agent_db.h:54
Definition: vrf.h:86
MacAddress mac_
Definition: mirror_table.h:106
uint16_t GetSPort() const
Definition: mirror_table.h:79
VrfMirrorEntryList unresolved_entry_list_
Definition: mirror_table.h:193
IpAddress dip_
Definition: mirror_table.h:46
char rx_buff_[bufLen]
Definition: mirror_table.h:192
MirrorEntry(std::string analyzer_name)
Definition: mirror_table.h:58
void ReadHandler(const boost::system::error_code &error, size_t bytes)
uint32_t vni_
Definition: mirror_table.h:105
uint32_t mirror_index_
Definition: mirror_table.h:112
IpAddress sip_
Definition: mirror_table.h:44
bool createdvrf_
Definition: mirror_table.h:109
VrfEntryRef vrf_
Definition: mirror_table.h:97
bool nic_assisted_mirroring_
Definition: mirror_table.h:52
bool IsConfigured()
boost::asio::ip::address IpAddress
Definition: address.h:13
uint16_t sport_
Definition: mirror_table.h:99
bool GetCreatedVrf() const
Definition: mirror_table.h:87
void DeleteResolvedVrfMirrorEntry(MirrorEntry *entry)
int ListenerId
Definition: db_table.h:62
uint32_t vrf_id() const
VrfMirrorEntryList resolved_entry_list_
Definition: mirror_table.h:194
void ResyncResolvedMirrorEntry(const VrfEntry *vrf)
std::map< std::string, MirrorEntryList > VrfMirrorEntryList
Definition: mirror_table.h:121
uint32_t GetRefCount() const
Definition: mirror_table.h:70
virtual bool Resync(DBEntry *entry, const DBRequest *req)
Definition: mirror_table.h:134
MirrorEntryData(bool nic_assisted_mirroring, uint16_t nic_assisted_mirroring_vlan)
Definition: mirror_table.h:37
std::unique_ptr< DBRequestKey > KeyPtr
Definition: db_entry.h:25
void BridgeRouteTableNotify(DBTablePartBase *partition, DBEntryBase *e)
virtual bool Change(const DBRequest *req)
Definition: mirror_table.h:64
void AddResolvedVrfMirrorEntry(MirrorEntry *entry)
virtual size_t Hash(const DBEntry *entry) const
Definition: mirror_table.h:128
uint16_t nic_assisted_mirroring_vlan_
Definition: mirror_table.h:111
void MirrorSockInit(void)
virtual void OnZeroRefcount(AgentDBEntry *e)
Definition: db.h:24
static const uint8_t kInvalidIndex
Definition: mirror_table.h:119
uint16_t nic_assisted_mirroring_vlan() const
Definition: mirror_table.h:88
DBTableBase::ListenerId bridge_rt_table_listener_id_
Definition: mirror_table.h:177
void Initialize()
const VrfEntry * GetVrf() const
std::pair< std::string, MirrorEntryList > VrfMirrorEntry
Definition: mirror_table.h:122
MirrorEntryKey(const std::string analyzer_name)
Definition: mirror_table.h:13
bool nic_assisted_mirroring() const
Definition: mirror_table.h:90
uint8_t GetMirrorFlag() const
Definition: mirror_table.h:85
virtual ~MirrorTable()
Definition: mirror_table.cc:24
std::string analyzer_name_
Definition: mirror_table.h:96
virtual ~MirrorEntry()
Definition: mirror_table.h:61
const MacAddress * GetMac() const
Definition: mirror_table.h:86
virtual std::string ToString() const
Definition: mirror_table.h:68
uint8_t mirror_flags_
Definition: mirror_table.h:104
class boost::shared_ptr< AgentSandesh > AgentSandeshPtr
Definition: agent_db.h:18
const std::string & name() const
Definition: db_table.h:110
static MirrorEntryData::MirrorEntryFlags DecodeMirrorFlag(const std::string &nh_mode, bool juniper_header)
void DeleteMirrorVrf(MirrorEntry *entry, bool del_from_vrf_list)
void VrfListenerInit()
virtual bool IsLess(const DBEntry &rhs) const
Definition: mirror_table.cc:31
IpAddress sip_
Definition: mirror_table.h:98
MacAddress mac_
Definition: mirror_table.h:50
VrfEntry * FindVrfEntry(const std::string &vrf_name) const
virtual AgentSandeshPtr GetAgentSandesh(const AgentSandeshArguments *args, const std::string &context)
static void DelMirrorEntry(const std::string &analyzer_name)
static MirrorTable * GetInstance()
Definition: mirror_table.h:156
uint16_t dport_
Definition: mirror_table.h:47
static void AddMirrorEntry(const std::string &analyzer_name, const std::string &vrf_name, const IpAddress &sip, uint16_t sport, const IpAddress &dip, uint16_t dport)
void set_mirror_entrySandeshData(MirrorEntrySandeshData &data) const
virtual DBEntry * Add(const DBRequest *req)
Definition: mirror_table.cc:52
const IpAddress * GetSip() const
Definition: mirror_table.h:78
uint32_t mirror_index() const
Definition: mirror_table.h:94
bool nic_assisted_mirroring_
Definition: mirror_table.h:110
virtual size_t Hash(const DBRequestKey *key) const
Definition: mirror_table.h:129
uint32_t GetVni() const
Definition: mirror_table.h:84
const IpAddress * GetDip() const
Definition: mirror_table.h:80
void RemoveUnresolved(MirrorEntry *entry)
void ResyncUnresolvedMirrorEntry(const VrfEntry *vrf)
MirrorTable(DB *db, const std::string &name)
Definition: mirror_table.h:124
uint8_t mirror_flags_
Definition: mirror_table.h:48
std::vector< MirrorEntry * > MirrorEntryList
Definition: mirror_table.h:120
bool UnresolvedMirrorVrf(const VrfEntry *vrf, VrfMirrorEntryList &list)
static const int kInvalidId
Definition: db_table.h:64
std::string vrf_name_
Definition: mirror_table.h:103
bool DBEntrySandesh(Sandesh *sresp, std::string &name) const
void VrfNotify(DBTablePartBase *root, DBEntryBase *entry)
static const unsigned bufLen
Definition: mirror_table.h:118
std::unique_ptr< boost::asio::ip::udp::socket > udp_sock_
Definition: mirror_table.h:190
virtual bool Delete(DBEntry *entry, const DBRequest *request)
const std::string GetAnalyzerName() const
Definition: mirror_table.h:77
const std::string vrf_name() const
Definition: mirror_table.h:83
static DBTableBase * CreateTable(DB *db, const std::string &name)
void AddUnresolved(MirrorEntry *entry)
void set_mirror_index(uint32_t index)
Definition: mirror_table.h:93
uint16_t sport_
Definition: mirror_table.h:45
void UnRegisterBridgeRouteTableListener(const VrfEntry *entry, MirrorVrfState *state)
static MirrorTable * mirror_table_
Definition: mirror_table.h:191
DBTableBase::ListenerId vrf_listener_id_
Definition: mirror_table.h:195
virtual KeyPtr GetDBRequestKey() const
Definition: mirror_table.cc:36
virtual bool OnChange(DBEntry *entry, const DBRequest *req)
std::string analyzer_name_
Definition: mirror_table.h:16
void ResyncMirrorEntry(VrfMirrorEntryList &list, const VrfEntry *vrf)
IpAddress dip_
Definition: mirror_table.h:100
void Shutdown()
virtual void SetKey(const DBRequestKey *key)
Definition: mirror_table.cc:41
uint16_t nic_assisted_mirroring_vlan_
Definition: mirror_table.h:53
MirrorEntry * GetMirrorEntry(VrfEntry *vrf, const MacAddress &mac, VrfMirrorEntryList &list)
uint16_t dport_
Definition: mirror_table.h:101
MirrorEntryData(const std::string vrf_name, const IpAddress &sip, const uint16_t sport, const IpAddress &dip, const uint16_t dport, uint8_t mirror_flags, uint32_t vni, const MacAddress &mac, bool createdvrf)
Definition: mirror_table.h:28
std::string vrf_name_
Definition: mirror_table.h:43
boost::intrusive_ptr< NextHop > NextHopRef
Definition: agent.h:124
NextHopRef nh_
Definition: mirror_table.h:102