void Map::createFromCoordinateLsdb(Nlsr& nlsr) { for (CoordinateLsa lsa : nlsr.getLsdb().getCoordinateLsdb()) { addEntry(lsa.getOrigRouter()); } }
void RoutingTableCalculator::makeAdjMatrix(Nlsr& pnlsr, Map pMap) { std::list<AdjLsa> adjLsdb = pnlsr.getLsdb().getAdjLsdb(); for (std::list<AdjLsa>::iterator it = adjLsdb.begin(); it != adjLsdb.end() ; it++) { int32_t row = pMap.getMappingNoByRouterName((*it).getOrigRouter()); std::list<Adjacent> adl = (*it).getAdl().getAdjList(); for (std::list<Adjacent>::iterator itAdl = adl.begin(); itAdl != adl.end() ; itAdl++) { int32_t col = pMap.getMappingNoByRouterName((*itAdl).getName()); double cost = (*itAdl).getLinkCost(); if ((row >= 0 && row < static_cast<int32_t>(m_nRouters)) && (col >= 0 && col < static_cast<int32_t>(m_nRouters))) { adjMatrix[row][col] = cost; } } } // Links that do not have the same cost for both directions should have their // costs corrected: // // If the cost of one side of the link is 0, both sides of the link should have their cost // corrected to 0. // // Otherwise, both sides of the link should use the larger of the two costs. // for (size_t row = 0; row < m_nRouters; ++row) { for (size_t col = 0; col < m_nRouters; ++col) { double toCost = adjMatrix[row][col]; double fromCost = adjMatrix[col][row]; if (fromCost != toCost) { double correctedCost = 0.0; if (toCost != 0 && fromCost != 0) { // If both sides of the link are up, use the larger cost correctedCost = std::max(toCost, fromCost); } _LOG_WARN("Cost between [" << row << "][" << col << "] and [" << col << "][" << row << "] are not the same (" << toCost << " != " << fromCost << "). " << "Correcting to cost: " << correctedCost); adjMatrix[row][col] = correctedCost; adjMatrix[col][row] = correctedCost; } } } }
void Map::createFromAdjLsdb(Nlsr& pnlsr) { std::list<AdjLsa> adjLsdb = pnlsr.getLsdb().getAdjLsdb(); for (std::list<AdjLsa>::iterator it = adjLsdb.begin(); it != adjLsdb.end() ; it++) { addEntry((*it).getOrigRouter()); std::list<Adjacent> adl = (*it).getAdl().getAdjList(); for (std::list<Adjacent>::iterator itAdl = adl.begin(); itAdl != adl.end() ; itAdl++) { addEntry((*itAdl).getName()); } } }
void RoutingTable::calculateHypDryRoutingTable(Nlsr& nlsr) { Map map; map.createFromAdjLsdb(nlsr); map.writeLog(); size_t nRouters = map.getMapSize(); HyperbolicRoutingCalculator calculator(nRouters, true, nlsr.getConfParameter().getRouterPrefix()); calculator.calculatePaths(map, ndn::ref(*this), nlsr.getLsdb(), nlsr.getAdjacencyList()); }
void SyncLogicHandler::processRoutingUpdateFromSync(const ndn::Name& routerName, uint64_t seqNo, Nlsr& pnlsr) { ndn::Name rName = routerName; if (routerName != pnlsr.getConfParameter().getRouterPrefix()) { SequencingManager sm(seqNo); sm.writeLog(); _LOG_DEBUG(routerName); try { if (pnlsr.getLsdb().isNameLsaNew(rName.append("name"), sm.getNameLsaSeq())) { _LOG_DEBUG("Updated Name LSA. Need to fetch it"); ndn::Name interestName(pnlsr.getConfParameter().getLsaPrefix()); interestName.append(routerName); interestName.append("name"); interestName.appendNumber(sm.getNameLsaSeq()); pnlsr.getLsdb().expressInterest(interestName, pnlsr.getConfParameter().getInterestResendTime(), 0); } if (pnlsr.getLsdb().isAdjLsaNew(rName.append("adjacency"), sm.getAdjLsaSeq())) { _LOG_DEBUG("Updated Adj LSA. Need to fetch it"); ndn::Name interestName(pnlsr.getConfParameter().getLsaPrefix()); interestName.append(routerName); interestName.append("adjacency"); interestName.appendNumber(sm.getAdjLsaSeq()); pnlsr.getLsdb().expressInterest(interestName, pnlsr.getConfParameter().getInterestResendTime(), 0); } if (pnlsr.getLsdb().isCoordinateLsaNew(rName.append("coordinate"), sm.getCorLsaSeq())) { _LOG_DEBUG("Updated Cor LSA. Need to fetch it"); ndn::Name interestName(pnlsr.getConfParameter().getLsaPrefix()); interestName.append(routerName); interestName.append("coordinate"); interestName.appendNumber(sm.getCorLsaSeq()); pnlsr.getLsdb().expressInterest(interestName, pnlsr.getConfParameter().getInterestResendTime(), 0); } } catch (std::exception& e) { std::cerr << e.what() << std::endl; return; } } }
void RoutingTable::calculate(Nlsr& pnlsr) { pnlsr.getLsdb().writeCorLsdbLog(); pnlsr.getLsdb().writeNameLsdbLog(); pnlsr.getLsdb().writeAdjLsdbLog(); pnlsr.getNamePrefixTable().writeLog(); if (pnlsr.getIsRoutingTableCalculating() == false) { //setting routing table calculation pnlsr.setIsRoutingTableCalculating(true); bool isHrEnabled = pnlsr.getConfParameter().getHyperbolicState() == HYPERBOLIC_STATE_ON; if ((!isHrEnabled && pnlsr.getLsdb().doesLsaExist(pnlsr.getConfParameter().getRouterPrefix().toUri() + "/" + "adjacency", std::string("adjacency"))) || (isHrEnabled && pnlsr.getLsdb().doesLsaExist(pnlsr.getConfParameter().getRouterPrefix().toUri() + "/" + "coordinate", std::string("coordinate")))) { if (pnlsr.getIsBuildAdjLsaSheduled() != 1) { _LOG_TRACE("Clearing old routing table"); clearRoutingTable(); // for dry run options clearDryRoutingTable(); _LOG_DEBUG("Calculating routing table"); // calculate Link State routing if ((pnlsr.getConfParameter().getHyperbolicState() == HYPERBOLIC_STATE_OFF) || (pnlsr.getConfParameter().getHyperbolicState() == HYPERBOLIC_STATE_DRY_RUN)) { calculateLsRoutingTable(pnlsr); } //calculate hyperbolic routing if (pnlsr.getConfParameter().getHyperbolicState() == HYPERBOLIC_STATE_ON) { calculateHypRoutingTable(pnlsr); } //calculate dry hyperbolic routing if (pnlsr.getConfParameter().getHyperbolicState() == HYPERBOLIC_STATE_DRY_RUN) { calculateHypDryRoutingTable(pnlsr); } //need to update NPT here _LOG_DEBUG("Calling Update NPT With new Route"); pnlsr.getNamePrefixTable().updateWithNewRoute(); writeLog(pnlsr.getConfParameter().getHyperbolicState()); pnlsr.getNamePrefixTable().writeLog(); pnlsr.getFib().writeLog(); } else { _LOG_DEBUG("Adjacency building is scheduled, so" " routing table can not be calculated :("); } } else { _LOG_DEBUG("No Adj LSA of router itself," " so Routing table can not be calculated :("); clearRoutingTable(); clearDryRoutingTable(); // for dry run options // need to update NPT here _LOG_DEBUG("Calling Update NPT With new Route"); pnlsr.getNamePrefixTable().updateWithNewRoute(); writeLog(pnlsr.getConfParameter().getHyperbolicState()); pnlsr.getNamePrefixTable().writeLog(); pnlsr.getFib().writeLog(); //debugging purpose end } pnlsr.setIsRouteCalculationScheduled(false); //clear scheduled flag pnlsr.setIsRoutingTableCalculating(false); //unsetting routing table calculation } else { scheduleRoutingTableCalculation(pnlsr); } }