blob: 7e2dc927b093d143fe368f6c104f1967dfc56622 [file] [log] [blame]
Ashlesh Gawande32ec3fd2018-07-18 13:42:32 -05001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Ashlesh Gawande30d96e42021-03-21 19:15:33 -07002/*
Alexander Afanasyev135288c2022-04-23 23:06:56 -04003 * Copyright (c) 2014-2022, The University of Memphis,
Ashlesh Gawande32ec3fd2018-07-18 13:42:32 -05004 * Regents of the University of California,
5 * Arizona Board of Regents.
6 *
7 * This file is part of NLSR (Named-data Link State Routing).
8 * See AUTHORS.md for complete list of NLSR authors and contributors.
9 *
10 * NLSR is free software: you can redistribute it and/or modify it under the terms
11 * of the GNU General Public License as published by the Free Software Foundation,
12 * either version 3 of the License, or (at your option) any later version.
13 *
14 * NLSR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
15 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
16 * PURPOSE. See the GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License along with
19 * NLSR, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
Ashlesh Gawande30d96e42021-03-21 19:15:33 -070020 */
Ashlesh Gawande32ec3fd2018-07-18 13:42:32 -050021
22#include "sync-protocol-adapter.hpp"
23#include "logger.hpp"
24
Ashlesh Gawande32ec3fd2018-07-18 13:42:32 -050025namespace nlsr {
26
Davide Pesavento1954a0c2022-09-30 15:56:04 -040027INIT_LOGGER(SyncProtocolAdapter);
28
29#ifdef HAVE_CHRONOSYNC
Ashlesh Gawande32ec3fd2018-07-18 13:42:32 -050030const auto FIXED_SESSION = ndn::name::Component::fromNumber(0);
Davide Pesavento1954a0c2022-09-30 15:56:04 -040031#endif
Ashlesh Gawande32ec3fd2018-07-18 13:42:32 -050032
33SyncProtocolAdapter::SyncProtocolAdapter(ndn::Face& face,
Davide Pesavento1954a0c2022-09-30 15:56:04 -040034 ndn::KeyChain& keyChain,
Ashlesh Gawande30d96e42021-03-21 19:15:33 -070035 SyncProtocol syncProtocol,
Ashlesh Gawande32ec3fd2018-07-18 13:42:32 -050036 const ndn::Name& syncPrefix,
37 const ndn::Name& userPrefix,
38 ndn::time::milliseconds syncInterestLifetime,
Davide Pesavento1954a0c2022-09-30 15:56:04 -040039 SyncUpdateCallback syncUpdateCallback)
40 : m_syncProtocol(syncProtocol)
41 , m_syncUpdateCallback(std::move(syncUpdateCallback))
Ashlesh Gawande32ec3fd2018-07-18 13:42:32 -050042{
Davide Pesavento1954a0c2022-09-30 15:56:04 -040043 switch (m_syncProtocol) {
Ashlesh Gawande30d96e42021-03-21 19:15:33 -070044#ifdef HAVE_CHRONOSYNC
Davide Pesavento1954a0c2022-09-30 15:56:04 -040045 case SyncProtocol::CHRONOSYNC:
Ashlesh Gawande32ec3fd2018-07-18 13:42:32 -050046 NDN_LOG_DEBUG("Using ChronoSync");
47 m_chronoSyncLogic = std::make_shared<chronosync::Logic>(face,
48 syncPrefix,
49 userPrefix,
Davide Pesavento1954a0c2022-09-30 15:56:04 -040050 [this] (auto&&... args) { onChronoSyncUpdate(std::forward<decltype(args)>(args)...); },
Ashlesh Gawande32ec3fd2018-07-18 13:42:32 -050051 chronosync::Logic::DEFAULT_NAME,
52 chronosync::Logic::DEFAULT_VALIDATOR,
53 chronosync::Logic::DEFAULT_RESET_TIMER,
54 chronosync::Logic::DEFAULT_CANCEL_RESET_TIMER,
55 chronosync::Logic::DEFAULT_RESET_INTEREST_LIFETIME,
56 syncInterestLifetime,
57 chronosync::Logic::DEFAULT_SYNC_REPLY_FRESHNESS,
58 chronosync::Logic::DEFAULT_RECOVERY_INTEREST_LIFETIME,
59 FIXED_SESSION);
Davide Pesavento1954a0c2022-09-30 15:56:04 -040060 break;
Varun Patil7d2d6892022-10-14 12:50:30 -070061#endif // HAVE_CHRONOSYNC
62#ifdef HAVE_PSYNC
Davide Pesavento1954a0c2022-09-30 15:56:04 -040063 case SyncProtocol::PSYNC:
64 NDN_LOG_DEBUG("Using PSync");
65 m_psyncLogic = std::make_shared<psync::FullProducer>(face,
66 keyChain,
67 80,
68 syncPrefix,
69 userPrefix,
70 [this] (auto&&... args) { onPSyncUpdate(std::forward<decltype(args)>(args)...); },
71 syncInterestLifetime);
72 break;
Varun Patil7d2d6892022-10-14 12:50:30 -070073#endif // HAVE_PSYNC
74#ifdef HAVE_SVS
75 case SyncProtocol::SVS:
76 NDN_LOG_DEBUG("Using SVS");
77 m_svsCore = std::make_shared<ndn::svs::SVSyncCore>(face,
78 syncPrefix,
79 [this] (auto&&... args) { onSvsUpdate(std::forward<decltype(args)>(args)...); });
80 break;
81#endif // HAVE_SVS
Davide Pesavento1954a0c2022-09-30 15:56:04 -040082 default:
83 NDN_CXX_UNREACHABLE;
84 }
Ashlesh Gawande32ec3fd2018-07-18 13:42:32 -050085}
86
87void
88SyncProtocolAdapter::addUserNode(const ndn::Name& userPrefix)
89{
Davide Pesavento1954a0c2022-09-30 15:56:04 -040090 switch (m_syncProtocol) {
Ashlesh Gawande30d96e42021-03-21 19:15:33 -070091#ifdef HAVE_CHRONOSYNC
Davide Pesavento1954a0c2022-09-30 15:56:04 -040092 case SyncProtocol::CHRONOSYNC:
Ashlesh Gawande32ec3fd2018-07-18 13:42:32 -050093 m_chronoSyncLogic->addUserNode(userPrefix, chronosync::Logic::DEFAULT_NAME, FIXED_SESSION);
Davide Pesavento1954a0c2022-09-30 15:56:04 -040094 break;
Varun Patil7d2d6892022-10-14 12:50:30 -070095#endif // HAVE_CHRONOSYNC
96#ifdef HAVE_PSYNC
Davide Pesavento1954a0c2022-09-30 15:56:04 -040097 case SyncProtocol::PSYNC:
98 m_psyncLogic->addUserNode(userPrefix);
99 break;
Varun Patil7d2d6892022-10-14 12:50:30 -0700100#endif // HAVE_PSYNC
101#ifdef HAVE_SVS
102 case SyncProtocol::SVS:
103 break;
104#endif // HAVE_SVS
Davide Pesavento1954a0c2022-09-30 15:56:04 -0400105 default:
106 NDN_CXX_UNREACHABLE;
107 }
Ashlesh Gawande32ec3fd2018-07-18 13:42:32 -0500108}
109
110void
111SyncProtocolAdapter::publishUpdate(const ndn::Name& userPrefix, uint64_t seq)
112{
Davide Pesavento1954a0c2022-09-30 15:56:04 -0400113 switch (m_syncProtocol) {
Ashlesh Gawande30d96e42021-03-21 19:15:33 -0700114#ifdef HAVE_CHRONOSYNC
Davide Pesavento1954a0c2022-09-30 15:56:04 -0400115 case SyncProtocol::CHRONOSYNC:
Ashlesh Gawande32ec3fd2018-07-18 13:42:32 -0500116 m_chronoSyncLogic->updateSeqNo(seq, userPrefix);
Davide Pesavento1954a0c2022-09-30 15:56:04 -0400117 break;
Varun Patil7d2d6892022-10-14 12:50:30 -0700118#endif // HAVE_CHRONOSYNC
119#ifdef HAVE_PSYNC
Davide Pesavento1954a0c2022-09-30 15:56:04 -0400120 case SyncProtocol::PSYNC:
121 m_psyncLogic->publishName(userPrefix, seq);
122 break;
Varun Patil7d2d6892022-10-14 12:50:30 -0700123#endif // HAVE_PSYNC
124#ifdef HAVE_SVS
125 case SyncProtocol::SVS:
126 m_svsCore->updateSeqNo(seq, userPrefix);
127 break;
128#endif // HAVE_SVS
Davide Pesavento1954a0c2022-09-30 15:56:04 -0400129 default:
130 NDN_CXX_UNREACHABLE;
131 }
Ashlesh Gawande32ec3fd2018-07-18 13:42:32 -0500132}
133
Ashlesh Gawande30d96e42021-03-21 19:15:33 -0700134#ifdef HAVE_CHRONOSYNC
Ashlesh Gawande32ec3fd2018-07-18 13:42:32 -0500135void
136SyncProtocolAdapter::onChronoSyncUpdate(const std::vector<chronosync::MissingDataInfo>& updates)
137{
138 NLSR_LOG_TRACE("Received ChronoSync update event");
139
140 for (const auto& update : updates) {
141 // Remove FIXED_SESSION
Alexander Afanasyev135288c2022-04-23 23:06:56 -0400142 m_syncUpdateCallback(update.session.getPrefix(-1), update.high, 0);
Ashlesh Gawande32ec3fd2018-07-18 13:42:32 -0500143 }
144}
Varun Patil7d2d6892022-10-14 12:50:30 -0700145#endif // HAVE_CHRONOSYNC
Ashlesh Gawande32ec3fd2018-07-18 13:42:32 -0500146
Varun Patil7d2d6892022-10-14 12:50:30 -0700147#ifdef HAVE_PSYNC
Ashlesh Gawande32ec3fd2018-07-18 13:42:32 -0500148void
149SyncProtocolAdapter::onPSyncUpdate(const std::vector<psync::MissingDataInfo>& updates)
150{
151 NLSR_LOG_TRACE("Received PSync update event");
152
153 for (const auto& update : updates) {
Alexander Afanasyev135288c2022-04-23 23:06:56 -0400154 m_syncUpdateCallback(update.prefix, update.highSeq, update.incomingFace);
Ashlesh Gawande32ec3fd2018-07-18 13:42:32 -0500155 }
156}
Varun Patil7d2d6892022-10-14 12:50:30 -0700157#endif // HAVE_PSYNC
158
159#ifdef HAVE_SVS
160void
161SyncProtocolAdapter::onSvsUpdate(const std::vector<ndn::svs::MissingDataInfo>& updates)
162{
163 NLSR_LOG_TRACE("Received SVS update event");
164
165 for (const auto& update : updates) {
166 m_syncUpdateCallback(update.nodeId, update.high, 0);
167 }
168}
169#endif // HAVE_SVS
Ashlesh Gawande32ec3fd2018-07-18 13:42:32 -0500170
Alexander Afanasyev135288c2022-04-23 23:06:56 -0400171} // namespace nlsr