]> git.puffer.fish Git - matthieu/frr.git/commitdiff
zebra, lib: send VRF backend to the client daemons
authorRenato Westphal <renato@opensourcerouting.org>
Sat, 19 Jan 2019 19:19:13 +0000 (17:19 -0200)
committerRenato Westphal <renato@opensourcerouting.org>
Tue, 19 Feb 2019 12:42:47 +0000 (09:42 -0300)
Add a new field in the ZEBRA_CAPABILITIES zapi message specifying
the VRF backend in use.

For simplicity, make the zclient code call vrf_configure_backend()
to apply the received value automatically instead of requiring
the daemons to do that themselves in their zebra_capabilities()
callbacks.

Additionally, call zebra_vrf_update_all() only after sending the
capabilities message to the client, so that it will know which VRF
backend is in use when processing the VRF messages.

This commit fixes a couple of bugs in the "interface" CLI command and
associated northbound callbacks, which behave differently depending
on the VRF backend in use. Before this commit, the vrf_backend
variable would always be set to VRF_BACKEND_NETNS in the client
daemons, even when zebra was started without the --vrfwnetns option.
This could lead to inconsistent behavior and subtle bugs under
specific circumstances.

Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
lib/zclient.c
zebra/zapi_msg.c
zebra/zserv.c

index cd7a279f1d622ca16d74a48548fa3e126d0ffd67..3e0c239360140593f78abfe296ba3db95cddbe21 100644 (file)
@@ -2371,8 +2371,12 @@ static void zclient_capability_decode(int command, struct zclient *zclient,
 {
        struct zclient_capabilities cap;
        struct stream *s = zclient->ibuf;
+       int vrf_backend;
        uint8_t mpls_enabled;
 
+       STREAM_GETL(s, vrf_backend);
+       vrf_configure_backend(vrf_backend);
+
        memset(&cap, 0, sizeof(cap));
        STREAM_GETC(s, mpls_enabled);
        cap.mpls_enabled = !!mpls_enabled;
index cd43d67ab4800756606873cf797f8c84912ae2b6..1875fa52579fdccfa3fb5b69dfe2b17cf3d53c08 100644 (file)
@@ -1656,6 +1656,7 @@ static void zsend_capabilities(struct zserv *client, struct zebra_vrf *zvrf)
        struct stream *s = stream_new(ZEBRA_MAX_PACKET_SIZ);
 
        zclient_create_header(s, ZEBRA_CAPABILITIES, zvrf->vrf->vrf_id);
+       stream_putl(s, vrf_get_backend());
        stream_putc(s, mpls_enabled);
        stream_putl(s, multipath_num);
 
@@ -1691,6 +1692,7 @@ static void zread_hello(ZAPI_HANDLER_ARGS)
        }
 
        zsend_capabilities(client, zvrf);
+       zebra_vrf_update_all(client);
 stream_failure:
        return;
 }
index 502186d226a2e4742d5164818b2ea9b2fdc3eccd..766dd54fb3467249c370e3312f71c286e346faf8 100644 (file)
@@ -723,8 +723,6 @@ static struct zserv *zserv_client_create(int sock)
                frr_pthread_new(&zclient_pthr_attrs, "Zebra API client thread",
                                "zebra_apic");
 
-       zebra_vrf_update_all(client);
-
        /* start read loop */
        zserv_client_event(client, ZSERV_CLIENT_READ);