summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--isisd/isis_adjacency.c41
-rw-r--r--isisd/isis_adjacency.h4
-rw-r--r--isisd/isis_sr.c37
-rw-r--r--isisd/isisd.c2
-rw-r--r--isisd/isisd.h1
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];