LCOV - code coverage report
Current view: top level - vnsw/agent/oper - multicast.h (source / functions) Hit Total Coverage
Test: OpenSDN C/C++ coverage (all TARGET_SET jobs) Lines: 71 157 45.2 %
Date: 2026-06-04 02:06:09 Functions: 28 63 44.4 %
Legend: Lines: hit not hit

          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          17 :     MulticastDBState(const std::string &vrf_name, const uint32_t vxlan_id) :
      46          34 :         vrf_name_(vrf_name), vxlan_id_(vxlan_id), learning_enabled_(false),
      47          17 :         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          25 :     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          20 :     MulticastGroupObject(const std::string &vrf_name,
      87             :                          const std::string &vn_name,
      88             :                          const Ip4Address &grp_addr,
      89          20 :                          const Ip4Address &src_addr) :
      90          20 :         vrf_name_(vrf_name), grp_address_(grp_addr), vn_name_(vn_name),
      91          20 :         src_address_(src_addr), vxlan_id_(0), peer_identifier_(0),
      92          20 :         deleted_(false), vn_(NULL), dependent_mg_(this, NULL),
      93          20 :         pbb_vrf_(false), pbb_vrf_name_(""),
      94          20 :         peer_(NULL), fabric_label_(0), learning_enabled_(false),
      95          20 :         pbb_etree_enabled_(false), bridge_domain_(NULL),
      96          80 :         mvpn_registered_(false), vn_count_(0), evpn_igmp_flags_(0) {
      97          20 :         local_olist_.clear();
      98          20 :     };
      99          40 :     virtual ~MulticastGroupObject() { };
     100             : 
     101             :     bool CanBeDeleted() const;
     102             : 
     103             :     //Add local member is local VM in server.
     104          39 :     bool AddLocalMember(const boost::uuids::uuid &intf_uuid,
     105             :                                     const MacAddress &mac) {
     106          39 :         local_olist_[intf_uuid] = mac;
     107          39 :         return true;
     108             :     };
     109             : 
     110             :     //Delete local member from VM list in server
     111          25 :     bool DeleteLocalMember(const boost::uuids::uuid &intf_uuid) {
     112          25 :         if (local_olist_.find(intf_uuid) == local_olist_.end()) {
     113           0 :             return false;
     114             :         }
     115          25 :         local_olist_.erase(intf_uuid);
     116          25 :         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          50 :     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         307 :     const std::string &vrf_name() const { return vrf_name_; };
     134         287 :     const Ip4Address &GetGroupAddress() { return grp_address_; };
     135         144 :     const Ip4Address &GetSourceAddress() { return src_address_; };
     136             :     ComponentNHKeyList GetInterfaceComponentNHKeyList(uint8_t interface_flags);
     137          49 :     const std::string &GetVnName() { return vn_name_; };
     138          25 :     bool IsDeleted() { return deleted_; };
     139             :     void Deleted(bool val) { deleted_ = val; };
     140             :     bool CanUnsubscribe() const {return (deleted_);}
     141          20 :     void set_vxlan_id(uint32_t vxlan_id) {vxlan_id_ = vxlan_id;}
     142          49 :     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         158 :     bool pbb_vrf() const {
     161         158 :         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          20 :     MulticastGroupObject* dependent_mg() {
     177          20 :         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          66 :     bool learning_enabled() const {
     213          66 :         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         304 :     std::set<MulticastGroupObject *> &GetMulticastObjList() {
     399         304 :         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          20 :     void AddToMulticastObjList(MulticastGroupObject *obj) {
     497          20 :         multicast_obj_list_.insert(obj);
     498          20 :     };
     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          39 :     void AddVmToMulticastObjMap(const boost::uuids::uuid &vm_itf_uuid,
     526             :                                 MulticastGroupObject *obj) {
     527             : 
     528          39 :         if (this->vm_to_mcobj_list_[vm_itf_uuid].find(obj) ==
     529          78 :                       this->vm_to_mcobj_list_[vm_itf_uuid].end()) {
     530          25 :             this->vm_to_mcobj_list_[vm_itf_uuid].insert(obj);
     531             :         }
     532          39 :     };
     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          25 :     void DeleteVmToMulticastObjMap(const boost::uuids::uuid &vm_itf_uuid,
     548             :                                    const MulticastGroupObject *obj) {
     549             :         VmMulticastGroupObjectList::iterator vmi_it =
     550          25 :             vm_to_mcobj_list_.find(vm_itf_uuid);
     551          25 :         if (vmi_it == vm_to_mcobj_list_.end()) {
     552           0 :             return;
     553             :         }
     554             : 
     555          25 :         MulticastGroupObjectList::iterator mc_it = vmi_it->second.begin();
     556          25 :         for (;mc_it != vmi_it->second.end(); mc_it++) {
     557          25 :             if (*mc_it == obj) {
     558          25 :                 vmi_it->second.erase(mc_it);
     559          25 :                 break;
     560             :             }
     561             :         }
     562             : 
     563          25 :         if (vmi_it->second.size() == 0) {
     564          25 :             vm_to_mcobj_list_.erase(vmi_it);
     565             :         }
     566             :     };
     567             : 
     568             :     std::set<MulticastGroupObject *> &
     569          25 :         GetVmToMulticastObjMap(const boost::uuids::uuid &uuid)
     570             :     {
     571          25 :         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 */

Generated by: LCOV version 1.14