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-11-09 02:10:49 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             :  * 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 */

Generated by: LCOV version 1.14