Merge pull request #14867 from opensourcerouting/zclient-options-cleanup

*: clean up `zclient` options
This commit is contained in:
Donald Sharp 2023-11-25 09:15:07 -05:00 committed by GitHub
commit 0dc7704fd5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
14 changed files with 48 additions and 55 deletions

View file

@ -3422,9 +3422,6 @@ static void bgp_zebra_capabilities(struct zclient_capabilities *cap)
void bgp_zebra_init(struct event_loop *master, unsigned short instance) 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; zclient_num_connects = 0;
hook_register_prio(if_real, 0, bgp_ifp_create); 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; zclient->instance = instance;
/* Initialize special zclient for synchronous message exchanges. */ /* 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->sock = -1;
zclient_sync->redist_default = ZEBRA_ROUTE_BGP; zclient_sync->redist_default = ZEBRA_ROUTE_BGP;
zclient_sync->instance = instance; zclient_sync->instance = instance;

View file

@ -872,7 +872,7 @@ static zclient_handler *const vnc_handlers[] = {
void vnc_zebra_init(struct event_loop *master) void vnc_zebra_init(struct event_loop *master)
{ {
/* Set default values. */ /* 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)); vnc_handlers, array_size(vnc_handlers));
zclient_init(zclient_vnc, ZEBRA_ROUTE_VNC, 0, &bgpd_privs); zclient_init(zclient_vnc, ZEBRA_ROUTE_VNC, 0, &bgpd_privs);
} }

View file

@ -98,9 +98,7 @@ static zclient_handler *const eigrp_handlers[] = {
void eigrp_zebra_init(void) void eigrp_zebra_init(void)
{ {
struct zclient_options opt = {.receive_notify = false}; zclient = zclient_new(master, &zclient_options_default, eigrp_handlers,
zclient = zclient_new(master, &opt, eigrp_handlers,
array_size(eigrp_handlers)); array_size(eigrp_handlers));
zclient_init(zclient, ZEBRA_ROUTE_EIGRP, 0, &eigrpd_privs); zclient_init(zclient, ZEBRA_ROUTE_EIGRP, 0, &eigrpd_privs);

View file

@ -1395,9 +1395,7 @@ void isis_zebra_init(struct event_loop *master, int instance)
zclient->zebra_connected = isis_zebra_connected; zclient->zebra_connected = isis_zebra_connected;
/* Initialize special zclient for synchronous message exchanges. */ /* Initialize special zclient for synchronous message exchanges. */
struct zclient_options options = zclient_options_default; zclient_sync = zclient_new(master, &zclient_options_sync, NULL, 0);
options.synchronous = true;
zclient_sync = zclient_new(master, &options, NULL, 0);
zclient_sync->sock = -1; zclient_sync->sock = -1;
zclient_sync->redist_default = ZEBRA_ROUTE_ISIS; zclient_sync->redist_default = ZEBRA_ROUTE_ISIS;
zclient_sync->instance = instance; zclient_sync->instance = instance;

View file

@ -2135,12 +2135,8 @@ static void zclient_sync_retry(struct event *thread)
*/ */
static void zclient_sync_init(void) static void zclient_sync_init(void)
{ {
struct zclient_options options = zclient_options_default;
options.synchronous = true;
/* Initialize special zclient for synchronous message exchanges. */ /* 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->sock = -1;
zclient_sync->redist_default = ZEBRA_ROUTE_LDP; zclient_sync->redist_default = ZEBRA_ROUTE_LDP;
zclient_sync->session_id = 1; /* Distinguish from main session */ zclient_sync->session_id = 1; /* Distinguish from main session */

View file

@ -41,8 +41,20 @@ static void zclient_event(enum zclient_event, struct zclient *);
static void zebra_interface_if_set_value(struct stream *s, static void zebra_interface_if_set_value(struct stream *s,
struct interface *ifp); struct interface *ifp);
struct zclient_options zclient_options_default = {.receive_notify = false, const struct zclient_options zclient_options_default = {
.synchronous = false}; .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; struct sockaddr_storage zclient_addr;
socklen_t zclient_addr_len; socklen_t zclient_addr_len;
@ -52,7 +64,7 @@ static int zclient_debug;
/* Allocate zclient structure. */ /* Allocate zclient structure. */
struct zclient *zclient_new(struct event_loop *master, 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) zclient_handler *const *handlers, size_t n_handlers)
{ {
struct zclient *zclient; struct zclient *zclient;
@ -69,8 +81,8 @@ struct zclient *zclient_new(struct event_loop *master,
zclient->handlers = handlers; zclient->handlers = handlers;
zclient->n_handlers = n_handlers; zclient->n_handlers = n_handlers;
zclient->receive_notify = opt->receive_notify;
zclient->synchronous = opt->synchronous; zclient->synchronous = opt->synchronous;
zclient->auxiliary = opt->auxiliary;
return zclient; return zclient;
} }
@ -392,10 +404,6 @@ enum zclient_send_status zclient_send_hello(struct zclient *zclient)
stream_putc(s, zclient->redist_default); stream_putc(s, zclient->redist_default);
stream_putw(s, zclient->instance); stream_putw(s, zclient->instance);
stream_putl(s, zclient->session_id); stream_putl(s, zclient->session_id);
if (zclient->receive_notify)
stream_putc(s, 1);
else
stream_putc(s, 0);
if (zclient->synchronous) if (zclient->synchronous)
stream_putc(s, 1); stream_putc(s, 1);
else else
@ -4444,7 +4452,8 @@ static void zclient_read(struct event *thread)
zlog_debug("zclient %p command %s VRF %u", zclient, zlog_debug("zclient %p command %s VRF %u", zclient,
zserv_command_string(command), vrf_id); 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); lib_handlers[command](command, zclient, length, vrf_id);
if (command < zclient->n_handlers && zclient->handlers[command]) if (command < zclient->n_handlers && zclient->handlers[command])
zclient->handlers[command](command, zclient, length, vrf_id); zclient->handlers[command](command, zclient, length, vrf_id);

View file

@ -303,12 +303,14 @@ struct zclient {
/* Privileges to change socket values */ /* Privileges to change socket values */
struct zebra_privs_t *privs; struct zebra_privs_t *privs;
/* Do we care about failure events for route install? */
bool receive_notify;
/* Is this a synchronous client? */ /* Is this a synchronous client? */
bool synchronous; 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() */ /* BFD enabled with bfd_protocol_integration_init() */
bool bfd_integration; 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 }; enum zebra_neigh_state { ZEBRA_NEIGH_INACTIVE = 0, ZEBRA_NEIGH_ACTIVE = 1 };
struct zclient_options { struct zclient_options {
bool receive_notify;
bool synchronous; 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 /* link layer representation for GRE like interfaces
* ip_in is the underlay IP, ip_out is the tunnel dest * 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 uint32_t zclient_get_nhg_start(uint32_t proto);
extern struct zclient *zclient_new(struct event_loop *m, extern struct zclient *zclient_new(struct event_loop *m,
struct zclient_options *opt, const struct zclient_options *opt,
zclient_handler *const *handlers, zclient_handler *const *handlers,
size_t n_handlers); size_t n_handlers);

View file

@ -2189,9 +2189,7 @@ void ospf_zebra_init(struct event_loop *master, unsigned short instance)
zclient->nexthop_update = ospf_zebra_import_check_update; zclient->nexthop_update = ospf_zebra_import_check_update;
/* Initialize special zclient for synchronous message exchanges. */ /* Initialize special zclient for synchronous message exchanges. */
struct zclient_options options = zclient_options_default; zclient_sync = zclient_new(master, &zclient_options_sync, NULL, 0);
options.synchronous = true;
zclient_sync = zclient_new(master, &options, NULL, 0);
zclient_sync->sock = -1; zclient_sync->sock = -1;
zclient_sync->redist_default = ZEBRA_ROUTE_OSPF; zclient_sync->redist_default = ZEBRA_ROUTE_OSPF;
zclient_sync->instance = instance; zclient_sync->instance = instance;

View file

@ -320,9 +320,6 @@ static zclient_handler *const path_handlers[] = {
*/ */
void path_zebra_init(struct event_loop *master) void path_zebra_init(struct event_loop *master)
{ {
struct zclient_options options = zclient_options_default;
options.synchronous = true;
/* Initialize asynchronous zclient. */ /* Initialize asynchronous zclient. */
zclient = zclient_new(master, &zclient_options_default, path_handlers, zclient = zclient_new(master, &zclient_options_default, path_handlers,
array_size(path_handlers)); array_size(path_handlers));
@ -330,7 +327,7 @@ void path_zebra_init(struct event_loop *master)
zclient->zebra_connected = path_zebra_connected; zclient->zebra_connected = path_zebra_connected;
/* Initialize special zclient for synchronous message exchanges. */ /* 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->sock = -1;
zclient_sync->redist_default = ZEBRA_ROUTE_SRTE; zclient_sync->redist_default = ZEBRA_ROUTE_SRTE;
zclient_sync->instance = 1; zclient_sync->instance = 1;

View file

@ -222,6 +222,8 @@ static int rule_notify_owner(ZAPI_CALLBACK_ARGS)
static void zebra_connected(struct zclient *zclient) static void zebra_connected(struct zclient *zclient)
{ {
DEBUGD(&pbr_dbg_zebra, "%s: Registering for fun and profit", __func__); 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); zclient_send_reg_requests(zclient, VRF_DEFAULT);
} }
@ -401,9 +403,7 @@ static zclient_handler *const pbr_handlers[] = {
void pbr_zebra_init(void) void pbr_zebra_init(void)
{ {
struct zclient_options opt = { .receive_notify = true }; zclient = zclient_new(master, &zclient_options_default, pbr_handlers,
zclient = zclient_new(master, &opt, pbr_handlers,
array_size(pbr_handlers)); array_size(pbr_handlers));
zclient_init(zclient, ZEBRA_ROUTE_PBR, 0, &pbr_privs); zclient_init(zclient, ZEBRA_ROUTE_PBR, 0, &pbr_privs);

View file

@ -122,10 +122,7 @@ void zclient_lookup_free(void)
void zclient_lookup_new(void) void zclient_lookup_new(void)
{ {
struct zclient_options options = zclient_options_default; zlookup = zclient_new(router->master, &zclient_options_sync, NULL, 0);
options.synchronous = true;
zlookup = zclient_new(router->master, &options, NULL, 0);
if (!zlookup) { if (!zlookup) {
flog_err(EC_LIB_ZAPI_SOCKET, "%s: zclient_new() failure", flog_err(EC_LIB_ZAPI_SOCKET, "%s: zclient_new() failure",
__func__); __func__);

View file

@ -512,6 +512,7 @@ static int route_notify_owner(ZAPI_CALLBACK_ARGS)
static void zebra_connected(struct zclient *zclient) static void zebra_connected(struct zclient *zclient)
{ {
zebra_route_notify_send(ZEBRA_ROUTE_NOTIFY_REQUEST, zclient, true);
zclient_send_reg_requests(zclient, VRF_DEFAULT); zclient_send_reg_requests(zclient, VRF_DEFAULT);
/* /*
@ -1067,14 +1068,12 @@ static zclient_handler *const sharp_handlers[] = {
void sharp_zebra_init(void) 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_real, 0, sharp_ifp_create);
hook_register_prio(if_up, 0, sharp_ifp_up); hook_register_prio(if_up, 0, sharp_ifp_up);
hook_register_prio(if_down, 0, sharp_ifp_down); hook_register_prio(if_down, 0, sharp_ifp_down);
hook_register_prio(if_unreal, 0, sharp_ifp_destroy); 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)); array_size(sharp_handlers));
zclient_init(zclient, ZEBRA_ROUTE_SHARP, 0, &sharp_privs); zclient_init(zclient, ZEBRA_ROUTE_SHARP, 0, &sharp_privs);

View file

@ -166,6 +166,7 @@ static int route_notify_owner(ZAPI_CALLBACK_ARGS)
static void zebra_connected(struct zclient *zclient) static void zebra_connected(struct zclient *zclient)
{ {
zebra_route_notify_send(ZEBRA_ROUTE_NOTIFY_REQUEST, zclient, true);
zclient_send_reg_requests(zclient, VRF_DEFAULT); zclient_send_reg_requests(zclient, VRF_DEFAULT);
static_fixup_vrf_ids(vrf_info_lookup(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) 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_real, 0, static_ifp_create);
hook_register_prio(if_up, 0, static_ifp_up); hook_register_prio(if_up, 0, static_ifp_up);
hook_register_prio(if_down, 0, static_ifp_down); hook_register_prio(if_down, 0, static_ifp_down);
hook_register_prio(if_unreal, 0, static_ifp_destroy); 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)); array_size(static_handlers));
zclient_init(zclient, ZEBRA_ROUTE_STATIC, 0, &static_privs); zclient_init(zclient, ZEBRA_ROUTE_STATIC, 0, &static_privs);

View file

@ -2376,17 +2376,13 @@ static void zread_hello(ZAPI_HANDLER_ARGS)
/* type of protocol (lib/zebra.h) */ /* type of protocol (lib/zebra.h) */
uint8_t proto; uint8_t proto;
unsigned short instance; unsigned short instance;
uint8_t notify;
uint8_t synchronous; uint8_t synchronous;
uint32_t session_id; uint32_t session_id;
STREAM_GETC(msg, proto); STREAM_GETC(msg, proto);
STREAM_GETW(msg, instance); STREAM_GETW(msg, instance);
STREAM_GETL(msg, session_id); STREAM_GETL(msg, session_id);
STREAM_GETC(msg, notify);
STREAM_GETC(msg, synchronous); STREAM_GETC(msg, synchronous);
if (notify)
client->notify_owner = true;
if (synchronous) if (synchronous)
client->synchronous = true; client->synchronous = true;