]> git.puffer.fish Git - mirror/frr.git/commitdiff
*: Make zapi route install Notifications optional
authorDonald Sharp <sharpd@cumulusnetworks.com>
Thu, 9 Nov 2017 19:34:42 +0000 (14:34 -0500)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Mon, 27 Nov 2017 14:09:35 +0000 (09:09 -0500)
Allow the higher level protocol to specify if it would
like to receive notifications about it's routes that
it has installed.

I've purposely made it part of zclient_new_notify because
we need to track the routes on a per daemon basis only.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
22 files changed:
babeld/babel_zebra.c
bgpd/bgp_zebra.c
bgpd/rfapi/vnc_zebra.c
eigrpd/eigrp_zebra.c
isisd/isis_zebra.c
ldpd/lde.c
ldpd/ldp_zebra.c
lib/zclient.c
lib/zclient.h
nhrpd/nhrp_route.c
ospf6d/ospf6_zebra.c
ospfd/ospf_zebra.c
pimd/pim_zebra.c
pimd/pim_zlookup.c
ripd/rip_zebra.c
ripngd/ripng_zebra.c
tests/bgpd/test_mpath.c
tests/test_lblmgr.c
zebra/client_main.c
zebra/label_manager.c
zebra/zserv.c
zebra/zserv.h

