Line data Source code
1 : /*
2 : * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3 : * Copyright Contributors to the OpenSDN project
4 : */
5 :
6 : #ifndef multicast_agent_oper_hpp
7 : #define multicast_agent_oper_hpp
8 :
9 : #include <netinet/in.h>
10 : #include <net/ethernet.h>
11 : #include <cmn/agent_cmn.h>
12 : #include <cmn/agent.h>
13 : #include <oper/nexthop.h>
14 : #include <oper/vn.h>
15 : #include <oper/agent_route_walker.h>
16 :
17 : extern SandeshTraceBufferPtr MulticastTraceBuf;
18 :
19 : #define MCTRACE(obj, ...) \
20 : do { \
21 : Multicast##obj::TraceMsg(MulticastTraceBuf, __FILE__, __LINE__, __VA_ARGS__);\
22 : } while (false)
23 :
24 : #define IS_BCAST_MCAST(grp) ((grp.to_ulong() == 0xFFFFFFFF) || \
25 : ((grp.to_ulong() & 0xF0000000) == 0xE0000000))
26 : class BgpPeer;
27 :
28 : struct OlistTunnelEntry {
29 57 : OlistTunnelEntry(const boost::uuids::uuid &device_uuid,
30 : uint32_t label,
31 : const Ip4Address &addr,
32 57 : TunnelType::TypeBmap bmap) :
33 57 : device_uuid_(device_uuid),
34 57 : label_(label),
35 57 : daddr_(addr),
36 57 : tunnel_bmap_(bmap) { }
37 0 : virtual ~OlistTunnelEntry() { }
38 :
39 : boost::uuids::uuid device_uuid_;
40 : uint32_t label_;
41 : Ip4Address daddr_;
42 : TunnelType::TypeBmap tunnel_bmap_;
43 : };
44 :
45 : struct MulticastDBState : DBState {
46 66 : MulticastDBState(const std::string &vrf_name, const uint32_t vxlan_id) :
47 132 : vrf_name_(vrf_name), vxlan_id_(vxlan_id), learning_enabled_(false),
48 66 : pbb_etree_enabled_(false) { }
49 :
50 : std::string vrf_name_;
51 : uint32_t vxlan_id_;
52 : bool learning_enabled_;
53 : bool pbb_etree_enabled_;
54 : bool layer2_control_word_;
55 : };
56 :
57 : struct MulticastVrfDBState : DBState {
58 0 : MulticastVrfDBState() : vrf_name_() { }
59 :
60 : std::string vrf_name_;
61 : DBTableBase::ListenerId id_;
62 : };
63 :
64 : struct MulticastIntfDBState : DBState {
65 165 : MulticastIntfDBState() {}
66 : std::set<std::string> vrf_list_;
67 : };
68 :
69 : typedef std::vector<OlistTunnelEntry> TunnelOlist;
70 :
71 : class MulticastGroupObject {
72 : public:
73 : typedef DependencyList<MulticastGroupObject, MulticastGroupObject> MGList;
74 : MulticastGroupObject(const std::string &vrf_name,
75 : const Ip4Address &grp_addr,
76 : const std::string &vn_name) :
77 : vrf_name_(vrf_name), grp_address_(grp_addr), vn_name_(vn_name),
78 : vxlan_id_(0), peer_identifier_(0), deleted_(false), vn_(NULL),
79 : dependent_mg_(this, NULL) , pbb_vrf_(false), pbb_vrf_name_(""),
80 : peer_(NULL), fabric_label_(0), learning_enabled_(false),
81 : pbb_etree_enabled_(false), bridge_domain_(NULL),
82 : mvpn_registered_(false), vn_count_(0), evpn_igmp_flags_(0) {
83 : boost::system::error_code ec;
84 : src_address_ = IpAddress::from_string("0.0.0.0", ec).to_v4();
85 : local_olist_.clear();
86 : };
87 69 : MulticastGroupObject(const std::string &vrf_name,
88 : const std::string &vn_name,
89 : const Ip4Address &grp_addr,
90 69 : const Ip4Address &src_addr) :
91 69 : vrf_name_(vrf_name), grp_address_(grp_addr), vn_name_(vn_name),
92 69 : src_address_(src_addr), vxlan_id_(0), peer_identifier_(0),
93 69 : deleted_(false), vn_(NULL), dependent_mg_(this, NULL),
94 69 : pbb_vrf_(false), pbb_vrf_name_(""),
95 69 : peer_(NULL), fabric_label_(0), learning_enabled_(false),
96 69 : pbb_etree_enabled_(false), bridge_domain_(NULL),
97 276 : mvpn_registered_(false), vn_count_(0), evpn_igmp_flags_(0) {
98 69 : local_olist_.clear();
99 69 : };
100 138 : virtual ~MulticastGroupObject() { };
101 :
102 : bool CanBeDeleted() const;
103 :
104 : //Add local member is local VM in server.
105 973 : bool AddLocalMember(const boost::uuids::uuid &intf_uuid,
106 : const MacAddress &mac) {
107 973 : local_olist_[intf_uuid] = mac;
108 973 : return true;
109 : };
110 :
111 : //Delete local member from VM list in server
112 165 : bool DeleteLocalMember(const boost::uuids::uuid &intf_uuid) {
113 165 : if (local_olist_.find(intf_uuid) == local_olist_.end()) {
114 0 : return false;
115 : }
116 165 : local_olist_.erase(intf_uuid);
117 165 : return true;
118 : };
119 :
120 : // Get list of local VMs.
121 0 : const std::map<boost::uuids::uuid, MacAddress> &GetLocalList() {
122 0 : return local_olist_;
123 : }
124 :
125 330 : uint32_t GetLocalListSize() { return local_olist_.size(); };
126 : void ClearLocalListSize() { local_olist_.clear(); };
127 :
128 : //Labels for server + server list + ingress source label
129 : void FlushAllPeerInfo(const Agent *agent,
130 : const Peer *peer,
131 : uint64_t peer_identifier);
132 :
133 : //Gets
134 5911 : const std::string &vrf_name() const { return vrf_name_; };
135 4913 : const Ip4Address &GetGroupAddress() { return grp_address_; };
136 2425 : const Ip4Address &GetSourceAddress() { return src_address_; };
137 : ComponentNHKeyList GetInterfaceComponentNHKeyList(uint8_t interface_flags);
138 1100 : const std::string &GetVnName() { return vn_name_; };
139 165 : bool IsDeleted() { return deleted_; };
140 : void Deleted(bool val) { deleted_ = val; };
141 : bool CanUnsubscribe() const {return (deleted_);}
142 70 : void set_vxlan_id(uint32_t vxlan_id) {vxlan_id_ = vxlan_id;}
143 1100 : uint32_t vxlan_id() const {return vxlan_id_;}
144 0 : void set_peer_identifier(uint64_t peer_id) {peer_identifier_ = peer_id;}
145 0 : uint64_t peer_identifier() {return peer_identifier_;}
146 : void set_vn(const VnEntry *vn);
147 : void reset_vn();
148 0 : void set_bridge_domain(const BridgeDomainEntry *bd) {
149 0 : bridge_domain_.reset(bd);
150 0 : }
151 :
152 0 : void reset_bridge_domain() {
153 0 : bridge_domain_.reset(NULL);
154 0 : }
155 :
156 2 : const VnEntry *vn() const {return vn_.get();}
157 :
158 0 : void set_pbb_vrf(bool is_pbb_vrf) {
159 0 : pbb_vrf_ = is_pbb_vrf;
160 0 : }
161 2675 : bool pbb_vrf() const {
162 2675 : return pbb_vrf_;
163 : }
164 :
165 0 : MGList::iterator mg_list_begin() {
166 0 : return mg_list_.begin();
167 : }
168 :
169 0 : MGList::iterator mg_list_end() {
170 0 : return mg_list_.end();
171 : }
172 :
173 0 : void set_dependent_mg(MulticastGroupObject *obj) {
174 0 : dependent_mg_.reset(obj);
175 0 : }
176 :
177 69 : MulticastGroupObject* dependent_mg() {
178 69 : return dependent_mg_.get();
179 : }
180 :
181 0 : void set_fabric_olist(const TunnelOlist &olist) {
182 0 : fabric_olist_ = olist;
183 0 : }
184 :
185 0 : const TunnelOlist& fabric_olist() const {
186 0 : return fabric_olist_;
187 : }
188 :
189 0 : void set_pbb_vrf_name(std::string name) {
190 0 : pbb_vrf_name_ = name;
191 0 : }
192 :
193 0 : const std::string& pbb_vrf_name() {
194 0 : return pbb_vrf_name_;
195 : }
196 :
197 0 : const Peer *peer() {
198 0 : return peer_;
199 : }
200 :
201 0 : void set_peer(const Peer *peer) {
202 0 : peer_ = peer;
203 0 : }
204 :
205 0 : uint32_t fabric_label() const {
206 0 : return fabric_label_;
207 : }
208 :
209 0 : void set_fabric_label(uint32_t label) {
210 0 : fabric_label_ = label;
211 0 : }
212 :
213 1301 : bool learning_enabled() const {
214 1301 : return learning_enabled_;
215 : }
216 :
217 0 : void set_learning_enabled(bool learning_enabled) {
218 0 : learning_enabled_ = learning_enabled;
219 0 : }
220 :
221 0 : bool pbb_etree_enabled() const {
222 0 : return pbb_etree_enabled_;
223 : }
224 :
225 0 : void set_pbb_etree_enabled(bool pbb_etree_enabled) {
226 0 : pbb_etree_enabled_ = pbb_etree_enabled;
227 0 : }
228 :
229 0 : bool mvpn_registered() const {
230 0 : return mvpn_registered_;
231 : }
232 :
233 0 : void set_mvpn_registered(bool mvpn_registered) {
234 0 : mvpn_registered_ = mvpn_registered;
235 0 : }
236 :
237 0 : void incr_vn_count() {
238 0 : vn_count_++;
239 0 : }
240 :
241 0 : void decr_vn_count() {
242 0 : vn_count_--;
243 0 : }
244 :
245 0 : uint32_t vn_count() {
246 0 : return vn_count_;
247 : }
248 :
249 0 : uint32_t evpn_igmp_flags() const {
250 0 : return evpn_igmp_flags_;
251 : }
252 :
253 0 : void set_evpn_igmp_flags(uint32_t evpn_igmp_flags) {
254 0 : evpn_igmp_flags_ = evpn_igmp_flags;
255 0 : }
256 :
257 : MulticastGroupObject* GetDependentMG(uint32_t isid);
258 : private:
259 : friend class MulticastHandler;
260 : std::string vrf_name_;
261 : Ip4Address grp_address_;
262 : std::string vn_name_;
263 : Ip4Address src_address_;
264 : uint32_t vxlan_id_;
265 : uint64_t peer_identifier_;
266 : bool deleted_;
267 : std::map<boost::uuids::uuid, MacAddress> local_olist_; /* UUID of local i/f
268 : and its MAC */
269 : VnEntryConstRef vn_;
270 :
271 : DependencyRef<MulticastGroupObject, MulticastGroupObject> dependent_mg_;
272 0 : DEPENDENCY_LIST(MulticastGroupObject, MulticastGroupObject, mg_list_);
273 :
274 : bool pbb_vrf_;
275 : std::string pbb_vrf_name_;
276 : TunnelOlist fabric_olist_;
277 : const Peer *peer_;
278 : uint32_t fabric_label_;
279 : bool learning_enabled_;
280 : bool pbb_etree_enabled_;
281 : bool layer2_control_word_;
282 : BridgeDomainConstRef bridge_domain_;
283 : bool mvpn_registered_;
284 : uint32_t vn_count_;
285 : uint32_t evpn_igmp_flags_;
286 : DISALLOW_COPY_AND_ASSIGN(MulticastGroupObject);
287 : };
288 :
289 : class MulticastTEWalker : public AgentRouteWalker {
290 : public:
291 : typedef DBTableWalker::WalkId RouteWalkerIdList[Agent::ROUTE_TABLE_MAX];
292 : MulticastTEWalker(const std::string &name, Agent *agent);
293 : virtual ~MulticastTEWalker();
294 :
295 : virtual bool RouteWalkNotify(DBTablePartBase *partition, DBEntryBase *e);
296 :
297 : private:
298 : DISALLOW_COPY_AND_ASSIGN(MulticastTEWalker);
299 : };
300 :
301 : struct AgentRouteData;
302 :
303 : /* Static class for handling multicast objects common functionalities */
304 : class MulticastHandler {
305 : public:
306 : static const uint32_t kMulticastTimeout = 5 * 60 * 1000;
307 : static const Ip4Address kBroadcast;
308 : typedef std::set<MulticastGroupObject *> MulticastGroupObjectList;
309 : typedef std::map<boost::uuids::uuid, MulticastGroupObjectList>
310 : VmMulticastGroupObjectList;
311 : typedef std::vector<std::string> ManagedPhysicalDevicesList;
312 :
313 : MulticastHandler(Agent *agent);
314 4 : virtual ~MulticastHandler() {
315 2 : assert(multicast_obj_list_.size() == 0);
316 4 : }
317 :
318 : MulticastGroupObject *CreateMulticastGroupObject(const string &vrf_name,
319 : const string &vn_name,
320 : const Ip4Address &src_addr,
321 : const Ip4Address &grp_addr,
322 : uint32_t vxlan_id);
323 :
324 : /* Called by XMPP to add ctrl node sent olist and label */
325 : void ModifyFabricMembers(const Peer *peer,
326 : const std::string &vrf_name,
327 : const Ip4Address &group,
328 : const Ip4Address &source,
329 : uint32_t source_label,
330 : const TunnelOlist &olist,
331 : uint64_t peer_identifier = 0);
332 : void ModifyEvpnMembers(const Peer *peer,
333 : const std::string &vrf_name,
334 : const Ip4Address &grp,
335 : const Ip4Address &src,
336 : const TunnelOlist &olist,
337 : uint32_t ethernet_tag,
338 : uint64_t peer_identifier = 0);
339 : /* Called as a result of XMPP message received with OLIST of
340 : * evpn endpoints with mpls or vxlan encap
341 : */
342 : void ModifyEvpnMembers(const Peer *peer,
343 : const std::string &vrf_name,
344 : const TunnelOlist &olist,
345 : uint32_t ethernet_tag,
346 : uint64_t peer_identifier = 0);
347 : void ModifyTorMembers(const Peer *peer,
348 : const std::string &vrf_name,
349 : const TunnelOlist &olist,
350 : uint32_t ethernet_tag,
351 : uint64_t peer_identifier = 0);
352 : void ModifyMvpnVrfRegistration(const Peer *peer,
353 : const std::string &vrf_name,
354 : const Ip4Address &group,
355 : const Ip4Address &source,
356 : uint64_t peer_identifier);
357 :
358 : //Registered for VN notification
359 : void ModifyVN(DBTablePartBase *partition, DBEntryBase *e);
360 : //Registered for VRF notification
361 : void ModifyVRF(DBTablePartBase *partition, DBEntryBase *e);
362 : void McastTableNotify(DBTablePartBase *partition, DBEntryBase *e);
363 : //Registered for VM notification
364 : void ModifyVmInterface(DBTablePartBase *partition, DBEntryBase *e);
365 : void NotifyPhysicalDevice(DBTablePartBase *partition, DBEntryBase *e);
366 : //Register VM and VN notification
367 : void Register();
368 :
369 : //Singleton object reference
370 19 : static MulticastHandler *GetInstance() {
371 19 : return obj_;
372 : };
373 : void TriggerLocalRouteChange(MulticastGroupObject *obj, const Peer *peer);
374 : void TriggerRemoteRouteChange(MulticastGroupObject *obj,
375 : const Peer *peer,
376 : const string &vrf_name,
377 : const Ip4Address &src,
378 : const Ip4Address &grp,
379 : const TunnelOlist &olist,
380 : uint64_t peer_identifier,
381 : bool delete_op,
382 : COMPOSITETYPE comp_type,
383 : uint32_t label,
384 : bool fabric,
385 : uint32_t ethernet_tag);
386 : void HandleIpam(const VnEntry *vn);
387 : void HandleVxLanChange(const VnEntry *vn);
388 : void HandleVnParametersChange(DBTablePartBase *partition,
389 : DBEntryBase *e);
390 : //For test routines to clear all routes and mpls label
391 : void Shutdown();
392 : //Multicast obj list addition deletion
393 : MulticastGroupObject *FindFloodGroupObject(const std::string &vrf_name);
394 : MulticastGroupObject *FindActiveGroupObject(const std::string &vrf_name,
395 : const Ip4Address &dip);
396 : MulticastGroupObject *FindActiveGroupObject(const std::string &vrf_name,
397 : const Ip4Address &sip,
398 : const Ip4Address &dip);
399 3945 : std::set<MulticastGroupObject *> &GetMulticastObjList() {
400 3945 : return multicast_obj_list_;
401 : };
402 : MulticastGroupObject *FindGroupObject(const std::string &vrf_name,
403 : const Ip4Address &sip,
404 : const Ip4Address &dip);
405 : ComponentNHKeyList GetInterfaceComponentNHKeyList(MulticastGroupObject *obj,
406 : uint8_t flags);
407 : void AddMulticastRoute(MulticastGroupObject *obj, const Peer *peer,
408 : uint32_t ethernet_tag,
409 : AgentRouteData *data,
410 : AgentRouteData *bridge_data);
411 : void DeleteMulticastRoute(const Peer *peer,
412 : const string &vrf_name,
413 : const Ip4Address &src_addr,
414 : const Ip4Address &grp_addr,
415 : uint32_t ethernet_tag,
416 : COMPOSITETYPE comp_type);
417 : bool FlushPeerInfo(uint64_t peer_sequence);
418 : void DeleteBroadcast(const Peer *peer,
419 : const std::string &vrf_name,
420 : uint32_t ethernet_tag,
421 : COMPOSITETYPE type);
422 : void DeleteMulticastObject(const std::string &vrf_name,
423 : const Ip4Address &src_addr,
424 : const Ip4Address &grp_addr);
425 :
426 : const Agent *agent() const {return agent_;}
427 : void Terminate();
428 : void AddBridgeDomain(DBTablePartBase *paritition,
429 : DBEntryBase *e);
430 0 : const ManagedPhysicalDevicesList &physical_devices() const {
431 0 : return physical_devices_;
432 : }
433 :
434 : void AddLocalPeerRoute(MulticastGroupObject *sg_object);
435 : void DeleteLocalPeerRoute(MulticastGroupObject *sg_object);
436 : void CreateMulticastVrfSourceGroup(const std::string &vrf_name,
437 : const std::string &vn_name,
438 : const Ip4Address &src_addr,
439 : const Ip4Address &grp_addr);
440 : void HandleRouteChangeAndMulticastObject(MulticastGroupObject *sg_object,
441 : boost::uuids::uuid vm_itf_uuid);
442 : void DeleteMulticastVrfSourceGroup(const std::string &vrf_name,
443 : const Ip4Address &src_addr,
444 : const Ip4Address &grp_addr);
445 : bool AddVmInterfaceToVrfSourceGroup(const std::string &vrf_name,
446 : const std::string &vn_name,
447 : const VmInterface *vm_itf,
448 : const Ip4Address &src_addr,
449 : const Ip4Address &grp_addr);
450 : void DeleteVmInterfaceFromVrfSourceGroup(const std::string &vrf_name,
451 : const VmInterface *vm_itf,
452 : const Ip4Address &src_addr,
453 : const Ip4Address &grp_addr);
454 : void DeleteVmInterfaceFromVrfSourceGroup(const std::string &vrf_name,
455 : const VmInterface *vm_itf,
456 : const Ip4Address &grp_addr = Ip4Address());
457 :
458 : void AddVmInterfaceToSourceGroup(const std::string &mvpn_vrf_name,
459 : const std::string &vn_name,
460 : const VmInterface *vm_itf,
461 : const Ip4Address &src_addr,
462 : const Ip4Address &grp_addr);
463 : void DeleteVmInterfaceFromSourceGroup(const std::string &mvpn_vrf_name,
464 : const VmInterface *vm_itf,
465 : const Ip4Address &src_addr,
466 : const Ip4Address &grp_addr);
467 : void DeleteVmInterfaceFromSourceGroup(const std::string &mvpn_vrf_name,
468 : const VmInterface *vm_itf,
469 : const Ip4Address &grp_addr);
470 : void DeleteVmInterfaceFromSourceGroup(const std::string &mvpn_vrf_name,
471 : const std::string &vm_vrf_name,
472 : const VmInterface *vm_itf);
473 :
474 : void SetEvpnMulticastSGFlags(const std::string &vrf_name,
475 : const Ip4Address &src_addr,
476 : const Ip4Address &grp_addr,
477 : uint32_t flags);
478 : uint32_t GetEvpnMulticastSGFlags(const std::string &vrf_name,
479 : const Ip4Address &src_addr,
480 : const Ip4Address &grp_addr);
481 :
482 : bool FilterVmi(const VmInterface *vmi);
483 :
484 0 : static void GetMulticastMacFromIp(const Ip4Address &ip, MacAddress &mac) {
485 0 : const Ip4Address::bytes_type &bytes_v4 = ip.to_bytes();
486 : MacAddress mac_address((unsigned int)0x01,
487 : (unsigned int)0x00,
488 : (unsigned int)0x5E,
489 0 : (unsigned int)(bytes_v4.at(1)&0x7F),
490 0 : (unsigned int)bytes_v4.at(2),
491 0 : (unsigned int)bytes_v4.at(3));
492 0 : mac = mac_address;
493 0 : }
494 :
495 : private:
496 : //operations on list of all objectas per group/source/vrf
497 69 : void AddToMulticastObjList(MulticastGroupObject *obj) {
498 69 : multicast_obj_list_.insert(obj);
499 69 : };
500 : //VM intf add-delete
501 : void DeleteVmInterface(const VmInterface *intf,
502 : const std::string &vrf_name);
503 : void DeleteVmInterface(const VmInterface *intf,
504 : MulticastIntfDBState *state);
505 : void AddVmInterfaceInFloodGroup(const VmInterface *vm_itf,
506 : MulticastIntfDBState *state);
507 : void AddVmInterfaceInFloodGroup(const VmInterface *vm_itf,
508 : const std::string &vrf_name);
509 : void Resync(MulticastGroupObject *obj);
510 : void DeleteEvpnPath(MulticastGroupObject *obj);
511 :
512 : //broadcast rt add /delete
513 : void AddL2BroadcastRoute(MulticastGroupObject *obj,
514 : const std::string &vrf_name,
515 : const std::string &vn_name,
516 : const Ip4Address &addr,
517 : uint32_t label,
518 : int vxlan_id,
519 : uint32_t ethernet_tag);
520 : void ChangeLearningMode(MulticastGroupObject *obj,
521 : bool learning_enabled);
522 : void ChangePbbEtreeMode(MulticastGroupObject *obj,
523 : bool pbb_etree_enabled);
524 :
525 : //VM itf to multicast ob
526 973 : void AddVmToMulticastObjMap(const boost::uuids::uuid &vm_itf_uuid,
527 : MulticastGroupObject *obj) {
528 :
529 973 : if (this->vm_to_mcobj_list_[vm_itf_uuid].find(obj) ==
530 1946 : this->vm_to_mcobj_list_[vm_itf_uuid].end()) {
531 165 : this->vm_to_mcobj_list_[vm_itf_uuid].insert(obj);
532 : }
533 973 : };
534 :
535 0 : bool FindVmToMulticastObjMap(const boost::uuids::uuid &vm_itf_uuid,
536 : MulticastGroupObjectList &objList) {
537 :
538 : VmMulticastGroupObjectList::iterator vmi_it =
539 0 : vm_to_mcobj_list_.find(vm_itf_uuid);
540 0 : if (vmi_it == vm_to_mcobj_list_.end()) {
541 0 : return false;
542 : }
543 :
544 0 : objList = this->vm_to_mcobj_list_[vm_itf_uuid];
545 0 : return true;
546 : }
547 :
548 165 : void DeleteVmToMulticastObjMap(const boost::uuids::uuid &vm_itf_uuid,
549 : const MulticastGroupObject *obj) {
550 : VmMulticastGroupObjectList::iterator vmi_it =
551 165 : vm_to_mcobj_list_.find(vm_itf_uuid);
552 165 : if (vmi_it == vm_to_mcobj_list_.end()) {
553 0 : return;
554 : }
555 :
556 165 : MulticastGroupObjectList::iterator mc_it = vmi_it->second.begin();
557 165 : for (;mc_it != vmi_it->second.end(); mc_it++) {
558 165 : if (*mc_it == obj) {
559 165 : vmi_it->second.erase(mc_it);
560 165 : break;
561 : }
562 : }
563 :
564 165 : if (vmi_it->second.size() == 0) {
565 165 : vm_to_mcobj_list_.erase(vmi_it);
566 : }
567 : };
568 :
569 : std::set<MulticastGroupObject *> &
570 165 : GetVmToMulticastObjMap(const boost::uuids::uuid &uuid)
571 : {
572 165 : return vm_to_mcobj_list_[uuid];
573 : };
574 :
575 : MulticastDBState*
576 : CreateBridgeDomainMG(DBTablePartBase *p, BridgeDomainEntry *bd);
577 : void ResyncDependentVrf(MulticastGroupObject *obj);
578 : void UpdateReference(MulticastGroupObject *obj);
579 : static MulticastHandler *obj_;
580 :
581 : Agent *agent_;
582 : std::map<std::string, std::vector<VnIpam> > vrf_ipam_mapping_;
583 : //VN uuid to VRF name mapping
584 : std::map<boost::uuids::uuid, string> vn_vrf_mapping_;
585 : //VM uuid <-> VN uuid
586 : //List of all multicast objects(VRF/G/S)
587 : MulticastGroupObjectList multicast_obj_list_;
588 : //Reference mapping of VM to participating multicast object list
589 : VmMulticastGroupObjectList vm_to_mcobj_list_;
590 :
591 : DBTable::ListenerId vn_listener_id_;
592 : DBTable::ListenerId vrf_listener_id_;
593 : DBTable::ListenerId interface_listener_id_;
594 : DBTable::ListenerId bridge_domain_id_;
595 : DBTable::ListenerId physical_device_listener_id_;
596 : ManagedPhysicalDevicesList physical_devices_;
597 : AgentRouteWalkerPtr te_walker_;
598 : DISALLOW_COPY_AND_ASSIGN(MulticastHandler);
599 : };
600 :
601 : #endif /* multicast_agent_oper_hpp */
|