示例#1
0
void CSwitchMgr::delSwitchByDpid(UINT8 dpid)
{
	LOG_INFO_FMT("before delete switch with dpid[0x%llx], switch map size[%lu] ...", 
		dpid, m_sws.size());

    m_rwlock.wlock();

	CSmartPtr<CSwitch> sw = getSwitchByDpid(dpid);
	if (sw.isNotNull())
	{
		sw->setState(SW_STATE_CLOSED);

		CControl::getInstance()->getTopoMgr().deleteSwitch(sw->getDpid());

		CHostMgr::getInstance()->delHostBySw(sw);

        delTagMap(sw->getTag());
		CControl::getInstance()->getTagMgr().release(sw->getTag());

		if (isValidMac(sw->getSwMac()))
		{
			delMacMap(sw->getSwMac());
			delIpMap(sw->getSwIp());
		}
		delDpidMap(sw->getDpid());
		delSwitchMap(sw->getSockfd());
	}

    m_rwlock.unlock();

	LOG_INFO_FMT("after delete switch with dpid[0x%llx], switch map size[%lu] ...", 
		dpid, m_sws.size());
}
示例#2
0
void COfConnectMgr::processPeerEnterUnreach(CSmartPtr<CSwitch>& sw, INT4 reason)
{
    if (sw.isNotNull() && (sw->getState() < SW_STATE_UNREACHABLE))
    {
        if (isValidMac(sw->getSwMac()))
        {
            sw->setState(SW_STATE_UNREACHABLE);

            //上报交换机事件ENTER_UNREACH
            CSwitchEventReportor::getInstance()->report(sw, EVENT_TYPE_SWITCH_ENTER_UNREACH, reason);

            //启动掉电检�?
            startPowerOffCheck(sw);
        }
        else
        {
            //seems mininet sws have all zero mac and same ip        
            processPeerQuit(sw, reason);
        }
    }
}
示例#3
0
void COfConnectMgr::processPeerDisconn(CSmartPtr<CSwitch>& sw)
{
    if (sw.isNotNull() && (sw->getState() < SW_STATE_DISCONNECTED))
    {
        if (isValidMac(sw->getSwMac()))
        {
            sw->setState(SW_STATE_DISCONNECTED);
            
            //上报交换机事件SWITCH_DISCONNECT
            CSwitchEventReportor::getInstance()->report(sw, EVENT_TYPE_SWITCH_DISCONNECT, EVENT_REASON_SWITCH_DISCONNECT);

            //启动掉电检�?
            startPowerOffCheck(sw);
        }
        else
        {
            //seems mininet sws have all zero mac and same ip
            processPeerQuit(sw, EVENT_REASON_SWITCH_DISCONNECT);
        }
    }
}
示例#4
0
void		Client::getMACAddress(void)
{
	bool	macIsSet = false;
	IP_ADAPTER_INFO AdapterInfo[16];
	DWORD dwBufLen = sizeof(AdapterInfo);
	DWORD dwStatus = GetAdaptersInfo(AdapterInfo, &dwBufLen);
	if (dwStatus == ERROR_SUCCESS)
	{
		PIP_ADAPTER_INFO pAdapterInfo = AdapterInfo;

		while (pAdapterInfo && !macIsSet)
		{
			if (isValidMac(pAdapterInfo))
			{
				m_MAC = addrToString(pAdapterInfo->Address);
				macIsSet = true;
			}
			pAdapterInfo = pAdapterInfo->Next;
		}
	}
}
示例#5
0
INT4 CSwitchMgr::addSwitch(INT4 sockfd, const INT1* mac, UINT4 ip, UINT2 port)
{
    CSmartPtr<CSwitch> sw;
    
    INT1 macStr[20] = {0};
    LOG_DEBUG_FMT("addSwitch with sockfd[%d]mac[%s]ip[%s]port[%u]", 
        sockfd, mac2str((UINT1*)mac, macStr), inet_htoa(ip), port);

    if (isValidMac(mac))
    {
        CSmartPtr<CSwitch> swOld = getSwitchByMac(mac);
        if (swOld.isNotNull())
        {
            LOG_DEBUG_FMT("getSwitchByMac[%s] returns sockfd[%d]mac[%s]ip[%s]port[%u]", 
                mac2str((UINT1*)mac, macStr), swOld->getSockfd(), 
                mac2str((UINT1*)swOld->getSwMac(), macStr), inet_htoa(swOld->getSwIp()), swOld->getSwPort());
            
            m_rwlock.wlock();
            delMacMap(mac);
            delIpMap(swOld->getSwIp());
            delDpidMap(swOld->getDpid());
            delTagMap(swOld->getTag());
            delSwitchMap(swOld->getSockfd());
            m_rwlock.unlock();

            switch_dupl_conn_t duplConn = {swOld->getSwIp(), swOld->getSwPort(), swOld->getSockfd(), swOld->getState()};

            sw = swOld;
            sw->setSockfd(sockfd);
            sw->setSwIp(ip);
            sw->setSwPort(port);
            sw->m_heartbeatTimes = 0;
            sw->m_heartbeatInterim = 0;

            COfConnectMgr::processPeerReconn(sw, duplConn);
        }
        else
        {
#ifdef USING_SWITCH_MEM_POOL
            CSwitch* swNew = allocSwitch();
            if (NULL == swNew)
            {
                LOG_ERROR_FMT("allocSwitch failed !");
                return BNC_ERR;
            }
            new(swNew) CSwitch(sockfd, mac, ip, port);
            sw = CSmartPtr<CSwitch>(swNew, deleteSwitch);
#else
            CSwitch* swNew = new CSwitch(sockfd, mac, ip, port);
            if (NULL == swNew)
            {
                LOG_ERROR_FMT("new CSwitch failed !");
                return BNC_ERR;
            }
            sw = CSmartPtr<CSwitch>(swNew);
#endif
            
            COfConnectMgr::processPeerConnect(sw);
        }

        sw->setState(SW_STATE_NEW_ACCEPT);

        m_rwlock.wlock();
        addSwitchMap(sockfd, sw);
        addMacMap(mac, sw);
        addIpMap(ip, sw);
        m_rwlock.unlock();
    }
    else
    {
        LOG_DEBUG_FMT("addSwitch with sockfd[%d]invalid mac[%s]ip[%s]port[%u]", 
            sockfd, mac2str((UINT1*)mac, macStr), inet_htoa(ip), port);

        //seems mininet sws have all zero mac and same ip
#ifdef USING_SWITCH_MEM_POOL
        CSwitch* swNew = allocSwitch();
        if (NULL == swNew)
        {
            LOG_ERROR_FMT("allocSwitch failed !");
            return BNC_ERR;
        }
        new(swNew) CSwitch(sockfd, mac, ip, port);
        sw = CSmartPtr<CSwitch>(swNew, deleteSwitch);
#else
        CSwitch* swNew = new CSwitch(sockfd, mac, ip, port);
        if (NULL == swNew)
        {
            LOG_ERROR_FMT("new CSwitch failed !");
            return BNC_ERR;
        }
        sw = CSmartPtr<CSwitch>(swNew);
#endif

        COfConnectMgr::processPeerConnect(sw);
        
        sw->setState(SW_STATE_NEW_ACCEPT);
        if (CConf::getInstance()->isMininet(ip))
            sw->setState(SW_STATE_STABLE);

        m_rwlock.wlock();
        addSwitchMap(sockfd, sw);
        m_rwlock.unlock();
    }

    if (OFPCR_ROLE_SLAVE != CClusterService::getInstance()->getControllerRole())
    {
        UINT4 tag = CControl::getInstance()->getTagMgr().alloc();
        if (CTagMgr::invalid_tag != tag)
        {
            sw->setTag(tag);
            addTagMap(tag, sw);
        }
    }

    return BNC_OK;
}