void NdnRtcNamespace::getSegmentationNumbers(const ndn::Name &prefix, PacketNumber &packetNumber, SegmentNumber &segmentNumber) { int p = -1; packetNumber = -1; segmentNumber = -1; if (isDeltaFramesPrefix(prefix)) { p = findComponent(prefix, NameComponentStreamFramesDelta); } else if (isKeyFramePrefix(prefix)) { p = findComponent(prefix, NameComponentStreamFramesKey); } if (p > 0) { if (p+1 < prefix.size()) { Name::Component packetNoComp = prefix.get(p+1); packetNumber = NdnRtcUtils::frameNumber(packetNoComp); } if (p+3 < prefix.size()) { Name::Component segmentNoComp = prefix.get(p+3); segmentNumber = NdnRtcUtils::segmentNumber(segmentNoComp); } } }
void HelloProtocol::processInterestTimedOut(const ndn::Interest& interest) { /* interest name: /<neighbor>/NLSR/INFO/<router> */ const ndn::Name interestName(interest.getName()); _LOG_DEBUG("Interest timed out for Name: " << interestName); if (interestName.get(-2).toUri() != INFO_COMPONENT) { return; } ndn::Name neighbor = interestName.getPrefix(-3); _LOG_DEBUG("Neighbor: " << neighbor); m_nlsr.getAdjacencyList().incrementTimedOutInterestCount(neighbor); Adjacent::Status status = m_nlsr.getAdjacencyList().getStatusOfNeighbor(neighbor); uint32_t infoIntTimedOutCount = m_nlsr.getAdjacencyList().getTimedOutInterestCount(neighbor); _LOG_DEBUG("Status: " << status); _LOG_DEBUG("Info Interest Timed out: " << infoIntTimedOutCount); if ((infoIntTimedOutCount < m_nlsr.getConfParameter().getInterestRetryNumber())) { /* interest name: /<neighbor>/NLSR/INFO/<router> */ ndn::Name interestName(neighbor); interestName.append(NLSR_COMPONENT); interestName.append(INFO_COMPONENT); interestName.append(m_nlsr.getConfParameter().getRouterPrefix().wireEncode()); expressInterest(interestName, m_nlsr.getConfParameter().getInterestResendTime()); } else if ((status == Adjacent::STATUS_ACTIVE) && (infoIntTimedOutCount == m_nlsr.getConfParameter().getInterestRetryNumber())) { m_nlsr.getAdjacencyList().setStatusOfNeighbor(neighbor, Adjacent::STATUS_INACTIVE); m_nlsr.getLsdb().scheduleAdjLsaBuild(); } }
void HelloProtocol::processInterest(const ndn::Name& name, const ndn::Interest& interest) { /* interest name: /<neighbor>/NLSR/INFO/<router> */ const ndn::Name interestName = interest.getName(); _LOG_DEBUG("Interest Received for Name: " << interestName); if (interestName.get(-2).toUri() != INFO_COMPONENT) { return; } ndn::Name neighbor; neighbor.wireDecode(interestName.get(-1).blockFromValue()); _LOG_DEBUG("Neighbor: " << neighbor); if (m_nlsr.getAdjacencyList().isNeighbor(neighbor)) { ndn::shared_ptr<ndn::Data> data = ndn::make_shared<ndn::Data>(); data->setName(ndn::Name(interest.getName()).appendVersion()); data->setFreshnessPeriod(ndn::time::seconds(10)); // 10 sec data->setContent(reinterpret_cast<const uint8_t*>(INFO_COMPONENT.c_str()), INFO_COMPONENT.size()); m_nlsr.getKeyChain().sign(*data, m_nlsr.getDefaultCertName()); _LOG_DEBUG("Sending out data for name: " << interest.getName()); m_nlsr.getNlsrFace().put(*data); Adjacent *adjacent = m_nlsr.getAdjacencyList().findAdjacent(neighbor); // If this neighbor was previously inactive, send our own hello interest, too if (adjacent->getStatus() == Adjacent::STATUS_INACTIVE) { // We can only do that if the neighbor currently has a face. if(adjacent->getFaceId() != 0){ /* interest name: /<neighbor>/NLSR/INFO/<router> */ ndn::Name interestName(neighbor); interestName.append(NLSR_COMPONENT); interestName.append(INFO_COMPONENT); interestName.append(m_nlsr.getConfParameter().getRouterPrefix().wireEncode()); expressInterest(interestName, m_nlsr.getConfParameter().getInterestResendTime()); } // If the originator of the Interest currently lacks a Face, we // need to give it one. else { registerPrefixes(adjacent->getName(), adjacent->getConnectingFaceUri(), adjacent->getLinkCost(), ndn::time::milliseconds::max()); } } } }
void HelloProtocol::processInterest(const ndn::Name& name, const ndn::Interest& interest) { /* interest name: /<neighbor>/NLSR/INFO/<router> */ const ndn::Name interestName = interest.getName(); _LOG_DEBUG("Interest Received for Name: " << interestName); if (interestName.get(-2).toUri() != INFO_COMPONENT) { return; } ndn::Name neighbor; neighbor.wireDecode(interestName.get(-1).blockFromValue()); _LOG_DEBUG("Neighbor: " << neighbor); if (m_nlsr.getAdjacencyList().isNeighbor(neighbor)) { ndn::shared_ptr<ndn::Data> data = ndn::make_shared<ndn::Data>(); data->setName(ndn::Name(interest.getName()).appendVersion()); data->setFreshnessPeriod(ndn::time::seconds(10)); // 10 sec data->setContent(reinterpret_cast<const uint8_t*>(INFO_COMPONENT.c_str()), INFO_COMPONENT.size()); m_nlsr.getKeyChain().sign(*data, m_nlsr.getDefaultCertName()); _LOG_DEBUG("Sending out data for name: " << interest.getName()); m_nlsr.getNlsrFace().put(*data); Adjacent *adjacent = m_nlsr.getAdjacencyList().findAdjacent(neighbor); if (adjacent->getStatus() == 0) { if(adjacent->getFaceId() != 0){ /* interest name: /<neighbor>/NLSR/INFO/<router> */ ndn::Name interestName(neighbor); interestName.append(NLSR_COMPONENT); interestName.append(INFO_COMPONENT); interestName.append(m_nlsr.getConfParameter().getRouterPrefix().wireEncode()); expressInterest(interestName, m_nlsr.getConfParameter().getInterestResendTime()); } else { registerPrefixes(adjacent->getName(), adjacent->getConnectingFaceUri(), adjacent->getLinkCost(), ndn::time::milliseconds::max()); } } } }
int NdnRtcNamespace::findComponent(const ndn::Name &prefix, const std::string &componentString) { int pos = -1; int nComponents = prefix.size(); Name::Component searchComponent((const uint8_t*)componentString.c_str(), componentString.size()); for (int i = nComponents; i--; i >= 0) { Name::Component c = prefix.get(i); if (c == searchComponent) { pos = i; break; } } return pos; }
void HelloProtocol::processInterestTimedOut(const ndn::Interest& interest) { /* interest name: /<neighbor>/NLSR/INFO/<router> */ const ndn::Name interestName(interest.getName()); _LOG_DEBUG("Interest timed out for Name: " << interestName); if (interestName.get(-2).toUri() != INFO_COMPONENT) { return; } ndn::Name neighbor = interestName.getPrefix(-3); _LOG_DEBUG("Neighbor: " << neighbor); m_nlsr.getAdjacencyList().incrementTimedOutInterestCount(neighbor); int status = m_nlsr.getAdjacencyList().getStatusOfNeighbor(neighbor); uint32_t infoIntTimedOutCount = m_nlsr.getAdjacencyList().getTimedOutInterestCount(neighbor); _LOG_DEBUG("Status: " << status); _LOG_DEBUG("Info Interest Timed out: " << infoIntTimedOutCount); if ((infoIntTimedOutCount < m_nlsr.getConfParameter().getInterestRetryNumber())) { /* interest name: /<neighbor>/NLSR/INFO/<router> */ ndn::Name interestName(neighbor); interestName.append(NLSR_COMPONENT); interestName.append(INFO_COMPONENT); interestName.append(m_nlsr.getConfParameter().getRouterPrefix().wireEncode()); expressInterest(interestName, m_nlsr.getConfParameter().getInterestResendTime()); } else if ((status == 1) && (infoIntTimedOutCount == m_nlsr.getConfParameter().getInterestRetryNumber())) { m_nlsr.getAdjacencyList().setStatusOfNeighbor(neighbor, 0); m_nlsr.incrementAdjBuildCount(); if (m_nlsr.getIsBuildAdjLsaSheduled() == false) { _LOG_DEBUG("Scheduling scheduledAdjLsaBuild"); m_nlsr.setIsBuildAdjLsaSheduled(true); // event here m_nlsr.getScheduler().scheduleEvent(ndn::time::seconds(5), ndn::bind(&Lsdb::scheduledAdjLsaBuild, &m_nlsr.getLsdb())); } } }
SegmentNumber NdnRtcNamespace::getSegmentNumber(const ndn::Name &prefix) { PacketNumber segmentNo = -1; int p = -1; if (isDeltaFramesPrefix(prefix)) { p = findComponent(prefix, NameComponentStreamFramesDelta); } else if (isKeyFramePrefix(prefix)) { p = findComponent(prefix, NameComponentStreamFramesKey); } if (p > 0 && p+3 < prefix.size()) { Name::Component segmentNoComp = prefix.get(p+3); segmentNo = NdnRtcUtils::segmentNumber(segmentNoComp); } return segmentNo; }