Zebra Protocol
**************

Overview of the Zebra Protocol
==============================

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 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.  The protocol is versioned to allow for incompatible changes.  Version 0 is implicitely versioned.  Version 1 onwards 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 of 255 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.

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.  The version 1 header was introduced with Quagga 0.99.3.  The version 3 header was introduced with Quagga 1.0.20160309.

Zebra Protocol Definition
=========================

Zebra Protocol Header (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) |
     +-------------------------------+---------------+

Zebra Protocol Common Header (version 1 and 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 (2)          |   Marker (1)  | Version (1) |
     +-------------------------------+---------------+-------------+
     |          Command (2)          |
     +-------------------------------+

Zebra Protocol Common Header (version 3)
----------------------------------------

     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) |
     +-------------------------------+---------------+-------------+
     |          VRF ID  (2)          |        Command (2)          |
     +-------------------------------+-----------------------------+

Zebra Protocol Header Field Definitions
---------------------------------------

Length
     Total packet length including this header. The minimum length is 3 bytes for version 0 messages, 6 bytes for version 1 and 2 messages, and 8 bytes for version 3.

Marker
     Static marker with a value of 255 always. This is to allow version 0 Zserv headers (which do not include version explicitely) to be distinguished from versioned headers. Not present in version 0 messages.

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.

VRF ID
     Virtual Routing/Forwarding context ID, to which the message applies. Only present from version 3 onwards.

Command
     The Zebra Protocol 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_IPV4_ROUTE_ADD
7
ZEBRA_IPV4_ROUTE_DELETE
8
ZEBRA_IPV6_ROUTE_ADD
9
ZEBRA_IPV6_ROUTE_DELETE
10
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