summaryrefslogtreecommitdiff
path: root/doc/developer
diff options
context:
space:
mode:
Diffstat (limited to 'doc/developer')
-rw-r--r--doc/developer/conf.py33
-rw-r--r--doc/developer/ospf-ls-retrans.rst69
-rw-r--r--doc/developer/ospf.rst1
-rw-r--r--doc/developer/packaging-debian.rst2
-rw-r--r--doc/developer/packaging-redhat.rst31
-rw-r--r--doc/developer/workflow.rst10
6 files changed, 117 insertions, 29 deletions
diff --git a/doc/developer/conf.py b/doc/developer/conf.py
index 495c604ae0..6a3ffe1638 100644
--- a/doc/developer/conf.py
+++ b/doc/developer/conf.py
@@ -18,6 +18,7 @@ import re
import pygments
from sphinx.highlighting import lexers
from sphinx.util import logging
+
logger = logging.getLogger(__name__)
# If extensions (or modules to document with autodoc) are in another directory,
@@ -53,18 +54,18 @@ source_suffix = ".rst"
master_doc = "index"
# General information about the project.
-project = u"FRR"
-copyright = u"2017, FRR"
-author = u"FRR authors"
+project = "FRR"
+copyright = "2017, FRR"
+author = "FRR authors"
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
# The short X.Y version.
-version = u"?.?"
+version = "?.?"
# The full version, including alpha/beta/rc tags.
-release = u"?.?-?"
+release = "?.?-?"
# -----------------------------------------------------------------------------
@@ -287,7 +288,7 @@ latex_elements = {
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [
- (master_doc, "FRR.tex", u"FRR Developer's Manual", u"FRR", "manual"),
+ (master_doc, "FRR.tex", "FRR Developer's Manual", "FRR", "manual"),
]
# The name of an image file (relative to this directory) to place at the top of
@@ -315,7 +316,7 @@ latex_logo = "../figures/frr-logo-medium.png"
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
-man_pages = [(master_doc, "frr", u"FRR Developer's Manual", [author], 1)]
+man_pages = [(master_doc, "frr", "FRR Developer's Manual", [author], 1)]
# If true, show URL addresses after external links.
# man_show_urls = False
@@ -330,7 +331,7 @@ texinfo_documents = [
(
master_doc,
"frr",
- u"FRR Developer's Manual",
+ "FRR Developer's Manual",
author,
"FRR",
"One line description of project.",
@@ -358,27 +359,29 @@ texinfo_documents = [
with open("../extra/frrlexer.py", "rb") as lex:
frrlexerpy = lex.read()
-frrfmt_re = re.compile(r'^\s*%(?P<spec>[^\s]+)\s+\((?P<types>.*)\)\s*$')
+frrfmt_re = re.compile(r"^\s*%(?P<spec>[^\s]+)\s+\((?P<types>.*)\)\s*$")
+
def parse_frrfmt(env, text, node):
from sphinx import addnodes
m = frrfmt_re.match(text)
if not m:
- logger.warning('could not parse frrfmt:: %r' % (text), location=node)
+ logger.warning("could not parse frrfmt:: %r" % (text), location=node)
node += addnodes.desc_name(text, text)
return text
- spec, types = m.group('spec'), m.group('types')
+ spec, types = m.group("spec"), m.group("types")
- node += addnodes.desc_sig_operator('%', '%')
- node += addnodes.desc_name(spec + ' ', spec + ' ')
+ node += addnodes.desc_sig_operator("%", "%")
+ node += addnodes.desc_name(spec + " ", spec + " ")
plist = addnodes.desc_parameterlist()
- for typ in types.split(','):
+ for typ in types.split(","):
typ = typ.strip()
plist += addnodes.desc_parameter(typ, typ)
node += plist
- return '%' + spec
+ return "%" + spec
+
# custom extensions here
def setup(app):
diff --git a/doc/developer/ospf-ls-retrans.rst b/doc/developer/ospf-ls-retrans.rst
new file mode 100644
index 0000000000..230d7a1c5d
--- /dev/null
+++ b/doc/developer/ospf-ls-retrans.rst
@@ -0,0 +1,69 @@
+OSPF Neighor Retransmission List
+================================
+
+Overview
+--------
+
+OSPF neighbor link-state retransmission lists are implemented using
+both a sparse Link State Database (LSDB) and a doubly-linked list.
+Rather than previous per-neighbor periodic timer, a per-neighbor
+timer is set to the expiration time of the next scheduled LSA
+retransmission.
+
+Sparse Link State Database (LSDB)
+---------------------------------
+
+When an explicit or implied acknowledgment is recieved from a
+neighbor in 2-way state or higher, the acknowledge LSA must be
+removed from the neighbor's link state retransmission list. In order
+to do this efficiently, a sparse LSDB is utilized. LSDB entries also
+include a pointer to the corresponding list entry so that it may be
+efficiently removed from the doubly-linked list.
+
+The sparse LSDB is implemented using the OSPF functions is
+ospf_lsdb.[c,h]. OSPF LSDBs are implemented as an array of route
+tables (lib/table.[c,h]). What is unique of the LS Retransmission
+list LSDB is that each entry also has a pointer into the doubly-linked
+list to facilitate fast deletions.
+
+Doubly-Linked List
+------------------
+
+In addition to the sparse LSDB, LSAs on a neighbor LS retransmission
+list are also maintained in a linked-list order chronologically
+with the LSA scheduled for the next retransmission at the head of
+the list.
+
+The doubly-link list is implemented using the dlist macros in
+lib/typesafe.h.
+
+LSA LS Retransmission List Addition
+------------------------------------
+
+When an LSA is added to a neighbor retransmission list, it is
+added to both the sparse LSDB and the doubly-linked list with a pointer
+in the LSDB route-table node to the list entry. The LSA is added to
+the tail of the list with the expiration time set to the current time
+with the retransmission interval added. If the neighbor retransmission
+timer is not set, it is set to expire at the time of the newly added
+LSA.
+
+LSA LS Retransmission List Deletion
+-----------------------------------
+
+When an LSA is deleted from a neighbor retransmission list, it is
+deleted from eboth the sparse LSDB and the doubly-linked list with the
+pointer the LSDB route-table node used to efficiently delete the entry
+from the list. If the LSA at the head of the list was removed, then
+the neighbor retransmission timer is reset to the expiration of the
+LSA at the head of the list or canceled if the list is empty.
+
+Neighbor LS Retransmission List Expiration
+------------------------------------------
+
+When the neighbor retransmission timer expires, the LSA at the top of
+list and any in a configured window (e.g., 50 milliseconds) are
+retransmitted. The LSAs that have been retransmitted are removed from
+the list and readded to the tail of the list with a new expiration time
+which is retransmit-interval seconds in the future.
+
diff --git a/doc/developer/ospf.rst b/doc/developer/ospf.rst
index 837a0bd185..da4802533c 100644
--- a/doc/developer/ospf.rst
+++ b/doc/developer/ospf.rst
@@ -8,6 +8,7 @@ OSPFD
:maxdepth: 2
ospf-api
+ ospf-ls-retrans
ospf-sr
cspf
diff --git a/doc/developer/packaging-debian.rst b/doc/developer/packaging-debian.rst
index c2c3b7e7e1..4109057ee5 100644
--- a/doc/developer/packaging-debian.rst
+++ b/doc/developer/packaging-debian.rst
@@ -68,6 +68,8 @@ buster.)
+----------------+-------------------+-----------------------------------------+
| pkg.frr.pim6d | pkg.frr.nopim6d | builds pim6d (default enabled) |
+----------------+-------------------+-----------------------------------------+
+ | pkg.frr.grpc | pkg.frr.nogrpc | builds with grpc support (default: no) |
+ +----------------+-------------------+-----------------------------------------+
* the ``-uc -us`` options to disable signing the packages with your GPG key
diff --git a/doc/developer/packaging-redhat.rst b/doc/developer/packaging-redhat.rst
index d88f449926..8037873461 100644
--- a/doc/developer/packaging-redhat.rst
+++ b/doc/developer/packaging-redhat.rst
@@ -67,24 +67,27 @@ Tested on CentOS 6, CentOS 7, CentOS 8 and Fedora 24.
############### FRRouting (FRR) configure options #################
# with-feature options
- %{!?with_pam: %global with_pam 0 }
- %{!?with_ospfclient: %global with_ospfclient 1 }
- %{!?with_ospfapi: %global with_ospfapi 1 }
- %{!?with_irdp: %global with_irdp 1 }
- %{!?with_rtadv: %global with_rtadv 1 }
+ %{!?with_babeld: %global with_babeld 1 }
+ %{!?with_bfdd: %global with_bfdd 1 }
+ %{!?with_bgp_vnc: %global with_bgp_vnc 0 }
+ %{!?with_cumulus: %global with_cumulus 0 }
+ %{!?with_eigrpd: %global with_eigrpd 1 }
+ %{!?with_fpm: %global with_fpm 1 }
+ %{!?with_mgmtd_test_be_client: %global with_mgmtd_test_be_client 0 }
%{!?with_ldpd: %global with_ldpd 1 }
- %{!?with_nhrpd: %global with_nhrpd 1 }
- %{!?with_eigrp: %global with_eigrpd 1 }
- %{!?with_shared: %global with_shared 1 }
%{!?with_multipath: %global with_multipath 256 }
- %{!?frr_user: %global frr_user frr }
- %{!?vty_group: %global vty_group frrvty }
- %{!?with_fpm: %global with_fpm 0 }
- %{!?with_watchfrr: %global with_watchfrr 1 }
- %{!?with_bgp_vnc: %global with_bgp_vnc 0 }
+ %{!?with_nhrpd: %global with_nhrpd 1 }
+ %{!?with_ospfapi: %global with_ospfapi 1 }
+ %{!?with_ospfclient: %global with_ospfclient 1 }
+ %{!?with_pam: %global with_pam 0 }
+ %{!?with_pbrd: %global with_pbrd 1 }
%{!?with_pimd: %global with_pimd 1 }
%{!?with_pim6d: %global with_pim6d 1 }
- %{!?with_rpki: %global with_rpki 0 }
+ %{!?with_vrrpd: %global with_vrrpd 1 }
+ %{!?with_rtadv: %global with_rtadv 1 }
+ %{!?with_watchfrr: %global with_watchfrr 1 }
+ %{!?with_pathd: %global with_pathd 1 }
+ %{!?with_grpc: %global with_grpc 0 }
8. Build the RPM::
diff --git a/doc/developer/workflow.rst b/doc/developer/workflow.rst
index f720f6279e..166c96da33 100644
--- a/doc/developer/workflow.rst
+++ b/doc/developer/workflow.rst
@@ -1306,6 +1306,16 @@ MemorySanitizer
to ``configure``.
+UndefinedSanitizer
+ Similar to AddressSanitizer, this tool provides runtime instrumentation for
+ detecting use of undefined behavior in C. Testing your own code with this
+ tool before submission is encouraged. You can enable it by passing::
+
+ --enable-undefined-sanitizer
+
+ to ``configure``. If you run FRR with this you will probably also have
+ to set ``sudo sysctl vm.mmap_rnd_bits=28``
+
All of the above tools are available in the Clang/LLVM toolchain since 3.4.
AddressSanitizer and ThreadSanitizer are available in recent versions of GCC,
but are no longer actively maintained. MemorySanitizer is not available in GCC.