summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--isisd/isis_misc.c8
-rw-r--r--isisd/isisd.c27
-rw-r--r--isisd/isisd.h2
-rw-r--r--tests/isisd/test_isis_spf.c13
4 files changed, 45 insertions, 5 deletions
diff --git a/isisd/isis_misc.c b/isisd/isis_misc.c
index e4ef6c8dfa..833d514341 100644
--- a/isisd/isis_misc.c
+++ b/isisd/isis_misc.c
@@ -370,18 +370,20 @@ const char *print_sys_hostname(const uint8_t *sysid)
struct isis_dynhn *dyn;
struct isis *isis = NULL;
struct listnode *node;
+ struct isis_area *area = NULL;
if (!sysid)
return "nullsysid";
/* For our system ID return our host name */
- isis = isis_lookup_by_sysid(sysid);
- if (isis && !CHECK_FLAG(im->options, F_ISIS_UNIT_TEST))
+ area = isis_area_lookup_by_sysid(sysid);
+ if (area && area->dynhostname && !CHECK_FLAG(im->options, F_ISIS_UNIT_TEST))
return cmd_hostname_get();
for (ALL_LIST_ELEMENTS_RO(im->isis, node, isis)) {
+ area = isis_area_lookup_by_sysid(isis->sysid);
dyn = dynhn_find_by_id(isis, sysid);
- if (dyn)
+ if (area && area->dynhostname && dyn)
return dyn->hostname;
}
diff --git a/isisd/isisd.c b/isisd/isisd.c
index 982df0839b..1f119dbcc8 100644
--- a/isisd/isisd.c
+++ b/isisd/isisd.c
@@ -272,7 +272,7 @@ void isis_area_del_circuit(struct isis_area *area, struct isis_circuit *circuit)
isis_csm_state_change(ISIS_DISABLE, circuit, area);
}
-static void delete_area_addr(void *arg)
+void isis_area_address_delete(void *arg)
{
struct iso_address *addr = (struct iso_address *)arg;
@@ -330,7 +330,7 @@ struct isis_area *isis_area_create(const char *area_tag, const char *vrf_name)
area->circuit_list = list_new();
area->adjacency_list = list_new();
area->area_addrs = list_new();
- area->area_addrs->del = delete_area_addr;
+ area->area_addrs->del = isis_area_address_delete;
if (!CHECK_FLAG(im->options, F_ISIS_UNIT_TEST))
event_add_timer(master, lsp_tick, area, 1, &area->t_tick);
@@ -471,6 +471,29 @@ struct isis_area *isis_area_lookup(const char *area_tag, vrf_id_t vrf_id)
return NULL;
}
+struct isis_area *isis_area_lookup_by_sysid(const uint8_t *sysid)
+{
+ struct isis_area *area;
+ struct listnode *node;
+ struct isis *isis;
+ struct iso_address *addr = NULL;
+
+ isis = isis_lookup_by_sysid(sysid);
+ if (isis == NULL)
+ return NULL;
+
+ for (ALL_LIST_ELEMENTS_RO(isis->area_list, node, area)) {
+ if (listcount(area->area_addrs) > 0) {
+ addr = listgetdata(listhead(area->area_addrs));
+ if (!memcmp(addr->area_addr + addr->addr_len, sysid,
+ ISIS_SYS_ID_LEN))
+ return area;
+ }
+ }
+
+ return NULL;
+}
+
int isis_area_get(struct vty *vty, const char *area_tag)
{
struct isis_area *area;
diff --git a/isisd/isisd.h b/isisd/isisd.h
index f5042e4ad5..2ed7dd0f10 100644
--- a/isisd/isisd.h
+++ b/isisd/isisd.h
@@ -285,10 +285,12 @@ void isis_area_add_circuit(struct isis_area *area,
void isis_area_del_circuit(struct isis_area *area,
struct isis_circuit *circuit);
+void isis_area_address_delete(void *arg);
struct isis_area *isis_area_create(const char *, const char *);
struct isis_area *isis_area_lookup(const char *, vrf_id_t vrf_id);
struct isis_area *isis_area_lookup_by_vrf(const char *area_tag,
const char *vrf_name);
+struct isis_area *isis_area_lookup_by_sysid(const uint8_t *sysid);
int isis_area_get(struct vty *vty, const char *area_tag);
void isis_area_destroy(struct isis_area *area);
void isis_filter_update(struct access_list *access);
diff --git a/tests/isisd/test_isis_spf.c b/tests/isisd/test_isis_spf.c
index 4ea28cda2f..317ebd729e 100644
--- a/tests/isisd/test_isis_spf.c
+++ b/tests/isisd/test_isis_spf.c
@@ -245,12 +245,25 @@ static int test_run(struct vty *vty, const struct isis_topology *topology,
struct isis_area *area;
struct lfa_protected_resource protected_resource = {};
uint8_t fail_id[ISIS_SYS_ID_LEN] = {};
+ static char sysidstr[ISO_SYSID_STRLEN];
+ char net_title[255];
+ uint8_t buff[255];
+ struct iso_address *addr = NULL;
/* Init topology. */
area = isis_area_create("1", NULL);
memcpy(area->isis->sysid, root->sysid, sizeof(area->isis->sysid));
area->is_type = IS_LEVEL_1_AND_2;
area->srdb.enabled = true;
+ area->area_addrs = list_new();
+ area->area_addrs->del = isis_area_address_delete;
+ addr = XMALLOC(MTYPE_ISIS_AREA_ADDR, sizeof(struct iso_address));
+ snprintfrr(sysidstr, sizeof(sysidstr), "%pSY", area->isis->sysid);
+ snprintf(net_title, sizeof(net_title), "49.%s.00", sysidstr);
+ addr->addr_len = dotformat2buff(buff, net_title);
+ memcpy(addr->area_addr, buff, addr->addr_len);
+ addr->addr_len -= (ISIS_SYS_ID_LEN + ISIS_NSEL_LEN);
+ listnode_add(area->area_addrs, addr);
if (test_topology_load(topology, area, area->lspdb) != 0) {
vty_out(vty, "%% Failed to load topology\n");
return CMD_WARNING;