FRR/ZEBRA Internals

ZAPI server-side (forcusing ZEBRA_ROUTE_ADD)

$ cat lib/zclient.h | grep "Zebra message types" -A 15
/* Zebra message types. */
typedef enum {
        ZEBRA_INTERFACE_ADD,
        ZEBRA_INTERFACE_DELETE,
        ZEBRA_INTERFACE_ADDRESS_ADD,
        ZEBRA_INTERFACE_ADDRESS_DELETE,
        ZEBRA_INTERFACE_UP,
        ZEBRA_INTERFACE_DOWN,
        ZEBRA_INTERFACE_SET_MASTER,
        ZEBRA_INTERFACE_SET_PROTODOWN,
        ZEBRA_ROUTE_ADD,
        ZEBRA_ROUTE_DELETE,
        ZEBRA_ROUTE_NOTIFY_OWNER,
        ZEBRA_REDISTRIBUTE_ADD,
        ZEBRA_REDISTRIBUTE_DELETE,
        ZEBRA_REDISTRIBUTE_DEFAULT_ADD,

$ cat zebra/zapi_msg.c | grep "void (\*zserv_handlers" -A 10
void (*zserv_handlers[])(ZAPI_HANDLER_ARGS) = {
        [ZEBRA_ROUTER_ID_ADD] = zread_router_id_add,
        [ZEBRA_ROUTER_ID_DELETE] = zread_router_id_delete,
        [ZEBRA_INTERFACE_ADD] = zread_interface_add,
        [ZEBRA_INTERFACE_DELETE] = zread_interface_delete,
        [ZEBRA_INTERFACE_SET_PROTODOWN] = zread_interface_set_protodown,
        [ZEBRA_ROUTE_ADD] = zread_route_add,
        [ZEBRA_ROUTE_DELETE] = zread_route_del,
        [ZEBRA_REDISTRIBUTE_ADD] = zebra_redistribute_add,
        [ZEBRA_REDISTRIBUTE_DELETE] = zebra_redistribute_delete,
        [ZEBRA_REDISTRIBUTE_DEFAULT_ADD] = zebra_redistribute_default_add,

$ cat zebra/zapi_msg.c | grep "static void zread_route_add" -A 10
static void zread_route_add(ZAPI_HANDLER_ARGS)
{
        struct stream *s;
        struct zapi_route api;
        struct zapi_nexthop *api_nh;
        afi_t afi;
        struct prefix_ipv6 *src_p = NULL;
        struct route_entry *re;
        struct nexthop *nexthop = NULL;
        int i, ret;
        vrf_id_t vrf_id = 0;
        ...
}

$ cat zebra/zserv.h | grep ZAPI_HANDLER_ARGS -A2
#define ZAPI_HANDLER_ARGS \
        struct zserv *client, struct zmsghdr *hdr, \
        struct stream *msg, struct zebra_vrf *zvrf

$ cat lib/zclient.h | grep "struct zmsghdr {" -A7
struct zmsghdr {
        uint16_t length;
        /* Always set to 255 in new zserv */
        uint8_t marker;
        uint8_t version;
        vrf_id_t vrf_id;
        uint16_t command;
};

ZAPI client-side (forcusing ZEBRA_ROUTE_ADD)

$ cat static_zebra.c | grep "extern void static_zebra_route_add(" -A10000 | less
extern void static_zebra_route_add(struct route_node *rn,
                                   struct static_route *si_changed,
                                   vrf_id_t vrf_id, safi_t safi, bool install)
{
        struct static_route *si = rn->info;
        const struct prefix *p, *src_pp;

        struct static_route *si = rn->info;
        const struct prefix *p, *src_pp;
        struct zapi_nexthop *api_nh;
        struct zapi_route api;
        uint32_t nh_num = 0;
...(snip)...
        zclient_route_send(install ?
                           ZEBRA_ROUTE_ADD : ZEBRA_ROUTE_DELETE,
                           zclient, &api);
}

$ cat lib/zclient.c  | grep zclient_route_send -A6
int zclient_route_send(uint8_t cmd, struct zclient *zclient,
                       struct zapi_route *api)
{
        if (zapi_route_encode(cmd, zclient->obuf, api) < 0)
                return -1;
        return zclient_send_message(zclient);
}

VTYSH

Building

./configure \
  --prefix=/usr --includedir=\${prefix}/include \
  --enable-exampledir=\${prefix}/share/doc/frr/examples \
  --bindir=\${prefix}/bin --sbindir=\${prefix}/lib/frr \
  --libdir=\${prefix}/lib/frr --libexecdir=\${prefix}/lib/frr \
  --localstatedir=/var/run/frr --sysconfdir=/etc/frr \
  --with-moduledir=\${prefix}/lib/frr/modules \
  --with-libyang-pluginsdir=\${prefix}/lib/frr/libyang_plugins \
  --enable-configfile-mask=0640 --enable-logfile-mask=0640 \
  --enable-snmp=agentx --enable-multipath=64 --enable-user=frr \
  --enable-group=frr --enable-vty-group=frrvty --with-pkg-git-version \
  --disable-ripd --disable-ripngd --disable-ospfd --disable-ospf6d \
  --disable-ldpd --disable-nhrpd --disable-eigrpd --disable-babeld \
  --disable-isisd --disable-pimd --disable-pbrd --disable-fabricd \
  --disable-vrrpd

daemons

bgpd=no
ospfd=no
ospf6d=no
ripd=no
ripngd=no
isisd=no
pimd=no
ldpd=no
nhrpd=no
eigrpd=no
babeld=no
sharpd=no
pbrd=no
bfdd=no
fabricd=no
vrrpd=no
vtysh_enable=yes
zebra_options="  -A 127.0.0.1 -s 90000000"
bgpd_options="   -A 127.0.0.1"
ospfd_options="  -A 127.0.0.1"
ospf6d_options=" -A ::1"
ripd_options="   -A 127.0.0.1"
ripngd_options=" -A ::1"
isisd_options="  -A 127.0.0.1"
pimd_options="   -A 127.0.0.1"
ldpd_options="   -A 127.0.0.1"
nhrpd_options="  -A 127.0.0.1"
eigrpd_options=" -A 127.0.0.1"
babeld_options=" -A 127.0.0.1"
sharpd_options=" -A 127.0.0.1"
pbrd_options="   -A 127.0.0.1"
staticd_options="-A 127.0.0.1"
bfdd_options="   -A 127.0.0.1"
fabricd_options="-A 127.0.0.1"
vrrpd_options="  -A 127.0.0.1"