⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mld6igmp_node.cc

📁 MLDv2 support igmpv3 lite
💻 CC
📖 第 1 页 / 共 3 页
字号:
			!= 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);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -