src: add SigningInfo and version number to SegmentPublisher
refs: #4783 Change-Id: Id5dc8d6096ff729be0b8d0f971004281e0c09eb1
This commit is contained in:
+2
-2
@@ -101,7 +101,7 @@ Consumer::sendHelloInterest()
|
||||
|
||||
m_helloFetcher->afterSegmentValidated.connect([this] (const ndn::Data& data) {
|
||||
if (data.getFinalBlock()) {
|
||||
m_helloDataName = data.getName().getPrefix(-1);
|
||||
m_helloDataName = data.getName().getPrefix(-2);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -189,7 +189,7 @@ Consumer::sendSyncInterest()
|
||||
|
||||
m_syncFetcher->afterSegmentValidated.connect([this] (const ndn::Data& data) {
|
||||
if (data.getFinalBlock()) {
|
||||
m_syncDataName = data.getName().getPrefix(-1);
|
||||
m_syncDataName = data.getName().getPrefix(-2);
|
||||
m_syncDataContentType = data.getContentType();
|
||||
}
|
||||
|
||||
|
||||
@@ -137,16 +137,14 @@ FullProducer::onSyncInterest(const ndn::Name& prefixName, const ndn::Interest& i
|
||||
|
||||
ndn::Name nameWithoutSyncPrefix = interest.getName().getSubName(prefixName.size());
|
||||
ndn::Name interestName;
|
||||
uint64_t interestSeq = 0;
|
||||
|
||||
if (nameWithoutSyncPrefix.size() == 1) {
|
||||
// Get /IBF from /IBF
|
||||
// Get /<prefix>/IBF from /<prefix>/IBF
|
||||
interestName = interest.getName();
|
||||
}
|
||||
else if (nameWithoutSyncPrefix.size() == 2) {
|
||||
// Get /IBF from /IBF/<seq-no>
|
||||
interestName = interest.getName().getPrefix(-1);
|
||||
interestSeq = interest.getName().get(-1).toSegment();
|
||||
else if (nameWithoutSyncPrefix.size() == 3) {
|
||||
// Get /<prefix>/IBF from /<prefix>/IBF/<version>/<segment-no>
|
||||
interestName = interest.getName().getPrefix(-2);
|
||||
}
|
||||
else {
|
||||
return;
|
||||
@@ -207,9 +205,6 @@ FullProducer::onSyncInterest(const ndn::Name& prefixName, const ndn::Interest& i
|
||||
|
||||
if (!state.getContent().empty()) {
|
||||
NDN_LOG_DEBUG("Sending sync content: " << state);
|
||||
if (interestSeq != 0) {
|
||||
interestName.appendSegment(interestSeq);
|
||||
}
|
||||
sendSyncData(interestName, state.wireEncode());
|
||||
return;
|
||||
}
|
||||
|
||||
+21
-13
@@ -74,14 +74,14 @@ PartialProducer::publishName(const ndn::Name& prefix, ndn::optional<uint64_t> se
|
||||
void
|
||||
PartialProducer::onHelloInterest(const ndn::Name& prefix, const ndn::Interest& interest)
|
||||
{
|
||||
// Last component or third last component (in case of interest with IBF and segment)
|
||||
// needs to be hello
|
||||
if (interest.getName().get(interest.getName().size()-1).toUri() != "hello" &&
|
||||
interest.getName().get(interest.getName().size()-3).toUri() != "hello") {
|
||||
if (m_segmentPublisher.replyFromStore(interest.getName())) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (m_segmentPublisher.replyFromStore(interest.getName())) {
|
||||
// Last component or fourth last component (in case of interest with version and segment)
|
||||
// needs to be hello
|
||||
if (interest.getName().get(interest.getName().size()-1).toUri() != "hello" &&
|
||||
interest.getName().get(interest.getName().size()-4).toUri() != "hello") {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -104,17 +104,25 @@ PartialProducer::onHelloInterest(const ndn::Name& prefix, const ndn::Interest& i
|
||||
void
|
||||
PartialProducer::onSyncInterest(const ndn::Name& prefix, const ndn::Interest& interest)
|
||||
{
|
||||
NDN_LOG_DEBUG("Sync Interest Received, nonce: " << interest.getNonce() <<
|
||||
" hash: " << std::hash<std::string>{}(interest.getName().toUri()));
|
||||
|
||||
ndn::Name interestName = interest.getName();
|
||||
|
||||
if (interestName.get(interestName.size() - 5).toUri() != "sync" &&
|
||||
interestName.get(interestName.size() - 7).toUri() != "sync") {
|
||||
if (m_segmentPublisher.replyFromStore(interest.getName())) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (m_segmentPublisher.replyFromStore(interest.getName())) {
|
||||
NDN_LOG_DEBUG("Sync Interest Received, nonce: " << interest.getNonce() <<
|
||||
" hash: " << std::hash<std::string>{}(interest.getName().toUri()));
|
||||
|
||||
ndn::Name nameWithoutSyncPrefix = interest.getName().getSubName(prefix.size());
|
||||
ndn::Name interestName;
|
||||
|
||||
if (nameWithoutSyncPrefix.size() == 4) {
|
||||
// Get /<prefix>/BF/IBF/ from /<prefix>/BF/IBF (3 components of BF + 1 for IBF)
|
||||
interestName = interest.getName();
|
||||
}
|
||||
else if (nameWithoutSyncPrefix.size() == 6) {
|
||||
// Get <prefix>/BF/IBF/ from /<prefix>/BF/IBF/<version>/<segment-no>
|
||||
interestName = interest.getName().getPrefix(-2);
|
||||
}
|
||||
else {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -97,6 +97,7 @@ private:
|
||||
void
|
||||
satisfyPendingSyncInterests(const ndn::Name& prefix);
|
||||
|
||||
PUBLIC_WITH_TESTS_ELSE_PRIVATE:
|
||||
/**
|
||||
* @brief Receive hello interest from consumer and respond with hello data
|
||||
*
|
||||
@@ -105,7 +106,6 @@ private:
|
||||
void
|
||||
onHelloInterest(const ndn::Name& prefix, const ndn::Interest& interest);
|
||||
|
||||
PUBLIC_WITH_TESTS_ELSE_PRIVATE:
|
||||
/**
|
||||
* @brief Receive sync interest from consumer
|
||||
*
|
||||
|
||||
@@ -34,7 +34,8 @@ SegmentPublisher::SegmentPublisher(ndn::Face& face, ndn::KeyChain& keyChain,
|
||||
|
||||
void
|
||||
SegmentPublisher::publish(const ndn::Name& interestName, const ndn::Name& dataName,
|
||||
const ndn::Block& block, ndn::time::milliseconds freshness)
|
||||
const ndn::Block& block, ndn::time::milliseconds freshness,
|
||||
const ndn::security::SigningInfo& signingInfo)
|
||||
{
|
||||
uint64_t interestSegment = 0;
|
||||
if (interestName[-1].isSegment()) {
|
||||
@@ -52,6 +53,9 @@ SegmentPublisher::publish(const ndn::Name& interestName, const ndn::Name& dataNa
|
||||
|
||||
uint64_t totalSegments = buffer.size() / maxPacketSize;
|
||||
|
||||
ndn::Name segmentPrefix(dataName);
|
||||
segmentPrefix.appendVersion();
|
||||
|
||||
uint64_t segmentNo = 0;
|
||||
do {
|
||||
const uint8_t* segmentEnd = segmentBegin + maxPacketSize;
|
||||
@@ -59,7 +63,7 @@ SegmentPublisher::publish(const ndn::Name& interestName, const ndn::Name& dataNa
|
||||
segmentEnd = end;
|
||||
}
|
||||
|
||||
ndn::Name segmentName(dataName);
|
||||
ndn::Name segmentName(segmentPrefix);
|
||||
segmentName.appendSegment(segmentNo);
|
||||
|
||||
// We get a std::exception: bad_weak_ptr from m_ims if we don't use shared_ptr for data
|
||||
@@ -70,7 +74,7 @@ SegmentPublisher::publish(const ndn::Name& interestName, const ndn::Name& dataNa
|
||||
|
||||
segmentBegin = segmentEnd;
|
||||
|
||||
m_keyChain.sign(*data);
|
||||
m_keyChain.sign(*data, signingInfo);
|
||||
|
||||
// Put on face only the segment which has a pending interest
|
||||
// otherwise the segment is unsolicited
|
||||
|
||||
@@ -54,7 +54,9 @@ public:
|
||||
*/
|
||||
void
|
||||
publish(const ndn::Name& interestName, const ndn::Name& dataName,
|
||||
const ndn::Block& block, ndn::time::milliseconds freshness);
|
||||
const ndn::Block& block, ndn::time::milliseconds freshness,
|
||||
const ndn::security::SigningInfo& signingInfo =
|
||||
ndn::security::v2::KeyChain::getDefaultSigningInfo());
|
||||
|
||||
/**
|
||||
* @brief Try to reply from memory, return false if we cannot find the segment.
|
||||
|
||||
@@ -394,6 +394,46 @@ BOOST_AUTO_TEST_CASE(DiffIBFDecodeFailureMultipleNodes)
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(DelayedSecondSegment)
|
||||
{
|
||||
addNode(0);
|
||||
|
||||
for (int i = 0; i < 300; i++) {
|
||||
Name prefixToPublish("userNode0-" + to_string(i));
|
||||
nodes[0]->addUserNode(prefixToPublish);
|
||||
nodes[0]->publishName(prefixToPublish);
|
||||
}
|
||||
|
||||
advanceClocks(ndn::time::milliseconds(10), 100);
|
||||
|
||||
Name syncInterestName(syncPrefix);
|
||||
IBLT iblt(40);
|
||||
iblt.appendToName(syncInterestName);
|
||||
|
||||
nodes[0]->onSyncInterest(syncPrefix, Interest(syncInterestName));
|
||||
|
||||
advanceClocks(ndn::time::milliseconds(10));
|
||||
|
||||
BOOST_CHECK_EQUAL(nodes[0]->m_segmentPublisher.m_ims.size(), 2);
|
||||
// Expire contents from segmentPublisher
|
||||
advanceClocks(ndn::time::milliseconds(10), 100);
|
||||
BOOST_CHECK_EQUAL(nodes[0]->m_segmentPublisher.m_ims.size(), 0);
|
||||
|
||||
// Get data name from face and increase segment number to form next interest
|
||||
Name dataName = faces[0]->sentData.front().getName();
|
||||
Name interestName = dataName.getSubName(0, dataName.size() - 1);
|
||||
interestName.appendSegment(1);
|
||||
faces[0]->sentData.clear();
|
||||
|
||||
nodes[0]->onSyncInterest(syncPrefix, Interest(interestName));
|
||||
advanceClocks(ndn::time::milliseconds(10));
|
||||
|
||||
// Should have repopulated SegmentPublisher
|
||||
BOOST_CHECK_EQUAL(nodes[0]->m_segmentPublisher.m_ims.size(), 2);
|
||||
// Should have received the second data segment this time
|
||||
BOOST_CHECK_EQUAL(faces[0]->sentData.front().getName()[-1].toSegment(), 1);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
|
||||
} // namespace psync
|
||||
@@ -83,6 +83,7 @@ BOOST_AUTO_TEST_CASE(SameSyncInterest)
|
||||
|
||||
Name syncInterestName(syncPrefix);
|
||||
syncInterestName.append("sync");
|
||||
Name syncInterestPrefix = syncInterestName;
|
||||
|
||||
BloomFilter bf(20, 0.001);
|
||||
bf.appendToName(syncInterestName);
|
||||
@@ -92,7 +93,7 @@ BOOST_AUTO_TEST_CASE(SameSyncInterest)
|
||||
Interest syncInterest(syncInterestName);
|
||||
syncInterest.setInterestLifetime(time::milliseconds(1000));
|
||||
syncInterest.setNonce(1);
|
||||
BOOST_REQUIRE_NO_THROW(producer.onSyncInterest(syncInterestName, syncInterest));
|
||||
BOOST_REQUIRE_NO_THROW(producer.onSyncInterest(syncInterestPrefix, syncInterest));
|
||||
face.processEvents(time::milliseconds(10));
|
||||
BOOST_CHECK_EQUAL(producer.m_pendingEntries.size(), 1);
|
||||
|
||||
@@ -100,7 +101,7 @@ BOOST_AUTO_TEST_CASE(SameSyncInterest)
|
||||
|
||||
// Same interest again - size of pending interest should remain same, but expirationEvent should change
|
||||
syncInterest.setNonce(2);
|
||||
BOOST_REQUIRE_NO_THROW(producer.onSyncInterest(syncInterestName, syncInterest));
|
||||
BOOST_REQUIRE_NO_THROW(producer.onSyncInterest(syncInterestPrefix, syncInterest));
|
||||
face.processEvents(time::milliseconds(10));
|
||||
BOOST_CHECK_EQUAL(producer.m_pendingEntries.size(), 1);
|
||||
|
||||
|
||||
@@ -362,6 +362,19 @@ BOOST_AUTO_TEST_CASE(SegmentedHello)
|
||||
consumers[0]->sendHelloInterest();
|
||||
advanceClocks(ndn::time::milliseconds(10));
|
||||
BOOST_CHECK_EQUAL(numHelloDataRcvd, 1);
|
||||
|
||||
// Simulate sending delayed interest for second segment
|
||||
Name dataName = face.sentData.back().getName();
|
||||
face.sentData.clear();
|
||||
BOOST_CHECK_EQUAL(producer->m_segmentPublisher.m_ims.size(), 2);
|
||||
|
||||
advanceClocks(ndn::time::milliseconds(1000));
|
||||
BOOST_CHECK_EQUAL(producer->m_segmentPublisher.m_ims.size(), 0);
|
||||
|
||||
producer->onHelloInterest(consumers[0]->m_helloInterestPrefix, Interest(dataName));
|
||||
advanceClocks(ndn::time::milliseconds(10));
|
||||
BOOST_CHECK_EQUAL(producer->m_segmentPublisher.m_ims.size(), 2);
|
||||
BOOST_CHECK_EQUAL(face.sentData.front().getName()[-1].toSegment(), 1);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(SegmentedSync)
|
||||
@@ -382,6 +395,13 @@ BOOST_AUTO_TEST_CASE(SegmentedSync)
|
||||
advanceClocks(ndn::time::milliseconds(10));
|
||||
BOOST_CHECK_EQUAL(numHelloDataRcvd, 1);
|
||||
|
||||
// To be used later to simulate sending delayed segmented interest
|
||||
ndn::Name syncInterestName(consumers[0]->m_syncInterestPrefix);
|
||||
consumers[0]->m_bloomFilter.appendToName(syncInterestName);
|
||||
syncInterestName.append(consumers[0]->m_iblt);
|
||||
syncInterestName.appendVersion();
|
||||
syncInterestName.appendSegment(1);
|
||||
|
||||
oldSeqMap = producer->m_prefixes;
|
||||
for (int i = 1; i < 10; i++) {
|
||||
producer->updateSeqNo(longNameToExceedDataSize.toUri() + "-" + to_string(i), 1);
|
||||
@@ -392,6 +412,20 @@ BOOST_AUTO_TEST_CASE(SegmentedSync)
|
||||
|
||||
advanceClocks(ndn::time::milliseconds(1500));
|
||||
BOOST_CHECK_EQUAL(numSyncDataRcvd, 1);
|
||||
|
||||
// Simulate sending delayed interest for second segment
|
||||
face.sentData.clear();
|
||||
consumerFaces[0]->sentData.clear();
|
||||
|
||||
BOOST_CHECK_EQUAL(producer->m_segmentPublisher.m_ims.size(), 2);
|
||||
|
||||
advanceClocks(ndn::time::milliseconds(2000));
|
||||
BOOST_CHECK_EQUAL(producer->m_segmentPublisher.m_ims.size(), 0);
|
||||
|
||||
producer->onSyncInterest(consumers[0]->m_syncInterestPrefix, Interest(syncInterestName));
|
||||
advanceClocks(ndn::time::milliseconds(10));
|
||||
BOOST_CHECK_EQUAL(producer->m_segmentPublisher.m_ims.size(), 2);
|
||||
BOOST_CHECK_EQUAL(face.sentData.front().getName()[-1].toSegment(), 1);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
|
||||
@@ -126,7 +126,7 @@ BOOST_AUTO_TEST_CASE(Basic)
|
||||
BOOST_CHECK_EQUAL(numRepliesFromStore, 2);
|
||||
|
||||
numRepliesFromStore = 0;
|
||||
face.expressInterest(Interest(Name("/hello/world/").appendSegment(0)),
|
||||
face.expressInterest(Interest(Name("/hello/world/")),
|
||||
[this] (const Interest& interest, const Data& data) {
|
||||
numComplete++;
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user