mirror of
https://gitlab.labs.nic.cz/labs/bird.git
synced 2024-05-11 16:54:54 +00:00
Nest: Removing separate tmpa from route propagation
This is a fundamental change of an original (1999) concept of route processing inside BIRD. During import/export, there was a temporary ea_list created which was to be used instead of the another one inside the route itself. This led to some confusion, quirks, and strange filter code that handled extended route attributes. Dropping it now. The protocol interface has changed in an uniform way -- the `struct ea_list *attrs` argument has been removed from store_tmp_attrs(), import_control(), rt_notify() and get_route_info().
This commit is contained in:
@@ -550,29 +550,47 @@ ea_do_sort(ea_list *e)
|
||||
while (ss);
|
||||
}
|
||||
|
||||
/**
|
||||
* In place discard duplicates, undefs and temporary attributes in sorted
|
||||
* ea_list. We use stable sort for this reason.
|
||||
**/
|
||||
static inline void
|
||||
ea_do_prune(ea_list *e)
|
||||
{
|
||||
eattr *s, *d, *l, *s0;
|
||||
int i = 0;
|
||||
|
||||
/* Discard duplicates and undefs. Do you remember sorting was stable? */
|
||||
s = d = e->attrs;
|
||||
l = e->attrs + e->count;
|
||||
s = d = e->attrs; /* Beginning of the list. @s is source, @d is destination. */
|
||||
l = e->attrs + e->count; /* End of the list */
|
||||
|
||||
/* Walk from begin to end. */
|
||||
while (s < l)
|
||||
{
|
||||
s0 = s++;
|
||||
/* Find a consecutive block of the same attribute */
|
||||
while (s < l && s->id == s[-1].id)
|
||||
s++;
|
||||
/* s0 is the most recent version, s[-1] the oldest one */
|
||||
if ((s0->type & EAF_TYPE_MASK) != EAF_TYPE_UNDEF)
|
||||
{
|
||||
*d = *s0;
|
||||
d->type = (d->type & ~(EAF_ORIGINATED|EAF_FRESH)) | (s[-1].type & EAF_ORIGINATED);
|
||||
d++;
|
||||
i++;
|
||||
}
|
||||
|
||||
/* Now s0 is the most recent version, s[-1] the oldest one */
|
||||
/* Drop undefs */
|
||||
if ((s0->type & EAF_TYPE_MASK) == EAF_TYPE_UNDEF)
|
||||
continue;
|
||||
|
||||
/* Drop temporary attributes */
|
||||
if (s0->type & EAF_TEMP)
|
||||
continue;
|
||||
|
||||
/* Copy the newest version to destination */
|
||||
*d = *s0;
|
||||
|
||||
/* Preserve info whether it originated locally */
|
||||
d->type = (d->type & ~(EAF_ORIGINATED|EAF_FRESH)) | (s[-1].type & EAF_ORIGINATED);
|
||||
|
||||
/* Next destination */
|
||||
d++;
|
||||
i++;
|
||||
}
|
||||
|
||||
e->count = i;
|
||||
}
|
||||
|
||||
@@ -1128,15 +1146,7 @@ rta_lookup(rta *o)
|
||||
|
||||
ASSERT(!(o->aflags & RTAF_CACHED));
|
||||
if (o->eattrs)
|
||||
{
|
||||
if (o->eattrs->next) /* Multiple ea_list's, need to merge them */
|
||||
{
|
||||
ea_list *ml = alloca(ea_scan(o->eattrs));
|
||||
ea_merge(o->eattrs, ml);
|
||||
o->eattrs = ml;
|
||||
}
|
||||
ea_sort(o->eattrs);
|
||||
}
|
||||
ea_normalize(o->eattrs);
|
||||
|
||||
h = rta_hash(o);
|
||||
for(r=rta_hash_table[h & rta_cache_mask]; r; r=r->next)
|
||||
@@ -1250,17 +1260,15 @@ rta_dump_all(void)
|
||||
}
|
||||
|
||||
void
|
||||
rta_show(struct cli *c, rta *a, ea_list *eal)
|
||||
rta_show(struct cli *c, rta *a)
|
||||
{
|
||||
static char *src_names[] = { "dummy", "static", "inherit", "device", "static-device", "redirect",
|
||||
"RIP", "OSPF", "OSPF-IA", "OSPF-E1", "OSPF-E2", "BGP", "pipe" };
|
||||
int i;
|
||||
|
||||
cli_printf(c, -1008, "\tType: %s %s", src_names[a->source], ip_scope_text(a->scope));
|
||||
if (!eal)
|
||||
eal = a->eattrs;
|
||||
for(; eal; eal=eal->next)
|
||||
for(i=0; i<eal->count; i++)
|
||||
|
||||
for(ea_list *eal = a->eattrs; eal; eal=eal->next)
|
||||
for(int i=0; i<eal->count; i++)
|
||||
ea_show(c, &eal->attrs[i]);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user