OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
bridge_domain.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2016 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #include <cmn/agent_cmn.h>
6 #include <vnc_cfg_types.h>
7 #include <agent_types.h>
8 #include <init/agent_param.h>
9 #include <cfg/cfg_init.h>
10 #include <ifmap/ifmap_node.h>
11 #include <cmn/agent_cmn.h>
13 #include <bgp_schema_types.h>
14 #include <oper/config_manager.h>
15 #include <oper/agent_sandesh.h>
16 #include <oper/vn.h>
17 #include <oper/vrf.h>
18 #include "oper/bridge_domain.h"
19 
21  const boost::uuids::uuid &id) :
22  AgentOperDBEntry(), table_(table), uuid_(id), isid_(0), bmac_vrf_name_(""),
23  learning_enabled_(false), pbb_etree_enabled_(false), layer2_control_word_(false) {
24 }
25 
26 bool BridgeDomainEntry::IsLess(const DBEntry &rhs) const {
27  const BridgeDomainEntry &bd =
28  static_cast<const BridgeDomainEntry &>(rhs);
29  return (uuid_ < bd.uuid_);
30 }
31 
32 std::string BridgeDomainEntry::ToString() const {
33  return UuidToString(uuid_);
34 }
35 
38  return DBEntryBase::KeyPtr(key);
39 }
40 
42  const BridgeDomainKey *k =
43  static_cast<const BridgeDomainKey *>(key);
44  uuid_ = k->uuid_;
45 }
46 
48  std::string &name) const {
49  BridgeDomainSandeshResp *resp =
50  static_cast<BridgeDomainSandeshResp *>(sresp);
51 
52  BridgeDomainSandeshData data;
53  data.set_uuid(UuidToString(uuid_));
54  data.set_name(name_);
55  data.set_isid(isid_);
56  if (vn_.get()) {
57  data.set_vn(UuidToString(vn_->GetUuid()));
58  }
59 
60  if (vrf_.get()) {
61  data.set_vrf(vrf_->GetName());
62  }
63 
64  if (learning_enabled_) {
65  data.set_learning_enabled("True");
66  } else {
67  data.set_learning_enabled("False");
68  }
69 
70  if (pbb_etree_enabled_) {
71  data.set_pbb_etree_enabled("True");
72  } else {
73  data.set_pbb_etree_enabled("False");
74  }
75 
76  std::vector<BridgeDomainSandeshData> &list =
77  const_cast<std::vector<BridgeDomainSandeshData>&>(resp->get_bd_list());
78  list.push_back(data);
79  return true;
80 }
81 
83  std::ostringstream str;
84  str << data->bmac_vrf_name_ << ":" << UuidToString(uuid_);
85 
87 
88  VrfKey key(str.str());
89  vrf_ = static_cast<VrfEntry *>(table_->agent()->
90  vrf_table()->Find(&key, true));
91  if (vrf_ && vrf_->IsDeleted()) {
92  vrf_ = NULL;
93  return;
94  }
95 
96  table_->agent()->vrf_table()->CreateVrf(str.str(), data->vn_uuid_,
98  data->bmac_vrf_name_,
99  data->mac_aging_time_,
100  data->learning_enabled_);
101 
102  vrf_ = static_cast<VrfEntry *>(table_->agent()->vrf_table()->
103  FindActiveEntry(&key));
104  assert(vrf_);
105 
106  vrf_->CreateTableLabel(data->learning_enabled_, true,
107  vn_->flood_unknown_unicast(),
108  vn_->layer2_control_word());
110  layer2_control_word_ = vn_->layer2_control_word();
111 }
112 
114  const BridgeDomainData *data) {
115  bool ret = false;
116  bool update_vrf = false;
117 
118  name_ = data->name_;
119  VnEntry *vn = table_->agent()->vn_table()->Find(data->vn_uuid_);
120  if (vn_ != vn) {
121  vn_ = vn;
122  update_vrf = true;
123  ret = true;
124  }
125 
126  if (isid_ != data->isid_) {
127  isid_ = data->isid_;
128  update_vrf = true;
129  ret = true;
130  }
131 
132  if (isid_ == 0) {
133  OPER_TRACE_ENTRY(BridgeDomain, table,
134  "Ignoring bridge-domain update with ISID 0",
136  return ret;
137  }
138 
139  if (mac_aging_time_ != data->mac_aging_time_) {
141  update_vrf = true;
142  ret = true;
143  }
144 
145  if (learning_enabled_ != data->learning_enabled_) {
147  update_vrf = true;
148  ret = true;
149  }
150 
151  if (vn && layer2_control_word_ != vn->layer2_control_word()) {
153  update_vrf = true;
154  ret = true;
155  }
156 
157  if (pbb_etree_enabled_ != data->pbb_etree_enabled_) {
159  ret = true;
160  }
161 
162  if (bmac_vrf_name_ != data->bmac_vrf_name_) {
164  update_vrf = true;
165  ret = true;
166  }
167 
168  if (vrf_ == NULL) {
169  update_vrf = true;
170  }
171 
172  if (vn_ && data->bmac_vrf_name_ != Agent::NullString() && update_vrf) {
173  OPER_TRACE_ENTRY(BridgeDomain, table, "Creating C-VRF",
175  UpdateVrf(data);
176  }
177 
178  return ret;
179 }
180 
182  BridgeDomainTable *table = static_cast<BridgeDomainTable *>(get_table());
183  OPER_TRACE_ENTRY(BridgeDomain, table, "Deleting bridge-domain",
185  if (vrf_.get()) {
186  table_->agent()->vrf_table()->DeleteVrf(vrf_->GetName(),
188  vrf_.reset();
189  }
190 }
191 
193  const std::string &name) :
194  AgentOperDBTable(db, name) {
195  set_agent(agent);
196 }
197 
199 }
200 
202  const std::string &name) {
203  BridgeDomainTable *table = new BridgeDomainTable(agent, db, name);
204  table->Init();
205  return table;
206 }
207 
208 std::unique_ptr<DBEntry>
210  const BridgeDomainKey *key = static_cast<const BridgeDomainKey *>(k);
211  BridgeDomainEntry *bd = new BridgeDomainEntry(this, key->uuid_);
212  return std::unique_ptr<DBEntry>(static_cast<DBEntry *>(bd));
213 }
214 
216  BridgeDomainKey *key = static_cast<BridgeDomainKey *>(req->key.get());
217  BridgeDomainData *data = static_cast<BridgeDomainData *>(req->data.get());
218  BridgeDomainEntry *bd = new BridgeDomainEntry(this, key->uuid_);
219  bd->Change(this, data);
220  return bd;
221 }
222 
224  BridgeDomainEntry *bd = static_cast<BridgeDomainEntry *>(entry);
225  BridgeDomainData *data = dynamic_cast<BridgeDomainData *>(req->data.get());
226  bool ret = bd->Change(this, data);
227  return ret;
228 }
229 
231  return OperDBOnChange(entry, req);
232 }
233 
235  BridgeDomainEntry *bd = static_cast<BridgeDomainEntry *>(entry);
236  bd->Delete();
237  return true;
238 }
239 
241  return new BridgeDomainKey(u);
242 }
243 
244 static void BuildVrfData (Agent *agent, IFMapNode *vn_node,
245  BridgeDomainData *data) {
246  IFMapAgentTable *table = static_cast<IFMapAgentTable *>(vn_node->table());
247  DBGraph *graph = table->GetGraph();
248 
249  for (DBGraphVertex::adjacency_iterator iter = vn_node->begin(graph);
250  iter != vn_node->end(table->GetGraph()); ++iter) {
251 
252  IFMapNode *adj_node = static_cast<IFMapNode *>(iter.operator->());
253  if (agent->config_manager()->SkipNode(adj_node)) {
254  continue;
255  }
256 
257  if (adj_node->table() == agent->cfg()->cfg_vrf_table()) {
258  autogen::RoutingInstance *vrf =
259  static_cast<autogen::RoutingInstance *>(adj_node->GetObject());
260  if(vrf->is_default()) {
261  data->bmac_vrf_name_ = adj_node->name();
262  }
263  }
264  }
265 }
266 
268  const autogen::BridgeDomain *bd) {
269  IFMapAgentTable *table = static_cast<IFMapAgentTable *>(node->table());
270  DBGraph *graph = table->GetGraph();
271  boost::uuids::uuid vn_uuid = boost::uuids::nil_uuid();
272  BridgeDomainData *bdd = new BridgeDomainData(agent, node);
273 
274  for (DBGraphVertex::adjacency_iterator iter = node->begin(graph);
275  iter != node->end(table->GetGraph()); ++iter) {
276 
277  IFMapNode *adj_node = static_cast<IFMapNode *>(iter.operator->());
278  if (agent->config_manager()->SkipNode(adj_node)) {
279  continue;
280  }
281 
282  if (adj_node->table() == agent->cfg()->cfg_vn_table()) {
283  autogen::VirtualNetwork *vn =
284  static_cast<autogen::VirtualNetwork *>(adj_node->GetObject());
285  autogen::IdPermsType id_perms = vn->id_perms();
286  CfgUuidSet(id_perms.uuid.uuid_mslong, id_perms.uuid.uuid_lslong,
287  vn_uuid);
288  bdd->pbb_etree_enabled_ = vn->pbb_etree_enable();
289  BuildVrfData(agent, adj_node, bdd);
290  }
291  }
292 
293  bdd->name_ = node->name();
294  bdd->isid_ = bd->isid();
295  bdd->vn_uuid_ = vn_uuid;
296  bdd->learning_enabled_ = bd->mac_learning_enabled();
297  bdd->mac_aging_time_ = bd->mac_aging_time();
298  return bdd;
299 }
300 
302  const boost::uuids::uuid &u) {
303  autogen::BridgeDomain *bd =
304  static_cast<autogen::BridgeDomain *>(node->GetObject());
305  assert(bd);
306 
307  assert(!u.is_nil());
308 
309  req.key.reset(BuildKey(u));
310  if ((req.oper == DBRequest::DB_ENTRY_DELETE) || node->IsDeleted()) {
312  return true;
313  }
314 
316  return false;
317 }
318 
320  const boost::uuids::uuid &u) {
321  autogen::BridgeDomain *bd =
322  static_cast <autogen::BridgeDomain *>(node->GetObject());
323  assert(bd);
324 
325  req.key.reset(BuildKey(u));
326  if (node->IsDeleted()) {
327  return false;
328  }
329 
331  req.data.reset(BuildData(agent(), node, bd));
332  return true;
333 }
334 
336  autogen::BridgeDomain *bd =
337  static_cast<autogen::BridgeDomain *>(node->GetObject());
338  autogen::IdPermsType id_perms = bd->id_perms();
339  CfgUuidSet(id_perms.uuid.uuid_mslong, id_perms.uuid.uuid_lslong, u);
340  return true;
341 }
342 
344  BridgeDomainKey key(u);
345  return static_cast<BridgeDomainEntry *>(FindActiveEntry(&key));
346 }
347 
350  const std::string &context) {
351  return AgentSandeshPtr(new BridgeDomainSandesh(context,
352  args->GetString("uuid"),
353  args->GetString("name")));
354 }
355 
356 void BridgeDomainSandeshReq::HandleRequest() const {
357  AgentSandeshPtr sand(new BridgeDomainSandesh(context(), get_uuid(),
358  get_name()));
359  sand->DoSandesh(sand);
360 }
std::string bmac_vrf_name_
Definition: bridge_domain.h:99
const VnEntry * vn() const
Definition: bridge_domain.h:57
uint32_t mac_aging_time_
Definition: bridge_domain.h:37
static void CfgUuidSet(uint64_t ms_long, uint64_t ls_long, boost::uuids::uuid &u)
Definition: agent_cmn.h:67
Definition: vrf.h:86
virtual std::unique_ptr< DBEntry > AllocEntry(const DBRequestKey *k) const
void CreateVrf(const string &name, const boost::uuids::uuid &vn_uuid, uint32_t flags)
Definition: vrf.cc:970
std::string GetString(const std::string &key) const
bool DBEntrySandesh(Sandesh *resp, std::string &name) const
DBTableBase * get_table() const
Definition: db_entry.cc:119
void DeleteVrf(const string &name, uint32_t flags=VrfData::ConfigVrf)
Definition: vrf.cc:987
bool IsDeleted() const
Definition: db_entry.h:49
virtual bool IFNodeToReq(IFMapNode *node, DBRequest &req, const boost::uuids::uuid &u)
ConfigManager * config_manager() const
Definition: agent.cc:889
Agent * agent() const
Definition: agent_db.h:213
std::unique_ptr< DBRequestData > data
Definition: db_table.h:49
std::string bmac_vrf_name_
Definition: bridge_domain.h:35
AgentDBEntry * FindActiveEntry(const DBEntry *key)
Definition: agent_db.cc:110
void AddBridgeDomainNode(IFMapNode *node)
boost::uuids::uuid uuid
VnTable * vn_table() const
Definition: agent.h:495
BridgeDomainEntry * Find(const boost::uuids::uuid &u)
virtual bool OperDBResync(DBEntry *entry, const DBRequest *req)
adjacency_iterator end(DBGraph *graph)
static std::string UuidToString(const boost::uuids::uuid &id)
Definition: string_util.h:138
virtual KeyPtr GetDBRequestKey() const
IFMapTable * table()
Definition: ifmap_node.h:29
virtual bool IFNodeToUuid(IFMapNode *node, boost::uuids::uuid &u)
std::unique_ptr< DBRequestKey > KeyPtr
Definition: db_entry.h:25
virtual void SetKey(const DBRequestKey *key)
virtual AgentSandeshPtr GetAgentSandesh(const AgentSandeshArguments *args, const std::string &context)
boost::uuids::uuid uuid_
Definition: bridge_domain.h:94
std::string name_
Definition: bridge_domain.h:95
BridgeDomainEntry(const BridgeDomainTable *table, const boost::uuids::uuid &id)
const DBGraph * GetGraph() const
Definition: db.h:24
void Init()
Definition: db_table.cc:387
virtual std::string ToString() const
virtual DBEntry * OperDBAdd(const DBRequest *req)
uint32_t mac_aging_time_
Definition: agent.h:358
Definition: vrf.h:22
std::unique_ptr< DBRequestKey > key
Definition: db_table.h:48
static BridgeDomainData * BuildData(Agent *agent, IFMapNode *node, const autogen::BridgeDomain *bd)
DBOperation oper
Definition: db_table.h:42
static const std::string & NullString()
Definition: agent.h:437
std::string name_
Definition: bridge_domain.h:31
#define OPER_TRACE_ENTRY(obj, table,...)
Definition: agent_db.h:234
static BridgeDomainKey * BuildKey(const boost::uuids::uuid &u)
class boost::shared_ptr< AgentSandesh > AgentSandeshPtr
Definition: agent_db.h:18
VnEntry * Find(const boost::uuids::uuid &vn_uuid)
Definition: vn.cc:759
const std::string & name() const
Definition: ifmap_node.h:48
const BridgeDomainTable * table_
Definition: bridge_domain.h:93
static DBTableBase * CreateTable(Agent *agent, DB *db, const std::string &name)
Definition: vn.h:151
VrfTable * vrf_table() const
Definition: agent.h:485
IFMapObject * GetObject()
Definition: ifmap_node.cc:63
boost::uuids::uuid vn_uuid_
Definition: bridge_domain.h:32
virtual bool OperDBOnChange(DBEntry *entry, const DBRequest *req)
static void BuildVrfData(Agent *agent, IFMapNode *vn_node, BridgeDomainData *data)
IFMapAgentTable * cfg_vrf_table() const
Definition: cfg_init.h:29
boost::uuids::uuid uuid_
Definition: bridge_domain.h:21
bool layer2_control_word() const
Definition: vn.h:218
IFMapAgentTable * cfg_vn_table() const
Definition: cfg_init.h:26
void UpdateVrf(const BridgeDomainData *data)
virtual bool IsLess(const DBEntry &rhs) const
BridgeDomainTable(Agent *agent, DB *db, const std::string &name)
AgentConfig * cfg() const
Definition: agent.cc:865
virtual bool OperDBDelete(DBEntry *entry, const DBRequest *req)
bool SkipNode(IFMapNode *node)
bool Change(const BridgeDomainTable *table, const BridgeDomainData *data)
adjacency_iterator begin(DBGraph *graph)
virtual ~BridgeDomainTable()
void set_agent(Agent *agent)
Definition: agent_db.h:212
bool ProcessConfig(IFMapNode *node, DBRequest &req, const boost::uuids::uuid &u)
VrfEntryRef vrf_
Definition: bridge_domain.h:98