summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--TODO1
-rw-r--r--proto/bgp/attrs.c24
-rw-r--r--proto/pipe/pipe.c11
-rw-r--r--sysdep/unix/krt.c2
4 files changed, 13 insertions, 25 deletions
diff --git a/TODO b/TODO
index 5180299..972afae 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 ce11202..4dda0ac 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 dde2ee7..3f41faa 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 6d8c696..74ab223 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;