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