void VirtualPathSelection::createPeerLink(const wns::service::dll::UnicastAddress myself, const wns::service::dll::UnicastAddress peer, const Metric linkMetric) { if(useStaticPS) { if (wns::simulator::getEventScheduler()->getTime() > staticPSsnapshotTimeout) { return; } } assure(mapper.knows(myself), "myself (" << myself << ") is not a known address"); assure(mapper.knows(peer), "peer (" << peer << ") is not a known address"); assure(isMeshPoint(myself) , "myself (" << myself << ") is not a known MP"); assure(isMeshPoint(peer), "peer (" << peer << ") is not a known MP"); assure(linkMetric.isNotInf(), "createPeerLink with metric == inf"); if(isPortal(myself) && isPortal(peer)) { MESSAGE_SINGLE(NORMAL, logger, "createPeerLink: Ignore wireless link between " << myself << " and " << peer << ", both are portals"); } else { int myselfId = mapper.get(myself); int peerId = mapper.get(peer); assure(linkCosts[myselfId][peerId].isInf(), "createPeerLink with already known linkCosts"); Metric newLinkMetric = linkMetric; if(preKnowledgeCosts[myselfId][peerId].isNotInf()) { newLinkMetric = newLinkMetric * (1.0-preKnowledgeAlpha) + preKnowledgeCosts[myselfId][peerId] * preKnowledgeAlpha; MESSAGE_SINGLE(NORMAL, logger, "createPeerLink: " << myself << "->" << peer << " has preKnowledge of " << preKnowledgeCosts[myselfId][peerId] << ", " << linkMetric << "->" << newLinkMetric); } linkCosts[myselfId][peerId] = newLinkMetric; MESSAGE_SINGLE(NORMAL, logger, "createPeerLink: " << myself << " --> " << peer << " costs " << linkCosts[myselfId][peerId]); pathMatrixIsConsistent = false; onNewPathSelectionEntry(); } }