blob: 7265a9e4dbbdcc4ada3518b7054bf438ef88de16 [file] [log] [blame]
Teng Liang39465c22018-11-12 19:43:04 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/*
3 * Copyright (c) 2014-2019, Regents of the University of California,
4 * 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
26#ifndef NFD_DAEMON_FW_SELF_LEARNING_STRATEGY_HPP
27#define NFD_DAEMON_FW_SELF_LEARNING_STRATEGY_HPP
28
29#include "fw/strategy.hpp"
30
31#include <ndn-cxx/lp/prefix-announcement-header.hpp>
32
33namespace nfd {
34namespace fw {
35
36/** \brief Self-learning strategy
37 *
38 * This strategy first broadcasts Interest to learn a single path towards data,
39 * then unicasts subsequent Interests along the learned path
40 *
41 * \see https://redmine.named-data.net/attachments/864/Self-learning-strategy-v1.pdf
ashiqopuc7079482019-02-20 05:34:37 +000042 *
43 * \note This strategy is not EndpointId-aware
Teng Liang39465c22018-11-12 19:43:04 -070044 */
45class SelfLearningStrategy : public Strategy
46{
47public:
48 explicit
49 SelfLearningStrategy(Forwarder& forwarder, const Name& name = getStrategyName());
50
51 static const Name&
52 getStrategyName();
53
54 /// StrategyInfo on pit::InRecord
55 class InRecordInfo : public StrategyInfo
56 {
57 public:
58 static constexpr int
59 getTypeId()
60 {
61 return 1040;
62 }
63
64 public:
65 bool isNonDiscoveryInterest = false;
66 };
67
68 /// StrategyInfo on pit::OutRecord
69 class OutRecordInfo : public StrategyInfo
70 {
71 public:
72 static constexpr int
73 getTypeId()
74 {
75 return 1041;
76 }
77
78 public:
79 bool isNonDiscoveryInterest = false;
80 };
81
82public: // triggers
83 void
ashiqopuc7079482019-02-20 05:34:37 +000084 afterReceiveInterest(const FaceEndpoint& ingress, const Interest& interest,
Teng Liang39465c22018-11-12 19:43:04 -070085 const shared_ptr<pit::Entry>& pitEntry) override;
86
87 void
88 afterReceiveData(const shared_ptr<pit::Entry>& pitEntry,
ashiqopuc7079482019-02-20 05:34:37 +000089 const FaceEndpoint& ingress, const Data& data) override;
Teng Liang39465c22018-11-12 19:43:04 -070090
91 void
ashiqopuc7079482019-02-20 05:34:37 +000092 afterReceiveNack(const FaceEndpoint& ingress, const lp::Nack& nack,
Teng Liang39465c22018-11-12 19:43:04 -070093 const shared_ptr<pit::Entry>& pitEntry) override;
94
95private: // operations
96
97 /** \brief Send an Interest to all possible faces
98 *
99 * This function is invoked when the forwarder has no matching FIB entries for
100 * an incoming discovery Interest, which will be forwarded to faces that
101 * - do not violate the Interest scope
102 * - are non-local
103 * - are not the face from which the Interest arrived, unless the face is ad-hoc
104 */
105 void
106 broadcastInterest(const Interest& interest, const Face& inFace,
107 const shared_ptr<pit::Entry>& pitEntry);
108
109 /** \brief Send an Interest to \p nexthops
110 */
111 void
112 multicastInterest(const Interest& interest, const Face& inFace,
113 const shared_ptr<pit::Entry>& pitEntry,
114 const fib::NextHopList& nexthops);
115
116 /** \brief Find a Prefix Announcement for the Data on the RIB thread, and forward
117 * the Data with the Prefix Announcement on the main thread
118 */
119 void
120 asyncProcessData(const shared_ptr<pit::Entry>& pitEntry, const Face& inFace, const Data& data);
121
122 /** \brief Check whether a PrefixAnnouncement needs to be attached to an incoming Data
123 *
124 * The conditions that a Data packet requires a PrefixAnnouncement are
125 * - the incoming Interest was discovery and
126 * - the outgoing Interest was non-discovery and
127 * - this forwarder does not directly connect to the consumer
128 */
129 static bool
130 needPrefixAnn(const shared_ptr<pit::Entry>& pitEntry);
131
132 /** \brief Add a route using RibManager::slAnnounce on the RIB thread
133 */
134 void
135 addRoute(const shared_ptr<pit::Entry>& pitEntry, const Face& inFace,
136 const Data& data, const ndn::PrefixAnnouncement& pa);
137
138 /** \brief renew a route using RibManager::slRenew on the RIB thread
139 */
140 void
141 renewRoute(const Name& name, FaceId inFaceId, time::milliseconds maxLifetime);
142
143private:
144 static const time::milliseconds ROUTE_RENEW_LIFETIME;
145};
146
147} // namespace fw
148} // namespace nfd
149
150#endif // NFD_DAEMON_FW_SELF_LEARNING_STRATEGY_HPP