]> git.proxmox.com Git - mirror_frr.git/blobdiff - isisd/isis_dr.c
zebra, lib: fix the ZEBRA_INTERFACE_VRF_UPDATE zapi message
[mirror_frr.git] / isisd / isis_dr.c
index 84b0bb973925014de2d8d74a4cdaba6e1f436637..449648656a6b617c50782dfbaf1bf4506f164c07 100644 (file)
@@ -62,35 +62,28 @@ const char *isis_disflag2string(int disflag)
        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;
 }
@@ -126,7 +119,7 @@ int isis_dr_elect(struct isis_circuit *circuit, int level)
        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;
 
@@ -135,7 +128,7 @@ int isis_dr_elect(struct isis_circuit *circuit, int level)
 
        if (!adjdb) {
                zlog_warn("isis_dr_elect() adjdb == NULL");
-               list_delete_and_null(&list);
+               list_delete(&list);
                return ISIS_WARNING;
        }
        isis_adj_build_up_list(adjdb, list);
@@ -177,7 +170,7 @@ int isis_dr_elect(struct isis_circuit *circuit, int level)
                 */
                if (circuit->u.bc.is_dr[level - 1])
                        retval = isis_dr_resign(circuit, level);
-               list_delete_and_null(&list);
+               list_delete(&list);
                return retval;
        }
 
@@ -217,13 +210,13 @@ int isis_dr_elect(struct isis_circuit *circuit, int level)
                if (circuit->u.bc.is_dr[level - 1])
                        retval = isis_dr_resign(circuit, level);
        }
-       list_delete_and_null(&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);
 
@@ -241,12 +234,6 @@ int isis_dr_resign(struct isis_circuit *circuit, int 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),
@@ -254,18 +241,20 @@ int isis_dr_resign(struct isis_circuit *circuit, int level)
        } 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);
 
@@ -274,21 +263,13 @@ int isis_dr_resign(struct isis_circuit *circuit, int level)
 
 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) {
@@ -307,11 +288,6 @@ int isis_dr_commence(struct isis_circuit *circuit, int level)
                   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),
@@ -333,17 +309,16 @@ int isis_dr_commence(struct isis_circuit *circuit, int level)
                   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);