lsa.hpp
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2014-2023, The University of Memphis,
4  * 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/>.
20  */
21 
22 #ifndef NLSR_LSA_LSA_HPP
23 #define NLSR_LSA_LSA_HPP
24 
25 #include "name-prefix-list.hpp"
26 #include "adjacent.hpp"
27 #include "adjacency-list.hpp"
28 #include "test-access-control.hpp"
29 
30 #include <ndn-cxx/util/scheduler.hpp>
31 
32 namespace nlsr {
33 
41 class Lsa
42 {
43 public:
44  class Error : public ndn::tlv::Error
45  {
46  public:
47  using ndn::tlv::Error::Error;
48  };
49 
50  enum class Type {
51  ADJACENCY,
52  COORDINATE,
53  NAME,
54  BASE
55  };
56 
57 protected:
58  Lsa(const ndn::Name& originRouter, uint64_t seqNo,
59  ndn::time::system_clock::time_point expirationTimePoint);
60 
61  Lsa() = default;
62 
63  Lsa(const Lsa& lsa);
64 
65 public:
66  virtual
67  ~Lsa() = default;
68 
69  virtual Type
70  getType() const = 0;
71 
72  void
73  setSeqNo(uint64_t seqNo)
74  {
75  m_seqNo = seqNo;
76  m_wire.reset();
77  }
78 
79  uint64_t
80  getSeqNo() const
81  {
82  return m_seqNo;
83  }
84 
85  const ndn::Name&
87  {
88  return m_originRouter;
89  }
90 
91  ndn::Name
93  {
94  return m_originRouter;
95  }
96 
97  const ndn::time::system_clock::time_point&
99  {
100  return m_expirationTimePoint;
101  }
102 
103  void
104  setExpirationTimePoint(const ndn::time::system_clock::time_point& lt)
105  {
107  m_wire.reset();
108  }
109 
110  void
111  setExpiringEventId(ndn::scheduler::EventId eid)
112  {
113  m_expiringEventId = eid;
114  }
115 
118  virtual std::string
119  toString() const = 0;
120 
121  virtual std::tuple<bool, std::list<ndn::Name>, std::list<ndn::Name>>
122  update(const std::shared_ptr<Lsa>& lsa) = 0;
123 
124  virtual const ndn::Block&
125  wireEncode() const = 0;
126 
127 protected:
128  template<ndn::encoding::Tag TAG>
129  size_t
130  wireEncode(ndn::EncodingImpl<TAG>& block) const;
131 
132  void
133  wireDecode(const ndn::Block& wire);
134 
135  std::string
136  getString() const;
137 
139  ndn::Name m_originRouter;
140  uint64_t m_seqNo = 0;
141  ndn::time::system_clock::time_point m_expirationTimePoint;
142  ndn::scheduler::ScopedEventId m_expiringEventId;
143 
144  mutable ndn::Block m_wire;
145 };
146 
148 
149 std::ostream&
150 operator<<(std::ostream& os, const Lsa::Type& type);
151 
152 std::istream&
153 operator>>(std::istream& is, Lsa::Type& type);
154 
155 } // namespace nlsr
156 
157 #endif // NLSR_LSA_LSA_HPP
Data abstraction for Lsa Lsa := LSA-TYPE TLV-LENGTH Name SequenceNumber ExpirationTimePoint.
Definition: lsa.hpp:42
virtual const ndn::Block & wireEncode() const =0
const ndn::Name & getOriginRouter() const
Definition: lsa.hpp:86
std::string getString() const
Definition: lsa.cpp:144
virtual Type getType() const =0
Lsa()=default
virtual ~Lsa()=default
void setExpiringEventId(ndn::scheduler::EventId eid)
Definition: lsa.hpp:111
uint64_t getSeqNo() const
Definition: lsa.hpp:80
uint64_t m_seqNo
Definition: lsa.hpp:140
ndn::time::system_clock::time_point m_expirationTimePoint
Definition: lsa.hpp:141
virtual std::tuple< bool, std::list< ndn::Name >, std::list< ndn::Name > > update(const std::shared_ptr< Lsa > &lsa)=0
ndn::Name getOriginRouterCopy() const
Definition: lsa.hpp:92
void setExpirationTimePoint(const ndn::time::system_clock::time_point &lt)
Definition: lsa.hpp:104
ndn::Block m_wire
Definition: lsa.hpp:144
ndn::scheduler::ScopedEventId m_expiringEventId
Definition: lsa.hpp:142
virtual std::string toString() const =0
void setSeqNo(uint64_t seqNo)
Definition: lsa.hpp:73
void wireDecode(const ndn::Block &wire)
Definition: lsa.cpp:68
ndn::Name m_originRouter
Definition: lsa.hpp:139
const ndn::time::system_clock::time_point & getExpirationTimePoint() const
Definition: lsa.hpp:98
Copyright (c) 2014-2020, The University of Memphis, Regents of the University of California.
NDN_CXX_DECLARE_WIRE_ENCODE_INSTANTIATIONS(Adjacent)
std::istream & operator>>(std::istream &is, Lsa::Type &type)
Definition: lsa.cpp:124
std::ostream & operator<<(std::ostream &os, const Adjacent &adjacent)
Definition: adjacent.cpp:176
#define PUBLIC_WITH_TESTS_ELSE_PROTECTED