1
0
mirror of https://gitlab.labs.nic.cz/labs/bird.git synced 2024-05-11 16:54:54 +00:00

Attribute list normalization cleanup

This commit is contained in:
Maria Matejka
2022-04-10 14:11:46 +02:00
parent 0b871c1704
commit de86040b2c
8 changed files with 73 additions and 79 deletions

View File

@@ -626,7 +626,7 @@ ea_do_prune(ea_list *e)
* If an attribute occurs multiple times in a single &ea_list,
* ea_sort() leaves only the first (the only significant) occurrence.
*/
void
static void
ea_sort(ea_list *e)
{
while (e)
@@ -650,8 +650,8 @@ ea_sort(ea_list *e)
* This function calculates an upper bound of the size of
* a given &ea_list after merging with ea_merge().
*/
unsigned
ea_scan(ea_list *e)
static unsigned
ea_scan(const ea_list *e)
{
unsigned cnt = 0;
@@ -677,8 +677,8 @@ ea_scan(ea_list *e)
* segments with ea_merge() and finally sort and prune the result
* by calling ea_sort().
*/
void
ea_merge(ea_list *e, ea_list *t)
static void
ea_merge(const ea_list *e, ea_list *t)
{
eattr *d = t->attrs;
@@ -694,6 +694,16 @@ ea_merge(ea_list *e, ea_list *t)
}
}
ea_list *
ea_normalize(const ea_list *e)
{
ea_list *t = tmp_alloc(ea_scan(e));
ea_merge(e, t);
ea_sort(t);
return t->count ? t : NULL;
}
/**
* ea_same - compare two &ea_list's
* @x: attribute list
@@ -729,33 +739,38 @@ ea_same(ea_list *x, ea_list *y)
return 1;
}
static inline ea_list *
ea_list_copy(ea_list *o)
uint
ea_list_size(ea_list *o)
{
ea_list *n;
unsigned i, adpos, elen;
unsigned i, elen;
if (!o)
return NULL;
ASSERT(!o->next);
elen = adpos = sizeof(ea_list) + sizeof(eattr) * o->count;
ASSERT_DIE(o);
ASSERT_DIE(!o->next);
elen = BIRD_CPU_ALIGN(sizeof(ea_list) + sizeof(eattr) * o->count);
for(i=0; i<o->count; i++)
{
eattr *a = &o->attrs[i];
if (!(a->type & EAF_EMBEDDED))
elen += sizeof(struct adata) + a->u.ptr->length;
elen += ADATA_SIZE(a->u.ptr->length);
}
n = mb_alloc(rta_pool, elen);
return elen;
}
void
ea_list_copy(ea_list *n, ea_list *o, uint elen)
{
uint adpos = sizeof(ea_list) + sizeof(eattr) * o->count;
memcpy(n, o, adpos);
n->flags |= EALF_CACHED;
for(i=0; i<o->count; i++)
adpos = BIRD_CPU_ALIGN(adpos);
for(uint i=0; i<o->count; i++)
{
eattr *a = &n->attrs[i];
if (!(a->type & EAF_EMBEDDED))
{
unsigned size = sizeof(struct adata) + a->u.ptr->length;
unsigned size = ADATA_SIZE(a->u.ptr->length);
ASSERT_DIE(adpos + size <= elen);
struct adata *d = ((void *) n) + adpos;
@@ -765,8 +780,8 @@ ea_list_copy(ea_list *o)
adpos += size;
}
}
ASSERT_DIE(adpos == elen);
return n;
}
static inline void
@@ -1029,6 +1044,7 @@ ea_hash(ea_list *e)
if (e) /* Assuming chain of length 1 */
{
ASSERT_DIE(!e->next);
for(i=0; i<e->count; i++)
{
struct eattr *a = &e->attrs[i];
@@ -1135,7 +1151,13 @@ rta_copy(rta *o)
memcpy(r, o, rta_size(o));
r->uc = 1;
r->nh.next = nexthop_copy(o->nh.next);
r->eattrs = ea_list_copy(o->eattrs);
if (!r->eattrs)
return r;
uint elen = ea_list_size(o->eattrs);
r->eattrs = mb_alloc(rta_pool, elen);
ea_list_copy(r->eattrs, o->eattrs, elen);
r->eattrs->flags |= EALF_CACHED;
return r;
}
@@ -1191,7 +1213,7 @@ rta_lookup(rta *o)
ASSERT(!o->cached);
if (o->eattrs)
ea_normalize(o->eattrs);
o->eattrs = ea_normalize(o->eattrs);
h = rta_hash(o);
for(r=rta_hash_table[h & rta_cache_mask]; r; r=r->next)

View File

@@ -55,7 +55,7 @@ rt_show_rte(struct cli *c, byte *ia, rte *e, struct rt_show_data *d, int primary
/* Need to normalize the extended attributes */
if (d->verbose && !rta_is_cached(a) && a->eattrs)
ea_normalize(a->eattrs);
a->eattrs = ea_normalize(a->eattrs);
get_route_info = e->src->proto->proto->get_route_info;
if (get_route_info)