summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDonald Sharp <donaldsharp72@gmail.com>2023-11-25 09:15:07 -0500
committerGitHub <noreply@github.com>2023-11-25 09:15:07 -0500
commit0dc7704fd50a035c85dea58408abea80c4816f15 (patch)
tree213419de02df4c18b899c5daebc249a5f243fd3a
parentca8fb16192537973033913a57f583adcffb13cce (diff)
parent5a40f2b0e75bbb43c0d6e2f9cfe190dfaa61f386 (diff)
Merge pull request #14867 from opensourcerouting/zclient-options-cleanup
*: clean up `zclient` options
-rw-r--r--bgpd/bgp_zebra.c5
-rw-r--r--bgpd/rfapi/vnc_zebra.c2
-rw-r--r--eigrpd/eigrp_zebra.c4
-rw-r--r--isisd/isis_zebra.c4
-rw-r--r--ldpd/lde.c6
-rw-r--r--lib/zclient.c27
-rw-r--r--lib/zclient.h21
-rw-r--r--ospfd/ospf_zebra.c4
-rw-r--r--pathd/path_zebra.c5
-rw-r--r--pbrd/pbr_zebra.c6
-rw-r--r--pimd/pim_zlookup.c5
-rw-r--r--sharpd/sharp_zebra.c5
-rw-r--r--staticd/static_zebra.c5
-rw-r--r--zebra/zapi_msg.c4
14 files changed, 48 insertions, 55 deletions
diff --git a/bgpd/bgp_zebra.c b/bgpd/bgp_zebra.c
index 0aeb59cd9e..98e21bae09 100644
--- a/bgpd/bgp_zebra.c
+++ b/bgpd/bgp_zebra.c
@@ -3422,9 +3422,6 @@ static void bgp_zebra_capabilities(struct zclient_capabilities *cap)
void bgp_zebra_init(struct event_loop *master, unsigned short instance)
{
- struct zclient_options options = zclient_options_default;
-
- options.synchronous = true;
zclient_num_connects = 0;
hook_register_prio(if_real, 0, bgp_ifp_create);
@@ -3442,7 +3439,7 @@ void bgp_zebra_init(struct event_loop *master, unsigned short instance)
zclient->instance = instance;
/* Initialize special zclient for synchronous message exchanges. */
- zclient_sync = zclient_new(master, &options, NULL, 0);
+ zclient_sync = zclient_new(master, &zclient_options_sync, NULL, 0);
zclient_sync->sock = -1;
zclient_sync->redist_default = ZEBRA_ROUTE_BGP;
zclient_sync->instance = instance;
diff --git a/bgpd/rfapi/vnc_zebra.c b/bgpd/rfapi/vnc_zebra.c
index c886beea91..82c08cabde 100644
--- a/bgpd/rfapi/vnc_zebra.c
+++ b/bgpd/rfapi/vnc_zebra.c
@@ -872,7 +872,7 @@ static zclient_handler *const vnc_handlers[] = {
void vnc_zebra_init(struct event_loop *master)
{
/* Set default values. */
- zclient_vnc = zclient_new(master, &zclient_options_default,
+ zclient_vnc = zclient_new(master, &zclient_options_auxiliary,
vnc_handlers, array_size(vnc_handlers));
zclient_init(zclient_vnc, ZEBRA_ROUTE_VNC, 0, &bgpd_privs);
}
diff --git a/eigrpd/eigrp_zebra.c b/eigrpd/eigrp_zebra.c
index a5cecb9c16..a0eff683db 100644
--- a/eigrpd/eigrp_zebra.c
+++ b/eigrpd/eigrp_zebra.c
@@ -98,9 +98,7 @@ static zclient_handler *const eigrp_handlers[] = {
void eigrp_zebra_init(void)
{
- struct zclient_options opt = {.receive_notify = false};
-
- zclient = zclient_new(master, &opt, eigrp_handlers,
+ zclient = zclient_new(master, &zclient_options_default, eigrp_handlers,
array_size(eigrp_handlers));
zclient_init(zclient, ZEBRA_ROUTE_EIGRP, 0, &eigrpd_privs);
diff --git a/isisd/isis_zebra.c b/isisd/isis_zebra.c
index 8252c1ac25..18a0c49ceb 100644
--- a/isisd/isis_zebra.c
+++ b/isisd/isis_zebra.c
@@ -1395,9 +1395,7 @@ void isis_zebra_init(struct event_loop *master, int instance)
zclient->zebra_connected = isis_zebra_connected;
/* Initialize special zclient for synchronous message exchanges. */
- struct zclient_options options = zclient_options_default;
- options.synchronous = true;
- zclient_sync = zclient_new(master, &options, NULL, 0);
+ zclient_sync = zclient_new(master, &zclient_options_sync, NULL, 0);
zclient_sync->sock = -1;
zclient_sync->redist_default = ZEBRA_ROUTE_ISIS;
zclient_sync->instance = instance;
diff --git a/ldpd/lde.c b/ldpd/lde.c
index c7e915deb3..ef4aecadad 100644
--- a/ldpd/lde.c
+++ b/ldpd/lde.c
@@ -2135,12 +2135,8 @@ static void zclient_sync_retry(struct event *thread)
*/
static void zclient_sync_init(void)
{
- struct zclient_options options = zclient_options_default;
-
- options.synchronous = true;
-
/* Initialize special zclient for synchronous message exchanges. */
- zclient_sync = zclient_new(master, &options, NULL, 0);
+ zclient_sync = zclient_new(master, &zclient_options_sync, NULL, 0);
zclient_sync->sock = -1;
zclient_sync->redist_default = ZEBRA_ROUTE_LDP;
zclient_sync->session_id = 1; /* Distinguish from main session */
diff --git a/lib/zclient.c b/lib/zclient.c
index 9f261e2f29..1b2ff02f61 100644
--- a/lib/zclient.c
+++ b/lib/zclient.c
@@ -41,8 +41,20 @@ static void zclient_event(enum zclient_event, struct zclient *);
static void zebra_interface_if_set_value(struct stream *s,
struct interface *ifp);
-struct zclient_options zclient_options_default = {.receive_notify = false,
- .synchronous = false};
+const struct zclient_options zclient_options_default = {
+ .synchronous = false,
+ .auxiliary = false,
+};
+
+const struct zclient_options zclient_options_sync = {
+ .synchronous = true,
+ .auxiliary = true,
+};
+
+const struct zclient_options zclient_options_auxiliary = {
+ .synchronous = false,
+ .auxiliary = true,
+};
struct sockaddr_storage zclient_addr;
socklen_t zclient_addr_len;
@@ -52,7 +64,7 @@ static int zclient_debug;
/* Allocate zclient structure. */
struct zclient *zclient_new(struct event_loop *master,
- struct zclient_options *opt,
+ const struct zclient_options *opt,
zclient_handler *const *handlers, size_t n_handlers)
{
struct zclient *zclient;
@@ -69,8 +81,8 @@ struct zclient *zclient_new(struct event_loop *master,
zclient->handlers = handlers;
zclient->n_handlers = n_handlers;
- zclient->receive_notify = opt->receive_notify;
zclient->synchronous = opt->synchronous;
+ zclient->auxiliary = opt->auxiliary;
return zclient;
}
@@ -392,10 +404,6 @@ enum zclient_send_status zclient_send_hello(struct zclient *zclient)
stream_putc(s, zclient->redist_default);
stream_putw(s, zclient->instance);
stream_putl(s, zclient->session_id);
- if (zclient->receive_notify)
- stream_putc(s, 1);
- else
- stream_putc(s, 0);
if (zclient->synchronous)
stream_putc(s, 1);
else
@@ -4444,7 +4452,8 @@ static void zclient_read(struct event *thread)
zlog_debug("zclient %p command %s VRF %u", zclient,
zserv_command_string(command), vrf_id);
- if (command < array_size(lib_handlers) && lib_handlers[command])
+ if (!zclient->auxiliary && command < array_size(lib_handlers) &&
+ lib_handlers[command])
lib_handlers[command](command, zclient, length, vrf_id);
if (command < zclient->n_handlers && zclient->handlers[command])
zclient->handlers[command](command, zclient, length, vrf_id);
diff --git a/lib/zclient.h b/lib/zclient.h
index 9b709ea64b..05eb6b20ee 100644
--- a/lib/zclient.h
+++ b/lib/zclient.h
@@ -303,12 +303,14 @@ struct zclient {
/* Privileges to change socket values */
struct zebra_privs_t *privs;
- /* Do we care about failure events for route install? */
- bool receive_notify;
-
/* Is this a synchronous client? */
bool synchronous;
+ /* Auxiliary clients don't execute standard library handlers
+ * (which otherwise would duplicate VRF/interface add/delete/etc.
+ */
+ bool auxiliary;
+
/* BFD enabled with bfd_protocol_integration_init() */
bool bfd_integration;
@@ -834,11 +836,18 @@ extern char *zclient_evpn_dump_macip_flags(uint8_t flags, char *buf,
enum zebra_neigh_state { ZEBRA_NEIGH_INACTIVE = 0, ZEBRA_NEIGH_ACTIVE = 1 };
struct zclient_options {
- bool receive_notify;
bool synchronous;
+
+ /* auxiliary = don't call common lib/ handlers that manage bits.
+ * Those should only run once, on the "main" zclient, which this is
+ * not. (This is also set for synchronous clients.)
+ */
+ bool auxiliary;
};
-extern struct zclient_options zclient_options_default;
+extern const struct zclient_options zclient_options_default;
+extern const struct zclient_options zclient_options_sync;
+extern const struct zclient_options zclient_options_auxiliary;
/* link layer representation for GRE like interfaces
* ip_in is the underlay IP, ip_out is the tunnel dest
@@ -885,7 +894,7 @@ int zclient_neigh_ip_encode(struct stream *s, uint16_t cmd, union sockunion *in,
extern uint32_t zclient_get_nhg_start(uint32_t proto);
extern struct zclient *zclient_new(struct event_loop *m,
- struct zclient_options *opt,
+ const struct zclient_options *opt,
zclient_handler *const *handlers,
size_t n_handlers);
diff --git a/ospfd/ospf_zebra.c b/ospfd/ospf_zebra.c
index 19d3c9a083..bb6cc3a89c 100644
--- a/ospfd/ospf_zebra.c
+++ b/ospfd/ospf_zebra.c
@@ -2189,9 +2189,7 @@ void ospf_zebra_init(struct event_loop *master, unsigned short instance)
zclient->nexthop_update = ospf_zebra_import_check_update;
/* Initialize special zclient for synchronous message exchanges. */
- struct zclient_options options = zclient_options_default;
- options.synchronous = true;
- zclient_sync = zclient_new(master, &options, NULL, 0);
+ zclient_sync = zclient_new(master, &zclient_options_sync, NULL, 0);
zclient_sync->sock = -1;
zclient_sync->redist_default = ZEBRA_ROUTE_OSPF;
zclient_sync->instance = instance;
diff --git a/pathd/path_zebra.c b/pathd/path_zebra.c
index 826443f979..645fa50856 100644
--- a/pathd/path_zebra.c
+++ b/pathd/path_zebra.c
@@ -320,9 +320,6 @@ static zclient_handler *const path_handlers[] = {
*/
void path_zebra_init(struct event_loop *master)
{
- struct zclient_options options = zclient_options_default;
- options.synchronous = true;
-
/* Initialize asynchronous zclient. */
zclient = zclient_new(master, &zclient_options_default, path_handlers,
array_size(path_handlers));
@@ -330,7 +327,7 @@ void path_zebra_init(struct event_loop *master)
zclient->zebra_connected = path_zebra_connected;
/* Initialize special zclient for synchronous message exchanges. */
- zclient_sync = zclient_new(master, &options, NULL, 0);
+ zclient_sync = zclient_new(master, &zclient_options_sync, NULL, 0);
zclient_sync->sock = -1;
zclient_sync->redist_default = ZEBRA_ROUTE_SRTE;
zclient_sync->instance = 1;
diff --git a/pbrd/pbr_zebra.c b/pbrd/pbr_zebra.c
index 2e2302b29d..dd15beaff4 100644
--- a/pbrd/pbr_zebra.c
+++ b/pbrd/pbr_zebra.c
@@ -222,6 +222,8 @@ static int rule_notify_owner(ZAPI_CALLBACK_ARGS)
static void zebra_connected(struct zclient *zclient)
{
DEBUGD(&pbr_dbg_zebra, "%s: Registering for fun and profit", __func__);
+
+ zebra_route_notify_send(ZEBRA_ROUTE_NOTIFY_REQUEST, zclient, true);
zclient_send_reg_requests(zclient, VRF_DEFAULT);
}
@@ -401,9 +403,7 @@ static zclient_handler *const pbr_handlers[] = {
void pbr_zebra_init(void)
{
- struct zclient_options opt = { .receive_notify = true };
-
- zclient = zclient_new(master, &opt, pbr_handlers,
+ zclient = zclient_new(master, &zclient_options_default, pbr_handlers,
array_size(pbr_handlers));
zclient_init(zclient, ZEBRA_ROUTE_PBR, 0, &pbr_privs);
diff --git a/pimd/pim_zlookup.c b/pimd/pim_zlookup.c
index 6a026f9947..c19119fa47 100644
--- a/pimd/pim_zlookup.c
+++ b/pimd/pim_zlookup.c
@@ -122,10 +122,7 @@ void zclient_lookup_free(void)
void zclient_lookup_new(void)
{
- struct zclient_options options = zclient_options_default;
- options.synchronous = true;
-
- zlookup = zclient_new(router->master, &options, NULL, 0);
+ zlookup = zclient_new(router->master, &zclient_options_sync, NULL, 0);
if (!zlookup) {
flog_err(EC_LIB_ZAPI_SOCKET, "%s: zclient_new() failure",
__func__);
diff --git a/sharpd/sharp_zebra.c b/sharpd/sharp_zebra.c
index 40921ecdd3..aa720bacf2 100644
--- a/sharpd/sharp_zebra.c
+++ b/sharpd/sharp_zebra.c
@@ -512,6 +512,7 @@ static int route_notify_owner(ZAPI_CALLBACK_ARGS)
static void zebra_connected(struct zclient *zclient)
{
+ zebra_route_notify_send(ZEBRA_ROUTE_NOTIFY_REQUEST, zclient, true);
zclient_send_reg_requests(zclient, VRF_DEFAULT);
/*
@@ -1067,14 +1068,12 @@ static zclient_handler *const sharp_handlers[] = {
void sharp_zebra_init(void)
{
- struct zclient_options opt = {.receive_notify = true};
-
hook_register_prio(if_real, 0, sharp_ifp_create);
hook_register_prio(if_up, 0, sharp_ifp_up);
hook_register_prio(if_down, 0, sharp_ifp_down);
hook_register_prio(if_unreal, 0, sharp_ifp_destroy);
- zclient = zclient_new(master, &opt, sharp_handlers,
+ zclient = zclient_new(master, &zclient_options_default, sharp_handlers,
array_size(sharp_handlers));
zclient_init(zclient, ZEBRA_ROUTE_SHARP, 0, &sharp_privs);
diff --git a/staticd/static_zebra.c b/staticd/static_zebra.c
index 1489f53b5b..68761c0084 100644
--- a/staticd/static_zebra.c
+++ b/staticd/static_zebra.c
@@ -166,6 +166,7 @@ static int route_notify_owner(ZAPI_CALLBACK_ARGS)
static void zebra_connected(struct zclient *zclient)
{
+ zebra_route_notify_send(ZEBRA_ROUTE_NOTIFY_REQUEST, zclient, true);
zclient_send_reg_requests(zclient, VRF_DEFAULT);
static_fixup_vrf_ids(vrf_info_lookup(VRF_DEFAULT));
@@ -531,14 +532,12 @@ static zclient_handler *const static_handlers[] = {
void static_zebra_init(void)
{
- struct zclient_options opt = { .receive_notify = true };
-
hook_register_prio(if_real, 0, static_ifp_create);
hook_register_prio(if_up, 0, static_ifp_up);
hook_register_prio(if_down, 0, static_ifp_down);
hook_register_prio(if_unreal, 0, static_ifp_destroy);
- zclient = zclient_new(master, &opt, static_handlers,
+ zclient = zclient_new(master, &zclient_options_default, static_handlers,
array_size(static_handlers));
zclient_init(zclient, ZEBRA_ROUTE_STATIC, 0, &static_privs);
diff --git a/zebra/zapi_msg.c b/zebra/zapi_msg.c
index 8a09fb0737..98268dafa6 100644
--- a/zebra/zapi_msg.c
+++ b/zebra/zapi_msg.c
@@ -2376,17 +2376,13 @@ static void zread_hello(ZAPI_HANDLER_ARGS)
/* type of protocol (lib/zebra.h) */
uint8_t proto;
unsigned short instance;
- uint8_t notify;
uint8_t synchronous;
uint32_t session_id;
STREAM_GETC(msg, proto);
STREAM_GETW(msg, instance);
STREAM_GETL(msg, session_id);
- STREAM_GETC(msg, notify);
STREAM_GETC(msg, synchronous);
- if (notify)
- client->notify_owner = true;
if (synchronous)
client->synchronous = true;