blob: db2c4cf545e63c3945afdbe3a06d50dcc8f4cbce [file] [log] [blame]
Junxiao Shifef73e42016-03-29 14:15:05 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Ashlesh Gawande90015992017-07-11 17:25:48 -05002/*
3 * Copyright (c) 2014-2017, Regents of the University of California,
Junxiao Shifef73e42016-03-29 14:15:05 -07004 * Arizona Board of Regents,
5 * Colorado State University,
6 * University Pierre & Marie Curie, Sorbonne University,
7 * Washington University in St. Louis,
8 * Beijing Institute of Technology,
9 * The University of Memphis.
10 *
11 * This file is part of NFD (Named Data Networking Forwarding Daemon).
12 * See AUTHORS.md for complete list of NFD authors and contributors.
13 *
14 * NFD is free software: you can redistribute it and/or modify it under the terms
15 * of the GNU General Public License as published by the Free Software Foundation,
16 * either version 3 of the License, or (at your option) any later version.
17 *
18 * NFD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
19 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
20 * PURPOSE. See the GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License along with
23 * NFD, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
24 */
25
Junxiao Shi00dc9142016-11-21 14:23:12 +000026#include "algorithm.hpp"
Junxiao Shifef73e42016-03-29 14:15:05 -070027
28namespace nfd {
Junxiao Shifef73e42016-03-29 14:15:05 -070029namespace scope_prefix {
30const Name LOCALHOST("ndn:/localhost");
31const Name LOCALHOP("ndn:/localhop");
32} // namespace scope_prefix
33
Junxiao Shif3410d82016-04-05 13:49:44 -070034namespace fw {
35
Junxiao Shifef73e42016-03-29 14:15:05 -070036bool
Junxiao Shi00dc9142016-11-21 14:23:12 +000037wouldViolateScope(const Face& inFace, const Interest& interest, const Face& outFace)
38{
39 if (outFace.getScope() == ndn::nfd::FACE_SCOPE_LOCAL) {
40 // forwarding to a local face is always allowed
41 return false;
42 }
43
44 if (scope_prefix::LOCALHOST.isPrefixOf(interest.getName())) {
45 // localhost Interests cannot be forwarded to a non-local face
46 return true;
47 }
48
49 if (scope_prefix::LOCALHOP.isPrefixOf(interest.getName())) {
50 // localhop Interests can be forwarded to a non-local face only if it comes from a local face
51 return inFace.getScope() != ndn::nfd::FACE_SCOPE_LOCAL;
52 }
53
54 // Interest name is not subject to scope control
55 return false;
56}
57
58bool
Junxiao Shifef73e42016-03-29 14:15:05 -070059canForwardToLegacy(const pit::Entry& pitEntry, const Face& face)
60{
61 time::steady_clock::TimePoint now = time::steady_clock::now();
62
Junxiao Shi4846f372016-04-05 13:39:30 -070063 bool hasUnexpiredOutRecord = std::any_of(pitEntry.out_begin(), pitEntry.out_end(),
Junxiao Shifef73e42016-03-29 14:15:05 -070064 [&face, &now] (const pit::OutRecord& outRecord) {
Junxiao Shi9cff7792016-08-01 21:45:11 +000065 return &outRecord.getFace() == &face && outRecord.getExpiry() >= now;
Junxiao Shifef73e42016-03-29 14:15:05 -070066 });
67 if (hasUnexpiredOutRecord) {
68 return false;
69 }
70
Junxiao Shi4846f372016-04-05 13:39:30 -070071 bool hasUnexpiredOtherInRecord = std::any_of(pitEntry.in_begin(), pitEntry.in_end(),
Junxiao Shifef73e42016-03-29 14:15:05 -070072 [&face, &now] (const pit::InRecord& inRecord) {
Junxiao Shi9cff7792016-08-01 21:45:11 +000073 return &inRecord.getFace() != &face && inRecord.getExpiry() >= now;
Junxiao Shifef73e42016-03-29 14:15:05 -070074 });
75 if (!hasUnexpiredOtherInRecord) {
76 return false;
77 }
78
Junxiao Shie21b3f32016-11-24 14:13:46 +000079 return true;
Junxiao Shifef73e42016-03-29 14:15:05 -070080}
81
82int
83findDuplicateNonce(const pit::Entry& pitEntry, uint32_t nonce, const Face& face)
84{
85 int dnw = DUPLICATE_NONCE_NONE;
86
87 for (const pit::InRecord& inRecord : pitEntry.getInRecords()) {
88 if (inRecord.getLastNonce() == nonce) {
Junxiao Shi9cff7792016-08-01 21:45:11 +000089 if (&inRecord.getFace() == &face) {
Junxiao Shifef73e42016-03-29 14:15:05 -070090 dnw |= DUPLICATE_NONCE_IN_SAME;
91 }
92 else {
93 dnw |= DUPLICATE_NONCE_IN_OTHER;
94 }
95 }
96 }
97
98 for (const pit::OutRecord& outRecord : pitEntry.getOutRecords()) {
99 if (outRecord.getLastNonce() == nonce) {
Junxiao Shi9cff7792016-08-01 21:45:11 +0000100 if (&outRecord.getFace() == &face) {
Junxiao Shifef73e42016-03-29 14:15:05 -0700101 dnw |= DUPLICATE_NONCE_OUT_SAME;
102 }
103 else {
104 dnw |= DUPLICATE_NONCE_OUT_OTHER;
105 }
106 }
107 }
108
109 return dnw;
110}
111
112bool
113hasPendingOutRecords(const pit::Entry& pitEntry)
114{
115 time::steady_clock::TimePoint now = time::steady_clock::now();
Junxiao Shi4846f372016-04-05 13:39:30 -0700116 return std::any_of(pitEntry.out_begin(), pitEntry.out_end(),
Junxiao Shi8744c972016-04-06 10:33:46 -0700117 [&now] (const pit::OutRecord& outRecord) {
118 return outRecord.getExpiry() >= now &&
119 outRecord.getIncomingNack() == nullptr;
120 });
Junxiao Shifef73e42016-03-29 14:15:05 -0700121}
122
Ashlesh Gawande90015992017-07-11 17:25:48 -0500123time::steady_clock::TimePoint
124getLastOutgoing(const pit::Entry& pitEntry)
125{
126 pit::OutRecordCollection::const_iterator lastOutgoing = std::max_element(
127 pitEntry.out_begin(), pitEntry.out_end(),
128 [] (const pit::OutRecord& a, const pit::OutRecord& b) {
129 return a.getLastRenewed() < b.getLastRenewed();
130 });
131 BOOST_ASSERT(lastOutgoing != pitEntry.out_end());
132
133 return lastOutgoing->getLastRenewed();
134}
135
Junxiao Shifef73e42016-03-29 14:15:05 -0700136} // namespace fw
137} // namespace nfd