Пример #1
0
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();
	}
}