diff --git a/filter/f-util.c b/filter/f-util.c index ee9490b4..7f17cd22 100644 --- a/filter/f-util.c +++ b/filter/f-util.c @@ -196,7 +196,7 @@ ca_lookup(pool *p, const char *name, int f_type) static int inited = 0; if (!inited) { - idm_init(&ca_idm, &root_pool, 8); + idm_init(&ca_idm, &root_pool, 8, EA_CUSTOM_BIT); HASH_INIT(ca_hash, &root_pool, CA_ORDER); ca_storage_max = 256; @@ -212,7 +212,7 @@ ca_lookup(pool *p, const char *name, int f_type) uint id = idm_alloc(&ca_idm); - if (id >= EA_CUSTOM_BIT) + if (!id) cf_error("Too many custom attributes."); if (id >= ca_storage_max) { diff --git a/lib/idm.c b/lib/idm.c index 66e311c6..94c7f11c 100644 --- a/lib/idm.c +++ b/lib/idm.c @@ -16,11 +16,12 @@ void -idm_init(struct idm *m, pool *p, uint size) +idm_init(struct idm *m, pool *p, u64 size, u64 max) { m->pos = 0; m->used = 1; m->size = size; + m->max = max; m->data = mb_allocz(p, m->size * sizeof(u32)); /* ID 0 is reserved */ @@ -29,17 +30,17 @@ idm_init(struct idm *m, pool *p, uint size) static inline int u32_cto(uint x) { return ffs(~x) - 1; } -u32 +u64 idm_alloc(struct idm *m) { - uint i, j; + u64 i, j; for (i = m->pos; i < m->size; i++) if (m->data[i] != 0xffffffff) goto found; - /* If we are at least 7/8 full, expand */ - if (m->used > (m->size * 28)) + /* If we are at least 7/8 full, expand (if we are allowed to) */ + if ((m->used * 32 < m->max) && (m->used > m->size * 28)) { m->size *= 2; m->data = mb_realloc(m->data, m->size * sizeof(u32)); @@ -51,24 +52,26 @@ idm_alloc(struct idm *m) if (m->data[i] != 0xffffffff) goto found; - ASSERT(0); + return 0; found: - ASSERT(i < 0x8000000); - m->pos = i; j = u32_cto(m->data[i]); + u64 id = 32 * i + j; + + ASSERT(id < m->max); + m->data[i] |= (1 << j); m->used++; - return 32 * i + j; + return id; } void -idm_free(struct idm *m, u32 id) +idm_free(struct idm *m, u64 id) { - uint i = id / 32; - uint j = id % 32; + u64 i = id / 32; + u64 j = id % 32; ASSERT((i < m->size) && (m->data[i] & (1 << j))); m->data[i] &= ~(1 << j); diff --git a/lib/idm.h b/lib/idm.h index e3380cce..c2ec6ab4 100644 --- a/lib/idm.h +++ b/lib/idm.h @@ -13,13 +13,14 @@ struct idm { u32 *data; - u32 pos; - u32 used; - u32 size; + u64 pos; + u64 used; + u64 size; + u64 max; }; -void idm_init(struct idm *m, pool *p, uint size); -u32 idm_alloc(struct idm *m); -void idm_free(struct idm *m, u32 id); +void idm_init(struct idm *m, pool *p, u64 size, u64 max); +u64 idm_alloc(struct idm *m); +void idm_free(struct idm *m, u64 id); #endif diff --git a/lib/tindex.c b/lib/tindex.c index 934151a8..e49d3ce1 100644 --- a/lib/tindex.c +++ b/lib/tindex.c @@ -40,7 +40,7 @@ tindex_new(pool *p) ti->unit_size = TI_MIN_UNIT_SIZE; ti->address_size = TI_MIN_ADDRESS_SIZE; ti->index_data = mb_allocz(p, ti->unit_size * (1 << ti->address_size)); - idm_init(&(ti->idm), p, (1 << ti->address_size)); + idm_init(&(ti->idm), p, (1 << (ti->address_size - 5)), (1 << ti->address_size)); u32 rootnode = idm_alloc(&(ti->idm)); ASSERT(rootnode == 1); return ti; diff --git a/nest/rt-attr.c b/nest/rt-attr.c index cc362cab..dad968f9 100644 --- a/nest/rt-attr.c +++ b/nest/rt-attr.c @@ -111,7 +111,7 @@ rte_src_init(void) { rte_src_slab = sl_new(rta_pool, sizeof(struct rte_src)); - idm_init(&src_ids, rta_pool, SRC_ID_INIT_SIZE); + idm_init(&src_ids, rta_pool, SRC_ID_INIT_SIZE, 1ULL << 32); HASH_INIT(src_hash, rta_pool, RSH_INIT_ORDER); } @@ -137,6 +137,7 @@ rt_get_source(struct proto *p, u32 id) src->proto = p; src->private_id = id; src->global_id = idm_alloc(&src_ids); + ASSERT(src->global_id); src->uc = 0; HASH_INSERT2(src_hash, RSH, rta_pool, src); diff --git a/proto/ospf/ospf.c b/proto/ospf/ospf.c index f3eabb47..d4d3c01d 100644 --- a/proto/ospf/ospf.c +++ b/proto/ospf/ospf.c @@ -257,7 +257,7 @@ ospf_start(struct proto *P) init_list(&(p->area_list)); fib_init(&p->rtf, P->pool, ospf_get_af(p), sizeof(ort), OFFSETOF(ort, fn), 0, NULL); if (ospf_is_v3(p)) - idm_init(&p->idm, P->pool, 16); + idm_init(&p->idm, P->pool, 16, 1ULL << 32); p->areano = 0; p->gr = ospf_top_new(p, P->pool); s_init_list(&(p->lsal)); diff --git a/proto/ospf/topology.c b/proto/ospf/topology.c index 7d5deca0..554b50b5 100644 --- a/proto/ospf/topology.c +++ b/proto/ospf/topology.c @@ -563,6 +563,7 @@ ort_to_lsaid(struct ospf_proto *p, ort *nf) if (!nf->lsa_id) nf->lsa_id = idm_alloc(&p->idm); + ASSERT(nf->lsa_id); return nf->lsa_id; }