*: Make zapi route install Notifications optional

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>
This commit is contained in:
Donald Sharp 2017-11-09 14:34:42 -05:00
parent 7ea7b86e2b
commit e1a1880de3
22 changed files with 64 additions and 25 deletions

View 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;

View 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;

View 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;

View 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;

View 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;

View 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;

View 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 */

View 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);
}

View 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 *);

View 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;

View 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;

View 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;

View 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;

View 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;

View 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;

View 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;

View 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);

View 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;

View 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);

View 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);

View 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)) {

View 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;