|
|
| version 1.1, 2012/02/21 17:26:11 | version 1.1.1.2, 2012/10/09 09:22:28 |
|---|---|
| Line 47 | Line 47 |
| #include "isisd/isis_dr.h" | #include "isisd/isis_dr.h" |
| #include "isisd/isis_events.h" | #include "isisd/isis_events.h" |
| extern struct isis *isis; | |
| extern struct thread_master *master; | |
| const char * | const char * |
| isis_disflag2string (int disflag) | isis_disflag2string (int disflag) |
| { | { |
| Line 137 isis_dr_elect (struct isis_circuit *circuit, int level | Line 134 isis_dr_elect (struct isis_circuit *circuit, int level |
| int biggest_prio = -1; | int biggest_prio = -1; |
| int cmp_res, retval = ISIS_OK; | int cmp_res, retval = ISIS_OK; |
| own_prio = circuit->u.bc.priority[level - 1]; | own_prio = circuit->priority[level - 1]; |
| adjdb = circuit->u.bc.adjdb[level - 1]; | adjdb = circuit->u.bc.adjdb[level - 1]; |
| if (!adjdb) | if (!adjdb) |
| { | { |
| zlog_warn ("isis_dr_elect() adjdb == NULL"); | zlog_warn ("isis_dr_elect() adjdb == NULL"); |
| retval = ISIS_WARNING; | |
| list_delete (list); | list_delete (list); |
| goto out; | return ISIS_WARNING; |
| } | } |
| isis_adj_build_up_list (adjdb, list); | isis_adj_build_up_list (adjdb, list); |
| Line 189 isis_dr_elect (struct isis_circuit *circuit, int level | Line 185 isis_dr_elect (struct isis_circuit *circuit, int level |
| if (!adj_dr) | if (!adj_dr) |
| { | { |
| /* | /* |
| * Could not find the DR - means we are alone and thus the DR | * Could not find the DR - means we are alone. Resign if we were DR. |
| */ | */ |
| if (!circuit->u.bc.is_dr[level - 1]) | if (circuit->u.bc.is_dr[level - 1]) |
| { | retval = isis_dr_resign (circuit, level); |
| list_delete (list); | list_delete (list); |
| list = NULL; | return retval; |
| return isis_dr_commence (circuit, level); | |
| } | |
| goto out; | |
| } | } |
| /* | /* |
| * Now we have the DR adjacency, compare it to self | * Now we have the DR adjacency, compare it to self |
| */ | */ |
| if (adj_dr->prio[level - 1] < own_prio | if (adj_dr->prio[level - 1] < own_prio || |
| || (adj_dr->prio[level - 1] == own_prio | (adj_dr->prio[level - 1] == own_prio && |
| && memcmp (adj_dr->snpa, circuit->u.bc.snpa, ETH_ALEN) < 0)) | memcmp (adj_dr->snpa, circuit->u.bc.snpa, ETH_ALEN) < 0)) |
| { | { |
| if (!circuit->u.bc.is_dr[level - 1]) | adj_dr->dis_record[level - 1].dis = ISIS_IS_NOT_DIS; |
| { | adj_dr->dis_record[level - 1].last_dis_change = time (NULL); |
| /* | |
| * We are the DR | |
| */ | |
| /* rotate the history log */ | /* rotate the history log */ |
| for (ALL_LIST_ELEMENTS_RO (list, node, adj)) | for (ALL_LIST_ELEMENTS_RO (list, node, adj)) |
| isis_check_dr_change (adj, level); | isis_check_dr_change (adj, level); |
| /* commence */ | /* We are the DR, commence DR */ |
| list_delete (list); | if (circuit->u.bc.is_dr[level - 1] == 0 && listcount (list) > 0) |
| return isis_dr_commence (circuit, level); | retval = isis_dr_commence (circuit, level); |
| } | |
| } | } |
| else | else |
| { | { |
| /* ok we have found the DIS - lets mark the adjacency */ | /* ok we have found the DIS - lets mark the adjacency */ |
| /* set flag for show output */ | /* set flag for show output */ |
| adj_dr->dis_record[level - 1].dis = ISIS_IS_DIS; | adj_dr->dis_record[level - 1].dis = ISIS_IS_DIS; |
| Line 240 isis_dr_elect (struct isis_circuit *circuit, int level | Line 228 isis_dr_elect (struct isis_circuit *circuit, int level |
| /* | /* |
| * We are not DR - if we were -> resign | * We are not DR - if we were -> resign |
| */ | */ |
| if (circuit->u.bc.is_dr[level - 1]) | if (circuit->u.bc.is_dr[level - 1]) |
| { | retval = isis_dr_resign (circuit, level); |
| list_delete (list); | |
| return isis_dr_resign (circuit, level); | |
| } | |
| } | } |
| out: | list_delete (list); |
| if (list) | |
| list_delete (list); | |
| return retval; | return retval; |
| } | } |
| Line 264 isis_dr_resign (struct isis_circuit *circuit, int leve | Line 246 isis_dr_resign (struct isis_circuit *circuit, int leve |
| circuit->u.bc.run_dr_elect[level - 1] = 0; | circuit->u.bc.run_dr_elect[level - 1] = 0; |
| THREAD_TIMER_OFF (circuit->u.bc.t_run_dr[level - 1]); | THREAD_TIMER_OFF (circuit->u.bc.t_run_dr[level - 1]); |
| THREAD_TIMER_OFF (circuit->u.bc.t_refresh_pseudo_lsp[level - 1]); | THREAD_TIMER_OFF (circuit->u.bc.t_refresh_pseudo_lsp[level - 1]); |
| circuit->lsp_regenerate_pending[level - 1] = 0; | |
| memcpy (id, isis->sysid, ISIS_SYS_ID_LEN); | memcpy (id, isis->sysid, ISIS_SYS_ID_LEN); |
| LSP_PSEUDO_ID (id) = circuit->circuit_id; | LSP_PSEUDO_ID (id) = circuit->circuit_id; |
| LSP_FRAGMENT (id) = 0; | LSP_FRAGMENT (id) = 0; |
| lsp_purge_dr (id, circuit, level); | lsp_purge_pseudo (id, circuit, level); |
| if (level == 1) | if (level == 1) |
| { | { |
| Line 327 isis_dr_commence (struct isis_circuit *circuit, int le | Line 310 isis_dr_commence (struct isis_circuit *circuit, int le |
| if (LSP_PSEUDO_ID (old_dr)) | if (LSP_PSEUDO_ID (old_dr)) |
| { | { |
| /* there was a dr elected, purge its LSPs from the db */ | /* there was a dr elected, purge its LSPs from the db */ |
| lsp_purge_dr (old_dr, circuit, level); | lsp_purge_pseudo (old_dr, circuit, level); |
| } | } |
| memcpy (circuit->u.bc.l1_desig_is, isis->sysid, ISIS_SYS_ID_LEN); | memcpy (circuit->u.bc.l1_desig_is, isis->sysid, ISIS_SYS_ID_LEN); |
| *(circuit->u.bc.l1_desig_is + ISIS_SYS_ID_LEN) = circuit->circuit_id; | *(circuit->u.bc.l1_desig_is + ISIS_SYS_ID_LEN) = circuit->circuit_id; |
| Line 335 isis_dr_commence (struct isis_circuit *circuit, int le | Line 318 isis_dr_commence (struct isis_circuit *circuit, int le |
| assert (circuit->circuit_id); /* must be non-zero */ | assert (circuit->circuit_id); /* must be non-zero */ |
| /* if (circuit->t_send_l1_psnp) | /* if (circuit->t_send_l1_psnp) |
| thread_cancel (circuit->t_send_l1_psnp); */ | thread_cancel (circuit->t_send_l1_psnp); */ |
| lsp_l1_pseudo_generate (circuit); | lsp_generate_pseudo (circuit, 1); |
| THREAD_TIMER_OFF (circuit->u.bc.t_run_dr[0]); | THREAD_TIMER_OFF (circuit->u.bc.t_run_dr[0]); |
| THREAD_TIMER_ON (master, circuit->u.bc.t_run_dr[0], isis_run_dr_l1, | THREAD_TIMER_ON (master, circuit->u.bc.t_run_dr[0], isis_run_dr_l1, |
| Line 353 isis_dr_commence (struct isis_circuit *circuit, int le | Line 336 isis_dr_commence (struct isis_circuit *circuit, int le |
| if (LSP_PSEUDO_ID (old_dr)) | if (LSP_PSEUDO_ID (old_dr)) |
| { | { |
| /* there was a dr elected, purge its LSPs from the db */ | /* there was a dr elected, purge its LSPs from the db */ |
| lsp_purge_dr (old_dr, circuit, level); | lsp_purge_pseudo (old_dr, circuit, level); |
| } | } |
| memcpy (circuit->u.bc.l2_desig_is, isis->sysid, ISIS_SYS_ID_LEN); | memcpy (circuit->u.bc.l2_desig_is, isis->sysid, ISIS_SYS_ID_LEN); |
| *(circuit->u.bc.l2_desig_is + ISIS_SYS_ID_LEN) = circuit->circuit_id; | *(circuit->u.bc.l2_desig_is + ISIS_SYS_ID_LEN) = circuit->circuit_id; |
| Line 361 isis_dr_commence (struct isis_circuit *circuit, int le | Line 344 isis_dr_commence (struct isis_circuit *circuit, int le |
| assert (circuit->circuit_id); /* must be non-zero */ | assert (circuit->circuit_id); /* must be non-zero */ |
| /* if (circuit->t_send_l1_psnp) | /* if (circuit->t_send_l1_psnp) |
| thread_cancel (circuit->t_send_l1_psnp); */ | thread_cancel (circuit->t_send_l1_psnp); */ |
| lsp_l2_pseudo_generate (circuit); | lsp_generate_pseudo (circuit, 2); |
| THREAD_TIMER_OFF (circuit->u.bc.t_run_dr[1]); | THREAD_TIMER_OFF (circuit->u.bc.t_run_dr[1]); |
| THREAD_TIMER_ON (master, circuit->u.bc.t_run_dr[1], isis_run_dr_l2, | THREAD_TIMER_ON (master, circuit->u.bc.t_run_dr[1], isis_run_dr_l2, |