struct isis_dynhn *dyn;
- dyn = dynhn_find_by_id(adj->sysid);
+ dyn = dynhn_find_by_id(adj->circuit->isis, adj->sysid);
if (dyn)
return dyn->hostname;
else
if (!adj)
return;
- dyn = dynhn_find_by_id(adj->sysid);
+ dyn = dynhn_find_by_id(adj->circuit->isis, adj->sysid);
if (dyn)
zlog_debug("%s", dyn->hostname);
vty_out(vty, " SNPA: %s", snpa_print(adj->snpa));
if (adj->circuit
&& (adj->circuit->circ_type == CIRCUIT_T_BROADCAST)) {
- dyn = dynhn_find_by_id(adj->lanid);
+ dyn = dynhn_find_by_id(adj->circuit->isis, adj->lanid);
if (dyn)
vty_out(vty, ", LAN id: %s.%02x", dyn->hostname,
adj->lanid[ISIS_SYS_ID_LEN]);
DEFINE_MTYPE_STATIC(ISISD, ISIS_DYNHN, "ISIS dyn hostname");
-extern struct host host;
-
-struct list *dyn_cache = NULL;
static int dyn_cache_cleanup(struct thread *);
void dyn_cache_init(struct isis *isis)
{
- if (dyn_cache == NULL)
- dyn_cache = list_new();
+ isis->dyn_cache = list_new();
if (!CHECK_FLAG(im->options, F_ISIS_UNIT_TEST))
thread_add_timer(master, dyn_cache_cleanup, isis, 120,
&isis->t_dync_clean);
- return;
}
-void dyn_cache_cleanup_all(void)
+void dyn_cache_finish(struct isis *isis)
{
struct listnode *node, *nnode;
struct isis_dynhn *dyn;
- for (ALL_LIST_ELEMENTS(dyn_cache, node, nnode, dyn)) {
- list_delete_node(dyn_cache, node);
+ thread_cancel(&isis->t_dync_clean);
+
+ for (ALL_LIST_ELEMENTS(isis->dyn_cache, node, nnode, dyn)) {
+ list_delete_node(isis->dyn_cache, node);
XFREE(MTYPE_ISIS_DYNHN, dyn);
}
+
+ list_delete(&isis->dyn_cache);
}
static int dyn_cache_cleanup(struct thread *thread)
isis->t_dync_clean = NULL;
- for (ALL_LIST_ELEMENTS(dyn_cache, node, nnode, dyn)) {
+ for (ALL_LIST_ELEMENTS(isis->dyn_cache, node, nnode, dyn)) {
if ((now - dyn->refresh) < MAX_LSP_LIFETIME)
continue;
- list_delete_node(dyn_cache, node);
+ list_delete_node(isis->dyn_cache, node);
XFREE(MTYPE_ISIS_DYNHN, dyn);
}
return ISIS_OK;
}
-struct isis_dynhn *dynhn_find_by_id(const uint8_t *id)
+struct isis_dynhn *dynhn_find_by_id(struct isis *isis, const uint8_t *id)
{
struct listnode *node = NULL;
struct isis_dynhn *dyn = NULL;
- for (ALL_LIST_ELEMENTS_RO(dyn_cache, node, dyn))
+ for (ALL_LIST_ELEMENTS_RO(isis->dyn_cache, node, dyn))
if (memcmp(dyn->id, id, ISIS_SYS_ID_LEN) == 0)
return dyn;
return NULL;
}
-struct isis_dynhn *dynhn_find_by_name(const char *hostname)
+struct isis_dynhn *dynhn_find_by_name(struct isis *isis, const char *hostname)
{
struct listnode *node = NULL;
struct isis_dynhn *dyn = NULL;
- for (ALL_LIST_ELEMENTS_RO(dyn_cache, node, dyn))
+ for (ALL_LIST_ELEMENTS_RO(isis->dyn_cache, node, dyn))
if (strncmp(dyn->hostname, hostname, 255) == 0)
return dyn;
return NULL;
}
-void isis_dynhn_insert(const uint8_t *id, const char *hostname, int level)
+void isis_dynhn_insert(struct isis *isis, const uint8_t *id,
+ const char *hostname, int level)
{
struct isis_dynhn *dyn;
- dyn = dynhn_find_by_id(id);
+ dyn = dynhn_find_by_id(isis, id);
if (!dyn) {
dyn = XCALLOC(MTYPE_ISIS_DYNHN, sizeof(struct isis_dynhn));
memcpy(dyn->id, id, ISIS_SYS_ID_LEN);
dyn->level = level;
- listnode_add(dyn_cache, dyn);
+ listnode_add(isis->dyn_cache, dyn);
}
snprintf(dyn->hostname, sizeof(dyn->hostname), "%s", hostname);
dyn->refresh = time(NULL);
}
-void isis_dynhn_remove(const uint8_t *id)
+void isis_dynhn_remove(struct isis *isis, const uint8_t *id)
{
struct isis_dynhn *dyn;
- dyn = dynhn_find_by_id(id);
+ dyn = dynhn_find_by_id(isis, id);
if (!dyn)
return;
- listnode_delete(dyn_cache, dyn);
+ listnode_delete(isis->dyn_cache, dyn);
XFREE(MTYPE_ISIS_DYNHN, dyn);
}
if (!isis->sysid_set)
return;
vty_out(vty, "Level System ID Dynamic Hostname\n");
- for (ALL_LIST_ELEMENTS_RO(dyn_cache, node, dyn)) {
+ for (ALL_LIST_ELEMENTS_RO(isis->dyn_cache, node, dyn)) {
vty_out(vty, "%-7d", dyn->level);
vty_out(vty, "%-15s%-15s\n", sysid_print(dyn->id),
dyn->hostname);
return;
}
-struct isis_dynhn *dynhn_snmp_next(const uint8_t *id, int level)
+struct isis_dynhn *dynhn_snmp_next(struct isis *isis, const uint8_t *id,
+ int level)
{
struct listnode *node = NULL;
struct isis_dynhn *dyn = NULL;
struct isis_dynhn *found_dyn = NULL;
int res;
- for (ALL_LIST_ELEMENTS_RO(dyn_cache, node, dyn)) {
+ for (ALL_LIST_ELEMENTS_RO(isis->dyn_cache, node, dyn)) {
res = memcmp(dyn->id, id, ISIS_SYS_ID_LEN);
if (res < 0)
};
void dyn_cache_init(struct isis *isis);
-void dyn_cache_cleanup_all(void);
-void isis_dynhn_insert(const uint8_t *id, const char *hostname, int level);
-void isis_dynhn_remove(const uint8_t *id);
-struct isis_dynhn *dynhn_find_by_id(const uint8_t *id);
-struct isis_dynhn *dynhn_find_by_name(const char *hostname);
+void dyn_cache_finish(struct isis *isis);
+void isis_dynhn_insert(struct isis *isis, const uint8_t *id,
+ const char *hostname, int level);
+void isis_dynhn_remove(struct isis *isis, const uint8_t *id);
+struct isis_dynhn *dynhn_find_by_id(struct isis *isis, const uint8_t *id);
+struct isis_dynhn *dynhn_find_by_name(struct isis *isis, const char *hostname);
void dynhn_print_all(struct vty *vty, struct isis *isis);
/* Snmp support */
-struct isis_dynhn *dynhn_snmp_next(const uint8_t *id, int level);
+struct isis_dynhn *dynhn_snmp_next(struct isis *isis, const uint8_t *id,
+ int level);
#endif /* _ZEBRA_ISIS_DYNHN_H */
if (area->dynhostname && lsp->tlvs->hostname
&& lsp->hdr.rem_lifetime) {
- isis_dynhn_insert(lsp->hdr.lsp_id, lsp->tlvs->hostname,
- (lsp->hdr.lsp_bits & LSPBIT_IST)
- == IS_LEVEL_1_AND_2
- ? IS_LEVEL_2
- : IS_LEVEL_1);
+ isis_dynhn_insert(
+ area->isis, lsp->hdr.lsp_id, lsp->tlvs->hostname,
+ (lsp->hdr.lsp_bits & LSPBIT_IST) == IS_LEVEL_1_AND_2
+ ? IS_LEVEL_2
+ : IS_LEVEL_1);
}
return;
char id[SYSID_STRLEN];
if (dynhost)
- dyn = dynhn_find_by_id(lsp_id);
+ dyn = dynhn_find_by_id(isis, lsp_id);
else
dyn = NULL;
{
struct isis_dynhn *dyn;
struct isis *isis = NULL;
+ struct listnode *node;
if (!sysid)
return "nullsysid";
if (isis && !CHECK_FLAG(im->options, F_ISIS_UNIT_TEST))
return cmd_hostname_get();
- dyn = dynhn_find_by_id(sysid);
- if (dyn)
- return dyn->hostname;
+ for (ALL_LIST_ELEMENTS_RO(im->isis, node, isis)) {
+ dyn = dynhn_find_by_id(isis, sysid);
+ if (dyn)
+ return dyn->hostname;
+ }
return sysid_print(sysid);
}
struct yang_data *data;
struct isis_circuit *circuit = adj->circuit;
struct isis_area *area = circuit->area;
- struct isis_dynhn *dyn = dynhn_find_by_id(adj->sysid);
+ struct isis_dynhn *dyn = dynhn_find_by_id(circuit->isis, adj->sysid);
notif_prep_instance_hdr(xpath, area, "default", arguments);
notif_prepr_iface_hdr(xpath, circuit, arguments);
oid *oid_idx;
size_t oid_idx_len;
size_t off = 0;
+ struct isis *isis = isis_lookup_by_vrfid(VRF_DEFAULT);
+
+ if (isis == NULL)
+ return NULL;
*write_method = NULL;
cmp_level = (int)oid_idx[ISIS_SYS_ID_LEN + 1];
- dyn = dynhn_find_by_id(cmp_buf);
+ dyn = dynhn_find_by_id(isis, cmp_buf);
if (dyn == NULL || dyn->level != cmp_level)
return NULL;
*/
cmp_level = (int)(IS_LEVEL_2 + 1);
- dyn = dynhn_snmp_next(cmp_buf, cmp_level);
+ dyn = dynhn_snmp_next(isis, cmp_buf, cmp_level);
if (dyn == NULL)
return NULL;
isis_redist_free(isis);
list_delete(&isis->area_list);
+ dyn_cache_finish(isis);
XFREE(MTYPE_ISIS, isis);
}
vrf_name, all_vrf);
}
+static int id_to_sysid(struct isis *isis, const char *id, uint8_t *sysid)
+{
+ struct isis_dynhn *dynhn;
+
+ memset(sysid, 0, ISIS_SYS_ID_LEN);
+ if (id) {
+ if (sysid2buff(sysid, id) == 0) {
+ dynhn = dynhn_find_by_name(isis, id);
+ if (dynhn == NULL)
+ return -1;
+ memcpy(sysid, dynhn->id, ISIS_SYS_ID_LEN);
+ }
+ }
+
+ return 0;
+}
+
static void isis_neighbor_common(struct vty *vty, const char *id, char detail,
struct isis *isis, uint8_t *sysid)
{
const char *vrf_name, bool all_vrf)
{
struct listnode *node;
- struct isis_dynhn *dynhn;
uint8_t sysid[ISIS_SYS_ID_LEN];
struct isis *isis;
return CMD_SUCCESS;
}
- memset(sysid, 0, ISIS_SYS_ID_LEN);
- if (id) {
- if (sysid2buff(sysid, id) == 0) {
- dynhn = dynhn_find_by_name(id);
- if (dynhn == NULL) {
- vty_out(vty, "Invalid system id %s\n", id);
- return CMD_SUCCESS;
- }
- memcpy(sysid, dynhn->id, ISIS_SYS_ID_LEN);
- }
- }
-
if (vrf_name) {
if (all_vrf) {
for (ALL_LIST_ELEMENTS_RO(im->isis, node, isis)) {
+ if (id_to_sysid(isis, id, sysid)) {
+ vty_out(vty, "Invalid system id %s\n",
+ id);
+ return CMD_SUCCESS;
+ }
isis_neighbor_common(vty, id, detail, isis,
sysid);
}
return CMD_SUCCESS;
}
isis = isis_lookup_by_vrfname(vrf_name);
- if (isis != NULL)
+ if (isis != NULL) {
+ if (id_to_sysid(isis, id, sysid)) {
+ vty_out(vty, "Invalid system id %s\n", id);
+ return CMD_SUCCESS;
+ }
isis_neighbor_common(vty, id, detail, isis, sysid);
+ }
}
return CMD_SUCCESS;
bool all_vrf)
{
struct listnode *node;
- struct isis_dynhn *dynhn;
uint8_t sysid[ISIS_SYS_ID_LEN];
struct isis *isis;
return CMD_SUCCESS;
}
- memset(sysid, 0, ISIS_SYS_ID_LEN);
- if (id) {
- if (sysid2buff(sysid, id) == 0) {
- dynhn = dynhn_find_by_name(id);
- if (dynhn == NULL) {
- vty_out(vty, "Invalid system id %s\n", id);
- return CMD_SUCCESS;
- }
- memcpy(sysid, dynhn->id, ISIS_SYS_ID_LEN);
- }
- }
if (vrf_name) {
if (all_vrf) {
- for (ALL_LIST_ELEMENTS_RO(im->isis, node, isis))
+ for (ALL_LIST_ELEMENTS_RO(im->isis, node, isis)) {
+ if (id_to_sysid(isis, id, sysid)) {
+ vty_out(vty, "Invalid system id %s\n",
+ id);
+ return CMD_SUCCESS;
+ }
isis_neighbor_common_clear(vty, id, sysid,
isis);
+ }
return CMD_SUCCESS;
}
isis = isis_lookup_by_vrfname(vrf_name);
- if (isis != NULL)
+ if (isis != NULL) {
+ if (id_to_sysid(isis, id, sysid)) {
+ vty_out(vty, "Invalid system id %s\n", id);
+ return CMD_SUCCESS;
+ }
isis_neighbor_common_clear(vty, id, sysid, isis);
+ }
}
return CMD_SUCCESS;
*/
if (sysid2buff(lspid, sysid)) {
lsp = lsp_search(head, lspid);
- } else if ((dynhn = dynhn_find_by_name(sysid))) {
+ } else if ((dynhn = dynhn_find_by_name(isis, sysid))) {
memcpy(lspid, dynhn->id, ISIS_SYS_ID_LEN);
lsp = lsp_search(head, lspid);
} else if (strncmp(cmd_hostname_get(), sysid, 15) == 0) {
struct thread *t_dync_clean; /* dynamic hostname cache cleanup thread */
uint32_t circuit_ids_used[8]; /* 256 bits to track circuit ids 1 through 255 */
int snmp_notifications;
+ struct list *dyn_cache;
struct route_table *ext_info[REDIST_PROTOCOL_COUNT];
};
{
int ret;
- isis_dynhn_insert(tnode->sysid, tnode->hostname, tnode->level);
+ isis_dynhn_insert(area->isis, tnode->sysid, tnode->hostname,
+ tnode->level);
for (int level = IS_LEVEL_1; level <= IS_LEVEL_2; level++) {
if ((tnode->level & level) == 0)
if (sysid2buff(fail_id, fail_sysid_str) == 0) {
struct isis_dynhn *dynhn;
- dynhn = dynhn_find_by_name(fail_sysid_str);
+ dynhn = dynhn_find_by_name(area->isis, fail_sysid_str);
if (dynhn == NULL) {
vty_out(vty, "Invalid system id %s\n",
fail_sysid_str);
/* Cleanup IS-IS area. */
isis_area_destroy(area);
- /* Cleanup hostnames. */
- dyn_cache_cleanup_all();
-
return CMD_SUCCESS;
}