mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-08 16:23:29 +00:00
Merge pull request #573 from donaldsharp/pim_crash_a_boo
pimd: Thread changes allow pim to crash a boo
This commit is contained in:
commit
f634740f41
@ -596,8 +596,6 @@ static int on_ifjoin_expiry_timer(struct thread *t)
|
|||||||
|
|
||||||
ch = THREAD_ARG(t);
|
ch = THREAD_ARG(t);
|
||||||
|
|
||||||
ch->t_ifjoin_expiry_timer = NULL;
|
|
||||||
|
|
||||||
ifjoin_to_noinfo(ch, true);
|
ifjoin_to_noinfo(ch, true);
|
||||||
/* ch may have been deleted */
|
/* ch may have been deleted */
|
||||||
|
|
||||||
@ -613,8 +611,6 @@ static int on_ifjoin_prune_pending_timer(struct thread *t)
|
|||||||
|
|
||||||
ch = THREAD_ARG(t);
|
ch = THREAD_ARG(t);
|
||||||
|
|
||||||
ch->t_ifjoin_prune_pending_timer = NULL;
|
|
||||||
|
|
||||||
if (ch->ifjoin_state == PIM_IFJOIN_PRUNE_PENDING)
|
if (ch->ifjoin_state == PIM_IFJOIN_PRUNE_PENDING)
|
||||||
{
|
{
|
||||||
/* Send PruneEcho(S,G) ? */
|
/* Send PruneEcho(S,G) ? */
|
||||||
|
@ -156,7 +156,6 @@ static int pim_igmp_other_querier_expire(struct thread *t)
|
|||||||
|
|
||||||
igmp = THREAD_ARG(t);
|
igmp = THREAD_ARG(t);
|
||||||
|
|
||||||
zassert(igmp->t_other_querier_timer);
|
|
||||||
zassert(!igmp->t_igmp_query_timer);
|
zassert(!igmp->t_igmp_query_timer);
|
||||||
|
|
||||||
if (PIM_DEBUG_IGMP_TRACE) {
|
if (PIM_DEBUG_IGMP_TRACE) {
|
||||||
@ -167,8 +166,6 @@ static int pim_igmp_other_querier_expire(struct thread *t)
|
|||||||
ifaddr_str);
|
ifaddr_str);
|
||||||
}
|
}
|
||||||
|
|
||||||
igmp->t_other_querier_timer = NULL;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
We are the current querier, then
|
We are the current querier, then
|
||||||
re-start sending general queries.
|
re-start sending general queries.
|
||||||
@ -204,9 +201,7 @@ void pim_igmp_other_querier_timer_on(struct igmp_sock *igmp)
|
|||||||
zlog_debug("Querier %s resetting TIMER event for Other-Querier-Present",
|
zlog_debug("Querier %s resetting TIMER event for Other-Querier-Present",
|
||||||
ifaddr_str);
|
ifaddr_str);
|
||||||
}
|
}
|
||||||
|
|
||||||
THREAD_OFF(igmp->t_other_querier_timer);
|
THREAD_OFF(igmp->t_other_querier_timer);
|
||||||
zassert(!igmp->t_other_querier_timer);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/*
|
/*
|
||||||
@ -268,7 +263,6 @@ void pim_igmp_other_querier_timer_off(struct igmp_sock *igmp)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
THREAD_OFF(igmp->t_other_querier_timer);
|
THREAD_OFF(igmp->t_other_querier_timer);
|
||||||
zassert(!igmp->t_other_querier_timer);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@ -966,7 +960,6 @@ static int igmp_group_timer(struct thread *t)
|
|||||||
|
|
||||||
zassert(group->group_filtermode_isexcl);
|
zassert(group->group_filtermode_isexcl);
|
||||||
|
|
||||||
group->t_group_timer = NULL;
|
|
||||||
group->group_filtermode_isexcl = 0;
|
group->group_filtermode_isexcl = 0;
|
||||||
|
|
||||||
/* Any source (*,G) is forwarded only if mode is EXCLUDE {empty} */
|
/* Any source (*,G) is forwarded only if mode is EXCLUDE {empty} */
|
||||||
@ -974,7 +967,6 @@ static int igmp_group_timer(struct thread *t)
|
|||||||
|
|
||||||
igmp_source_delete_expired(group->group_source_list);
|
igmp_source_delete_expired(group->group_source_list);
|
||||||
|
|
||||||
zassert(!group->t_group_timer);
|
|
||||||
zassert(!group->group_filtermode_isexcl);
|
zassert(!group->group_filtermode_isexcl);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1001,9 +993,7 @@ static void group_timer_off(struct igmp_group *group)
|
|||||||
zlog_debug("Cancelling TIMER event for group %s on %s",
|
zlog_debug("Cancelling TIMER event for group %s on %s",
|
||||||
group_str, group->group_igmp_sock->interface->name);
|
group_str, group->group_igmp_sock->interface->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
THREAD_OFF(group->t_group_timer);
|
THREAD_OFF(group->t_group_timer);
|
||||||
zassert(!group->t_group_timer);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void igmp_group_timer_on(struct igmp_group *group,
|
void igmp_group_timer_on(struct igmp_group *group,
|
||||||
|
@ -128,9 +128,6 @@ static int igmp_source_timer(struct thread *t)
|
|||||||
group->group_igmp_sock->interface->name);
|
group->group_igmp_sock->interface->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
zassert(source->t_source_timer);
|
|
||||||
source->t_source_timer = NULL;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
RFC 3376: 6.3. IGMPv3 Source-Specific Forwarding Rules
|
RFC 3376: 6.3. IGMPv3 Source-Specific Forwarding Rules
|
||||||
|
|
||||||
@ -151,8 +148,6 @@ static int igmp_source_timer(struct thread *t)
|
|||||||
Source timer switched from (T > 0) to (T == 0): disable forwarding.
|
Source timer switched from (T > 0) to (T == 0): disable forwarding.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
zassert(!source->t_source_timer);
|
|
||||||
|
|
||||||
if (group->group_filtermode_isexcl) {
|
if (group->group_filtermode_isexcl) {
|
||||||
/* EXCLUDE mode */
|
/* EXCLUDE mode */
|
||||||
|
|
||||||
@ -193,7 +188,6 @@ static void source_timer_off(struct igmp_group *group,
|
|||||||
}
|
}
|
||||||
|
|
||||||
THREAD_OFF(source->t_source_timer);
|
THREAD_OFF(source->t_source_timer);
|
||||||
zassert(!source->t_source_timer);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void igmp_source_timer_on(struct igmp_group *group,
|
static void igmp_source_timer_on(struct igmp_group *group,
|
||||||
@ -216,7 +210,6 @@ static void igmp_source_timer_on(struct igmp_group *group,
|
|||||||
|
|
||||||
thread_add_timer_msec(master, igmp_source_timer, source, interval_msec,
|
thread_add_timer_msec(master, igmp_source_timer, source, interval_msec,
|
||||||
&source->t_source_timer);
|
&source->t_source_timer);
|
||||||
zassert(source->t_source_timer);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
RFC 3376: 6.3. IGMPv3 Source-Specific Forwarding Rules
|
RFC 3376: 6.3. IGMPv3 Source-Specific Forwarding Rules
|
||||||
@ -470,8 +463,6 @@ source_new (struct igmp_group *group,
|
|||||||
|
|
||||||
listnode_add(group->group_source_list, src);
|
listnode_add(group->group_source_list, src);
|
||||||
|
|
||||||
zassert(!src->t_source_timer); /* source timer == 0 */
|
|
||||||
|
|
||||||
/* Any source (*,G) is forwarded only if mode is EXCLUDE {empty} */
|
/* Any source (*,G) is forwarded only if mode is EXCLUDE {empty} */
|
||||||
igmp_anysource_forward_stop(group);
|
igmp_anysource_forward_stop(group);
|
||||||
|
|
||||||
@ -1281,8 +1272,6 @@ static int igmp_group_retransmit(struct thread *t)
|
|||||||
num_retransmit_sources_left = group_retransmit_sources(group,
|
num_retransmit_sources_left = group_retransmit_sources(group,
|
||||||
send_with_sflag_set);
|
send_with_sflag_set);
|
||||||
|
|
||||||
group->t_group_query_retransmit_timer = NULL;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Keep group retransmit timer running if there is any retransmit
|
Keep group retransmit timer running if there is any retransmit
|
||||||
counter pending
|
counter pending
|
||||||
|
@ -625,7 +625,6 @@ static int mroute_read(struct thread *t)
|
|||||||
}
|
}
|
||||||
/* Keep reading */
|
/* Keep reading */
|
||||||
done:
|
done:
|
||||||
qpim_mroute_socket_reader = NULL;
|
|
||||||
mroute_read_on();
|
mroute_read_on();
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
@ -633,8 +632,6 @@ static int mroute_read(struct thread *t)
|
|||||||
|
|
||||||
static void mroute_read_on()
|
static void mroute_read_on()
|
||||||
{
|
{
|
||||||
zassert(!qpim_mroute_socket_reader);
|
|
||||||
|
|
||||||
thread_add_read(master, mroute_read, 0, qpim_mroute_socket_fd,
|
thread_add_read(master, mroute_read, 0, qpim_mroute_socket_fd,
|
||||||
&qpim_mroute_socket_reader);
|
&qpim_mroute_socket_reader);
|
||||||
}
|
}
|
||||||
|
@ -67,7 +67,6 @@ pim_msdp_sa_timer_expiry_log(struct pim_msdp_sa *sa, const char *timer_str)
|
|||||||
static int
|
static int
|
||||||
pim_msdp_sa_adv_timer_cb(struct thread *t)
|
pim_msdp_sa_adv_timer_cb(struct thread *t)
|
||||||
{
|
{
|
||||||
msdp->sa_adv_timer = NULL;
|
|
||||||
if (PIM_DEBUG_MSDP_EVENTS) {
|
if (PIM_DEBUG_MSDP_EVENTS) {
|
||||||
zlog_debug("MSDP SA advertisment timer expired");
|
zlog_debug("MSDP SA advertisment timer expired");
|
||||||
}
|
}
|
||||||
@ -93,7 +92,6 @@ pim_msdp_sa_state_timer_cb(struct thread *t)
|
|||||||
struct pim_msdp_sa *sa;
|
struct pim_msdp_sa *sa;
|
||||||
|
|
||||||
sa = THREAD_ARG(t);
|
sa = THREAD_ARG(t);
|
||||||
sa->sa_state_timer = NULL;
|
|
||||||
|
|
||||||
if (PIM_DEBUG_MSDP_EVENTS) {
|
if (PIM_DEBUG_MSDP_EVENTS) {
|
||||||
pim_msdp_sa_timer_expiry_log(sa, "state");
|
pim_msdp_sa_timer_expiry_log(sa, "state");
|
||||||
@ -898,7 +896,6 @@ pim_msdp_peer_hold_timer_cb(struct thread *t)
|
|||||||
struct pim_msdp_peer *mp;
|
struct pim_msdp_peer *mp;
|
||||||
|
|
||||||
mp = THREAD_ARG(t);
|
mp = THREAD_ARG(t);
|
||||||
mp->hold_timer = NULL;
|
|
||||||
|
|
||||||
if (PIM_DEBUG_MSDP_EVENTS) {
|
if (PIM_DEBUG_MSDP_EVENTS) {
|
||||||
pim_msdp_peer_timer_expiry_log(mp, "hold");
|
pim_msdp_peer_timer_expiry_log(mp, "hold");
|
||||||
@ -932,7 +929,6 @@ pim_msdp_peer_ka_timer_cb(struct thread *t)
|
|||||||
struct pim_msdp_peer *mp;
|
struct pim_msdp_peer *mp;
|
||||||
|
|
||||||
mp = THREAD_ARG(t);
|
mp = THREAD_ARG(t);
|
||||||
mp->ka_timer = NULL;
|
|
||||||
|
|
||||||
if (PIM_DEBUG_MSDP_EVENTS) {
|
if (PIM_DEBUG_MSDP_EVENTS) {
|
||||||
pim_msdp_peer_timer_expiry_log(mp, "ka");
|
pim_msdp_peer_timer_expiry_log(mp, "ka");
|
||||||
@ -994,7 +990,6 @@ pim_msdp_peer_cr_timer_cb(struct thread *t)
|
|||||||
struct pim_msdp_peer *mp;
|
struct pim_msdp_peer *mp;
|
||||||
|
|
||||||
mp = THREAD_ARG(t);
|
mp = THREAD_ARG(t);
|
||||||
mp->cr_timer = NULL;
|
|
||||||
|
|
||||||
if (PIM_DEBUG_MSDP_EVENTS) {
|
if (PIM_DEBUG_MSDP_EVENTS) {
|
||||||
pim_msdp_peer_timer_expiry_log(mp, "connect-retry");
|
pim_msdp_peer_timer_expiry_log(mp, "connect-retry");
|
||||||
|
@ -223,8 +223,6 @@ static int on_neighbor_timer(struct thread *t)
|
|||||||
neigh->holdtime, src_str, ifp->name);
|
neigh->holdtime, src_str, ifp->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
neigh->t_expire_timer = NULL;
|
|
||||||
|
|
||||||
snprintf(msg, sizeof(msg), "%d-sec holdtime expired", neigh->holdtime);
|
snprintf(msg, sizeof(msg), "%d-sec holdtime expired", neigh->holdtime);
|
||||||
pim_neighbor_delete(ifp, neigh, msg);
|
pim_neighbor_delete(ifp, neigh, msg);
|
||||||
|
|
||||||
@ -278,7 +276,6 @@ on_neighbor_jp_timer (struct thread *t)
|
|||||||
zlog_debug("%s:Sending JP Agg to %s on %s with %d groups", __PRETTY_FUNCTION__,
|
zlog_debug("%s:Sending JP Agg to %s on %s with %d groups", __PRETTY_FUNCTION__,
|
||||||
src_str, neigh->interface->name, neigh->upstream_jp_agg->count);
|
src_str, neigh->interface->name, neigh->upstream_jp_agg->count);
|
||||||
}
|
}
|
||||||
neigh->jp_timer = NULL;
|
|
||||||
|
|
||||||
rpf.source_nexthop.interface = neigh->interface;
|
rpf.source_nexthop.interface = neigh->interface;
|
||||||
rpf.rpf_addr.u.prefix4 = neigh->source_addr;
|
rpf.rpf_addr.u.prefix4 = neigh->source_addr;
|
||||||
|
@ -721,7 +721,6 @@ static int on_pim_hello_send(struct thread *t)
|
|||||||
/*
|
/*
|
||||||
* Schedule next hello
|
* Schedule next hello
|
||||||
*/
|
*/
|
||||||
pim_ifp->t_pim_hello_timer = NULL;
|
|
||||||
hello_resched(ifp);
|
hello_resched(ifp);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -801,7 +800,6 @@ void pim_hello_restart_triggered(struct interface *ifp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
THREAD_OFF(pim_ifp->t_pim_hello_timer);
|
THREAD_OFF(pim_ifp->t_pim_hello_timer);
|
||||||
pim_ifp->t_pim_hello_timer = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
random_msec = triggered_hello_delay_msec;
|
random_msec = triggered_hello_delay_msec;
|
||||||
|
@ -310,18 +310,13 @@ static int ssmpingd_read_msg(struct ssmpingd_sock *ss)
|
|||||||
static int ssmpingd_sock_read(struct thread *t)
|
static int ssmpingd_sock_read(struct thread *t)
|
||||||
{
|
{
|
||||||
struct ssmpingd_sock *ss;
|
struct ssmpingd_sock *ss;
|
||||||
int sock_fd;
|
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
ss = THREAD_ARG(t);
|
ss = THREAD_ARG(t);
|
||||||
|
|
||||||
sock_fd = THREAD_FD(t);
|
|
||||||
zassert(sock_fd == ss->sock_fd);
|
|
||||||
|
|
||||||
result = ssmpingd_read_msg(ss);
|
result = ssmpingd_read_msg(ss);
|
||||||
|
|
||||||
/* Keep reading */
|
/* Keep reading */
|
||||||
ss->t_sock_read = 0;
|
|
||||||
ssmpingd_read_on(ss);
|
ssmpingd_read_on(ss);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
@ -329,7 +324,6 @@ static int ssmpingd_sock_read(struct thread *t)
|
|||||||
|
|
||||||
static void ssmpingd_read_on(struct ssmpingd_sock *ss)
|
static void ssmpingd_read_on(struct ssmpingd_sock *ss)
|
||||||
{
|
{
|
||||||
zassert(!ss->t_sock_read);
|
|
||||||
thread_add_read(master, ssmpingd_sock_read, ss, ss->sock_fd,
|
thread_add_read(master, ssmpingd_sock_read, ss, ss->sock_fd,
|
||||||
&ss->t_sock_read);
|
&ss->t_sock_read);
|
||||||
}
|
}
|
||||||
@ -370,7 +364,7 @@ static struct ssmpingd_sock *ssmpingd_new(struct in_addr source_addr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ss->sock_fd = sock_fd;
|
ss->sock_fd = sock_fd;
|
||||||
ss->t_sock_read = 0;
|
ss->t_sock_read = NULL;
|
||||||
ss->source_addr = source_addr;
|
ss->source_addr = source_addr;
|
||||||
ss->creation = pim_time_monotonic_sec();
|
ss->creation = pim_time_monotonic_sec();
|
||||||
ss->requests = 0;
|
ss->requests = 0;
|
||||||
|
@ -277,8 +277,6 @@ static int on_join_timer(struct thread *t)
|
|||||||
|
|
||||||
up = THREAD_ARG(t);
|
up = THREAD_ARG(t);
|
||||||
|
|
||||||
up->t_join_timer = NULL;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* In the case of a HFR we will not ahve anyone to send this to.
|
* In the case of a HFR we will not ahve anyone to send this to.
|
||||||
*/
|
*/
|
||||||
@ -1090,7 +1088,6 @@ pim_upstream_keep_alive_timer (struct thread *t)
|
|||||||
struct pim_upstream *up;
|
struct pim_upstream *up;
|
||||||
|
|
||||||
up = THREAD_ARG(t);
|
up = THREAD_ARG(t);
|
||||||
up->t_ka_timer = NULL;
|
|
||||||
|
|
||||||
if (I_am_RP (up->sg.grp))
|
if (I_am_RP (up->sg.grp))
|
||||||
{
|
{
|
||||||
@ -1146,7 +1143,6 @@ pim_upstream_msdp_reg_timer(struct thread *t)
|
|||||||
struct pim_upstream *up;
|
struct pim_upstream *up;
|
||||||
|
|
||||||
up = THREAD_ARG(t);
|
up = THREAD_ARG(t);
|
||||||
up->t_msdp_reg_timer = NULL;
|
|
||||||
|
|
||||||
/* source is no longer active - pull the SA from MSDP's cache */
|
/* source is no longer active - pull the SA from MSDP's cache */
|
||||||
pim_msdp_sa_local_del(&up->sg);
|
pim_msdp_sa_local_del(&up->sg);
|
||||||
@ -1337,8 +1333,6 @@ pim_upstream_register_stop_timer (struct thread *t)
|
|||||||
struct ip ip_hdr;
|
struct ip ip_hdr;
|
||||||
up = THREAD_ARG (t);
|
up = THREAD_ARG (t);
|
||||||
|
|
||||||
up->t_rs_timer = NULL;
|
|
||||||
|
|
||||||
if (PIM_DEBUG_TRACE)
|
if (PIM_DEBUG_TRACE)
|
||||||
{
|
{
|
||||||
char state_str[PIM_REG_STATE_STR_LEN];
|
char state_str[PIM_REG_STATE_STR_LEN];
|
||||||
@ -1398,11 +1392,7 @@ pim_upstream_start_register_stop_timer (struct pim_upstream *up, int null_regist
|
|||||||
{
|
{
|
||||||
uint32_t time;
|
uint32_t time;
|
||||||
|
|
||||||
if (up->t_rs_timer)
|
|
||||||
{
|
|
||||||
THREAD_TIMER_OFF (up->t_rs_timer);
|
THREAD_TIMER_OFF (up->t_rs_timer);
|
||||||
up->t_rs_timer = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!null_register)
|
if (!null_register)
|
||||||
{
|
{
|
||||||
|
@ -579,10 +579,6 @@ void pim_scan_oil()
|
|||||||
|
|
||||||
static int on_rpf_cache_refresh(struct thread *t)
|
static int on_rpf_cache_refresh(struct thread *t)
|
||||||
{
|
{
|
||||||
zassert(qpim_rpf_cache_refresher);
|
|
||||||
|
|
||||||
qpim_rpf_cache_refresher = 0;
|
|
||||||
|
|
||||||
/* update PIM protocol state */
|
/* update PIM protocol state */
|
||||||
scan_upstream_rpf_cache();
|
scan_upstream_rpf_cache();
|
||||||
|
|
||||||
|
@ -46,7 +46,6 @@ static int zclient_lookup_connect(struct thread *t)
|
|||||||
struct zclient *zlookup;
|
struct zclient *zlookup;
|
||||||
|
|
||||||
zlookup = THREAD_ARG(t);
|
zlookup = THREAD_ARG(t);
|
||||||
zlookup->t_connect = NULL;
|
|
||||||
|
|
||||||
if (zlookup->sock >= 0) {
|
if (zlookup->sock >= 0) {
|
||||||
return 0;
|
return 0;
|
||||||
@ -61,7 +60,6 @@ static int zclient_lookup_connect(struct thread *t)
|
|||||||
zlookup->fail = 0; /* reset counter on connection */
|
zlookup->fail = 0; /* reset counter on connection */
|
||||||
}
|
}
|
||||||
|
|
||||||
zassert(!zlookup->t_connect);
|
|
||||||
if (zlookup->sock < 0) {
|
if (zlookup->sock < 0) {
|
||||||
/* Since last connect failed, retry within 10 secs */
|
/* Since last connect failed, retry within 10 secs */
|
||||||
zclient_lookup_sched(zlookup, 10);
|
zclient_lookup_sched(zlookup, 10);
|
||||||
@ -74,8 +72,6 @@ static int zclient_lookup_connect(struct thread *t)
|
|||||||
/* Schedule connection with delay. */
|
/* Schedule connection with delay. */
|
||||||
static void zclient_lookup_sched(struct zclient *zlookup, int delay)
|
static void zclient_lookup_sched(struct zclient *zlookup, int delay)
|
||||||
{
|
{
|
||||||
zassert(!zlookup->t_connect);
|
|
||||||
|
|
||||||
thread_add_timer(master, zclient_lookup_connect, zlookup, delay,
|
thread_add_timer(master, zclient_lookup_connect, zlookup, delay,
|
||||||
&zlookup->t_connect);
|
&zlookup->t_connect);
|
||||||
|
|
||||||
@ -86,7 +82,6 @@ static void zclient_lookup_sched(struct zclient *zlookup, int delay)
|
|||||||
/* Schedule connection for now. */
|
/* Schedule connection for now. */
|
||||||
static void zclient_lookup_sched_now(struct zclient *zlookup)
|
static void zclient_lookup_sched_now(struct zclient *zlookup)
|
||||||
{
|
{
|
||||||
zassert(!zlookup->t_connect);
|
|
||||||
thread_add_event(master, zclient_lookup_connect, zlookup, 0,
|
thread_add_event(master, zclient_lookup_connect, zlookup, 0,
|
||||||
&zlookup->t_connect);
|
&zlookup->t_connect);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user