142 lines
6.6 KiB
TeX
142 lines
6.6 KiB
TeX
\section{Link-State Database}
|
|
\label{sec:lsdb}
|
|
|
|
The Link-State Database (LSDB) holds LSA information distributed by
|
|
other routers in the network. The LSDB stores all types of LSAs and
|
|
will trigger events when a new LSA is added, updated, or expires. The
|
|
LSDB also handles LSA retrieval, performs LSA builds, and triggers
|
|
routing table calculations.
|
|
|
|
\subsection{Retrieving an LSA}
|
|
|
|
The LSDB provides the \texttt{Lsdb::expressInterest()} method as a
|
|
public interface to retrieve an LSA from the network. If LSA Data is
|
|
returned, the LSDB will validate the Data using the Validator
|
|
module. Then, it will perform the necessary LSDB modifications. If
|
|
the LSA Interest times out, the LSDB will retry until it reaches a
|
|
configurable maximum number of tries, or a configurable deadline
|
|
passes.
|
|
|
|
The LSDB uses the SegmentFetcher system to retrieve LSAs. LSAs very
|
|
often will exceed the maximum NDN packet size. In these cases, the LSA
|
|
needs to be split into segments to be sent, so the LSDB uses the
|
|
SegmentFetcher to send all LSAs. The SegmentFetcher can decide if the
|
|
data actually needs to be split.
|
|
|
|
\subsection{General Procedure}
|
|
|
|
The LSDB is responsible for building, installing, and publishing
|
|
NLSR's LSAs, as well as for installing and processing LSAs from other
|
|
NSLRs. Generally, the functions of the LSDB are:
|
|
\begin{itemize}
|
|
\item Schedule the building of an LSA.
|
|
\item Building the LSA.
|
|
\item Installing the LSA into the LSDB.
|
|
\end{itemize}
|
|
|
|
\subsection{Scheduling LSA Builds}
|
|
LSAs need to be rebuilt whenever the routing information NLSR has
|
|
changes. This includes events like neighbors becoming active, or when
|
|
a prefix for advertisement is inserted by the Prefix Update Processor,
|
|
which would cause an adjacency LSA or a name LSA rebuild,
|
|
respectively. To improve performance, instead of directly building
|
|
adjacency LSAs the first request schedules the build, and build requests
|
|
that occur after the scheduling but before the actual event are
|
|
aggregated (in other words, ignored), because they will be satisfied
|
|
by the already-scheduled build. Some specifics are shown below.
|
|
below.
|
|
\begin{itemize}
|
|
\item \textbf{Adjacency LSAs} -- will only be scheduled if link-state
|
|
routing is enabled. In particular, this means Adjacency LSA builds
|
|
will \emph{not} occur if hyperbolic routing is enabled. Note that
|
|
adjacency LSAs will be built if dry-run hyperbolic routing is
|
|
enabled, as the network is still using link-state routing to
|
|
calculate paths.
|
|
\end{itemize}
|
|
|
|
\subsection{Building LSAs}
|
|
Building LSAs has a part common to all LSAs and a part specific to
|
|
each LSA type. For example, all LSA types increment sequence number
|
|
and have the same expiration length, and of course come from the same
|
|
router. Additionally, all LSA builds cause a sync update
|
|
publishing. However, each type of LSA includes different data, to
|
|
represent different kinds of information that NLSR
|
|
has. (Section~\ref{sec:lsas}) In particular:
|
|
\begin{itemize}
|
|
\item \textbf{Adjacency LSAs} -- the number and a list of active
|
|
neighbors is included.
|
|
\item \textbf{Coordinate LSAs} -- the hyperbolic radius and all
|
|
hyperbolic angles are included.
|
|
\item \textbf{Name LSAs} -- the list of name prefixes that are
|
|
accessible at this router is included.
|
|
\end{itemize}
|
|
|
|
\subsection{Installing and Processing LSAs}
|
|
LSA installation procedure is mostly the same across any type of LSA,
|
|
but each type also has installation behavior specific to that type,
|
|
too. For any LSA type, we need to schedule an expiration event, and we
|
|
need to update several fields in the LSA. However, installing an
|
|
adjacency or coordinate LSA causes a Routing Table calculation, but a
|
|
name LSA does not, for example.
|
|
%%| Not yet true, but it should be true!
|
|
Additionally, the name of the origin router is added as a ``routable prefix'' in the NPT. (Section~\ref{sec:npt}).
|
|
\begin{itemize}
|
|
\item \textbf{Adjacency LSAs} -- each adjacency in the LSA will be
|
|
added as a ``routable prefix'' to the NPT. If the adjacencies have
|
|
changed since the last version of this LSA, a Routing Table
|
|
calculation needs to be scheduled, because the state of the
|
|
network has changed. Of course, this is necessarily true if the
|
|
LSA is new to us. Important to note is that we will also install
|
|
and process \emph{our own} adjacency LSA in this way.
|
|
\item \textbf{Coordinate LSAs} -- the router that the LSA is from
|
|
will be added as a ``routable prefix'' to the NPT. If the radius
|
|
and coordinates have changed since the last version of this LSA, a
|
|
Routing Table calculation needs to be scheduled, because the state
|
|
of the network has changed. As above, this is true for a new
|
|
LSA. This is only done if the LSA is from a foreign router.
|
|
\item \textbf{Name LSAs} -- each name prefix in the LSA will be
|
|
added to our NPT. This is only done if the LSA is from a foreign
|
|
router.
|
|
\end{itemize}
|
|
|
|
\subsection{LSA Expiration}
|
|
LSAs expire so that the network can clean up when a router
|
|
crashes. The amount of time an LSA lasts is configurable. When an LSA
|
|
expires, we refresh it if it's our LSA, and remove it from the LSDB if
|
|
not. There is a ``grace period'' window that is appended to the end of
|
|
the expiration period of all LSAs, to provide time for the originating
|
|
router to refresh the LSA and for it to propagate back to us. In all
|
|
expiration cases, the name of the origin router will be removed from
|
|
the NPT. What happens when an LSA is removed from the LSDB differs
|
|
based on the type of LSA:
|
|
\begin{itemize}
|
|
\item \textbf{Adjacency LSAs} -- a Routing Table calculation needs to occur,
|
|
since the state of the network has changed, at least from our
|
|
perspective.
|
|
\item \textbf{Coordinate LSAs} -- a Routing Table calculation needs to occur,
|
|
since the state of the network has changed, at least from our
|
|
perspective.
|
|
\item \textbf{Name LSAs} -- the name prefixes in the LSA are removed from the
|
|
NPT.
|
|
\end{itemize}
|
|
|
|
\subsection{LSA Refreshment}
|
|
NLSR will only refresh its own LSAs. Additionally, the procedure for refreshing an LSA is the same for all types:
|
|
\begin{itemize}
|
|
\item Increment the LSA sequence number
|
|
\item Schedule another expiration event. The length of time to wait
|
|
until refreshing is configurable, but it should probably be lower
|
|
than the expiration time that was set when building the LSA
|
|
initially. This prevents other routers from deleting our LSAs
|
|
because the network is slow, for instance. The length of time is set
|
|
by \texttt{lsa-refresh-time} in the configuration file.
|
|
\item Publish an update to sync
|
|
\end{itemize}
|
|
|
|
\begin{figure}[h]
|
|
\center
|
|
\includegraphics[width=0.5\linewidth]{figures/generic-lsdb-flow}
|
|
\label{fig:generic-lsdb-flow}
|
|
\caption{The general LSDB logic for each LSA type}
|
|
\end{figure}
|