diff options
Diffstat (limited to 'isisd/isis_adjacency.c')
| -rw-r--r-- | isisd/isis_adjacency.c | 43 |
1 files changed, 11 insertions, 32 deletions
diff --git a/isisd/isis_adjacency.c b/isisd/isis_adjacency.c index 425627485a..af5258846a 100644 --- a/isisd/isis_adjacency.c +++ b/isisd/isis_adjacency.c @@ -50,8 +50,6 @@ #include "isisd/fabricd.h" #include "isisd/isis_nb.h" -extern struct isis *isis; - static struct isis_adjacency *adj_alloc(const uint8_t *id) { struct isis_adjacency *adj; @@ -94,6 +92,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 +122,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(area->adjacency_list, node, adj)) { + if (!(adj->level & level)) + 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; - - 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 +164,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; } |
