summaryrefslogtreecommitdiff
path: root/sysdep
diff options
context:
space:
mode:
Diffstat (limited to 'sysdep')
-rw-r--r--sysdep/linux/krt-scan.h4
-rw-r--r--sysdep/linux/netlink/krt-scan.h7
-rw-r--r--sysdep/linux/netlink/krt-set.h3
-rw-r--r--sysdep/unix/krt-set.h4
-rw-r--r--sysdep/unix/krt.c26
-rw-r--r--sysdep/unix/krt.h1
6 files changed, 35 insertions, 10 deletions
diff --git a/sysdep/linux/krt-scan.h b/sysdep/linux/krt-scan.h
index c5bf5884..6c7e440f 100644
--- a/sysdep/linux/krt-scan.h
+++ b/sysdep/linux/krt-scan.h
@@ -1,7 +1,7 @@
/*
* BIRD -- Linux Kernel Route Syncer -- Scanning
*
- * (c) 1998--1999 Martin Mares <mj@ucw.cz>
+ * (c) 1998--2000 Martin Mares <mj@ucw.cz>
*
* Can be freely distributed and used under the terms of the GNU GPL.
*/
@@ -16,4 +16,6 @@ struct krt_scan_status {
list temp_ifs; /* Temporary interfaces */
};
+static inline int krt_scan_params_same(struct krt_scan_params *o, struct krt_scan_params *n) { return 1; }
+
#endif
diff --git a/sysdep/linux/netlink/krt-scan.h b/sysdep/linux/netlink/krt-scan.h
index cdfe4443..ec10a7fe 100644
--- a/sysdep/linux/netlink/krt-scan.h
+++ b/sysdep/linux/netlink/krt-scan.h
@@ -1,7 +1,7 @@
/*
* BIRD -- Linux Kernel Netlink Route Syncer -- Scanning
*
- * (c) 1998--1999 Martin Mares <mj@ucw.cz>
+ * (c) 1998--2000 Martin Mares <mj@ucw.cz>
*
* Can be freely distributed and used under the terms of the GNU GPL.
*/
@@ -30,4 +30,9 @@ struct krt_scan_status {
list temp_ifs; /* Temporary interfaces */
};
+static inline int krt_scan_params_same(struct krt_scan_params *o, struct krt_scan_params *n)
+{
+ return o->async == n->async && o->table_id == n->table_id;
+}
+
#endif
diff --git a/sysdep/linux/netlink/krt-set.h b/sysdep/linux/netlink/krt-set.h
index 48df5ecf..4f35e090 100644
--- a/sysdep/linux/netlink/krt-set.h
+++ b/sysdep/linux/netlink/krt-set.h
@@ -1,7 +1,7 @@
/*
* BIRD -- Unix Kernel Netlink Route Syncer -- Dummy Include File
*
- * (c) 1998--1999 Martin Mares <mj@ucw.cz>
+ * (c) 1998--2000 Martin Mares <mj@ucw.cz>
*
* Can be freely distributed and used under the terms of the GNU GPL.
*/
@@ -22,5 +22,6 @@ struct krt_set_status {
static inline void krt_set_construct(struct krt_config *c) { };
static inline void krt_set_start(struct krt_proto *p, int first) { };
static inline void krt_set_shutdown(struct krt_proto *p, int last) { };
+static inline int krt_set_params_same(struct krt_set_params *o, struct krt_set_params *n) { return 1; }
#endif
diff --git a/sysdep/unix/krt-set.h b/sysdep/unix/krt-set.h
index cfa5fb76..1c5e15e1 100644
--- a/sysdep/unix/krt-set.h
+++ b/sysdep/unix/krt-set.h
@@ -1,7 +1,7 @@
/*
* BIRD -- Unix Kernel Route Syncer -- Setting
*
- * (c) 1998--1999 Martin Mares <mj@ucw.cz>
+ * (c) 1998--2000 Martin Mares <mj@ucw.cz>
*
* Can be freely distributed and used under the terms of the GNU GPL.
*/
@@ -15,4 +15,6 @@ struct krt_set_params {
struct krt_set_status {
};
+static inline int krt_set_params_same(struct krt_set_params *o, struct krt_set_params *n) { return 1; }
+
#endif
diff --git a/sysdep/unix/krt.c b/sysdep/unix/krt.c
index b321729b..110ded08 100644
--- a/sysdep/unix/krt.c
+++ b/sysdep/unix/krt.c
@@ -582,6 +582,7 @@ krt_prune(struct krt_proto *p)
if (KRT_CF->learn)
krt_learn_prune(p);
#endif
+ p->initialized = 1;
}
void
@@ -661,7 +662,8 @@ krt_notify(struct proto *P, net *net, rte *new, rte *old, struct ea_list *tmpa)
net->n.flags |= KRF_INSTALLED;
else
net->n.flags &= ~KRF_INSTALLED;
- krt_set_notify(p, net, new, old);
+ if (p->initialized) /* Before first scan we don't touch the routes */
+ krt_set_notify(p, net, new, old);
}
/*
@@ -703,7 +705,7 @@ krt_start_timer(struct krt_proto *p)
t->hook = krt_scan;
t->data = p;
t->recurrent = KRT_CF->scan_time;
- tm_start(t, KRT_CF->scan_time);
+ tm_start(t, 0);
return t;
}
@@ -735,13 +737,11 @@ krt_start(struct proto *P)
#ifdef CONFIG_ALL_TABLES_AT_ONCE
if (first)
krt_scan_timer = krt_start_timer(p);
+ else
+ tm_start(p->scan_timer, 0);
p->scan_timer = krt_scan_timer;
- /* If this is the last instance to be initialized, kick the timer */
- if (!P->proto->startup_counter)
- krt_scan(p->scan_timer);
#else
p->scan_timer = krt_start_timer(p);
- krt_scan(p->scan_timer);
#endif
return PS_UP;
@@ -785,6 +785,19 @@ krt_init(struct proto_config *c)
return &p->p;
}
+static int
+krt_reconfigure(struct proto *p, struct proto_config *new)
+{
+ struct krt_config *o = (struct krt_config *) p->cf;
+ struct krt_config *n = (struct krt_config *) new;
+
+ return o->scan_time == n->scan_time
+ && o->learn == n->learn /* persist needn't be the same */
+ && krt_set_params_same(&o->set, &n->set)
+ && krt_scan_params_same(&o->scan, &n->scan)
+ ;
+}
+
struct protocol proto_unix_kernel = {
name: "Kernel",
template: "kernel%d",
@@ -794,6 +807,7 @@ struct protocol proto_unix_kernel = {
init: krt_init,
start: krt_start,
shutdown: krt_shutdown,
+ reconfigure: krt_reconfigure,
#ifdef KRT_ALLOW_LEARN
dump: krt_dump,
dump_attrs: krt_dump_attrs,
diff --git a/sysdep/unix/krt.h b/sysdep/unix/krt.h
index 85b884a1..8a444f04 100644
--- a/sysdep/unix/krt.h
+++ b/sysdep/unix/krt.h
@@ -62,6 +62,7 @@ struct krt_proto {
#ifdef CONFIG_ALL_TABLES_AT_ONCE
node instance_node; /* Node in krt instance list */
#endif
+ int initialized; /* First scan has already been finished */
};
extern struct proto_config *cf_krt;