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()); }
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); } } }
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); } } }
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; } } }
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; }