summaryrefslogtreecommitdiff
path: root/doc/developer
diff options
context:
space:
mode:
Diffstat (limited to 'doc/developer')
-rw-r--r--doc/developer/building-frr-for-centos6.rst6
-rw-r--r--doc/developer/building-frr-for-ubuntu1804.rst2
-rw-r--r--doc/developer/building-libyang.rst20
-rw-r--r--doc/developer/conf.py2
-rw-r--r--doc/developer/index.rst1
-rw-r--r--doc/developer/maintainer-release-build.rst4
-rw-r--r--doc/developer/modules.rst6
-rw-r--r--doc/developer/next-hop-tracking.rst2
-rw-r--r--doc/developer/packaging-debian.rst4
-rw-r--r--doc/developer/packaging.rst1
-rw-r--r--doc/developer/process-architecture.rst4
-rw-r--r--doc/developer/vtysh.rst201
-rw-r--r--doc/developer/workflow.rst58
-rw-r--r--doc/developer/zebra.rst383
14 files changed, 575 insertions, 119 deletions
diff --git a/doc/developer/building-frr-for-centos6.rst b/doc/developer/building-frr-for-centos6.rst
index 5f9ce705f2..c57573cb9f 100644
--- a/doc/developer/building-frr-for-centos6.rst
+++ b/doc/developer/building-frr-for-centos6.rst
@@ -244,7 +244,7 @@ Load the modifed sysctl's on the system:
Add init.d startup files
^^^^^^^^^^^^^^^^^^^^^^^^
-.. code-block::
+.. code-block:: shell
sudo install -p -m 755 redhat/frr.init /etc/init.d/frr
sudo chkconfig --add frr
@@ -252,13 +252,13 @@ Add init.d startup files
Enable FRR daemon at startup
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-.. code-block::
+.. code-block:: shell
sudo chkconfig frr on
Start FRR manually (or reboot)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-.. code-block::
+.. code-block:: shell
sudo /etc/init.d/frr start
diff --git a/doc/developer/building-frr-for-ubuntu1804.rst b/doc/developer/building-frr-for-ubuntu1804.rst
index 2d1edc063d..e69ded8f73 100644
--- a/doc/developer/building-frr-for-ubuntu1804.rst
+++ b/doc/developer/building-frr-for-ubuntu1804.rst
@@ -115,7 +115,7 @@ Create empty FRR configuration files
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Although not strictly necessary, it's good practice to create empty
-configuration files _before_ starting FRR. This assures that the permissions
+configuration files _before_ starting FRR. This assures that the permissions
are correct. If the files are not already present, FRR will create them.
It's also important to consider _which_ files to create. FRR supports writing
diff --git a/doc/developer/building-libyang.rst b/doc/developer/building-libyang.rst
index 9757ad454e..005b6ba786 100644
--- a/doc/developer/building-libyang.rst
+++ b/doc/developer/building-libyang.rst
@@ -40,23 +40,3 @@ When building libyang on CentOS 6, it's also necessary to pass the
Note: please check the `libyang build requirements
<https://github.com/CESNET/libyang/blob/master/README.md#build-requirements>`_
first.
-
-Libyang uses loadable libraries an YANG modules. It supports
-environment variables to allow overriding the load paths for each of
-these. With FRR, this override currently must be done at the time of
-running FRR's configure command using new options. The new options are:
-
-.. code-block:: shell
-
- --with-yangmodelsdir=DIR
- yang models directory (${datarootdir}/yang)
- --with-libyang-pluginsdir=DIR
- yangmodule plugins directory
- (${libdir}/frr/libyang_plugins)
-
-an example which uses the compile directory is:
-
-.. code-block:: shell
-
- ./configure --with-libyang-pluginsdir="`pwd`/yang/libyang_plugins/.libs" \
- --with-yangmodelsdir="`pwd`/yang"
diff --git a/doc/developer/conf.py b/doc/developer/conf.py
index 61253c4b2f..254c9f6bfc 100644
--- a/doc/developer/conf.py
+++ b/doc/developer/conf.py
@@ -131,7 +131,7 @@ language = None
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
-exclude_patterns = ['_build']
+exclude_patterns = ['_build', 'building-libyang.rst']
# The reST default role (used for this markup: `text`) to use for all
# documents.
diff --git a/doc/developer/index.rst b/doc/developer/index.rst
index 42192db637..9838e1098c 100644
--- a/doc/developer/index.rst
+++ b/doc/developer/index.rst
@@ -12,3 +12,4 @@ FRRouting Developer's Guide
bgpd
ospf
zebra
+ vtysh
diff --git a/doc/developer/maintainer-release-build.rst b/doc/developer/maintainer-release-build.rst
index 907bd14ee6..85aaa5365a 100644
--- a/doc/developer/maintainer-release-build.rst
+++ b/doc/developer/maintainer-release-build.rst
@@ -1,5 +1,5 @@
-Release Build Procedure for FRR maintainers
-=========================================================
+Release Build Procedure for FRR Maintainers
+===========================================
1. Rename branch (if needed)
diff --git a/doc/developer/modules.rst b/doc/developer/modules.rst
index bde7682e4e..99c79462ab 100644
--- a/doc/developer/modules.rst
+++ b/doc/developer/modules.rst
@@ -103,9 +103,9 @@ standard entry point for loadable modules.
Command line parameters
-----------------------
-Command line parameters can be passed directly to a module by appending a
-colon to the module name when loading it, e.g. ``-M mymodule:myparameter``.
-The text after the colon will be accessible in the module's code through
+Command line parameters can be passed directly to a module by appending a
+colon to the module name when loading it, e.g. ``-M mymodule:myparameter``.
+The text after the colon will be accessible in the module's code through
``THIS_MODULE->load_args``. For example, see how the format parameter is
configured in the ``zfpm_init()`` function inside ``zebra_fpm.c``.
diff --git a/doc/developer/next-hop-tracking.rst b/doc/developer/next-hop-tracking.rst
index e6484102a8..a9af5e749c 100644
--- a/doc/developer/next-hop-tracking.rst
+++ b/doc/developer/next-hop-tracking.rst
@@ -269,7 +269,7 @@ RNH table::
O O
/ \
O O
-
+
struct rnh
{
uint8_t flags;
diff --git a/doc/developer/packaging-debian.rst b/doc/developer/packaging-debian.rst
index 4ea784c0fc..c812a38212 100644
--- a/doc/developer/packaging-debian.rst
+++ b/doc/developer/packaging-debian.rst
@@ -1,5 +1,5 @@
-Debian
-======
+Packaging Debian
+================
(Tested on Ubuntu 12.04, 14.04, 16.04, 17.10, 18.04, Debian 8 and 9)
diff --git a/doc/developer/packaging.rst b/doc/developer/packaging.rst
index e9bb3a5409..27e6e155fb 100644
--- a/doc/developer/packaging.rst
+++ b/doc/developer/packaging.rst
@@ -5,4 +5,5 @@ Packaging
.. toctree::
:maxdepth: 2
+ maintainer-release-build
packaging-debian
diff --git a/doc/developer/process-architecture.rst b/doc/developer/process-architecture.rst
index 806afa644c..6e0eb68188 100644
--- a/doc/developer/process-architecture.rst
+++ b/doc/developer/process-architecture.rst
@@ -118,7 +118,7 @@ The following diagram illustrates a simplified version of this infrastructure.
.. todo: replace these with SVG
.. figure:: ../figures/threadmaster-single.png
:align: center
-
+
Lifecycle of a program using a single threadmaster.
The series of "task" boxes represents the current ready task queue. The various
@@ -183,7 +183,7 @@ running their own ``threadmaster``-based event loop.
.. todo: replace these with SVG
.. figure:: ../figures/threadmaster-multiple.png
:align: center
-
+
Lifecycle of a program using multiple pthreads, each running their own
``threadmaster``
diff --git a/doc/developer/vtysh.rst b/doc/developer/vtysh.rst
new file mode 100644
index 0000000000..4a52eb0544
--- /dev/null
+++ b/doc/developer/vtysh.rst
@@ -0,0 +1,201 @@
+.. _vtysh:
+
+*****
+VTYSH
+*****
+
+.. seealso:: :ref:`command-line-interface`
+
+.. _vtysh-architecture:
+
+Architecture
+============
+
+VTYSH is a shell for FRR daemons. It amalgamates all the CLI commands defined
+in each of the daemons and presents them to the user in a single shell, which
+saves the user from having to telnet to each of the daemons and use their
+individual shells. The amalgamation is achieved by
+:ref:`extracting <vtysh-command-extraction>` commands from daemons and
+injecting them into VTYSH at build time.
+
+At runtime, VTYSH maintains an instance of a CLI mode tree just like each
+daemon. However, the mode tree in VTYSH contains (almost) all commands from
+every daemon in the same tree, whereas individual daemons have trees that only
+contain commands relevant to themselves. VTYSH also uses the library CLI
+facilities to maintain the user's current position in the tree (the current
+node). Note that this position must be synchronized with all daemons; if a
+daemon receives a command that causes it to change its current node, VTYSH must
+also change its node. Since the extraction script does not understand the
+handler code of commands, but only their definitions, this and other behaviors
+must be manually programmed into VTYSH for every case where the internal state
+of VTYSH must change in response to a command. Details on how this is done are
+discussed in the :ref:`vtysh-special-defuns` section.
+
+VTYSH also handles writing and applying the integrated configuration file,
+:file:`/etc/frr/frr.conf`. Since it has knowledge of the entire command space
+of FRR, it can intelligently distribute configuration commands only to the
+daemons that understand them. Similarly, when writing the configuration file it
+takes care of combining multiple instances of configuration blocks and
+simplifying the output. This is discussed in :ref:`vtysh-configuration`.
+
+.. _vtysh-command-extraction:
+
+Command Extraction
+------------------
+
+When VTYSH is a built, a Perl script named :file:`extract.pl` searches the FRR
+codebase looking for ``DEFUN``'s. It extracts these ``DEFUN``'s, transforms
+them into ``DEFSH``'s and appends them to ``vtysh_cmd.c``. Each ``DEFSH``
+contains the name of the command plus ``_vtysh``, as well as a flag that
+indicates which daemons the command was found in. When the command is executed
+in VTYSH, this flag is inspected to determine which daemons to send the command
+to. This way, commands are only sent to the daemons that know about them,
+avoiding spurious errors from daemons that don't have the command defined.
+
+The extraction script contains lots of hardcoded knowledge about what sources
+to look at and what flags to use for certain commands.
+
+.. _vtysh-special-defuns:
+
+Special DEFUNs
+--------------
+
+In addition to the vanilla ``DEFUN`` macro for defining CLI commands, there are
+several VTYSH-specific ``DEFUN`` variants that each serve different purposes.
+
+``DEFSH``
+ Used almost exclusively by generated VTYSH code. This macro defines a
+ ``cmd_element`` with no handler function; the command, when executed, is
+ simply forwarded to the daemons indicated in the daemon flag.
+
+``DEFUN_NOSH``
+ Used by daemons. Has the same expansion as a ``DEFUN``, but ``extract.pl``
+ will skip these definitions when extracting commands. This is typically used
+ when VTYSH must take some special action upon receiving the command, and the
+ programmer therefore needs to write VTYSH's copy of the command manually
+ instead of using the generated version.
+
+``DEFUNSH``
+ The same as ``DEFUN``, but with an argument that allows specifying the
+ ``->daemon`` field of the generated ``cmd_element``. This is used by VTYSH
+ to determine which daemons to send the command to.
+
+``DEFUNSH_ATTR``
+ A version of ``DEFUNSH`` that allows setting the ``->attr`` field of the
+ generated ``cmd_element``. Not used in practice.
+
+.. _vtysh-configuration:
+
+Configuration Management
+------------------------
+
+When integrated configuration is used, VTYSH manages writing, reading and
+applying the FRR configuration file. VTYSH can be made to read and apply an
+integrated configuration to all running daemons by launching it with ``-f
+<file>``. It sends the appropriate configuration lines to the relevant daemons
+in the same way that commands entered by the user on VTYSH's shell prompt are
+processed.
+
+Configuration writing is more complicated. VTYSH makes a best-effort attempt to
+combine and simplify the configuration as much as possible. A working example
+is best to explain this behavior.
+
+Example
+^^^^^^^
+
+Suppose we have just *staticd* and *zebra* running on the system, and use VTYSH
+to apply the following configuration snippet:
+
+.. code-block:: frr
+
+ !
+ vrf blue
+ ip protocol static route-map ExampleRoutemap
+ ip route 192.168.0.0/24 192.168.0.1
+ exit-vrf
+ !
+
+Note that *staticd* defines static route commands and *zebra* defines ``ip
+protocol`` commands. Therefore if we ask only *zebra* for its configuration, we
+get the following::
+
+ (config)# do sh running-config zebra
+ Building configuration...
+
+ ...
+ !
+ vrf blue
+ ip protocol static route-map ExampleRoutemap
+ exit-vrf
+ !
+ ...
+
+Note that the static route doesn't show up there. Similarly, if we ask
+*staticd* for its configuration, we get::
+
+ (config)# do sh running-config staticd
+
+ ...
+ !
+ vrf blue
+ ip route 192.168.0.0/24 192.168.0.1
+ exit-vrf
+ !
+ ...
+
+But when we display the configuration with VTYSH, we see::
+
+ ubuntu-bionic(config)# do sh running-config
+
+ ...
+ !
+ vrf blue
+ ip protocol static route-map ExampleRoutemap
+ ip route 192.168.0.0/24 192.168.0.1
+ exit-vrf
+ !
+ ...
+
+This is because VTYSH asks each daemon for its currently running configuration,
+and combines equivalent blocks together. In the above example, it combined the
+``vrf blue`` blocks from both *zebra* and *staticd* together into one. This is
+done in :file:`vtysh_config.c`.
+
+Protocol
+========
+
+VTYSH communicates with FRR daemons by way of domain socket. Each daemon
+creates its own socket, typically in :file:`/var/run/frr/<daemon>.vty`. The
+protocol is very simple. In the VTYSH to daemon direction, messages are simply
+NULL-terminated strings, whose content are CLI commands. Here is a typical
+message from VTYSH to a daemon:
+
+::
+
+ Request
+
+ 00000000: 646f 2077 7269 7465 2074 6572 6d69 6e61 do write termina
+ 00000010: 6c0a 00 l..
+
+
+The response format has some more data in it. First is a NULL-terminated string
+containing the plaintext response, which is just the output of the command that
+was sent in the request. This is displayed to the user. The plaintext response
+is followed by 3 null marker bytes, followed by a 1-byte status code that
+indicates whether the command was successful or not.
+
+::
+
+ Response
+
+ 0 1 2 3
+ 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Plaintext Response |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Marker (0x00) | Status Code |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+
+The first ``0x00`` byte in the marker also serves to terminate the plaintext
+response.
diff --git a/doc/developer/workflow.rst b/doc/developer/workflow.rst
index ee7592fd6a..543dfdd3b9 100644
--- a/doc/developer/workflow.rst
+++ b/doc/developer/workflow.rst
@@ -91,17 +91,63 @@ documentation and packaging systems will be updated to reflect the next
possible release name to allow for easy distinguishing.
After one month the development branch will be renamed to
-``stable/MAJOR.MINOR``. This process is not held up unless a crash or security
-issue has been found and needs to be addressed. Issues being fixed will not
-cause a delay.
+``stable/MAJOR.MINOR``. The branch is a stable branch. This process is not
+held up unless a crash or security issue has been found and needs to
+be addressed. Issues being fixed will not cause a delay.
Bugfix releases are made as needed at 1 month intervals until the next
-``MAJOR.MINOR`` relese branch is pulled. Depending on the severity of the bugs,
+``MAJOR.MINOR`` release branch is pulled. Depending on the severity of the bugs,
bugfix releases may occur sooner.
Bugfixes are applied to the two most recent releases. Security fixes are
-backported to all releases less than or equal to one year old. Security fixes
-may also be backported to older releases depending on severity.
+backported to all releases less than or equal to at least one year old. Security
+fixes may also be backported to older releases depending on severity.
+
+Long term support branches ( LTS )
+-----------------------------------------
+
+This kind of branch is not yet officially supported, and need experimentation
+before being effective.
+
+Previous definition of releases prevents long term support of previous releases.
+For instance, bug and security fixes are not applied if the stable branch is too
+old.
+
+Because the FRR users have a need to backport bug and security fixes after the
+stable branch becomes too old, there is a need to provide support on a long term
+basis on that stable branch. If that support is applied on that stable branch,
+then that branch is a long term support branch.
+
+Having a LTS branch requires extra-work and requires one person to be in charge
+of that maintenance branch for a certain amount of time. The amount of time will
+be by default set to 4 months, and can be increased. 4 months stands for the time
+between two releases, this time can be applied to the decision to continue with a
+LTS release or not. In all cases, that time period will be well-defined and
+published. Also, a self nomination from a person that proposes to handle the LTS
+branch is required. The work can be shared by multiple people. In all cases, there
+must be at least one person that is in charge of the maintenance branch. The person
+on people responsible for a maintenance branch must be a FRR maintainer. Note that
+they may choose to abandon support for the maintenance branch at any time. If
+noone takes over the responsibility of the LTS branch, then the support will be
+discontinued.
+
+The LTS branch duties are the following ones:
+
+- organise meetings on a (bi-)weekly or monthly basis, the handling of issues
+ and pull requested relative to that branch. When time permits, this may be done
+ during the regularly scheduled FRR meeting.
+
+- ensure the stability of the branch, by using and eventually adapting the
+ checking the CI tools of FRR ( indeed, maintaining may lead to create
+ maintenance branches for topotests or for CI).
+
+It will not be possible to backport feature requests to LTS branches. Actually, it
+is a false good idea to use LTS for that need. Introducing feature requests may
+break the paradigm where all more recent releases should also include the feature
+request. This would require the LTS maintainer to ensure that all more recent
+releases have support for this feature request. Moreover, introducing features
+requests may result in breaking the stability of the branch. LTS branches are first
+done to bring long term support for stability.
Changelog
---------
diff --git a/doc/developer/zebra.rst b/doc/developer/zebra.rst
index 1bf31e9624..f771d48235 100644
--- a/doc/developer/zebra.rst
+++ b/doc/developer/zebra.rst
@@ -9,108 +9,335 @@ Zebra
Overview of the Zebra Protocol
==============================
-Zebra Protocol is used by protocol daemons to communicate with the zebra
-daemon.
+The Zebra protocol is used by protocol daemons to communicate with the
+**zebra** daemon.
-Each protocol daemon may request and send information to and from the zebra
+Each protocol daemon may request and send information to and from the **zebra**
daemon such as interface states, routing state, nexthop-validation, and so on.
-Protocol daemons may also install routes with zebra. The zebra daemon manages
-which route is installed into the forwarding table with the kernel.
-
-Zebra Protocol is a streaming protocol, with a common header. Two versions of
-the header are in use. Version 0 is implicitely versioned. Version 1 has an
-explicit version field. Version 0 can be distinguished from all other versions
-by examining the 3rd byte of the header, which contains a marker value for all
-versions bar version 0. The marker byte corresponds to the command field in
-version 0, and the marker value is a reserved command in version 0.
-
-We do not anticipate there will be further versions of the header for the
-foreseeable future, as the command field in version 1 is wide enough to allow
-for future extensions to done compatibly through seperate commands.
-
-Version 0 is used by all versions of GNU Zebra as of this writing, and versions
-of Quagga up to and including Quagga 0.98. Version 2 was created for 0.99.21 of
-Quagga. Version 3 designates VRF compatibility and was released in 1.0.
-Version 4 will be used as of FRR 2.0 to indicate that we are a different
-Routing Suite now and to hopefully prevent accidental Quagga <-> FRR issues.
+Protocol daemons may also install routes with **zebra**. The **zebra** daemon
+manages which routes are installed into the forwarding table with the kernel.
-Zebra Protocol Definition
-=========================
+The Zebra protocol is a streaming protocol, with a common header. Version 0
+lacks a version field and is implicitly versioned. Version 1 and all subsequent
+versions have a version field. Version 0 can be distinguished from all other
+versions by examining the 3rd byte of the header, which contains a marker value
+of 255 (in Quagga) or 254 (in FRR) for all versions except version 0. The
+marker byte corresponds to the command field in version 0, and the marker value
+is a reserved command in version 0.
-Zebra Protocol Header (version 0)
-----------------------------------
+Version History
+---------------
-::
+- Version 0
- 0 1 2 3
- 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- +-------------------------------+---------------+
- | Length (2) | Command (1) |
- +-------------------------------+---------------+
+ Used by all versions of GNU Zebra and all version of Quagga up to and
+ including Quagga 0.98. This version has no ``version`` field, and so is
+ implicitly versioned as version 0.
+- Version 1
-Zebra Protocol Common Header (version 1)
-----------------------------------------
+ Added ``marker`` and ``version`` fields, increased ``command`` field to 16
+ bits. Used by Quagga versions 0.99.3 through 0.99.20.
-::
+- Version 2
+
+ Used by Quagga versions 0.99.21 through 0.99.23.
+
+- Version 3
+
+ Added ``vrf_id`` field. Used by Quagga versions 0.99.23 until FRR fork.
+
+- Version 4
+
+ Change marker value to 254 to prevent people mixing and matching Quagga and
+ FRR daemon binaries. Used by FRR versions 2.0 through 3.0.3.
+
+- Version 5
- 0 1 2 3
- 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- +-------------------------------+---------------+-------------+
- | Length (2) | Marker (1) | Version (1) |
- +-------------------------------+---------------+-------------+
- | Command (2) |
- +-------------------------------+
+ Increased VRF identifier field from 16 to 32 bits. Used by FRR versions 4.0
+ through 5.0.1.
+- Version 6
+
+ Removed the following commands:
+
+ * ZEBRA_IPV4_ROUTE_ADD
+ * ZEBRA_IPV4_ROUTE_DELETE
+ * ZEBRA_IPV6_ROUTE_ADD
+ * ZEBRA_IPV6_ROUTE_DELETE
+
+ Used since FRR version 6.0.
+
+
+Zebra Protocol Definition
+=========================
Zebra Protocol Header Field Definitions
---------------------------------------
Length
- Total packet length including this header. The minimum length is 3 bytes for
- version 0 messages and 6 bytes for version 1 messages.
+ Total packet length including this header.
Marker
- Static marker with a value of 255 always. This is to allow version 0 Zserv
- headers (which do not include version explicitly) to be distinguished from
- versioned headers. Not present in version 0 messages.
+ Static marker. The marker value, when it exists, is 255 in all versions of
+ Quagga. It is 254 in all versions of FRR. This is to allow version 0 headers
+ (which do not include version explicitly) to be distinguished from versioned
+ headers.
Version
- Version number of the Zserv message. Clients should not continue processing
- messages past the version field for versions they do not recognise. Not
- present in version 0 messages.
+ Zebra protocol version number. Clients should not continue processing
+ messages past the version field for versions they do not recognise.
Command
- The Zebra Protocol command.
+ The Zebra protocol command.
+
+
+Current Version
+^^^^^^^^^^^^^^^
+
+::
+
+ Version 5, 6
+
+ 0 1 2 3
+ 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Length | Marker | Version |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | VRF ID |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Command |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+
+Past Versions
+^^^^^^^^^^^^^
+
+::
+
+ Version 0
+
+ 0 1 2 3
+ 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Length | Command |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+::
+
+ Version 1, 2
+
+ 0 1 2 3
+ 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Length | Marker | Version |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Command |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+
+::
+
+ Version 3, 4
+
+ 0 1 2 3
+ 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Length | Marker | Version |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | VRF ID | Command |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Zebra Protocol Commands
-----------------------
-+-----------------------------------+-------+
-| Command | Value |
-+===================================+=======+
-| ZEBRA_INTERFACE_ADD | 1 |
-+-----------------------------------+-------+
-| ZEBRA_INTERFACE_DELETE | 2 |
-+-----------------------------------+-------+
-| ZEBRA_INTERFACE_ADDRESS_ADD | 3 |
-+-----------------------------------+-------+
-| ZEBRA_INTERFACE_ADDRESS_DELETE | 4 |
-+-----------------------------------+-------+
-| ZEBRA_INTERFACE_UP | 5 |
-+-----------------------------------+-------+
-| ZEBRA_INTERFACE_DOWN | 6 |
-+-----------------------------------+-------+
-| ZEBRA_REDISTRIBUTE_ADD | 11 |
-+-----------------------------------+-------+
-| ZEBRA_REDISTRIBUTE_DELETE | 12 |
-+-----------------------------------+-------+
-| ZEBRA_REDISTRIBUTE_DEFAULT_ADD | 13 |
-+-----------------------------------+-------+
-| ZEBRA_REDISTRIBUTE_DEFAULT_DELETE | 14 |
-+-----------------------------------+-------+
-| ZEBRA_IPV4_NEXTHOP_LOOKUP | 15 |
-+-----------------------------------+-------+
-| ZEBRA_IPV6_NEXTHOP_LOOKUP | 16 |
-+-----------------------------------+-------+
++------------------------------------+-------+
+| Command | Value |
++====================================+=======+
+| ZEBRA_INTERFACE_ADD | 0 |
++------------------------------------+-------+
+| ZEBRA_INTERFACE_DELETE | 1 |
++------------------------------------+-------+
+| ZEBRA_INTERFACE_ADDRESS_ADD | 2 |
++------------------------------------+-------+
+| ZEBRA_INTERFACE_ADDRESS_DELETE | 3 |
++------------------------------------+-------+
+| ZEBRA_INTERFACE_UP | 4 |
++------------------------------------+-------+
+| ZEBRA_INTERFACE_DOWN | 5 |
++------------------------------------+-------+
+| ZEBRA_INTERFACE_SET_MASTER | 6 |
++------------------------------------+-------+
+| ZEBRA_ROUTE_ADD | 7 |
++------------------------------------+-------+
+| ZEBRA_ROUTE_DELETE | 8 |
++------------------------------------+-------+
+| ZEBRA_ROUTE_NOTIFY_OWNER | 9 |
++------------------------------------+-------+
+| ZEBRA_REDISTRIBUTE_ADD | 10 |
++------------------------------------+-------+
+| ZEBRA_REDISTRIBUTE_DELETE | 11 |
++------------------------------------+-------+
+| ZEBRA_REDISTRIBUTE_DEFAULT_ADD | 12 |
++------------------------------------+-------+
+| ZEBRA_REDISTRIBUTE_DEFAULT_DELETE | 13 |
++------------------------------------+-------+
+| ZEBRA_ROUTER_ID_ADD | 14 |
++------------------------------------+-------+
+| ZEBRA_ROUTER_ID_DELETE | 15 |
++------------------------------------+-------+
+| ZEBRA_ROUTER_ID_UPDATE | 16 |
++------------------------------------+-------+
+| ZEBRA_HELLO | 17 |
++------------------------------------+-------+
+| ZEBRA_CAPABILITIES | 18 |
++------------------------------------+-------+
+| ZEBRA_NEXTHOP_REGISTER | 19 |
++------------------------------------+-------+
+| ZEBRA_NEXTHOP_UNREGISTER | 20 |
++------------------------------------+-------+
+| ZEBRA_NEXTHOP_UPDATE | 21 |
++------------------------------------+-------+
+| ZEBRA_INTERFACE_NBR_ADDRESS_ADD | 22 |
++------------------------------------+-------+
+| ZEBRA_INTERFACE_NBR_ADDRESS_DELETE | 23 |
++------------------------------------+-------+
+| ZEBRA_INTERFACE_BFD_DEST_UPDATE | 24 |
++------------------------------------+-------+
+| ZEBRA_IMPORT_ROUTE_REGISTER | 25 |
++------------------------------------+-------+
+| ZEBRA_IMPORT_ROUTE_UNREGISTER | 26 |
++------------------------------------+-------+
+| ZEBRA_IMPORT_CHECK_UPDATE | 27 |
++------------------------------------+-------+
+| ZEBRA_BFD_DEST_REGISTER | 28 |
++------------------------------------+-------+
+| ZEBRA_BFD_DEST_DEREGISTER | 29 |
++------------------------------------+-------+
+| ZEBRA_BFD_DEST_UPDATE | 30 |
++------------------------------------+-------+
+| ZEBRA_BFD_DEST_REPLAY | 31 |
++------------------------------------+-------+
+| ZEBRA_REDISTRIBUTE_ROUTE_ADD | 32 |
++------------------------------------+-------+
+| ZEBRA_REDISTRIBUTE_ROUTE_DEL | 33 |
++------------------------------------+-------+
+| ZEBRA_VRF_UNREGISTER | 34 |
++------------------------------------+-------+
+| ZEBRA_VRF_ADD | 35 |
++------------------------------------+-------+
+| ZEBRA_VRF_DELETE | 36 |
++------------------------------------+-------+
+| ZEBRA_VRF_LABEL | 37 |
++------------------------------------+-------+
+| ZEBRA_INTERFACE_VRF_UPDATE | 38 |
++------------------------------------+-------+
+| ZEBRA_BFD_CLIENT_REGISTER | 39 |
++------------------------------------+-------+
+| ZEBRA_BFD_CLIENT_DEREGISTER | 40 |
++------------------------------------+-------+
+| ZEBRA_INTERFACE_ENABLE_RADV | 41 |
++------------------------------------+-------+
+| ZEBRA_INTERFACE_DISABLE_RADV | 42 |
++------------------------------------+-------+
+| ZEBRA_IPV3_NEXTHOP_LOOKUP_MRIB | 44 |
++------------------------------------+-------+
+| ZEBRA_INTERFACE_LINK_PARAMS | 44 |
++------------------------------------+-------+
+| ZEBRA_MPLS_LABELS_ADD | 45 |
++------------------------------------+-------+
+| ZEBRA_MPLS_LABELS_DELETE | 46 |
++------------------------------------+-------+
+| ZEBRA_IPMR_ROUTE_STATS | 47 |
++------------------------------------+-------+
+| ZEBRA_LABEL_MANAGER_CONNECT | 48 |
++------------------------------------+-------+
+| ZEBRA_LABEL_MANAGER_CONNECT_ASYNC | 49 |
++------------------------------------+-------+
+| ZEBRA_GET_LABEL_CHUNK | 50 |
++------------------------------------+-------+
+| ZEBRA_RELEASE_LABEL_CHUNK | 51 |
++------------------------------------+-------+
+| ZEBRA_FEC_REGISTER | 52 |
++------------------------------------+-------+
+| ZEBRA_FEC_UNREGISTER | 53 |
++------------------------------------+-------+
+| ZEBRA_FEC_UPDATE | 54 |
++------------------------------------+-------+
+| ZEBRA_ADVERTISE_DEFAULT_GW | 55 |
++------------------------------------+-------+
+| ZEBRA_ADVERTISE_SUBNET | 56 |
++------------------------------------+-------+
+| ZEBRA_ADVERTISE_ALL_VNI | 57 |
++------------------------------------+-------+
+| ZEBRA_LOCAL_ES_ADD | 58 |
++------------------------------------+-------+
+| ZEBRA_LOCAL_ES_DEL | 59 |
++------------------------------------+-------+
+| ZEBRA_VNI_ADD | 60 |
++------------------------------------+-------+
+| ZEBRA_VNI_DEL | 61 |
++------------------------------------+-------+
+| ZEBRA_L2VNI_ADD | 63 |
++------------------------------------+-------+
+| ZEBRA_L2VNI_DEL | 64 |
++------------------------------------+-------+
+| ZEBRA_REMOTE_VTEP_ADD | 64 |
++------------------------------------+-------+
+| ZEBRA_REMOTE_VTEP_DEL | 65 |
++------------------------------------+-------+
+| ZEBRA_MACIP_ADD | 66 |
++------------------------------------+-------+
+| ZEBRA_MACIP_DEL | 67 |
++------------------------------------+-------+
+| ZEBRA_IP_PREFIX_ROUTE_ADD | 68 |
++------------------------------------+-------+
+| ZEBRA_IP_PREFIX_ROUTE_DEL | 69 |
++------------------------------------+-------+
+| ZEBRA_REMOTE_MACIP_ADD | 70 |
++------------------------------------+-------+
+| ZEBRA_REMOTE_MACIP_DEL | 71 |
++------------------------------------+-------+
+| ZEBRA_PW_ADD | 72 |
++------------------------------------+-------+
+| ZEBRA_PW_DELETE | 73 |
++------------------------------------+-------+
+| ZEBRA_PW_SET | 74 |
++------------------------------------+-------+
+| ZEBRA_PW_UNSET | 75 |
++------------------------------------+-------+
+| ZEBRA_PW_STATUS_UPDATE | 76 |
++------------------------------------+-------+
+| ZEBRA_RULE_ADD | 77 |
++------------------------------------+-------+
+| ZEBRA_RULE_DELETE | 78 |
++------------------------------------+-------+
+| ZEBRA_RULE_NOTIFY_OWNER | 79 |
++------------------------------------+-------+
+| ZEBRA_TABLE_MANAGER_CONNECT | 80 |
++------------------------------------+-------+
+| ZEBRA_GET_TABLE_CHUNK | 81 |
++------------------------------------+-------+
+| ZEBRA_RELEASE_TABLE_CHUNK | 82 |
++------------------------------------+-------+
+| ZEBRA_IPSET_CREATE | 83 |
++------------------------------------+-------+
+| ZEBRA_IPSET_DESTROY | 84 |
++------------------------------------+-------+
+| ZEBRA_IPSET_ENTRY_ADD | 85 |
++------------------------------------+-------+
+| ZEBRA_IPSET_ENTRY_DELETE | 86 |
++------------------------------------+-------+
+| ZEBRA_IPSET_NOTIFY_OWNER | 87 |
++------------------------------------+-------+
+| ZEBRA_IPSET_ENTRY_NOTIFY_OWNER | 88 |
++------------------------------------+-------+
+| ZEBRA_IPTABLE_ADD | 89 |
++------------------------------------+-------+
+| ZEBRA_IPTABLE_DELETE | 90 |
++------------------------------------+-------+
+| ZEBRA_IPTABLE_NOTIFY_OWNER | 91 |
++------------------------------------+-------+
+| ZEBRA_VXLAN_FLOOD_CONTROL | 92 |
++------------------------------------+-------+