void isis_event_system_type_change (struct isis_area *area, int newtype) { struct listnode *node; struct isis_circuit *circuit; Log(LOG_DEBUG, "DEBUG (default/core/ISIS ): ISIS-Evt (%s) system type change %s -> %s\n", area->area_tag, circuit_t2string (area->is_type), circuit_t2string (newtype)); if (area->is_type == newtype) return; /* No change */ switch (area->is_type) { case IS_LEVEL_1: if (area->lspdb[1] == NULL) area->lspdb[1] = lsp_db_init (); lsp_l2_generate (area); break; case IS_LEVEL_1_AND_2: if (newtype == IS_LEVEL_1) { lsp_db_destroy (area->lspdb[1]); } else { lsp_db_destroy (area->lspdb[0]); } break; case IS_LEVEL_2: if (area->lspdb[0] == NULL) area->lspdb[0] = lsp_db_init (); lsp_l1_generate (area); break; default: break; } area->is_type = newtype; for (ALL_LIST_ELEMENTS_RO (area->circuit_list, node, circuit)) isis_event_circuit_type_change (circuit, newtype); spftree_area_init (area); lsp_regenerate_schedule (area); return; }
int area_net_title (struct isis_area *area, const u_char *net_title) { struct area_addr *addr; struct area_addr *addrp; struct listnode *node; u_char buff[255]; if (!area) { Log(LOG_WARNING, "WARN ( %s/core/ISIS ): Can't find ISIS instance\n", config.name); return TRUE; } /* We check that we are not over the maximal number of addresses */ if (listcount (area->area_addrs) >= isis->max_area_addrs) { Log(LOG_WARNING, "WARN ( %s/core/ISIS ): Maximum of area addresses (%d) already reached\n", config.name, isis->max_area_addrs); return TRUE; } addr = calloc(1, sizeof (struct area_addr)); addr->addr_len = dotformat2buff (buff, net_title); memcpy (addr->area_addr, buff, addr->addr_len); if (addr->addr_len < 8 || addr->addr_len > 20) { Log(LOG_WARNING, "WARN ( %s/core/ISIS ): area address must be at least 8..20 octets long (%d)\n", config.name, addr->addr_len); free(addr); return TRUE; } if (isis->sysid_set == 0) { /* * First area address - get the SystemID for this router */ memcpy (isis->sysid, GETSYSID (addr, ISIS_SYS_ID_LEN), ISIS_SYS_ID_LEN); isis->sysid_set = 1; Log(LOG_DEBUG, "DEBUG ( %s/core/ISIS ): Router has SystemID %s\n", config.name, sysid_print (isis->sysid)); } else { /* * Check that the SystemID portions match */ if (memcmp (isis->sysid, GETSYSID (addr, ISIS_SYS_ID_LEN), ISIS_SYS_ID_LEN)) { Log(LOG_WARNING, "WARN ( %s/core/ISIS ): System ID must not change when defining additional area addresses\n", config.name); free(addr); return TRUE; } /* now we see that we don't already have this address */ for (ALL_LIST_ELEMENTS_RO (area->area_addrs, node, addrp)) { if ((addrp->addr_len + ISIS_SYS_ID_LEN + 1) != (addr->addr_len)) continue; if (!memcmp (addrp->area_addr, addr->area_addr, addr->addr_len)) { free(addr); return FALSE; /* silent fail */ } } } /* * Forget the systemID part of the address */ addr->addr_len -= (ISIS_SYS_ID_LEN + 1); isis_listnode_add (area->area_addrs, addr); /* Only now we can safely generate our LSPs for this area */ if (listcount (area->area_addrs) > 0) { lsp_l1_generate (area); lsp_l2_generate (area); } return FALSE; }