5 #include <boost/uuid/uuid_io.hpp>
30 #include <sandesh/sandesh_types.h>
31 #include <sandesh/sandesh_constants.h>
32 #include <sandesh/sandesh.h>
33 #include <sandesh/sandesh_trace.h>
36 using namespace boost::uuids;
38 #define INVALID_PEER_IDENTIFIER ControllerPeerPath::kInvalidPeerIdentifier
51 vn_listener_id_ = agent_->vn_table()->Register(
53 vrf_listener_id_ = agent_->vrf_table()->Register(
55 interface_listener_id_ = agent_->interface_table()->Register(
57 bridge_domain_id_ = agent_->bridge_domain_table()->Register(
60 if (agent_->tsn_no_forwarding_enabled()) {
61 physical_device_listener_id_ = agent_->physical_device_table()->
64 agent_->oper_db()->agent_route_walk_manager()->
65 RegisterWalker(static_cast<AgentRouteWalker *>(te_walker_.get()));
68 GetMulticastObjList().clear();
72 agent_->vn_table()->Unregister(vn_listener_id_);
73 agent_->interface_table()->Unregister(interface_listener_id_);
74 agent_->vrf_table()->Unregister(vrf_listener_id_);
75 agent_->bridge_domain_table()->Unregister(bridge_domain_id_);
77 agent_->physical_device_table()->
78 Unregister(physical_device_listener_id_);
80 if (te_walker_.get()) {
81 agent_->oper_db()->agent_route_walk_manager()->
82 ReleaseWalker(te_walker_.get());
88 const string &vrf_name,
89 const string &vn_name,
93 uint32_t ethernet_tag)
99 boost::system::error_code ec;
100 MCTRACE(Log,
"add L2 bcast route ", vrf_name, addr.to_string(), 0);
104 if (component_nh_key_list.size() == 0)
114 component_nh_key_list,
127 const std::string &vrf_name,
128 uint32_t ethernet_tag,
131 boost::system::error_code ec;
132 MCTRACE(Log,
"delete bcast route ", vrf_name,
"255.255.255.255", 0);
149 if (new_vxlan_id != obj->
vxlan_id()) {
150 boost::system::error_code ec;
151 Ip4Address broadcast = IpAddress::from_string(
"255.255.255.255",
163 bool deleted =
false;
174 uint32_t old_vxlan_id = state ? state->
vxlan_id_ : 0;
176 boost::system::error_code ec;
177 Ip4Address broadcast = IpAddress::from_string(
"255.255.255.255",
189 if (all_broadcast == NULL) {
190 all_broadcast = CreateMulticastGroupObject(state->
vrf_name_,
194 all_broadcast->
set_vn(vn);
196 if (old_vxlan_id != vn_vxlan_id) {
211 component_nh_key_list,
219 Ip4Address broadcast = IpAddress::from_string(
"255.255.255.255",
254 HandleVnParametersChange(partition, e);
271 sg_object = FindGroupObject(vrf->
GetName(), src, grp);
280 channel = agent_->controller_xmpp_channel(i);
299 target_object = FindGroupObject(agent_->fabric_policy_vrf_name(),
302 if (!target_object) {
306 std::map<uuid, MacAddress>::const_iterator it;
310 if (target_object->
AddLocalMember(it->first, it->second) ==
true) {
311 AddVmToMulticastObjMap(it->first, target_object);
315 DeleteVmToMulticastObjMap(it->first, target_object);
322 DeleteMulticastRoute(agent_->local_vm_peer(), target_object->
vrf_name(),
326 DeleteMulticastObject(target_object->
vrf_name(),
330 TriggerLocalRouteChange(target_object, agent_->local_vm_peer());
340 if (!agent_->params()->mvpn_ipv4_enable()) {
387 AddL2BroadcastRoute(obj, state->
vrf_name_,
394 obj->set_vxlan_id(bd->
isid());
413 DeleteBroadcast(agent_->local_vm_peer(),
422 state = CreateBridgeDomainMG(partition, bd);
456 bool learning_enabled) {
466 bool pbb_etree_enabled) {
476 if ((local_olist_.size() == 0) && (vn_.get() == NULL) &&
477 bridge_domain_.get() == NULL)
485 it != mg_list_.end(); it++) {
486 if (it->vxlan_id_ == isid) {
487 return it.operator->();
495 const string &vn_name,
501 AddToMulticastObjList(obj);
504 boost::system::error_code ec;
506 IpAddress::from_string(
"255.255.255.255", ec).to_v4();
508 UpdateReference(obj);
515 const std::vector<VnIpam> &ipam = vn->
GetVnIpam();
516 bool delete_ipam =
false;
517 std::map<uuid, string>::iterator it;
525 it = vn_vrf_mapping_.find(vn_uuid);
526 if (it != vn_vrf_mapping_.end()) {
527 vrf_name = it->second;
528 vrf_ipam_mapping_.erase(vrf_name);
530 vn_vrf_mapping_.erase(vn_uuid);
534 if (delete_ipam ==
false) {
536 vn_vrf_mapping_.insert(std::pair<uuid, string>(vn_uuid, vrf_name));
543 vrf_ipam_mapping_.insert(std::pair<
string, std::vector<VnIpam> >(vrf_name,
552 ManagedPhysicalDevicesList::iterator pd_it =
553 std::find(physical_devices_.begin(), physical_devices_.end(),
556 if (pd_it == physical_devices_.end())
558 physical_devices_.erase(pd_it);
560 if (pd_it != physical_devices_.end())
562 physical_devices_.push_back(dev_ip.to_string());
564 std::sort(physical_devices_.begin(), physical_devices_.end());
566 if (te_walker_.get()) {
567 te_walker_.get()->StartVrfWalk();
604 if (FilterVmi(vm_itf)) {
615 DeleteVmInterface(vm_itf, state);
623 assert(vm_itf->
vn() != NULL);
627 vm_itf->
SetState(partition->
parent(), interface_listener_id_, state);
631 AddVmInterfaceInFloodGroup(vm_itf, state);
637 std::set<std::string> new_vrf_list;
638 new_vrf_list.insert(vm_intf->
vrf()->
GetName());
641 VmInterface::BridgeDomainEntrySet::const_iterator it =
644 if (it->bridge_domain_.get() && it->bridge_domain_->vrf()) {
645 new_vrf_list.insert(it->bridge_domain_->vrf()->GetName());
650 for (std::set<std::string>::const_iterator it = new_vrf_list.begin();
651 it != new_vrf_list.end(); it++) {
652 AddVmInterfaceInFloodGroup(vm_intf, *it);
656 for (std::set<std::string>::const_iterator it = state->
vrf_list_.begin();
658 DeleteVmInterface(vm_intf, *it);
666 for (std::set<std::string>::const_iterator it = state->
vrf_list_.begin();
668 DeleteVmInterface(intf, *it);
679 const std::string &vrf_name) {
682 boost::system::error_code ec;
684 IpAddress::from_string(
"255.255.255.255", ec).to_v4();
685 std::set<MulticastGroupObject *> &obj_list = GetVmToMulticastObjMap(
687 for (std::set<MulticastGroupObject *>::iterator it = obj_list.begin();
688 it != obj_list.end(); it++) {
690 if (((*it)->vrf_name() != vrf_name) ||
691 ((*it)->GetGroupAddress() != bcast_addr)) {
700 if (((*it)->DeleteLocalMember(vm_itf->
GetUuid()) ==
true) &&
701 ((*it)->IsDeleted() ==
false) &&
702 ((*it)->GetLocalListSize() != 0)) {
703 TriggerLocalRouteChange(*it, agent_->local_vm_peer());
704 MCTRACE(LogSG,
"modify route, vm is deleted ", (*it)->vrf_name(),
705 (*it)->GetSourceAddress().to_string(),
706 (*it)->GetGroupAddress().to_string(), 0);
709 if((*it)->GetLocalListSize() == 0) {
710 MCTRACE(Info,
"Del route for multicast address",
713 DeleteBroadcast(agent_->local_vm_peer(),
717 DeleteMulticastObject((*it)->vrf_name_,
Ip4Address(), bcast_addr);
719 DeleteVmToMulticastObjMap(vm_itf->
GetUuid(), *it);
730 for (std::set<MulticastGroupObject *>::iterator it =
731 this->GetMulticastObjList().begin();
732 it != this->GetMulticastObjList().end(); it++) {
734 if (((*it)->vrf_name() == vrf_name) &&
735 ((*it)->GetGroupAddress() == grp_addr) &&
736 ((*it)->GetSourceAddress() == src_addr)) {
738 if (!((*it)->CanBeDeleted())) {
742 if ((*it)->dependent_mg() != NULL) {
753 MCTRACE(LogSG,
"delete obj vrf/source/grp/size ", vrf_name,
754 src_addr.to_string(),
755 grp_addr.to_string(),
756 this->GetMulticastObjList().size());
758 this->GetMulticastObjList().erase(it);
765 boost::system::error_code ec;
766 Ip4Address broadcast = IpAddress::from_string(
"255.255.255.255",
768 return (FindGroupObject(vrf_name,
Ip4Address(), broadcast));
773 const std::string &vrf_name,
776 for(std::set<MulticastGroupObject *>::iterator it =
777 this->GetMulticastObjList().begin();
778 it != this->GetMulticastObjList().end(); it++) {
779 if (((*it)->vrf_name() == vrf_name) &&
780 ((*it)->GetGroupAddress() == dip) &&
781 ((*it)->GetSourceAddress() == sip)) {
785 MCTRACE(LogSG,
"mcast obj size ", vrf_name, sip.to_string(),
786 dip.to_string(), this->GetMulticastObjList().size());
791 const std::string &vrf_name,
796 MCTRACE(LogSG,
"Multicast object deleted ", vrf_name,
797 sip.to_string(), dip.to_string(), 0);
816 for (std::map<uuid, MacAddress>::iterator it = local_olist_.begin();
817 it != local_olist_.end(); it++) {
821 component_nh_key_list.push_back(component_nh_key);
823 return component_nh_key_list;
828 uint8_t interface_flags) {
832 return component_nh_key_list;
855 boost::system::error_code ec;
857 IpAddress::from_string(
"255.255.255.255", ec).to_v4();
861 route_tunnel_bmap = agent_->params()->mvpn_ipv4_enable() ?
864 component_nh_key_list =
865 GetInterfaceComponentNHKeyList(obj, intf_flags);
867 MCTRACE(LogSG,
"enqueue route change with local peer",
871 component_nh_key_list.size());
877 comp_type, component_nh_key_list,
887 if (!agent_->params()->mvpn_ipv4_enable()) {
890 component_nh_key_list =
891 GetInterfaceComponentNHKeyList(obj, intf_flags);
900 comp_type,component_nh_key_list,
917 uint32_t ethernet_tag,
921 boost::system::error_code ec;
923 IpAddress::from_string(
"255.255.255.255", ec).to_v4();
930 if (!agent_->params()->mvpn_ipv4_enable()) {
935 ethernet_tag, bridge_data);
939 obj->
vrf_name(), ethernet_tag, data);
944 const string &vrf_name,
947 uint32_t ethernet_tag,
950 boost::system::error_code ec;
952 IpAddress::from_string(
"255.255.255.255", ec).to_v4();
954 if (grp != bcast_addr) {
956 src, grp, ethernet_tag, comp_type);
958 if (!agent_->params()->mvpn_ipv4_enable()) {
960 GetMulticastMacFromIp(grp, mac);
969 ethernet_tag, l2_comp_type);
979 const string &vrf_name,
983 uint64_t peer_identifier,
988 uint32_t ethernet_tag) {
1008 (peer_identifier <= obj_peer_identifier))
1013 MCTRACE(LogSG,
"delete bcast path from remote peer", vrf_name,
1014 src.to_string(), grp.to_string(), 0);
1015 DeleteMulticastRoute(peer, vrf_name, src, grp, ethernet_tag, comp_type);
1022 if ((peer_identifier < obj_peer_identifier) &&
1029 MCTRACE(LogSG,
"Invalid peer identifier sent for modification",
1030 vrf_name, src.to_string(), grp.to_string(), 0);
1038 for (TunnelOlist::const_iterator it = olist.begin();
1039 it != olist.end(); it++) {
1042 agent_->router_id(),
1049 req.
data.reset(tnh_data);
1050 agent_->nexthop_table()->Enqueue(&req);
1052 MCTRACE(Log,
"Enqueue add TOR TUNNEL ",
1053 agent_->fabric_vrf_name(),
1054 it->daddr_.to_string(), it->label_);
1057 agent_->fabric_vrf_name(),
1058 agent_->router_id(), it->daddr_,
1059 false, it->tunnel_bmap_));
1060 component_nh_key_list.push_back(component_key_ptr);
1061 route_tunnel_bmap = it->tunnel_bmap_;
1064 MCTRACE(LogSG,
"enqueue route change with remote peer",
1068 component_nh_key_list.size());
1074 DeleteMulticastRoute(peer, vrf_name, src, grp, ethernet_tag, comp_type);
1093 component_nh_key_list,
1102 component_nh_key_list,
1106 boost::system::error_code ec;
1108 IpAddress::from_string(
"255.255.255.255", ec).to_v4();
1109 if ((grp != bcast_addr) && !agent_->params()->mvpn_ipv4_enable()) {
1115 component_nh_key_list,
1120 obj->
vxlan_id(), route_tunnel_bmap,
1126 AddMulticastRoute(obj, peer, ethernet_tag, data, bridge_data);
1127 MCTRACE(LogSG,
"rebake subnet peer for subnet", vrf_name,
1133 const std::string &vrf_name) {
1137 boost::system::error_code ec;
1138 Ip4Address broadcast = IpAddress::from_string(
"255.255.255.255",
1140 bool add_route =
false;
1141 std::string vn_name = vn->
GetName();
1145 all_broadcast = this->FindGroupObject(vrf_name,
Ip4Address(), broadcast);
1146 if (all_broadcast == NULL) {
1147 all_broadcast = CreateMulticastGroupObject(vrf_name, vn->
GetName(),
1155 TriggerLocalRouteChange(all_broadcast, agent_->local_vm_peer());
1156 AddVmToMulticastObjMap(intf_uuid, all_broadcast);
1164 TriggerLocalRouteChange(all_broadcast, agent_->local_vm_peer());
1175 const std::string &vrf_name,
1180 uint64_t peer_identifier)
1182 boost::system::error_code ec;
1184 obj = FindActiveGroupObject(vrf_name, src, grp);
1185 MCTRACE(LogSG,
"XMPP call(edge replicate) multicast handler ", vrf_name,
1186 src.to_string(), grp.to_string(), label);
1188 bool delete_op =
false;
1194 }
else if (obj == NULL) {
1216 IpAddress::from_string(
"255.255.255.255", ec).to_v4();
1218 if (grp != bcast_addr) {
1222 TriggerRemoteRouteChange(obj, peer, vrf_name, src, grp, olist,
1224 delete_op, comp_type,
1235 TriggerRemoteRouteChange(mg, peer, iter->vrf_name(), src, grp,
1236 olist, peer_identifier,
1237 delete_op, comp_type,
1241 MCTRACE(LogSG,
"Add fabric grp label ", vrf_name, src.to_string(),
1242 grp.to_string(), label);
1246 const std::string &vrf_name,
1250 uint32_t ethernet_tag,
1251 uint64_t peer_identifier) {
1253 boost::system::error_code ec;
1256 MCTRACE(LogSG,
"XMPP call(EVPN) multicast handler ", vrf_name, src.to_string(),
1257 grp.to_string(), 0);
1259 bool delete_op =
false;
1262 }
else if (obj == NULL) {
1266 TriggerRemoteRouteChange(obj, peer, vrf_name, src, grp, olist,
1267 peer_identifier, delete_op,
1269 false, ethernet_tag);
1271 MCTRACE(LogSG,
"Add EVPN TOR Olist ", vrf_name, src.to_string(),
1272 grp.to_string(), 0);
1286 const std::string &vrf_name,
1288 uint32_t ethernet_tag,
1289 uint64_t peer_identifier)
1291 boost::system::error_code ec;
1292 Ip4Address grp = Ip4Address::from_string(
"255.255.255.255", ec);
1295 std::string derived_vrf_name = vrf_name;
1297 if (ethernet_tag && obj) {
1302 derived_vrf_name = obj->
vrf_name();
1306 MCTRACE(Log,
"XMPP call(EVPN) multicast handler ", derived_vrf_name,
1307 grp.to_string(), 0);
1309 bool delete_op =
false;
1312 }
else if (obj == NULL) {
1316 TriggerRemoteRouteChange(obj, peer, derived_vrf_name,
Ip4Address(), grp,
1319 MCTRACE(Log,
"Add EVPN TOR Olist ", derived_vrf_name, grp.to_string(), 0);
1323 const std::string &vrf_name,
1325 uint32_t ethernet_tag,
1326 uint64_t peer_identifier)
1328 boost::system::error_code ec;
1330 Ip4Address grp = Ip4Address::from_string(
"255.255.255.255", ec);
1333 MCTRACE(Log,
"TOR multicast handler ", vrf_name, grp.to_string(), 0);
1335 bool delete_op =
false;
1338 }
else if (obj == NULL) {
1342 TriggerRemoteRouteChange(obj, peer, vrf_name,
Ip4Address(), grp, olist,
1345 MCTRACE(Log,
"Add external TOR Olist ", vrf_name, grp.to_string(), 0);
1349 const std::string &vrf_name,
1352 uint64_t peer_identifier) {
1355 obj = FindGroupObject(vrf_name, src, grp);
1357 bool delete_op =
false;
1365 TriggerRemoteRouteChange(obj, peer, vrf_name, src, grp, olist,
1376 uint64_t peer_identifier) {
1377 if ((peer_identifier != peer_identifier_) ||
1379 boost::system::error_code ec;
1380 Ip4Address bcast_addr = IpAddress::from_string(
"255.255.255.255",
1382 if (GetGroupAddress() != bcast_addr) {
1384 vrf_name_, src_address_,
1390 MCTRACE(Log,
"Delete broadcast route", vrf_name_,
1391 grp_address_.to_string(), 0);
1398 vn_listener_id_(
DBTable::kInvalidId),
1399 interface_listener_id_(
DBTable::kInvalidId),
1400 physical_device_listener_id_(
DBTable::kInvalidId),
1401 physical_devices_() {
1409 for (std::set<MulticastGroupObject *>::iterator it =
1424 boost::system::error_code ec;
1425 Ip4Address bcast_addr = IpAddress::from_string(
"255.255.255.255",
1428 for (std::set<MulticastGroupObject *>::iterator it =
1451 if (route == NULL) {
1457 for(Route::PathList::iterator it = route->
GetPathList().begin();
1460 static_cast<const AgentPath *
>(it.operator->());
1462 (obj)->FlushAllPeerInfo(
agent_,
1473 std::set<MulticastGroupObject *>::iterator it =
1492 if (vrf && vrf->IsPbbVrf()) {
1514 if (dependent_mg && dependent_mg->
peer()) {
1538 if (bridge_route == NULL){
1542 for(Route::PathList::iterator it = bridge_route->
GetPathList().begin();
1545 static_cast<AgentPath *
>(it.operator->());
1558 uint32_t route_tunnel_bmap;
1567 component_nh_key_list, sg_object->
pbb_vrf(),
1584 component_nh_key_list, sg_object->
pbb_vrf(),
1588 sg_object->
vxlan_id(), bridge_data);
1621 const std::string &vrf_name,
1622 const std::string &vn_name,
1629 MCTRACE(LogSG,
"Add SG ", vrf_name, src_addr.to_string(),
1630 grp_addr.to_string(), 0);
1632 bool created =
false;
1635 if (sg_object == NULL) {
1637 src_addr, grp_addr, vrf->
vxlan_id());
1646 MCTRACE(LogSG,
"Add SG done ", vrf_name, src_addr.to_string(),
1647 grp_addr.to_string(), 0);
1672 MCTRACE(LogSG,
"modify route, vm is deleted for <S,G> ",
1710 const std::string &vrf_name,
1716 MCTRACE(LogSG,
"Delete SG ", vrf_name, src_addr.to_string(),
1717 grp_addr.to_string(), 0);
1724 std::map<uuid, MacAddress>::const_iterator it;
1725 it = sg_object->GetLocalList().begin();
1726 while (it != sg_object->GetLocalList().end()) {
1733 MCTRACE(LogSG,
"VMI delete notify done for <S,G> ", vrf_name,
1734 src_addr.to_string(), grp_addr.to_string(), 0);
1738 it = sg_object->GetLocalList().begin();
1744 MCTRACE(LogSG,
"Delete SG done ", vrf_name, src_addr.to_string(),
1745 grp_addr.to_string(), 0);
1753 const std::string &vrf_name,
1754 const std::string &vn_name,
1760 if (!vrf || vrf->
IsDeleted())
return false;
1762 MCTRACE(LogSG,
"VMI add notify ", vrf_name, src_addr.to_string(),
1763 grp_addr.to_string(), 0);
1768 bool created =
false;
1771 if (sg_object == NULL) {
1782 }
else if (created) {
1787 MCTRACE(LogSG,
"VMI add notify done ", vrf_name, src_addr.to_string(),
1788 grp_addr.to_string(), 0);
1796 const std::string &mc_vrf_name,
1797 const std::string &vn_name,
1805 MCTRACE(LogSG,
"VMI add notify ", mc_vrf_name, src_addr.to_string(),
1806 grp_addr.to_string(), 0);
1808 bool created =
false;
1810 vm_itf, src_addr, grp_addr);
1815 sg_object =
FindGroupObject(vm_itf->vrf()->GetName(), src_addr, grp_addr);
1819 vn_name, vm_itf, src_addr, grp_addr);
1823 if (mvpn_sg_object == NULL) {
1825 vn_name, src_addr, grp_addr, vrf->
vxlan_id());
1832 mvpn_sg_object->incr_vn_count();
1835 MCTRACE(LogSG,
"VMI add notify done ", mc_vrf_name, src_addr.to_string(),
1836 grp_addr.to_string(), 0);
1844 const std::string &vrf_name,
1856 MCTRACE(LogSG,
"VMI delete notify ", vrf_name, src_addr.to_string(),
1857 grp_addr.to_string(), 0);
1864 MCTRACE(LogSG,
"VMI delete notify done ", vrf_name, src_addr.to_string(),
1865 grp_addr.to_string(), 0);
1873 const std::string &mc_vrf_name,
1879 vm_itf, src_addr, grp_addr);
1889 const std::string &vrf_name,
1900 grp_addr.to_string(), 0);
1902 std::set<MulticastGroupObject *> sg_to_delete;
1903 boost::system::error_code ec;
1905 IpAddress::from_string(
"255.255.255.255", ec).to_v4();
1906 for(std::set<MulticastGroupObject *>::iterator sg_it = objList.begin();
1907 sg_it != objList.end(); sg_it++) {
1909 if ((*sg_it)->vrf_name() != vrf_name) {
1914 if ((grp_addr.is_unspecified() &&
1915 (*sg_it)->GetGroupAddress() == bcast_addr)) {
1920 if ((!grp_addr.is_unspecified() &&
1921 (*sg_it)->GetGroupAddress() != grp_addr)) {
1929 sg_to_delete.insert(*sg_it);
1932 for(std::set<MulticastGroupObject *>::iterator sg_it = sg_to_delete.begin();
1933 sg_it != sg_to_delete.end(); sg_it++) {
1937 MCTRACE(LogSG,
"VMI delete notify done ", vrf_name,
1939 grp_addr.to_string(), 0);
1948 const std::string &mc_vrf_name,
1960 const std::string &mc_vrf_name,
1961 const std::string &vm_vrf_name,
1971 const std::string &vrf_name,
1987 const std::string &vrf_name,
2007 (partition->
parent()))->agent();
2009 bool notify =
false;
2010 for(Route::PathList::iterator it = bridge_route->
GetPathList().begin();
2032 static_cast<CompositeNH *>(path->
original_nh().get()),
2038 partition->
Notify(bridge_route);
void DeleteVmInterface(const VmInterface *intf, const std::string &vrf_name)
MulticastHandler * multicast() const
NextHopRef original_nh() const
void AddVmInterfaceToSourceGroup(const std::string &mvpn_vrf_name, const std::string &vn_name, const VmInterface *vm_itf, const Ip4Address &src_addr, const Ip4Address &grp_addr)
std::set< std::string > vrf_list_
BridgeDomainEntrySet list_
bool layer2_control_word_
bool layer2_control_word() const
void ModifyMvpnVrfRegistration(const Peer *peer, const std::string &vrf_name, const Ip4Address &group, const Ip4Address &source, uint64_t peer_identifier)
uint32_t GetLocalListSize()
void TriggerLocalRouteChange(MulticastGroupObject *obj, const Peer *peer)
const VnEntry * vn() const
const MacAddress & vm_mac() const
bool ChangeNH(Agent *agent, NextHop *nh)
static MulticastHandler * obj_
MulticastGroupObject * FindGroupObject(const std::string &vrf_name, const Ip4Address &sip, const Ip4Address &dip)
TsnElector * tsn_elector() const
const std::string & vrf_name() const
void ChangePbbEtreeMode(MulticastGroupObject *obj, bool pbb_etree_enabled)
void set_learning_enabled(bool learning_enabled)
void DeleteBridgeRoute(const AgentRoute *rt)
DBState * GetState(DBTableBase *tbl_base, ListenerId listener) const
MulticastDBState * CreateBridgeDomainMG(DBTablePartBase *p, BridgeDomainEntry *bd)
const boost::uuids::uuid & GetUuid() const
VrfEntry * FindVrfFromName(const string &name)
static AgentRouteData * BuildBgpPeerData(const Peer *peer, const string &vrf_name, const std::string &vn_name, uint32_t label, int vxlan_id, uint32_t ethernet_tag, uint32_t tunnel_type, Composite::Type type, ComponentNHKeyList &component_nh_key_list, bool pbb_nh, bool learning_enabled)
bool FlushPeerInfo(uint64_t peer_sequence)
static void DeleteBroadcastReq(const Peer *peer, const std::string &vrf_name, uint32_t ethernet_tag, COMPOSITETYPE type)
#define INVALID_PEER_IDENTIFIER
uint32_t fabric_label() const
Agent supports multiple route tables - Inet-unicast (IPv4/IPv6), Inet-multicast, bridge, EVPN (Type2/Type5). This base class contains common code for all types of route tables.
void set_pbb_etree_enabled(bool pbb_etree_enabled)
const Ip4Address & dest_ip_addr() const
void AddVmToMulticastObjMap(const boost::uuids::uuid &vm_itf_uuid, MulticastGroupObject *obj)
VmInterface::DeviceType device_type() const
const Ip4Address & GetSourceAddress()
std::set< MulticastGroupObject * > MulticastGroupObjectList
void ModifyTorMembers(const Peer *peer, const std::string &vrf_name, const TunnelOlist &olist, uint32_t ethernet_tag, uint64_t peer_identifier=0)
void SetState(DBTableBase *tbl_base, ListenerId listener, DBState *state)
SandeshTraceBufferPtr MulticastTraceBuf
bool CanBeDeleted() const
boost::asio::ip::address IpAddress
void HandleVnParametersChange(DBTablePartBase *partition, DBEntryBase *e)
ComponentNHKeyList GetInterfaceComponentNHKeyList(MulticastGroupObject *obj, uint8_t flags)
std::unique_ptr< DBRequestData > data
AgentRouteWalkerPtr te_walker_
static const uint64_t kInvalidPeerIdentifier
AgentDBEntry * FindActiveEntry(const DBEntry *key)
void set_pbb_vrf_name(std::string name)
void CreateMulticastVrfSourceGroup(const std::string &vrf_name, const std::string &vn_name, const Ip4Address &src_addr, const Ip4Address &grp_addr)
void AddL2BroadcastRoute(MulticastGroupObject *obj, const std::string &vrf_name, const std::string &vn_name, const Ip4Address &addr, uint32_t label, int vxlan_id, uint32_t ethernet_tag)
void AddMulticastRoute(MulticastGroupObject *obj, const Peer *peer, uint32_t ethernet_tag, AgentRouteData *data, AgentRouteData *bridge_data)
void DeleteVmInterfaceFromVrfSourceGroup(const std::string &vrf_name, const VmInterface *vm_itf, const Ip4Address &src_addr, const Ip4Address &grp_addr)
boost::shared_ptr< const ComponentNHKey > ComponentNHKeyPtr
bool pbb_etree_enabled() const
const string & GetName() const
static void GetMulticastMacFromIp(const Ip4Address &ip, MacAddress &mac)
MulticastGroupObject * FindFloodGroupObject(const std::string &vrf_name)
void SetEvpnMulticastSGFlags(const std::string &vrf_name, const Ip4Address &src_addr, const Ip4Address &grp_addr, uint32_t flags)
boost::shared_ptr< TraceBuffer< SandeshTrace > > SandeshTraceBufferPtr
void Resync(MulticastGroupObject *obj)
MulticastTEWalker(const std::string &name, Agent *agent)
DBTableBase::ListenerId id_
const VrfEntry * vrf() const
bool learning_enabled() const
Base class for all Route entries in agent.
void DeleteMulticastVrfSourceGroup(const std::string &vrf_name, const Ip4Address &src_addr, const Ip4Address &grp_addr)
MulticastGroupObjectList multicast_obj_list_
const IpAddress & ip() const
void Unregister(ListenerId listener)
bool pbb_etree_enabled() const
std::vector< ComponentNHKeyPtr > ComponentNHKeyList
Inet4MulticastRouteEntry * FindRoute(const Ip4Address &grp_addr, const Ip4Address &src_addr)
MulticastGroupObject * FindActiveGroupObject(const std::string &vrf_name, const Ip4Address &dip)
void AddBridgeRoute(const AgentRoute *rt)
ListenerId Register(ChangeCallback callback, const std::string &name="unspecified")
const Type GetType() const
NextHop * nexthop() const
bool mvpn_ipv4_enable() const
bool AddLocalMember(const boost::uuids::uuid &intf_uuid, const MacAddress &mac)
virtual Agent::RouteTableType GetTableType() const =0
bool tsn_no_forwarding_enabled() const
bool AddVmInterfaceToVrfSourceGroup(const std::string &vrf_name, const std::string &vn_name, const VmInterface *vm_itf, const Ip4Address &src_addr, const Ip4Address &grp_addr)
BridgeRouteEntry * FindRoute(const MacAddress &mac)
void set_peer_identifier(uint64_t peer_id)
virtual bool ReComputePathAdd(AgentPath *path)
void AddLocalPeerRoute(MulticastGroupObject *sg_object)
void NotifyPhysicalDevice(DBTablePartBase *partition, DBEntryBase *e)
uint32_t evpn_igmp_flags() const
bool DeleteLocalMember(const boost::uuids::uuid &intf_uuid)
void ModifyVmInterface(DBTablePartBase *partition, DBEntryBase *e)
void FlushAllPeerInfo(const Agent *agent, const Peer *peer, uint64_t peer_identifier)
std::unique_ptr< DBRequestKey > key
void set_dependent_mg(MulticastGroupObject *obj)
AgentRouteTable * GetBridgeRouteTable(const std::string &vrf_name)
static TypeBmap AllType()
const Peer * peer() const
static void DeleteMulticastRoute(const string &vrf_name, const Ip4Address &src_addr, const Ip4Address &grp_addr)
MGList::iterator mg_list_begin()
void ResyncDependentVrf(MulticastGroupObject *obj)
const Peer * local_peer() const
void DeleteVmToMulticastObjMap(const boost::uuids::uuid &vm_itf_uuid, const MulticastGroupObject *obj)
const std::vector< VnIpam > & GetVnIpam() const
static const MacAddress & BroadcastMac()
const VnEntry * vn() const
const Ip4Address & GetGroupAddress()
MulticastGroupObject * CreateMulticastGroupObject(const string &vrf_name, const string &vn_name, const Ip4Address &src_addr, const Ip4Address &grp_addr, uint32_t vxlan_id)
COMPOSITETYPE composite_nh_type() const
void DeleteMulticastRoute(const Peer *peer, const string &vrf_name, const Ip4Address &src_addr, const Ip4Address &grp_addr, uint32_t ethernet_tag, COMPOSITETYPE comp_type)
AgentParam * params() const
void set_vxlan_id(uint32_t vxlan_id)
const std::map< boost::uuids::uuid, MacAddress > & GetLocalList()
bool learning_enabled() const
void HandleVxLanChange(const VnEntry *vn)
void ClearState(DBTableBase *tbl_base, ListenerId listener)
void set_fabric_label(uint32_t label)
static Type ComputeType(TypeBmap bmap)
void set_vn(const VnEntry *vn)
boost::asio::ip::address_v4 Ip4Address
bool FilterVmi(const VmInterface *vmi)
ComponentNHKeyList GetInterfaceComponentNHKeyList(uint8_t interface_flags)
void DeleteEvpnPath(MulticastGroupObject *obj)
static const uint32_t kInvalidLabel
const BridgeDomainList & bridge_domain_list() const
VrfTable * vrf_table() const
void DeleteBroadcast(const Peer *peer, const std::string &vrf_name, uint32_t ethernet_tag, COMPOSITETYPE type)
const Ip4Address & primary_ip_addr() const
static void AddBridgeBroadcastRoute(const Peer *peer, const string &vrf_name, uint32_t ethernet_tag, AgentRouteData *data)
void McastTableNotify(DBTablePartBase *partition, DBEntryBase *e)
void HandleIpam(const VnEntry *vn)
uint32_t GetEvpnMulticastSGFlags(const std::string &vrf_name, const Ip4Address &src_addr, const Ip4Address &grp_addr)
void set_bridge_domain(const BridgeDomainEntry *bd)
void TriggerRemoteRouteChange(MulticastGroupObject *obj, const Peer *peer, const string &vrf_name, const Ip4Address &src, const Ip4Address &grp, const TunnelOlist &olist, uint64_t peer_identifier, bool delete_op, COMPOSITETYPE comp_type, uint32_t label, bool fabric, uint32_t ethernet_tag)
const TunnelOlist & fabric_olist() const
VrfEntry * GetVrf() const
const Peer * multicast_tree_builder_peer() const
void DeleteMulticastObject(const std::string &vrf_name, const Ip4Address &src_addr, const Ip4Address &grp_addr)
const std::string & GetVnName()
bool layer3_forwarding() const
VmInterface::VmiType vmi_type() const
uint32_t vxlan_id() const
MulticastHandler(Agent *agent)
void UpdateReference(MulticastGroupObject *obj)
void AddBridgeDomain(DBTablePartBase *paritition, DBEntryBase *e)
uint64_t peer_identifier()
static const int kInvalidId
void ModifyVN(DBTablePartBase *partition, DBEntryBase *e)
AgentRouteTable * GetInet4MulticastRouteTable(const std::string &vrf_name)
void set_mvpn_registered(bool mvpn_registered)
AgentRouteTable * GetRouteTable(uint8_t table_type) const
static void AddMulticastRoute(const string &vn_name, const string &vrf_name, const Ip4Address &src_addr, const Ip4Address &grp_addr, ComponentNHKeyList &component_nh_key_list)
uint32_t vxlan_id() const
const Peer * local_vm_peer() const
void ModifyFabricMembers(const Peer *peer, const std::string &vrf_name, const Ip4Address &group, const Ip4Address &source, uint32_t source_label, const TunnelOlist &olist, uint64_t peer_identifier=0)
std::set< MulticastGroupObject * > & GetMulticastObjList()
void AddVmInterfaceInFloodGroup(const VmInterface *vm_itf, MulticastIntfDBState *state)
const boost::uuids::uuid & GetUuid() const
const string & GetName() const
void reset_bridge_domain()
void DeleteLocalPeerRoute(MulticastGroupObject *sg_object)
static AgentRouteData * BuildNonBgpPeerData(const string &vrf_name, const std::string &vn_name, uint32_t label, int vxlan_id, uint32_t tunnel_type, Composite::Type type, ComponentNHKeyList &component_nh_key_list, bool pbb_nh, bool learning_enabled)
void Notify(DBEntryBase *entry)
void set_peer(const Peer *peer)
void HandleRouteChangeAndMulticastObject(MulticastGroupObject *sg_object, boost::uuids::uuid vm_itf_uuid)
void set_pbb_vrf(bool is_pbb_vrf)
MulticastGroupObject * GetDependentMG(uint32_t isid)
static const Ip4Address kBroadcast
void ChangeLearningMode(MulticastGroupObject *obj, bool learning_enabled)
virtual AgentPath * FindPath(const Peer *peer) const
void ModifyVRF(DBTablePartBase *partition, DBEntryBase *e)
std::vector< OlistTunnelEntry > TunnelOlist
bool FindVmToMulticastObjMap(const boost::uuids::uuid &vm_itf_uuid, MulticastGroupObjectList &objList)
void ModifyEvpnMembers(const Peer *peer, const std::string &vrf_name, const Ip4Address &grp, const Ip4Address &src, const TunnelOlist &olist, uint32_t ethernet_tag, uint64_t peer_identifier=0)
void set_evpn_igmp_flags(uint32_t evpn_igmp_flags)
static TypeBmap VxlanType()
MGList::iterator mg_list_end()
const std::string & pbb_vrf_name()
bool mvpn_registered() const
NextHop * UpdateNH(Agent *agent, CompositeNH *cnh, const TsnElector *te)
MulticastGroupObject * dependent_mg()
virtual bool RouteWalkNotify(DBTablePartBase *partition, DBEntryBase *e)
SandeshTraceBufferPtr SandeshTraceBufferCreate(const std::string &buf_name, size_t buf_size, bool trace_enable=true)
const PathList & GetPathList() const
virtual ~MulticastTEWalker()
void DeleteVmInterfaceFromSourceGroup(const std::string &mvpn_vrf_name, const VmInterface *vm_itf, const Ip4Address &src_addr, const Ip4Address &grp_addr)
void set_fabric_olist(const TunnelOlist &olist)
const std::string & fabric_policy_vrf_name() const
const Ip4Address & src_ip_addr() const