summaryrefslogtreecommitdiffstats
path: root/proto/pipe
diff options
context:
space:
mode:
authorOndrej Zajicek <santiago@crfreenet.org>2009-12-20 22:56:09 +0100
committerOndrej Zajicek <santiago@crfreenet.org>2009-12-20 22:56:09 +0100
commitc4199e30313c88c0911060a5b5f3cc181ceedb37 (patch)
tree0eb8b9f8d54a47426d16c5745767fbefb8f3693f /proto/pipe
parentf2d7da742bd683b8eaecb1be8e3b04618171c796 (diff)
parentea7ada3809ed672bd9d2f9e5742f42b238cc5389 (diff)
downloadbird-c4199e30313c88c0911060a5b5f3cc181ceedb37.tar
bird-c4199e30313c88c0911060a5b5f3cc181ceedb37.zip
Merge branch 'dev' into ospf3
Diffstat (limited to 'proto/pipe')
-rw-r--r--proto/pipe/pipe.c26
1 files changed, 23 insertions, 3 deletions
diff --git a/proto/pipe/pipe.c b/proto/pipe/pipe.c
index c117f3b..aa76a15 100644
--- a/proto/pipe/pipe.c
+++ b/proto/pipe/pipe.c
@@ -114,6 +114,19 @@ pipe_import_control(struct proto *P, rte **ee, ea_list **ea UNUSED, struct linpo
}
static int
+pipe_reload_routes(struct proto *P)
+{
+ /*
+ * Because the pipe protocol feeds routes from both routing tables
+ * together, both directions are reloaded during refeed and 'reload
+ * out' command works like 'reload' command. For symmetry, we also
+ * request refeed when 'reload in' command is used.
+ */
+ proto_request_feeding(P);
+ return 1;
+}
+
+static int
pipe_start(struct proto *P)
{
struct pipe_proto *p = (struct pipe_proto *) P;
@@ -183,6 +196,7 @@ pipe_init(struct proto_config *C)
P->accept_ra_types = (p->mode == PIPE_OPAQUE) ? RA_OPTIMAL : RA_ANY;
P->rt_notify = pipe_rt_notify_pri;
P->import_control = pipe_import_control;
+ P->reload_routes = pipe_reload_routes;
return P;
}
@@ -206,12 +220,18 @@ pipe_get_status(struct proto *P, byte *buf)
}
static int
-pipe_reconfigure(struct proto *p, struct proto_config *new)
+pipe_reconfigure(struct proto *P, struct proto_config *new)
{
- struct pipe_config *o = (struct pipe_config *) p->cf;
+ struct pipe_proto *p = (struct pipe_proto *) P;
+ struct pipe_config *o = (struct pipe_config *) P->cf;
struct pipe_config *n = (struct pipe_config *) new;
- return (o->peer == n->peer) && (o->mode == n->mode);
+ if ((o->peer->table != n->peer->table) || (o->mode != n->mode))
+ return 0;
+
+ /* Update also the filter in the phantom protocol */
+ p->phantom->p.out_filter = new->in_filter;
+ return 1;
}
struct protocol proto_pipe = {