OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
multicast_policy.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2018 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #include <algorithm>
6 #include <boost/uuid/uuid_io.hpp>
7 #include <base/parse_object.h>
8 #include <ifmap/ifmap_link.h>
9 #include <ifmap/ifmap_table.h>
10 #include <vnc_cfg_types.h>
11 
12 #include <cmn/agent_cmn.h>
13 #include <cfg/cfg_init.h>
14 #include <oper/config_manager.h>
15 #include <oper/multicast_policy.h>
16 
17 #include <oper/agent_sandesh.h>
18 
19 using namespace autogen;
20 using namespace std;
21 
23  MulticastPolicyTraceBuf(SandeshTraceBufferCreate("MulticastPolicy", 5000));
24 
26 
27 bool MulticastPolicyEntry::IsLess(const DBEntry &rhs) const {
28  const MulticastPolicyEntry &a =
29  static_cast<const MulticastPolicyEntry &>(rhs);
30  return (mp_uuid_ < a.mp_uuid_);
31 }
32 
34  std::stringstream uuidstring;
35  uuidstring << mp_uuid_;
36  return uuidstring.str();
37 }
38 
40  MulticastPolicyKey *key = new MulticastPolicyKey(mp_uuid_);
41  return DBEntryBase::KeyPtr(key);
42 }
43 
45  const MulticastPolicyKey *k = static_cast<const MulticastPolicyKey *>(key);
46  mp_uuid_ = k->mp_uuid_;
47 }
48 
50  IpAddress group) const {
51 
52  std::vector<SourceGroupInfo>::const_iterator it = mcast_sg_.begin();
53  while (it != mcast_sg_.end()) {
54  if ((it->source == source) && (it->group == group)) {
55  return it->action;
56  }
57  it++;
58  }
59 
61 }
62 
63 std::unique_ptr<DBEntry> MulticastPolicyTable::AllocEntry(const DBRequestKey *k)
64  const {
65 
66  const MulticastPolicyKey *key = static_cast<const MulticastPolicyKey *>(k);
68  return std::unique_ptr<DBEntry>(static_cast<DBEntry *>(mp));
69 }
70 
72  MulticastPolicyKey *key = static_cast<MulticastPolicyKey *>(req->key.get());
74  ChangeHandler(mp, req);
75  return mp;
76 }
77 
79  const DBRequest *req) {
80 
81  MulticastPolicyEntry *mp = static_cast<MulticastPolicyEntry *>(entry);
82  bool ret = ChangeHandler(mp, req);
83  return ret;
84 }
85 
87  std::vector<SourceGroupInfo> mcast_sg;
88  MulticastPolicyEntry *mp = static_cast<MulticastPolicyEntry *>(entry);
89  mp->set_mcast_sg(mcast_sg);
90  return true;
91 }
92 
94  const std::vector<SourceGroupInfo> &lhs,
95  const std::vector<SourceGroupInfo> &rhs) const {
96 
97  if (lhs.size() != rhs.size()) {
98  return false;
99  }
100 
101  vector<SourceGroupInfo>::const_iterator lit = lhs.begin();
102  vector<SourceGroupInfo>::const_iterator rit = rhs.begin();
103  while (lit != lhs.end() && rit != rhs.end()) {
104  if ((lit->source != rit->source) ||
105  (lit->group != rit->group) ||
106  (lit->action != rit->action)) {
107  return false;
108  }
109  ++lit;
110  ++rit;
111  }
112  return true;
113 }
114 
116  bool ret = false;
117  MulticastPolicyEntry *mp = static_cast<MulticastPolicyEntry *>(entry);
118  MulticastPolicyData *data = static_cast<MulticastPolicyData *>(req->data.get());
119 
120  if (!IsEqual(mp->mcast_sg(), data->mcast_sg_)) {
121  mp->set_mcast_sg(data->mcast_sg_);
122  ret = true;
123  }
124 
125  if (mp->name() != data->name_) {
126  mp->set_name(data->name_);
127  ret = true;
128  }
129 
130  return ret;
131 }
132 
134  const std::string &name) {
135  mp_table_ = new MulticastPolicyTable(db, name);
136  mp_table_->Init();
137  return mp_table_;
138 };
139 
141  boost::uuids::uuid &u) {
142  MulticastPolicy *cfg = static_cast<MulticastPolicy *>(node->GetObject());
143  assert(cfg);
144  autogen::IdPermsType id_perms = cfg->id_perms();
145  CfgUuidSet(id_perms.uuid.uuid_mslong, id_perms.uuid.uuid_lslong, u);
146  return true;
147 }
148 
150  const boost::uuids::uuid &u) {
151  MulticastPolicy *cfg = static_cast<MulticastPolicy *>(node->GetObject());
152  assert(cfg);
153 
154  assert(!u.is_nil());
155 
156  if ((req.oper == DBRequest::DB_ENTRY_DELETE) || node->IsDeleted()) {
158  req.key.reset(new MulticastPolicyKey(u));
159  agent()->mp_table()->Enqueue(&req);
160  return false;
161  }
162 
163  agent()->config_manager()->AddMulticastPolicyNode(node);
164  return false;
165 }
166 
168  const boost::uuids::uuid &u) {
169 
170  if (node->IsDeleted())
171  return false;
172 
173  MulticastPolicy *cfg = static_cast<MulticastPolicy *>(node->GetObject());
174  assert(cfg);
175 
177 
178  autogen::MulticastPolicy *data =
179  static_cast<autogen::MulticastPolicy *>(node->GetObject());
180 
181  autogen::IdPermsType id_perms = data->id_perms();
182 
183  std::vector<autogen::MulticastSourceGroup> cfg_sg_list =
184  data->multicast_source_groups();
185  std::vector<autogen::MulticastSourceGroup>::const_iterator it =
186  cfg_sg_list.begin();
187 
188  std::vector<SourceGroupInfo> sg_list;
189  SourceGroupInfo sg;
190  boost::system::error_code ec;
191  while (it != cfg_sg_list.end()) {
192  sg.source = IpAddress::from_string(it->source_address, ec);
193  sg.group = IpAddress::from_string(it->group_address, ec);
194  sg.action = (it->action == "pass") ?
197  sg_list.push_back(sg);
198  it++;
199  }
200 
201  MulticastPolicyKey *mp_key = new MulticastPolicyKey(u);
202  MulticastPolicyData *mp_data =
203  new MulticastPolicyData(agent(), node, node->name(), sg_list);
204 
205  req.key.reset(mp_key);
206  req.data.reset(mp_data);
207  agent()->mp_table()->Enqueue(&req);
208  return false;
209 }
210 
212  std::string &name) const {
213 
214  MulticastPolicyResp *resp = static_cast<MulticastPolicyResp *>(sresp);
215  std::string str_uuid = UuidToString(GetMpUuid());
216 
217  MulticastPolicySandeshData data;
218  std::vector<MulticastPolicyEntrySandeshData> entries;
219  std::vector<SourceGroupInfo>::const_iterator it =
220  mcast_sg_.begin();
221  uint32_t id = 0;
222  while (it != mcast_sg_.end()) {
223  MulticastPolicyEntrySandeshData entry;
224  entry.set_entry_id(id);
225  entry.set_source_address(it->source.to_string());
226  entry.set_group_address(it->group.to_string());
227  entry.set_action((it->action == SourceGroupInfo::ACTION_PASS) ?
228  "pass" : "deny");
229  entries.push_back(entry);
230  it++;
231  }
232  data.set_entries(entries);
233 
234  std::vector<MulticastPolicySandeshData> &list =
235  const_cast<std::vector<MulticastPolicySandeshData>&>
236  (resp->get_mp_list());
237  list.push_back(data);
238 
239  return true;
240 }
241 
242 void MulticastPolicyReq::HandleRequest() const {
243  AgentSandeshPtr sand(new AgentMulticastPolicySandesh(context(),
244  get_uuid()));
245  sand->DoSandesh(sand);
246 }
247 
249  const AgentSandeshArguments *args,
250  const std::string &context) {
251 
252  return AgentSandeshPtr(new AgentMulticastPolicySandesh(context,
253  args->GetString("uuid")));
254 }
virtual bool OperDBDelete(DBEntry *entry, const DBRequest *req)
virtual AgentSandeshPtr GetAgentSandesh(const AgentSandeshArguments *args, const std::string &context)
virtual bool IFNodeToUuid(IFMapNode *node, boost::uuids::uuid &u)
virtual bool IFNodeToReq(IFMapNode *node, DBRequest &req, const boost::uuids::uuid &u)
static void CfgUuidSet(uint64_t ms_long, uint64_t ls_long, boost::uuids::uuid &u)
Definition: agent_cmn.h:67
void set_mcast_sg(std::vector< SourceGroupInfo > &mcast_sg)
std::string GetString(const std::string &key) const
virtual bool OperDBOnChange(DBEntry *entry, const DBRequest *req)
void set_name(std::string &name)
bool DBEntrySandesh(Sandesh *sresp, std::string &name) const
std::vector< SourceGroupInfo > mcast_sg_
static MulticastPolicyTable * mp_table_
bool IsDeleted() const
Definition: db_entry.h:49
virtual void SetKey(const DBRequestKey *key)
boost::asio::ip::address IpAddress
Definition: address.h:13
std::unique_ptr< DBRequestData > data
Definition: db_table.h:49
bool ProcessConfig(IFMapNode *node, DBRequest &req, const boost::uuids::uuid &u)
boost::uuids::uuid uuid
const std::string & name() const
static std::string UuidToString(const boost::uuids::uuid &id)
Definition: string_util.h:138
bool ChangeHandler(DBEntry *entry, const DBRequest *req)
boost::shared_ptr< TraceBuffer< SandeshTrace > > SandeshTraceBufferPtr
Definition: sandesh_trace.h:18
std::unique_ptr< DBRequestKey > KeyPtr
Definition: db_entry.h:25
virtual string ToString() const
Definition: db.h:24
virtual KeyPtr GetDBRequestKey() const
std::unique_ptr< DBRequestKey > key
Definition: db_table.h:48
DBOperation oper
Definition: db_table.h:42
const std::vector< SourceGroupInfo > & mcast_sg() const
class boost::shared_ptr< AgentSandesh > AgentSandeshPtr
Definition: agent_db.h:18
bool IsEqual(const std::vector< SourceGroupInfo > &lhs, const std::vector< SourceGroupInfo > &rhs) const
const std::string & name() const
Definition: ifmap_node.h:48
virtual DBEntry * OperDBAdd(const DBRequest *req)
IFMapObject * GetObject()
Definition: ifmap_node.cc:63
static DBTableBase * CreateTable(DB *db, const std::string &name)
virtual std::unique_ptr< DBEntry > AllocEntry(const DBRequestKey *k) const
SandeshTraceBufferPtr MulticastPolicyTraceBuf(SandeshTraceBufferCreate("MulticastPolicy", 5000))
SourceGroupInfo::Action GetAction(IpAddress source, IpAddress group) const
virtual bool IsLess(const DBEntry &rhs) const
SandeshTraceBufferPtr SandeshTraceBufferCreate(const std::string &buf_name, size_t buf_size, bool trace_enable=true)
Definition: sandesh_trace.h:46