void spf_backoff_free(struct spf_backoff *backoff) { if (!backoff) return; THREAD_TIMER_OFF(backoff->t_holddown); THREAD_TIMER_OFF(backoff->t_timetolearn); XFREE(MTYPE_SPF_BACKOFF_NAME, backoff->name); XFREE(MTYPE_SPF_BACKOFF, backoff); }
void isis_delete_adj (void *arg) { struct isis_adjacency *adj = arg; if (!adj) return; THREAD_TIMER_OFF (adj->t_expire); /* remove from SPF trees */ spftree_area_adj_del (adj->circuit->area, adj); if (adj->area_addrs) list_delete (adj->area_addrs); if (adj->ipv4_addrs) list_delete (adj->ipv4_addrs); #ifdef HAVE_IPV6 if (adj->ipv6_addrs) list_delete (adj->ipv6_addrs); #endif XFREE (MTYPE_ISIS_ADJACENCY, adj); return; }
void isis_circuit_down (struct isis_circuit *circuit) { /* Cancel all active threads -- FIXME: wrong place */ /* HT: Read thread if GNU_LINUX, TIMER thread otherwise. */ THREAD_OFF (circuit->t_read); if (circuit->circ_type == CIRCUIT_T_BROADCAST) { THREAD_TIMER_OFF (circuit->u.bc.t_send_lan_hello[0]); THREAD_TIMER_OFF (circuit->u.bc.t_send_lan_hello[1]); THREAD_TIMER_OFF (circuit->u.bc.t_run_dr[0]); THREAD_TIMER_OFF (circuit->u.bc.t_run_dr[1]); } else if (circuit->circ_type == CIRCUIT_T_P2P) { THREAD_TIMER_OFF (circuit->u.p2p.t_send_p2p_hello); } if (circuit->t_send_psnp[0]) { THREAD_TIMER_OFF (circuit->t_send_psnp[0]); } if (circuit->t_send_psnp[1]) { THREAD_TIMER_OFF (circuit->t_send_psnp[1]); } /* close the socket */ close (circuit->fd); return; }
/* Restore an interface to its pre UP state Used from ism_interface_down only */ void ospf_if_cleanup (struct ospf_interface *oi) { struct route_node *rn; struct listnode *node, *nnode; struct ospf_neighbor *nbr; struct ospf_nbr_nbma *nbr_nbma; struct ospf_lsa *lsa; /* oi->nbrs and oi->nbr_nbma should be deleted on InterfaceDown event */ /* delete all static neighbors attached to this interface */ for (ALL_LIST_ELEMENTS (oi->nbr_nbma, node, nnode, nbr_nbma)) { OSPF_POLL_TIMER_OFF (nbr_nbma->t_poll); if (nbr_nbma->nbr) { nbr_nbma->nbr->nbr_nbma = NULL; nbr_nbma->nbr = NULL; } nbr_nbma->oi = NULL; listnode_delete (oi->nbr_nbma, nbr_nbma); } /* send Neighbor event KillNbr to all associated neighbors. */ for (rn = route_top (oi->nbrs); rn; rn = route_next (rn)) if ((nbr = rn->info) != NULL) if (nbr != oi->nbr_self) OSPF_NSM_EVENT_EXECUTE (nbr, NSM_KillNbr); /* Cleanup Link State Acknowlegdment list. */ for (ALL_LIST_ELEMENTS (oi->ls_ack, node, nnode, lsa)) ospf_lsa_unlock (&lsa); /* oi->ls_ack */ list_delete_all_node (oi->ls_ack); oi->crypt_seqnum = 0; /* Empty link state update queue */ ospf_ls_upd_queue_empty (oi); /* Reset pseudo neighbor. */ ospf_nbr_delete (oi->nbr_self); oi->nbr_self = ospf_nbr_new (oi); ospf_nbr_add_self (oi); ospf_lsa_unlock (&oi->network_lsa_self); oi->network_lsa_self = NULL; OSPF_TIMER_OFF (oi->t_network_lsa_self); #ifdef HAVE_GRACEFUL_RESTART THREAD_TIMER_OFF(oi->t_opaque_lsa_refresh); oi->v_opaque_lsa_count = 0 ; #endif }
int isis_area_destroy (const char *area_tag) { struct isis_area *area; struct listnode *node, *nnode; struct isis_circuit *circuit; area = isis_area_lookup (area_tag); if (area == NULL) { Log(LOG_WARNING, "WARN ( %s/core/ISIS ): Can't find ISIS instance %s\n", config.name, area_tag); return TRUE; } if (area->circuit_list) { for (ALL_LIST_ELEMENTS (area->circuit_list, node, nnode, circuit)) { /* The fact that it's in circuit_list means that it was configured */ isis_csm_state_change (ISIS_DISABLE, circuit, area); isis_circuit_down (circuit); isis_circuit_deconfigure (circuit, area); } isis_list_delete (area->circuit_list); } isis_listnode_delete (isis->area_list, area); if (area->t_remove_aged) thread_cancel (area->t_remove_aged); THREAD_TIMER_OFF (area->spftree[0]->t_spf); THREAD_TIMER_OFF (area->spftree[1]->t_spf); free(area); isis->sysid_set=0; return FALSE; }
static int spf_backoff_holddown_elapsed(struct thread *thread) { struct spf_backoff *backoff = THREAD_ARG(thread); backoff->t_holddown = NULL; THREAD_TIMER_OFF(backoff->t_timetolearn); timerclear(&backoff->first_event_time); backoff->state = SPF_BACKOFF_QUIET; backoff_debug("SPF Back-off(%s) HOLDDOWN elapsed, move to state %s", backoff->name, spf_backoff_state2str(backoff->state)); return 0; }
static void circuit_resign_level (struct isis_circuit *circuit, int level) { int idx = level - 1; THREAD_TIMER_OFF (circuit->t_send_csnp[idx]); THREAD_TIMER_OFF (circuit->t_send_psnp[idx]); if (circuit->circ_type == CIRCUIT_T_BROADCAST) { THREAD_TIMER_OFF (circuit->u.bc.t_send_lan_hello[idx]); THREAD_TIMER_OFF (circuit->u.bc.t_run_dr[idx]); THREAD_TIMER_OFF (circuit->u.bc.t_refresh_pseudo_lsp[idx]); circuit->lsp_regenerate_pending[idx] = 0; circuit->u.bc.run_dr_elect[idx] = 0; if (circuit->u.bc.lan_neighs[idx] != NULL) { list_delete (circuit->u.bc.lan_neighs[idx]); circuit->u.bc.lan_neighs[idx] = NULL; } } return; }
void isis_spftree_del (struct isis_spftree *spftree) { THREAD_TIMER_OFF (spftree->t_spf); spftree->tents->del = (void (*)(void *)) isis_vertex_del; list_delete (spftree->tents); spftree->tents = NULL; spftree->paths->del = (void (*)(void *)) isis_vertex_del; list_delete (spftree->paths); spftree->paths = NULL; XFREE (MTYPE_ISIS_SPFTREE, spftree); return; }
long spf_backoff_schedule(struct spf_backoff *backoff) { long rv = 0; struct timeval now; gettimeofday(&now, NULL); backoff_debug("SPF Back-off(%s) schedule called in state %s", backoff->name, spf_backoff_state2str(backoff->state)); backoff->last_event_time = now; switch (backoff->state) { case SPF_BACKOFF_QUIET: backoff->state = SPF_BACKOFF_SHORT_WAIT; thread_add_timer_msec( backoff->m, spf_backoff_timetolearn_elapsed, backoff, backoff->timetolearn, &backoff->t_timetolearn); thread_add_timer_msec(backoff->m, spf_backoff_holddown_elapsed, backoff, backoff->holddown, &backoff->t_holddown); backoff->first_event_time = now; rv = backoff->init_delay; break; case SPF_BACKOFF_SHORT_WAIT: case SPF_BACKOFF_LONG_WAIT: THREAD_TIMER_OFF(backoff->t_holddown); thread_add_timer_msec(backoff->m, spf_backoff_holddown_elapsed, backoff, backoff->holddown, &backoff->t_holddown); if (backoff->state == SPF_BACKOFF_SHORT_WAIT) rv = backoff->short_delay; else rv = backoff->long_delay; break; } backoff_debug( "SPF Back-off(%s) changed state to %s and returned %ld delay", backoff->name, spf_backoff_state2str(backoff->state), rv); return rv; }