?? mld6igmp_node.cc
字號(hào):
!= XORP_OK) { XLOG_ERROR("Cannot delete address %s from vif %s " "from the set of configured vifs: %s", cstring(addr), ifmgr_vif_name.c_str(), error_msg.c_str()); } if (add_config_vif_addr( ifmgr_vif_name, addr, subnet_addr, broadcast_addr, peer_addr, error_msg) != XORP_OK) { XLOG_ERROR("Cannot add address %s to vif %s from " "the set of configured vifs: %s", cstring(addr), ifmgr_vif_name.c_str(), error_msg.c_str()); } } } if (is_ipv6()) { IfMgrVifAtom::IPv6Map::const_iterator a6_iter; for (a6_iter = ifmgr_vif.ipv6addrs().begin(); a6_iter != ifmgr_vif.ipv6addrs().end(); ++a6_iter) { const IfMgrIPv6Atom& a6 = a6_iter->second; VifAddr* node_vif_addr = node_vif->find_address(IPvX(a6.addr())); IPvX addr(a6.addr()); IPvXNet subnet_addr(addr, a6.prefix_len()); IPvX broadcast_addr(IPvX::ZERO(family())); IPvX peer_addr(IPvX::ZERO(family())); if (a6.has_endpoint()) peer_addr = IPvX(a6.endpoint_addr()); if (node_vif_addr == NULL) { if (add_config_vif_addr( ifmgr_vif_name, addr, subnet_addr, broadcast_addr, peer_addr, error_msg) != XORP_OK) { XLOG_ERROR("Cannot add address %s to vif %s from " "the set of configured vifs: %s", cstring(addr), ifmgr_vif_name.c_str(), error_msg.c_str()); } continue; } if ((addr == node_vif_addr->addr()) && (subnet_addr == node_vif_addr->subnet_addr()) && (peer_addr == node_vif_addr->peer_addr())) { continue; // Nothing changed } // Update the address if (delete_config_vif_addr(ifmgr_vif_name, addr, error_msg) != XORP_OK) { XLOG_ERROR("Cannot delete address %s from vif %s " "from the set of configured vifs: %s", cstring(addr), ifmgr_vif_name.c_str(), error_msg.c_str()); } if (add_config_vif_addr( ifmgr_vif_name, addr, subnet_addr, broadcast_addr, peer_addr, error_msg) != XORP_OK) { XLOG_ERROR("Cannot add address %s to vif %s from " "the set of configured vifs: %s", cstring(addr), ifmgr_vif_name.c_str(), error_msg.c_str()); } } } // // Delete vif addresses that don't exist anymore // { list<IPvX> delete_addresses_list; list<VifAddr>::const_iterator vif_addr_iter; for (vif_addr_iter = node_vif->addr_list().begin(); vif_addr_iter != node_vif->addr_list().end(); ++vif_addr_iter) { const VifAddr& vif_addr = *vif_addr_iter; if (vif_addr.addr().is_ipv4() && (_iftree.find_addr(ifmgr_iface_name, ifmgr_vif_name, vif_addr.addr().get_ipv4())) == NULL) { delete_addresses_list.push_back(vif_addr.addr()); } if (vif_addr.addr().is_ipv6() && (_iftree.find_addr(ifmgr_iface_name, ifmgr_vif_name, vif_addr.addr().get_ipv6())) == NULL) { delete_addresses_list.push_back(vif_addr.addr()); } } // Delete the addresses list<IPvX>::iterator ipvx_iter; for (ipvx_iter = delete_addresses_list.begin(); ipvx_iter != delete_addresses_list.end(); ++ipvx_iter) { const IPvX& ipvx = *ipvx_iter; if (delete_config_vif_addr(ifmgr_vif_name, ipvx, error_msg) != XORP_OK) { XLOG_ERROR("Cannot delete address %s from vif %s from " "the set of configured vifs: %s", cstring(ipvx), ifmgr_vif_name.c_str(), error_msg.c_str()); } } } } } // // Remove vifs that don't exist anymore // list<string> delete_vifs_list; for (mld6igmp_vif_iter = configured_vifs().begin(); mld6igmp_vif_iter != configured_vifs().end(); ++mld6igmp_vif_iter) { Vif* node_vif = &mld6igmp_vif_iter->second;#if 0 if (node_vif->is_pim_register()) continue; // XXX: don't delete the PIM Register vif#endif if (_iftree.find_vif(node_vif->name(), node_vif->name()) == NULL) { // Add the vif to the list of old interfaces delete_vifs_list.push_back(node_vif->name()); } } // Delete the old vifs list<string>::iterator vif_name_iter; for (vif_name_iter = delete_vifs_list.begin(); vif_name_iter != delete_vifs_list.end(); ++vif_name_iter) { const string& vif_name = *vif_name_iter; if (delete_config_vif(vif_name, error_msg) != XORP_OK) { XLOG_ERROR("Cannot delete vif %s from the set of configured " "vifs: %s", vif_name.c_str(), error_msg.c_str()); } } // Done set_config_all_vifs_done(error_msg);}/** * Mld6igmpNode::add_vif: * @vif: Information about the new Mld6igmpVif to install. * @error_msg: The error message (if error). * * Install a new MLD/IGMP vif. * * Return value: %XORP_OK on success, otherwise %XORP_ERROR. **/intMld6igmpNode::add_vif(const Vif& vif, string& error_msg){ // // Create a new Mld6igmpVif // Mld6igmpVif *mld6igmp_vif = new Mld6igmpVif(*this, vif); if (ProtoNode<Mld6igmpVif>::add_vif(mld6igmp_vif) != XORP_OK) { // Cannot add this new vif error_msg = c_format("Cannot add vif %s: internal error", vif.name().c_str()); XLOG_ERROR("%s", error_msg.c_str()); delete mld6igmp_vif; return (XORP_ERROR); } // // Update and check the primary address // do { if (mld6igmp_vif->update_primary_address(error_msg) == XORP_OK) break; if (mld6igmp_vif->addr_ptr() == NULL) { // XXX: don't print an error if the vif has no addresses break; } if (mld6igmp_vif->is_loopback() || mld6igmp_vif->is_pim_register()) { // XXX: don't print an error if this is a loopback or register_vif break; } XLOG_ERROR("Error updating primary address for vif %s: %s", mld6igmp_vif->name().c_str(), error_msg.c_str()); return (XORP_ERROR); } while (false); XLOG_INFO("Interface added: %s", mld6igmp_vif->str().c_str()); return (XORP_OK);}/** * Mld6igmpNode::add_vif: * @vif_name: The name of the new vif. * @vif_index: The vif index of the new vif. * @error_msg: The error message (if error). * * Install a new MLD/IGMP vif. If the vif exists, nothing is installed. * * Return value: %XORP_OK on success, otherwise %XORP_ERROR. **/intMld6igmpNode::add_vif(const string& vif_name, uint32_t vif_index, string& error_msg){ Mld6igmpVif *mld6igmp_vif = vif_find_by_vif_index(vif_index); if ((mld6igmp_vif != NULL) && (mld6igmp_vif->name() == vif_name)) { return (XORP_OK); // Already have this vif } // // Create a new Vif // Vif vif(vif_name); vif.set_vif_index(vif_index); if (add_vif(vif, error_msg) != XORP_OK) { return (XORP_ERROR); } return (XORP_OK);}/** * Mld6igmpNode::delete_vif: * @vif_name: The name of the vif to delete. * @error_msg: The error message (if error). * * Delete an existing MLD/IGMP vif. * * Return value: %XORP_OK on success, otherwise %XORP_ERROR. **/intMld6igmpNode::delete_vif(const string& vif_name, string& error_msg){ Mld6igmpVif *mld6igmp_vif = vif_find_by_name(vif_name); if (mld6igmp_vif == NULL) { error_msg = c_format("Cannot delete vif %s: no such vif", vif_name.c_str()); XLOG_ERROR("%s", error_msg.c_str()); return (XORP_ERROR); } if (ProtoNode<Mld6igmpVif>::delete_vif(mld6igmp_vif) != XORP_OK) { error_msg = c_format("Cannot delete vif %s: internal error", vif_name.c_str()); XLOG_ERROR("%s", error_msg.c_str()); delete mld6igmp_vif; return (XORP_ERROR); } delete mld6igmp_vif; XLOG_INFO("Interface deleted: %s", vif_name.c_str()); return (XORP_OK);}intMld6igmpNode::set_vif_flags(const string& vif_name, bool is_pim_register, bool is_p2p, bool is_loopback, bool is_multicast, bool is_broadcast, bool is_up, uint32_t mtu, string& error_msg){ bool is_changed = false; Mld6igmpVif *mld6igmp_vif = vif_find_by_name(vif_name); if (mld6igmp_vif == NULL) { error_msg = c_format("Cannot set flags vif %s: no such vif", vif_name.c_str()); XLOG_ERROR("%s", error_msg.c_str()); return (XORP_ERROR); } if (mld6igmp_vif->is_pim_register() != is_pim_register) { mld6igmp_vif->set_pim_register(is_pim_register); is_changed = true; } if (mld6igmp_vif->is_p2p() != is_p2p) { mld6igmp_vif->set_p2p(is_p2p); is_changed = true; } if (mld6igmp_vif->is_loopback() != is_loopback) { mld6igmp_vif->set_loopback(is_loopback); is_changed = true; } if (mld6igmp_vif->is_multicast_capable() != is_multicast) { mld6igmp_vif->set_multicast_capable(is_multicast); is_changed = true; } if (mld6igmp_vif->is_broadcast_capable() != is_broadcast) { mld6igmp_vif->set_broadcast_capable(is_broadcast); is_changed = true; } if (mld6igmp_vif->is_underlying_vif_up() != is_up) { mld6igmp_vif->set_underlying_vif_up(is_up); is_changed = true; } if (mld6igmp_vif->mtu() != mtu) { mld6igmp_vif->set_mtu(mtu); is_changed = true; } if (is_changed) XLOG_INFO("Interface flags changed: %s", mld6igmp_vif->str().c_str()); return (XORP_OK);}intMld6igmpNode::add_vif_addr(const string& vif_name, const IPvX& addr, const IPvXNet& subnet_addr, const IPvX& broadcast_addr, const IPvX& peer_addr, string& error_msg){ Mld6igmpVif *mld6igmp_vif = vif_find_by_name(vif_name); if (mld6igmp_vif == NULL) { error_msg = c_format("Cannot add address on vif %s: no such vif", vif_name.c_str()); XLOG_ERROR("%s", error_msg.c_str()); return (XORP_ERROR); } const VifAddr vif_addr(addr, subnet_addr, broadcast_addr, peer_addr); // // Check the arguments // if (! addr.is_unicast()) { error_msg = c_format("Cannot add address on vif %s: " "invalid unicast address: %s", vif_name.c_str(), addr.str().c_str()); XLOG_ERROR("%s", error_msg.c_str()); return (XORP_ERROR); } if ((addr.af() != family()) || (subnet_addr.af() != family()) || (broadcast_addr.af() != family()) || (peer_addr.af() != family())) { error_msg = c_format("Cannot add address on vif %s: " "invalid address family: %s ", vif_name.c_str(), vif_addr.str().c_str()); XLOG_ERROR("%s", error_msg.c_str()); return (XORP_ERROR); } VifAddr* node_vif_addr = mld6igmp_vif->find_address(addr); if ((node_vif_addr != NULL) && (*node_vif_addr == vif_addr)) return (XORP_OK); // Already have this address // // TODO: If an interface changes its primary IP address, then // we should do something about it. // // However, by adding or updating an existing address we cannot // change a valid primary address, hence we do nothing here. // if (node_vif_addr != NULL) { // Update the address XLOG_INFO("Updated existing address on vif %s: old is %s new is %s", mld6igmp_vif->name().c_str(), node_vif_addr->str().c_str(), vif_addr.str().c_str()); *node_vif_addr = vif_addr; } else { // Add a new address mld6igmp_vif->add_address(vif_addr); XLOG_INFO("Added new address to vif %s: %s", mld6igmp_vif->name().c_str(), vif_addr.str().c_str()); } // // Update and check the primary address // do { if (mld6igmp_vif->update_primary_address(error_msg) == XORP_OK) break; if (! (mld6igmp_vif->is_up() || mld6igmp_vif->is_pending_up())) { // XXX: print an error only if the interface is UP or PENDING_UP break; } if (mld6igmp_vif->is_loopback() || mld6igmp_vif->is_pim_register()) { // XXX: don't print an error if this is a loopback or register_vif break; } XLOG_ERROR("Error updating primary address for vif %s: %s", mld6igmp_vif->name().c_str(), error_msg.c_str()); return (XORP_ERROR); } while (false); return (XORP_OK);}intMld6igmpNode::delete_vif_addr(const string& vif_name, const IPvX& addr, string& error_msg){ Mld6igmpVif *mld6igmp_vif = vif_find_by_name(vif_name); if (mld6igmp_vif == NULL) { error_msg = c_format("Cannot delete address on vif %s: no such vif", vif_name.c_str()); XLOG_ERROR("%s", error_msg.c_str()); return (XORP_ERROR); } const VifAddr *tmp_vif_addr = mld6igmp_vif->find_address(addr); if (tmp_vif_addr == NULL) { error_msg = c_format("Cannot delete address on vif %s: " "invalid address %s", vif_name.c_str(), addr.str().c_str()); XLOG_ERROR("%s", error_msg.c_str()); return (XORP_ERROR); } VifAddr vif_addr = *tmp_vif_addr; // Get a copy // // Get the vif's old primary address and whether the vif is UP // bool old_vif_is_up = mld6igmp_vif->is_up() || mld6igmp_vif->is_pending_up(); IPvX old_primary_addr = mld6igmp_vif->primary_addr(); // // If an interface's primary address is deleted, first stop the vif. // if (old_vif_is_up) { if (mld6igmp_vif->primary_addr() == addr) { string dummy_error_msg; mld6igmp_vif->stop(dummy_error_msg); } } if (mld6igmp_vif->delete_address(addr) != XORP_OK) { XLOG_UNREACHABLE(); return (XORP_ERROR); } XLOG_INFO("Deleted address on interface %s: %s", mld6igmp_vif->name().c_str(), vif_addr.str().c_str()); // // Update and check the primary address. // If the vif has no primary address, then stop it. // If the vif's primary address was changed, then restart the vif. // do { string dummy_error_msg; if (mld6igmp_vif->update_primary_address(error_msg) != XORP_OK) { XLOG_ERROR("Error updating primary address for vif %s: %s", mld6igmp_vif->name().c_str(), error_msg.c_str()); } if (mld6igmp_vif->primary_addr().is_zero()) { mld6igmp_vif->stop(dummy_error_msg); break; } if (old_primary_addr == mld6igmp_vif->primary_addr()) break; // Nothing changed // Conditionally restart the interface mld6igmp_vif->stop(dummy_error_msg); if (old_vif_is_up) mld6igmp_vif->start(dummy_error_msg); break; } while (false); return (XORP_OK);}/** * Mld6igmpNode::enable_vif: * @vif_name: The name of the vif to enable. * @error_msg: The error message (if error). * * Enable an existing MLD6IGMP vif. * * Return value: %XORP_OK on success, otherwise %XORP_ERROR. **/intMld6igmpNode::enable_vif(const string& vif_name, string& error_msg){ Mld6igmpVif *mld6igmp_vif = vif_find_by_name(vif_name); if (mld6igmp_vif == NULL) { error_msg = c_format("Cannot enable vif %s: no such vif", vif_name.c_str()); XLOG_ERROR("%s", error_msg.c_str()); return (XORP_ERROR);
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -