}
event_add_timer(bm->master, bgp_sync_label_manager, NULL, 1,
- &bm->t_bgp_label_manager);
+ &bm->t_bgp_sync_label_manager);
}
void bgp_lp_event_chunk(uint32_t first, uint32_t last)
}
event_add_timer(bm->master, bgp_sync_label_manager, NULL, 1,
- &bm->t_bgp_label_manager);
+ &bm->t_bgp_sync_label_manager);
}
DEFUN(show_bgp_labelpool_summary, show_bgp_labelpool_summary_cmd,
/* All information about zebra. */
struct zclient *zclient = NULL;
struct zclient *zclient_sync = NULL;
+static bool bgp_zebra_label_manager_connect(void);
/* hook to indicate vrf status change for SNMP */
DEFINE_HOOK(bgp_vrf_status_changed, (struct bgp *bgp, struct interface *ifp),
hook_register_prio(if_del, 0, bgp_if_delete_hook);
}
-static void bgp_zebra_label_manager_connect(void)
+static void bgp_start_label_manager(struct event *start)
+{
+ bgp_zebra_label_manager_connect();
+}
+
+static bool bgp_zebra_label_manager_ready(void)
+{
+ return (zclient_sync->sock > 0);
+}
+
+static bool bgp_zebra_label_manager_connect(void)
{
/* Connect to label manager. */
if (zclient_socket_connect(zclient_sync) < 0) {
zlog_warn("%s: failed connecting synchronous zclient!",
__func__);
- return;
+ return false;
}
/* make socket non-blocking */
set_nonblocking(zclient_sync->sock);
__func__);
close(zclient_sync->sock);
zclient_sync->sock = -1;
- return;
+ return false;
}
/* Connect to label manager */
close(zclient_sync->sock);
zclient_sync->sock = -1;
}
- return;
+ return false;
}
/* tell label pool that zebra is connected */
bgp_lp_event_zebra_up();
+
+ return true;
}
void bgp_zebra_init(struct event_loop *master, unsigned short instance)
zclient_sync->session_id = 1;
zclient_sync->privs = &bgpd_privs;
- bgp_zebra_label_manager_connect();
+ if (!bgp_zebra_label_manager_ready())
+ event_add_timer(master, bgp_start_label_manager, NULL, 1,
+ &bm->t_bgp_start_label_manager);
}
void bgp_zebra_destroy(void)
bm->tcp_dscp = IPTOS_PREC_INTERNETCONTROL;
bm->inq_limit = BM_DEFAULT_Q_LIMIT;
bm->outq_limit = BM_DEFAULT_Q_LIMIT;
- bm->t_bgp_label_manager = NULL;
+ bm->t_bgp_sync_label_manager = NULL;
+ bm->t_bgp_start_label_manager = NULL;
bgp_mac_init();
/* init the rd id space.
list_delete(&bm->listen_sockets);
EVENT_OFF(bm->t_rmap_update);
- EVENT_OFF(bm->t_bgp_label_manager);
+ EVENT_OFF(bm->t_bgp_sync_label_manager);
+ EVENT_OFF(bm->t_bgp_start_label_manager);
bgp_mac_finish();
}