diff --git a/TODO b/TODO index 51802994..972afae7 100644 --- a/TODO +++ b/TODO @@ -18,7 +18,6 @@ Core - client: data losses on large dumps? - table: ocassional core dumps in rt_prune() -- table: filtering of old routes during updates? - table: do feeding by parts - bgp: timing of updates? diff --git a/proto/bgp/attrs.c b/proto/bgp/attrs.c index ce112028..4dda0ac0 100644 --- a/proto/bgp/attrs.c +++ b/proto/bgp/attrs.c @@ -402,7 +402,7 @@ bgp_export_check(struct bgp_proto *p, ea_list *new) } static struct bgp_bucket * -bgp_get_bucket(struct bgp_proto *p, ea_list *old, ea_list *tmp, int originate) +bgp_get_bucket(struct bgp_proto *p, ea_list *attrs, int originate) { ea_list *t, *new; unsigned i, cnt, hash, code; @@ -410,21 +410,9 @@ bgp_get_bucket(struct bgp_proto *p, ea_list *old, ea_list *tmp, int originate) u32 seen = 0; struct bgp_bucket *b; - /* Merge the attribute lists */ - if (tmp) - { - for(t=tmp; t->next; t=t->next) - ; - t->next = old; - new = alloca(ea_scan(tmp)); - ea_merge(tmp, new); - t->next = NULL; - } - else - { - new = alloca(ea_scan(old)); - ea_merge(old, new); - } + /* Merge the attribute list */ + new = alloca(ea_scan(attrs)); + ea_merge(attrs, new); ea_sort(new); /* Normalize attributes */ @@ -516,7 +504,7 @@ bgp_free_bucket(struct bgp_proto *p, struct bgp_bucket *buck) } void -bgp_rt_notify(struct proto *P, net *n, rte *new, rte *old, ea_list *tmpa) +bgp_rt_notify(struct proto *P, net *n, rte *new, rte *old, ea_list *attrs) { struct bgp_proto *p = (struct bgp_proto *) P; struct bgp_bucket *buck; @@ -526,7 +514,7 @@ bgp_rt_notify(struct proto *P, net *n, rte *new, rte *old, ea_list *tmpa) if (new) { - buck = bgp_get_bucket(p, new->attrs->eattrs, tmpa, new->attrs->source != RTS_BGP); + buck = bgp_get_bucket(p, attrs, new->attrs->source != RTS_BGP); if (!buck) /* Inconsistent attribute list */ return; } diff --git a/proto/pipe/pipe.c b/proto/pipe/pipe.c index dde2ee7c..3f41faaf 100644 --- a/proto/pipe/pipe.c +++ b/proto/pipe/pipe.c @@ -19,7 +19,7 @@ #include "pipe.h" static void -pipe_send(struct pipe_proto *p, rtable *dest, net *n, rte *new, rte *old) +pipe_send(struct pipe_proto *p, rtable *dest, net *n, rte *new, rte *old, ea_list *attrs) { net *nn; rte *e; @@ -38,6 +38,7 @@ pipe_send(struct pipe_proto *p, rtable *dest, net *n, rte *new, rte *old) a.proto = &p->p; a.source = RTS_PIPE; a.aflags = 0; + a.eattrs = attrs; e = rte_get_temp(&a); e->net = nn; } @@ -49,21 +50,21 @@ pipe_send(struct pipe_proto *p, rtable *dest, net *n, rte *new, rte *old) } static void -pipe_rt_notify_pri(struct proto *P, net *net, rte *new, rte *old, ea_list *tmpa) +pipe_rt_notify_pri(struct proto *P, net *net, rte *new, rte *old, ea_list *attrs) { struct pipe_proto *p = (struct pipe_proto *) P; DBG("PIPE %c> %I/%d\n", (new ? '+' : '-'), net->n.prefix, net->n.pxlen); - pipe_send(p, p->peer, net, new, old); + pipe_send(p, p->peer, net, new, old, attrs); } static void -pipe_rt_notify_sec(struct proto *P, net *net, rte *new, rte *old, ea_list *tmpa) +pipe_rt_notify_sec(struct proto *P, net *net, rte *new, rte *old, ea_list *attrs) { struct pipe_proto *p = ((struct pipe_proto *) P)->phantom; DBG("PIPE %c< %I/%d\n", (new ? '+' : '-'), net->n.prefix, net->n.pxlen); - pipe_send(p, p->p.table, net, new, old); + pipe_send(p, p->p.table, net, new, old, attrs); } static int diff --git a/sysdep/unix/krt.c b/sysdep/unix/krt.c index 6d8c696d..74ab2239 100644 --- a/sysdep/unix/krt.c +++ b/sysdep/unix/krt.c @@ -663,7 +663,7 @@ krt_scan(timer *t) */ static void -krt_notify(struct proto *P, net *net, rte *new, rte *old, struct ea_list *tmpa) +krt_notify(struct proto *P, net *net, rte *new, rte *old, struct ea_list *attrs) { struct krt_proto *p = (struct krt_proto *) P;