#include "stream.h"
#include "if.h"
-#include "isisd/dict.h"
#include "isisd/isis_constants.h"
#include "isisd/isis_common.h"
#include "isisd/isis_misc.h"
return NULL; /* not reached */
}
-int isis_run_dr_l1(struct thread *thread)
+int isis_run_dr(struct thread *thread)
{
- struct isis_circuit *circuit;
+ struct isis_circuit_arg *arg = THREAD_ARG(thread);
- circuit = THREAD_ARG(thread);
- assert(circuit);
-
- if (circuit->u.bc.run_dr_elect[0])
- zlog_warn("isis_run_dr(): run_dr_elect already set for l1");
-
- circuit->u.bc.t_run_dr[0] = NULL;
- circuit->u.bc.run_dr_elect[0] = 1;
+ assert(arg);
- return ISIS_OK;
-}
+ struct isis_circuit *circuit = arg->circuit;
+ int level = arg->level;
-int isis_run_dr_l2(struct thread *thread)
-{
- struct isis_circuit *circuit;
-
- circuit = THREAD_ARG(thread);
assert(circuit);
- if (circuit->u.bc.run_dr_elect[1])
- zlog_warn("isis_run_dr(): run_dr_elect already set for l2");
+ if (circuit->circ_type != CIRCUIT_T_BROADCAST) {
+ zlog_warn("%s: scheduled for non broadcast circuit from %s:%d",
+ __func__, thread->schedfrom, thread->schedfrom_line);
+ return ISIS_WARNING;
+ }
+ if (circuit->u.bc.run_dr_elect[level - 1])
+ zlog_warn("isis_run_dr(): run_dr_elect already set for l%d", level);
- circuit->u.bc.t_run_dr[1] = NULL;
- circuit->u.bc.run_dr_elect[1] = 1;
+ circuit->u.bc.t_run_dr[level - 1] = NULL;
+ circuit->u.bc.run_dr_elect[level - 1] = 1;
return ISIS_OK;
}
struct listnode *node;
struct isis_adjacency *adj, *adj_dr = NULL;
struct list *list = list_new();
- u_char own_prio;
+ uint8_t own_prio;
int biggest_prio = -1;
int cmp_res, retval = ISIS_OK;
if (!adjdb) {
zlog_warn("isis_dr_elect() adjdb == NULL");
- list_delete(list);
+ list_delete(&list);
return ISIS_WARNING;
}
isis_adj_build_up_list(adjdb, list);
*/
if (circuit->u.bc.is_dr[level - 1])
retval = isis_dr_resign(circuit, level);
- list_delete(list);
+ list_delete(&list);
return retval;
}
if (circuit->u.bc.is_dr[level - 1])
retval = isis_dr_resign(circuit, level);
}
- list_delete(list);
+ list_delete(&list);
return retval;
}
int isis_dr_resign(struct isis_circuit *circuit, int level)
{
- u_char id[ISIS_SYS_ID_LEN + 2];
+ uint8_t id[ISIS_SYS_ID_LEN + 2];
zlog_debug("isis_dr_resign l%d", level);
if (level == 1) {
memset(circuit->u.bc.l1_desig_is, 0, ISIS_SYS_ID_LEN + 1);
- THREAD_TIMER_OFF(circuit->t_send_csnp[0]);
-
- thread_add_timer(master, isis_run_dr_l1, circuit,
- 2 * circuit->hello_interval[0],
- &circuit->u.bc.t_run_dr[0]);
-
thread_add_timer(master, send_l1_psnp, circuit,
isis_jitter(circuit->psnp_interval[level - 1],
PSNP_JITTER),
} else {
memset(circuit->u.bc.l2_desig_is, 0, ISIS_SYS_ID_LEN + 1);
- THREAD_TIMER_OFF(circuit->t_send_csnp[1]);
-
- thread_add_timer(master, isis_run_dr_l2, circuit,
- 2 * circuit->hello_interval[1],
- &circuit->u.bc.t_run_dr[1]);
-
thread_add_timer(master, send_l2_psnp, circuit,
isis_jitter(circuit->psnp_interval[level - 1],
PSNP_JITTER),
&circuit->t_send_psnp[1]);
}
+ THREAD_TIMER_OFF(circuit->t_send_csnp[level - 1]);
+
+ thread_add_timer(master, isis_run_dr,
+ &circuit->level_arg[level - 1],
+ 2 * circuit->hello_interval[level - 1],
+ &circuit->u.bc.t_run_dr[level - 1]);
+
+
thread_add_event(master, isis_event_dis_status_change, circuit, 0,
NULL);
int isis_dr_commence(struct isis_circuit *circuit, int level)
{
- u_char old_dr[ISIS_SYS_ID_LEN + 2];
+ uint8_t old_dr[ISIS_SYS_ID_LEN + 2];
if (isis->debugs & DEBUG_EVENTS)
zlog_debug("isis_dr_commence l%d", level);
/* Lets keep a pause in DR election */
circuit->u.bc.run_dr_elect[level - 1] = 0;
- if (level == 1)
- thread_add_timer(master, isis_run_dr_l1, circuit,
- 2 * circuit->hello_interval[0],
- &circuit->u.bc.t_run_dr[0]);
- else
- thread_add_timer(master, isis_run_dr_l2, circuit,
- 2 * circuit->hello_interval[1],
- &circuit->u.bc.t_run_dr[1]);
circuit->u.bc.is_dr[level - 1] = 1;
if (level == 1) {
thread_cancel (circuit->t_send_l1_psnp); */
lsp_generate_pseudo(circuit, 1);
- THREAD_TIMER_OFF(circuit->u.bc.t_run_dr[0]);
- thread_add_timer(master, isis_run_dr_l1, circuit,
- 2 * circuit->hello_interval[0],
- &circuit->u.bc.t_run_dr[0]);
-
thread_add_timer(master, send_l1_csnp, circuit,
isis_jitter(circuit->csnp_interval[level - 1],
CSNP_JITTER),
thread_cancel (circuit->t_send_l1_psnp); */
lsp_generate_pseudo(circuit, 2);
- THREAD_TIMER_OFF(circuit->u.bc.t_run_dr[1]);
- thread_add_timer(master, isis_run_dr_l2, circuit,
- 2 * circuit->hello_interval[1],
- &circuit->u.bc.t_run_dr[1]);
-
thread_add_timer(master, send_l2_csnp, circuit,
isis_jitter(circuit->csnp_interval[level - 1],
CSNP_JITTER),
&circuit->t_send_csnp[1]);
}
+ thread_add_timer(master, isis_run_dr,
+ &circuit->level_arg[level - 1],
+ 2 * circuit->hello_interval[level - 1],
+ &circuit->u.bc.t_run_dr[level - 1]);
thread_add_event(master, isis_event_dis_status_change, circuit, 0,
NULL);