diff options
| -rw-r--r-- | isisd/isis_adjacency.c | 41 | ||||
| -rw-r--r-- | isisd/isis_adjacency.h | 4 | ||||
| -rw-r--r-- | isisd/isis_sr.c | 37 | ||||
| -rw-r--r-- | isisd/isisd.c | 2 | ||||
| -rw-r--r-- | isisd/isisd.h | 1 |
5 files changed, 23 insertions, 62 deletions
diff --git a/isisd/isis_adjacency.c b/isisd/isis_adjacency.c index 425627485a..ab133cbfd3 100644 --- a/isisd/isis_adjacency.c +++ b/isisd/isis_adjacency.c @@ -94,6 +94,7 @@ struct isis_adjacency *isis_new_adj(const uint8_t *id, const uint8_t *snpa, } } adj->adj_sids = list_new(); + listnode_add(circuit->area->adjacency_list, adj); return adj; } @@ -123,42 +124,21 @@ struct isis_adjacency *isis_adj_lookup_snpa(const uint8_t *ssnpa, return NULL; } -bool isis_adj_exists(const struct isis_area *area, int level, - const uint8_t *sysid) +struct isis_adjacency *isis_adj_find(const struct isis_area *area, int level, + const uint8_t *sysid) { - struct isis_circuit *circuit; + struct isis_adjacency *adj; struct listnode *node; - for (ALL_LIST_ELEMENTS_RO(area->circuit_list, node, circuit)) { - struct isis_adjacency *adj; - struct listnode *anode; - struct list *adjdb; - - switch (circuit->circ_type) { - case CIRCUIT_T_BROADCAST: - adjdb = circuit->u.bc.adjdb[level - 1]; - if (!adjdb) - continue; - - for (ALL_LIST_ELEMENTS_RO(adjdb, anode, adj)) { - if (!memcmp(adj->sysid, sysid, ISIS_SYS_ID_LEN)) - return true; - } - break; - case CIRCUIT_T_P2P: - adj = circuit->u.p2p.neighbor; - if (!adj) - break; + for (ALL_LIST_ELEMENTS_RO(area->adjacency_list, node, adj)) { + if (!(adj->level & level)) + continue; - if (!memcmp(adj->sysid, sysid, ISIS_SYS_ID_LEN)) - return true; - break; - default: - break; - } + if (!memcmp(adj->sysid, sysid, ISIS_SYS_ID_LEN)) + return adj; } - return false; + return NULL; } DEFINE_HOOK(isis_adj_state_change_hook, (struct isis_adjacency *adj), (adj)) @@ -186,6 +166,7 @@ void isis_delete_adj(void *arg) adj_mt_finish(adj); list_delete(&adj->adj_sids); + listnode_delete(adj->circuit->area->adjacency_list, adj); XFREE(MTYPE_ISIS_ADJACENCY, adj); return; } diff --git a/isisd/isis_adjacency.h b/isisd/isis_adjacency.h index d61fbbd751..3c3a211a52 100644 --- a/isisd/isis_adjacency.h +++ b/isisd/isis_adjacency.h @@ -113,8 +113,8 @@ struct isis_adjacency *isis_adj_lookup(const uint8_t *sysid, struct list *adjdb); struct isis_adjacency *isis_adj_lookup_snpa(const uint8_t *ssnpa, struct list *adjdb); -bool isis_adj_exists(const struct isis_area *area, int level, - const uint8_t *sysid); +struct isis_adjacency *isis_adj_find(const struct isis_area *area, int level, + const uint8_t *sysid); struct isis_adjacency *isis_new_adj(const uint8_t *id, const uint8_t *snpa, int level, struct isis_circuit *circuit); void isis_delete_adj(void *adj); diff --git a/isisd/isis_sr.c b/isisd/isis_sr.c index afb814c089..c69bf31d24 100644 --- a/isisd/isis_sr.c +++ b/isisd/isis_sr.c @@ -1223,7 +1223,7 @@ static void process_node_changes(struct isis_area *area, int level, * If an neighbor router's SRGB was changed or created, then reinstall * all Prefix-SIDs from all nodes that use this neighbor as nexthop. */ - adjacent = isis_adj_exists(area, level, sysid); + adjacent = !!isis_adj_find(area, level, sysid); switch (srn->state) { case SRDB_STATE_NEW: case SRDB_STATE_MODIFIED: @@ -2103,7 +2103,7 @@ static int sr_start_label_manager(struct thread *start) int isis_sr_start(struct isis_area *area) { struct isis_sr_db *srdb = &area->srdb; - struct isis_circuit *circuit; + struct isis_adjacency *adj; struct listnode *node; /* First start Label Manager if not ready */ @@ -2140,34 +2140,11 @@ int isis_sr_start(struct isis_area *area) area->area_tag); /* Create Adjacency-SIDs from existing IS-IS Adjacencies. */ - for (ALL_LIST_ELEMENTS_RO(area->circuit_list, node, circuit)) { - struct isis_adjacency *adj; - struct listnode *anode; - - switch (circuit->circ_type) { - case CIRCUIT_T_BROADCAST: - for (int level = ISIS_LEVEL1; level <= ISIS_LEVELS; - level++) { - for (ALL_LIST_ELEMENTS_RO( - circuit->u.bc.adjdb[level - 1], - anode, adj)) { - if (adj->ipv4_address_count > 0) - sr_adj_sid_add(adj, AF_INET); - if (adj->ipv6_address_count > 0) - sr_adj_sid_add(adj, AF_INET6); - } - } - break; - case CIRCUIT_T_P2P: - adj = circuit->u.p2p.neighbor; - if (adj && adj->ipv4_address_count > 0) - sr_adj_sid_add(adj, AF_INET); - if (adj && adj->ipv6_address_count > 0) - sr_adj_sid_add(adj, AF_INET6); - break; - default: - break; - } + for (ALL_LIST_ELEMENTS_RO(area->adjacency_list, node, adj)) { + if (adj->ipv4_address_count > 0) + sr_adj_sid_add(adj, AF_INET); + if (adj->ipv6_address_count > 0) + sr_adj_sid_add(adj, AF_INET6); } area->srdb.enabled = true; diff --git a/isisd/isisd.c b/isisd/isisd.c index 97a4688460..cc94444d47 100644 --- a/isisd/isisd.c +++ b/isisd/isisd.c @@ -133,6 +133,7 @@ struct isis_area *isis_area_create(const char *area_tag) spftree_area_init(area); area->circuit_list = list_new(); + area->adjacency_list = list_new(); area->area_addrs = list_new(); thread_add_timer(master, lsp_tick, area, 1, &area->t_tick); flags_initialize(&area->flags); @@ -268,6 +269,7 @@ void isis_area_destroy(struct isis_area *area) } list_delete(&area->circuit_list); } + list_delete(&area->adjacency_list); lsp_db_fini(&area->lspdb[0]); lsp_db_fini(&area->lspdb[1]); diff --git a/isisd/isisd.h b/isisd/isisd.h index 5a6c704b7c..724d5f8e54 100644 --- a/isisd/isisd.h +++ b/isisd/isisd.h @@ -107,6 +107,7 @@ struct isis_area { #define DEFAULT_LSP_MTU 1497 unsigned int lsp_mtu; /* Size of LSPs to generate */ struct list *circuit_list; /* IS-IS circuits */ + struct list *adjacency_list; /* IS-IS adjacencies */ struct flags flags; struct thread *t_tick; /* LSP walker */ struct thread *t_lsp_refresh[ISIS_LEVELS]; |
