blob: ec8dca5ced6ad75cae9103467ae81619f0581ebf [file] [log] [blame]
akmhoque3d06e792014-05-27 16:23:20 -05001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Nick Gordonfeae5572017-01-13 12:06:26 -06003 * Copyright (c) 2014-2017, The University of Memphis,
Vince Lehmanc2e51f62015-01-20 15:03:11 -06004 * Regents of the University of California,
5 * Arizona Board of Regents.
akmhoque3d06e792014-05-27 16:23:20 -05006 *
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/>.
akmhoque3d06e792014-05-27 16:23:20 -050020 **/
Vince Lehmanc2e51f62015-01-20 15:03:11 -060021
akmhoque53353462014-04-22 08:43:45 -050022#include "sync-logic-handler.hpp"
Vince Lehman0a7da612014-10-29 14:39:29 -050023#include "common.hpp"
Vince Lehman904c2412014-09-23 19:36:11 -050024#include "conf-parameter.hpp"
Vince Lehman904c2412014-09-23 19:36:11 -050025#include "lsa.hpp"
Vince Lehman904c2412014-09-23 19:36:11 -050026#include "utility/name-helper.hpp"
Nick Gordon9eac4d92017-08-29 17:31:29 -050027#include "logger.hpp"
Vince Lehman904c2412014-09-23 19:36:11 -050028
akmhoque53353462014-04-22 08:43:45 -050029namespace nlsr {
30
akmhoque674b0b12014-05-20 14:33:28 -050031INIT_LOGGER("SyncLogicHandler");
32
Ashlesh Gawande3e105a02017-05-16 17:36:56 -050033const std::string NLSR_COMPONENT = "NLSR";
34const std::string LSA_COMPONENT = "LSA";
Vince Lehman904c2412014-09-23 19:36:11 -050035
Alexander Afanasyev7c8882f2014-10-28 12:12:15 -070036template<class T>
37class NullDeleter
38{
39public:
40 void
41 operator()(T*)
42 {
43 }
44};
45
Nick Gordon9eac4d92017-08-29 17:31:29 -050046SyncLogicHandler::SyncLogicHandler(ndn::Face& face, const IsLsaNew& isLsaNew, ConfParameter& conf)
47 : onNewLsa(ndn::make_unique<OnNewLsa>())
48 , m_syncFace(face)
49 , m_isLsaNew(isLsaNew)
Vince Lehman0bcf9a32014-12-10 11:24:45 -060050 , m_confParam(conf)
Vince Lehman0bcf9a32014-12-10 11:24:45 -060051{
Vince Lehman0bcf9a32014-12-10 11:24:45 -060052}
53
akmhoque53353462014-04-22 08:43:45 -050054void
Vince Lehman9d097802015-03-16 17:55:59 -050055SyncLogicHandler::createSyncSocket(const ndn::Name& syncPrefix)
akmhoque53353462014-04-22 08:43:45 -050056{
Vince Lehman9d097802015-03-16 17:55:59 -050057 if (m_syncSocket != nullptr) {
dmcoomes5bcb39e2017-10-31 15:07:55 -050058 NLSR_LOG_WARN("Trying to create Sync socket, but Sync socket already exists");
Vince Lehman9d097802015-03-16 17:55:59 -050059 return;
60 }
61
62 m_syncPrefix = syncPrefix;
63
64 // Build LSA sync update prefix
65 buildUpdatePrefix();
66
dmcoomes5bcb39e2017-10-31 15:07:55 -050067 NLSR_LOG_DEBUG("Creating Sync socket. Sync Prefix: " << m_syncPrefix);
Vince Lehman904c2412014-09-23 19:36:11 -050068
69 // The face's lifetime is managed in main.cpp; SyncSocket should not manage the memory
70 // of the object
dmcoomes9f936662017-03-02 10:33:09 -060071 std::shared_ptr<ndn::Face> facePtr(&m_syncFace, NullDeleter<ndn::Face>());
Vince Lehman904c2412014-09-23 19:36:11 -050072
Ashlesh Gawande3e105a02017-05-16 17:36:56 -050073 m_syncSocket = std::make_shared<chronosync::Socket>(m_syncPrefix, m_nameLsaUserPrefix, *facePtr,
Nick Gordone98480b2017-05-24 11:23:03 -050074 std::bind(&SyncLogicHandler::onChronoSyncUpdate, this, _1));
Ashlesh Gawande3e105a02017-05-16 17:36:56 -050075
76 if (m_confParam.getHyperbolicState() == HYPERBOLIC_STATE_OFF) {
77 m_syncSocket->addSyncNode(m_adjLsaUserPrefix);
78 }
79 else {
80 m_syncSocket->addSyncNode(m_coorLsaUserPrefix);
81 }
akmhoque53353462014-04-22 08:43:45 -050082}
83
84void
Nick Gordone98480b2017-05-24 11:23:03 -050085SyncLogicHandler::onChronoSyncUpdate(const std::vector<chronosync::MissingDataInfo>& v)
akmhoque53353462014-04-22 08:43:45 -050086{
dmcoomes5bcb39e2017-10-31 15:07:55 -050087 NLSR_LOG_DEBUG("Received ChronoSync update event");
Vince Lehman904c2412014-09-23 19:36:11 -050088
89 for (size_t i = 0; i < v.size(); i++){
Ashlesh Gawande3e105a02017-05-16 17:36:56 -050090 ndn::Name updateName = v[i].session.getPrefix(-1);
Vince Lehman904c2412014-09-23 19:36:11 -050091
dmcoomes5bcb39e2017-10-31 15:07:55 -050092 NLSR_LOG_DEBUG("Update Name: " << updateName << " Seq no: " << v[i].high);
Vince Lehman904c2412014-09-23 19:36:11 -050093
Ashlesh Gawande3e105a02017-05-16 17:36:56 -050094 int32_t nlsrPosition = util::getNameComponentPosition(updateName, nlsr::NLSR_COMPONENT);
95 int32_t lsaPosition = util::getNameComponentPosition(updateName, nlsr::LSA_COMPONENT);
96
97 if (nlsrPosition < 0 || lsaPosition < 0) {
dmcoomes5bcb39e2017-10-31 15:07:55 -050098 NLSR_LOG_WARN("Received malformed sync update");
Ashlesh Gawande3e105a02017-05-16 17:36:56 -050099 return;
100 }
101
102 ndn::Name networkName = updateName.getSubName(1, nlsrPosition-1);
103 ndn::Name routerName = updateName.getSubName(lsaPosition + 1).getPrefix(-1);
104
105 ndn::Name originRouter = networkName;
106 originRouter.append(routerName);
107
108 processUpdateFromSync(originRouter, updateName, v[i].high);
akmhoque53353462014-04-22 08:43:45 -0500109 }
110}
111
112void
Ashlesh Gawande3e105a02017-05-16 17:36:56 -0500113SyncLogicHandler::processUpdateFromSync(const ndn::Name& originRouter,
114 const ndn::Name& updateName, const uint64_t& seqNo)
akmhoque53353462014-04-22 08:43:45 -0500115{
dmcoomes5bcb39e2017-10-31 15:07:55 -0500116 NLSR_LOG_DEBUG("Origin Router of update: " << originRouter);
akmhoque53353462014-04-22 08:43:45 -0500117
Nick Gordon0f1bf1d2017-06-22 15:40:27 -0500118 // A router should not try to fetch its own LSA
119 if (originRouter != m_confParam.getRouterPrefix()) {
Vince Lehman904c2412014-09-23 19:36:11 -0500120
Nick Gordon727d4832017-10-13 18:04:25 -0500121 Lsa::Type lsaType;
122 std::istringstream(updateName.get(updateName.size()-1).toUri()) >> lsaType;
Vince Lehman904c2412014-09-23 19:36:11 -0500123
dmcoomes5bcb39e2017-10-31 15:07:55 -0500124 NLSR_LOG_DEBUG("Received sync update with higher " << lsaType
Nick Gordon0f1bf1d2017-06-22 15:40:27 -0500125 << " sequence number than entry in LSDB");
126
Nick Gordon9eac4d92017-08-29 17:31:29 -0500127 if (m_isLsaNew(originRouter, lsaType, seqNo)) {
Nick Gordon727d4832017-10-13 18:04:25 -0500128 if (lsaType == Lsa::Type::ADJACENCY && seqNo != 0 &&
Nick Gordon0f1bf1d2017-06-22 15:40:27 -0500129 m_confParam.getHyperbolicState() == HYPERBOLIC_STATE_ON) {
dmcoomes5bcb39e2017-10-31 15:07:55 -0500130 NLSR_LOG_ERROR("Got an update for adjacency LSA when hyperbolic routing"
Nick Gordon0f1bf1d2017-06-22 15:40:27 -0500131 << " is enabled. Not going to fetch.");
132 return;
133 }
134
Nick Gordon727d4832017-10-13 18:04:25 -0500135 if (lsaType == Lsa::Type::COORDINATE && seqNo != 0 &&
Nick Gordon0f1bf1d2017-06-22 15:40:27 -0500136 m_confParam.getHyperbolicState() == HYPERBOLIC_STATE_OFF) {
dmcoomes5bcb39e2017-10-31 15:07:55 -0500137 NLSR_LOG_ERROR("Got an update for coordinate LSA when link-state"
Nick Gordon0f1bf1d2017-06-22 15:40:27 -0500138 << " is enabled. Not going to fetch.");
139 return;
140 }
Nick Gordon9eac4d92017-08-29 17:31:29 -0500141 (*onNewLsa)(updateName, seqNo);
Ashlesh Gawande3e105a02017-05-16 17:36:56 -0500142 }
akmhoque53353462014-04-22 08:43:45 -0500143 }
144}
145
Vince Lehman904c2412014-09-23 19:36:11 -0500146void
Nick Gordon727d4832017-10-13 18:04:25 -0500147SyncLogicHandler::publishRoutingUpdate(const Lsa::Type& type, const uint64_t& seqNo)
Vince Lehman904c2412014-09-23 19:36:11 -0500148{
Vince Lehman9d097802015-03-16 17:55:59 -0500149 if (m_syncSocket == nullptr) {
dmcoomes5bcb39e2017-10-31 15:07:55 -0500150 NLSR_LOG_FATAL("Cannot publish routing update; SyncSocket does not exist");
Vince Lehman9d097802015-03-16 17:55:59 -0500151
dmcoomes9f936662017-03-02 10:33:09 -0600152 BOOST_THROW_EXCEPTION(SyncLogicHandler::Error("Cannot publish routing update; SyncSocket does not exist"));
Vince Lehman9d097802015-03-16 17:55:59 -0500153 }
154
Nick Gordon727d4832017-10-13 18:04:25 -0500155
156 switch (type) {
157 case Lsa::Type::ADJACENCY:
Ashlesh Gawande3e105a02017-05-16 17:36:56 -0500158 publishSyncUpdate(m_adjLsaUserPrefix, seqNo);
Nick Gordon727d4832017-10-13 18:04:25 -0500159 break;
160 case Lsa::Type::COORDINATE:
Ashlesh Gawande3e105a02017-05-16 17:36:56 -0500161 publishSyncUpdate(m_coorLsaUserPrefix, seqNo);
Nick Gordon727d4832017-10-13 18:04:25 -0500162 break;
163 case Lsa::Type::NAME:
164 publishSyncUpdate(m_nameLsaUserPrefix, seqNo);
165 break;
166 default:
167 break;
Ashlesh Gawande3e105a02017-05-16 17:36:56 -0500168 }
Vince Lehman904c2412014-09-23 19:36:11 -0500169}
170
171void
Vince Lehmanc11cc202015-01-20 11:41:33 -0600172SyncLogicHandler::buildUpdatePrefix()
173{
Ashlesh Gawande3e105a02017-05-16 17:36:56 -0500174 ndn::Name updatePrefix = m_confParam.getLsaPrefix();
175 updatePrefix.append(m_confParam.getSiteName());
176 updatePrefix.append(m_confParam.getRouterName());
177
178 m_nameLsaUserPrefix = updatePrefix;
Nick Gordon727d4832017-10-13 18:04:25 -0500179 m_nameLsaUserPrefix.append(std::to_string(Lsa::Type::NAME));
Ashlesh Gawande3e105a02017-05-16 17:36:56 -0500180
181 m_adjLsaUserPrefix = updatePrefix;
Nick Gordon727d4832017-10-13 18:04:25 -0500182 m_adjLsaUserPrefix.append(std::to_string(Lsa::Type::ADJACENCY));
Ashlesh Gawande3e105a02017-05-16 17:36:56 -0500183
184 m_coorLsaUserPrefix = updatePrefix;
Nick Gordon727d4832017-10-13 18:04:25 -0500185 m_coorLsaUserPrefix.append(std::to_string(Lsa::Type::COORDINATE));
Vince Lehmanc11cc202015-01-20 11:41:33 -0600186}
187
188void
Vince Lehman904c2412014-09-23 19:36:11 -0500189SyncLogicHandler::publishSyncUpdate(const ndn::Name& updatePrefix, uint64_t seqNo)
190{
dmcoomes5bcb39e2017-10-31 15:07:55 -0500191 NLSR_LOG_DEBUG("Publishing Sync Update. Prefix: " << updatePrefix << " Seq No: " << seqNo);
Vince Lehman904c2412014-09-23 19:36:11 -0500192
akmhoque53353462014-04-22 08:43:45 -0500193 ndn::Name updateName(updatePrefix);
Nick Gordone98480b2017-05-24 11:23:03 -0500194 std::string data("NoData");
Vince Lehman904c2412014-09-23 19:36:11 -0500195
Ashlesh Gawande415676b2016-12-22 00:26:23 -0600196 m_syncSocket->publishData(reinterpret_cast<const uint8_t*>(data.c_str()), data.size(),
197 ndn::time::milliseconds(1000), seqNo, updateName);
akmhoque53353462014-04-22 08:43:45 -0500198}
199
Nick Gordonfad8e252016-08-11 14:21:38 -0500200} // namespace nlsr