index e7c27e8e21f3dbbf8363eac7c67e0c5b085650b1..8dea1431e2eb0429007bd1ac35128ab8043d1033 100644 (file)
@@ -237,7 +237,7 @@ babel_zebra_connected (struct zclient *zclient)
 
 void babelz_zebra_init(void)
 {
-    zclient = zclient_new(master);
+    zclient = zclient_new_notify(master, &zclient_options_default);
     zclient_init(zclient, ZEBRA_ROUTE_BABEL, 0, &babeld_privs);
 
     zclient->zebra_connected = babel_zebra_connected;
index b6bf008bae292eb1c1ea74d06087ff26ab5baf93..1cf04abfce69a32c7a9682133cdaaf5784aa9548 100644 (file)
@@ -1759,7 +1759,7 @@ void bgp_zebra_init(struct thread_master *master)
        zclient_num_connects = 0;
 
        /* Set default values. */
-       zclient = zclient_new(master);
+       zclient = zclient_new_notify(master, &zclient_options_default);
        zclient_init(zclient, ZEBRA_ROUTE_BGP, 0, &bgpd_privs);
        zclient->zebra_connected = bgp_zebra_connected;
        zclient->router_id_update = bgp_router_id_update;
index 478d3b5ac7669a9893fd90df6c91ccaffd032f90..5c71df238fe5951dc862e40326f302c3d2f11a91 100644 (file)
@@ -892,7 +892,7 @@ extern struct zebra_privs_t bgpd_privs;
 void vnc_zebra_init(struct thread_master *master)
 {
        /* Set default values. */
-       zclient_vnc = zclient_new(master);
+       zclient_vnc = zclient_new_notify(master, &zclient_options_default);
        zclient_init(zclient_vnc, ZEBRA_ROUTE_VNC, 0, &bgpd_privs);
 
        zclient_vnc->redistribute_route_add = vnc_zebra_read_route;
index 9076a50f57dfdcab97085f6b03975c7d2134c33e..b6e776f68a542aa0b66b7538d01f608314427c41 100644 (file)
@@ -101,7 +101,7 @@ static void eigrp_zebra_connected(struct zclient *zclient)
 
 void eigrp_zebra_init(void)
 {
-       zclient = zclient_new(master);
+       zclient = zclient_new_notify(master, &zclient_options_default);
 
        zclient_init(zclient, ZEBRA_ROUTE_EIGRP, 0, &eigrpd_privs);
        zclient->zebra_connected = eigrp_zebra_connected;
index c186dd56ad367cda2b922baa44ed70dca6d96c74..573b81591cf7f0122f26a25ed55bd3db8385fd8a 100644 (file)
@@ -411,7 +411,7 @@ static void isis_zebra_connected(struct zclient *zclient)
 
 void isis_zebra_init(struct thread_master *master)
 {
-       zclient = zclient_new(master);
+       zclient = zclient_new_notify(master, &zclient_options_default);
        zclient_init(zclient, ZEBRA_ROUTE_ISIS, 0, &isisd_privs);
        zclient->zebra_connected = isis_zebra_connected;
        zclient->router_id_update = isis_router_id_update_zebra;
index 8122b88cca3b1186288c35bfd87dc9d54a78468f..b597d967d7341c7ff71f5a9f8ae1aae60a7201c7 100644 (file)
@@ -1618,7 +1618,7 @@ static void
 zclient_sync_init(u_short instance)
 {
        /* Initialize special zclient for synchronous message exchanges. */
-       zclient_sync = zclient_new(master);
+       zclient_sync = zclient_new_notify(master, &zclient_options_default);
        zclient_sync->sock = -1;
        zclient_sync->redist_default = ZEBRA_ROUTE_LDP;
        zclient_sync->instance = instance;
index 8fe51cb9d18f03175bd98ae9bd0dcec2e01720b7..e703a9ff61adad1896e7c36e45f43b3e775ecf4e 100644 (file)
@@ -513,7 +513,7 @@ void
 ldp_zebra_init(struct thread_master *master)
 {
        /* Set default values. */
-       zclient = zclient_new(master);
+       zclient = zclient_new_notify(master, &zclient_options_default);
        zclient_init(zclient, ZEBRA_ROUTE_LDP, 0, &ldpd_privs);
 
        /* set callbacks */
index e769906012972cbb05a432483a33ecba6d53d79a..655e4e1a800ea7365e200efc29c3632d00d8d76a 100644 (file)
@@ -52,8 +52,11 @@ socklen_t zclient_addr_len;
 /* This file local debug flag. */
 int zclient_debug = 0;
 
+struct zclient_options zclient_options_default = { .receive_notify = false };
+
 /* Allocate zclient structure. */
-struct zclient *zclient_new(struct thread_master *master)
+struct zclient *zclient_new_notify(struct thread_master *master,
+                                  struct zclient_options *opt)
 {
        struct zclient *zclient;
        zclient = XCALLOC(MTYPE_ZCLIENT, sizeof(struct zclient));
@@ -63,6 +66,8 @@ struct zclient *zclient_new(struct thread_master *master)
        zclient->wb = buffer_new(0);
        zclient->master = master;
 
+       zclient->receive_notify = opt->receive_notify;
+
        return zclient;
 }
 
@@ -190,7 +195,7 @@ void zclient_reset(struct zclient *zclient)
  * @param zclient a pointer to zclient structure
  * @return socket fd just to make sure that connection established
  * @see zclient_init
- * @see zclient_new
+ * @see zclient_new_notify
  */
 int zclient_socket_connect(struct zclient *zclient)
 {
@@ -346,6 +351,11 @@ static int zebra_hello_send(struct zclient *zclient)
                zclient_create_header(s, ZEBRA_HELLO, VRF_DEFAULT);
                stream_putc(s, zclient->redist_default);
                stream_putw(s, zclient->instance);
+               if (zclient->receive_notify)
+                       stream_putc(s, 1);
+               else
+                       stream_putc(s, 0);
+
                stream_putw_at(s, 0, stream_get_endp(s));
                return zclient_send_message(zclient);
        }
index 025a3ac230d88dd88b4aefaed2c0bd26abb406ae..de580446712bb111b12451e85b7c332248b9b908 100644 (file)
@@ -138,6 +138,9 @@ struct zclient {
        /* Priviledges to change socket values */
        struct zebra_privs_t *privs;
 
+       /* Do we care about failure events for route install? */
+       bool receive_notify;
+
        /* Socket to zebra daemon. */
        int sock;
 
@@ -336,8 +339,25 @@ enum zapi_route_notify_owner {
 #define ZEBRA_MAC_TYPE_STICKY                0x01 /* Sticky MAC*/
 #define ZEBRA_MAC_TYPE_GW                    0x02 /* gateway (SVI) mac*/
 
+struct zclient_options {
+       bool receive_notify;
+};
+
 /* Prototypes of zebra client service functions. */
 extern struct zclient *zclient_new(struct thread_master *);
+
+#if CONFDATE > 20181101
+CPP_NOTICE("zclient_new_notify can take over or zclient_new now");
+#endif
+
+extern struct zclient_options zclient_options_default;
+
+extern struct zclient *zclient_new_notify(struct thread_master *m,
+                                         struct zclient_options *opt);
+
+#define zclient_new(A) zclient_new_notify((A), &zclient_options_default); \
+       CPP_WARN("Please transition to using zclient_new_notify");
+
 extern void zclient_init(struct zclient *, int, u_short, struct zebra_privs_t *privs);
 extern int zclient_start(struct zclient *);
 extern void zclient_stop(struct zclient *);
index 7701dcbb88eae5d3054c867aa1646e35b1822798..2612d8e045bef673a016620ed484da2334d072a8 100644 (file)
@@ -314,7 +314,7 @@ void nhrp_zebra_init(void)
        zebra_rib[AFI_IP] = route_table_init();
        zebra_rib[AFI_IP6] = route_table_init();
 
-       zclient = zclient_new(master);
+       zclient = zclient_new_notify(master, &zclient_options_default);
        zclient->zebra_connected = nhrp_zebra_connected;
        zclient->interface_add = nhrp_interface_add;
        zclient->interface_delete = nhrp_interface_delete;
index a900648236429cda8ee101575b2b77d7bae3a1a2..cc87c499ee50af6e502bf382aa7907365adae65e 100644 (file)
@@ -583,7 +583,7 @@ static void ospf6_zebra_connected(struct zclient *zclient)
 void ospf6_zebra_init(struct thread_master *master)
 {
        /* Allocate zebra structure. */
-       zclient = zclient_new(master);
+       zclient = zclient_new_notify(master, &zclient_options_default);
        zclient_init(zclient, ZEBRA_ROUTE_OSPF6, 0, &ospf6d_privs);
        zclient->zebra_connected = ospf6_zebra_connected;
        zclient->router_id_update = ospf6_router_id_update_zebra;
index 34ad6f65b0878a5f9e2c586b4f895756615e4781..66be29dbb417e6a591a078c501919d701d1ca8b0 100644 (file)
@@ -1475,7 +1475,7 @@ static void ospf_zebra_connected(struct zclient *zclient)
 void ospf_zebra_init(struct thread_master *master, u_short instance)
 {
        /* Allocate zebra structure. */
-       zclient = zclient_new(master);
+       zclient = zclient_new_notify(master, &zclient_options_default);
        zclient_init(zclient, ZEBRA_ROUTE_OSPF, instance, &ospfd_privs);
        zclient->zebra_connected = ospf_zebra_connected;
        zclient->router_id_update = ospf_router_id_update_zebra;
index 04466258bb3cccc2c71731832db21966a0b050c1..689e9a744987341ad4a968c073b9c4aeec4218f4 100644 (file)
@@ -748,7 +748,7 @@ void pim_zebra_init(void)
        int i;
 
        /* Socket for receiving updates from Zebra daemon */
-       zclient = zclient_new(master);
+       zclient = zclient_new_notify(master, &zclient_options_default);
 
        zclient->zebra_connected = pim_zebra_connected;
        zclient->router_id_update = pim_router_id_update_zebra;
index fd75a699b3bbdcddaeb531acdc4b6de999bf8ce8..bcaf4a38dd3cb99e9278725158c67f16b4e4f7cd 100644 (file)
@@ -120,7 +120,7 @@ void zclient_lookup_free(void)
 
 void zclient_lookup_new(void)
 {
-       zlookup = zclient_new(master);
+       zlookup = zclient_new_notify(master, &zclient_options_default);
        if (!zlookup) {
                zlog_err("%s: zclient_new() failure", __PRETTY_FUNCTION__);
                return;
index e479e2474dee8e65a2bb4ce7f8c65f7d54deaa7b..041635e1533d315ac329b0dffdddd8ba09e6d49c 100644 (file)
@@ -590,7 +590,7 @@ static void rip_zebra_connected(struct zclient *zclient)
 void rip_zclient_init(struct thread_master *master)
 {
        /* Set default value to the zebra client structure. */
-       zclient = zclient_new(master);
+       zclient = zclient_new_notify(master, &zclient_options_default);
        zclient_init(zclient, ZEBRA_ROUTE_RIP, 0, &ripd_privs);
        zclient->zebra_connected = rip_zebra_connected;
        zclient->interface_add = rip_interface_add;
index 084d58ee53927c3e3d9e2b510f1ed1cd51a6e56c..18a8d14f093e90c398ea8d86855c757a00f84220 100644 (file)
@@ -413,7 +413,7 @@ static void ripng_zebra_connected(struct zclient *zclient)
 void zebra_init(struct thread_master *master)
 {
        /* Allocate zebra structure. */
-       zclient = zclient_new(master);
+       zclient = zclient_new_notify(master, &zclient_options_default);
        zclient_init(zclient, ZEBRA_ROUTE_RIPNG, 0, &ripngd_privs);
 
        zclient->zebra_connected = ripng_zebra_connected;
index ccd3b6f4c2c99ee826dfe0100bf650d08e55bed7..247fcf7da0643f5c25bca14dd74debcbc553cdb9 100644 (file)
@@ -374,7 +374,7 @@ static int global_test_init(void)
 {
        qobj_init();
        master = thread_master_create(NULL);
-       zclient = zclient_new(master);
+       zclient = zclient_new_notify(master, &zclient_options_default);
        bgp_master_init(master);
        vrf_init(NULL, NULL, NULL, NULL);
        bgp_option_set(BGP_OPT_NO_LISTEN);
index 5e604db61a2a3c89a980fd975cdcb6ff71017473..b08f63b70f5df4020d6470b7ac9b1b74246e2628 100644 (file)
@@ -115,7 +115,7 @@ void init_zclient(struct thread_master *master, char *lm_zserv_path)
 {
        frr_zclient_addr(&zclient_addr, &zclient_addr_len, lm_zserv_path);
 
-       zclient = zclient_new(master);
+       zclient = zclient_new_notify(master, &zclient_options_default);
        /* zclient_init(zclient, ZEBRA_LABEL_MANAGER, 0); */
        zclient->sock = -1;
        zclient->redist_default = ZEBRA_ROUTE_LDP;
index 95b9d00dc0c0587a8687fd911e4e493650ae56aa..9b82e482616d333c6d1effc9515aed6692546e58 100644 (file)
@@ -184,7 +184,7 @@ int main(int argc, char **argv)
 
        master = thread_master_create(NULL);
        /* Establish connection to zebra. */
-       zclient = zclient_new(master);
+       zclient = zclient_new_notify(master, &zclient_options_default);
        zclient->enable = 1;
        zclient_socket_connect(zclient);
 
index 6fbb7517892e42e58dde6fb6ce05c6a4beb15f10..bf4522b70f52dcf2354866ec97921b9a7fd73b77 100644 (file)
@@ -221,7 +221,7 @@ static void lm_zclient_init(char *lm_zserv_path)
                                 lm_zserv_path);
 
        /* Set default values. */
-       zclient = zclient_new(zebrad.master);
+       zclient = zclient_new_notify(zebrad.master, &zclient_options_default);
        zclient->sock = -1;
        zclient->t_connect = NULL;
        lm_zclient_connect(NULL);
index f76490861dabc3da6f12e2d792fbd94e1d20deff..7b1839930ed4eb55be25d9658e944ee7e3e74d6d 100644 (file)
@@ -997,11 +997,14 @@ int zsend_route_notify_owner(u_char proto, vrf_id_t vrf_id,
        uint8_t blen;
 
        client = zebra_find_client(proto);
-       if (!client) {
-               if (IS_ZEBRA_DEBUG_PACKET)
-                       zlog_debug("Attempting to notify a client for proto: %u but did not find one",
-                                  proto);
-               return -1;
+       if (!client || !client->notify_owner) {
+               if (IS_ZEBRA_DEBUG_PACKET) {
+                       char buff[PREFIX_STRLEN];
+
+                       zlog_debug("Not Notifying Owner: %u about prefix %s",
+                                  proto, prefix2str(p, buff, sizeof(buff)));
+               }
+               return 0;
        }
 
        s = client->obuf;
@@ -1918,9 +1921,13 @@ static void zread_hello(struct zserv *client)
        /* type of protocol (lib/zebra.h) */
        u_char proto;
        u_short instance;
+       u_char notify;
 
        STREAM_GETC(client->ibuf, proto);
        STREAM_GETW(client->ibuf, instance);
+       STREAM_GETC(client->ibuf, notify);
+       if (notify)
+               client->notify_owner = true;
 
        /* accept only dynamic routing protocols */
        if ((proto < ZEBRA_ROUTE_MAX) && (proto > ZEBRA_ROUTE_STATIC)) {
index 9978c6d896b6a6f48a16903efe12f0f1c8942532..a62f1c89fc4adef6a0e708103840e04281383d7a 100644 (file)
@@ -75,6 +75,8 @@ struct zserv {
        /* Router-id information. */
        vrf_bitmap_t ridinfo;
 
+       bool notify_owner;
+
        /* client's protocol */
        u_char proto;
        u_short instance;