diff options
author | Martin Mares <mj@ucw.cz> | 1998-10-19 20:13:36 +0200 |
---|---|---|
committer | Martin Mares <mj@ucw.cz> | 1998-10-19 20:13:36 +0200 |
commit | 7d8329078066b5682a0330b20dbdf74c7a01cbac (patch) | |
tree | 10893b4eef8fd178460a7ae2d2bc3106179bb3c3 | |
parent | 08045252553478457f923a9f941675df9992f507 (diff) | |
download | bird-7d8329078066b5682a0330b20dbdf74c7a01cbac.tar bird-7d8329078066b5682a0330b20dbdf74c7a01cbac.zip |
Generate router_id automatically if possible (standard "smallest of local
regular interface addresses" rule).
Protocols should NOT rely on router_id existence -- when router ID is not
available, the router_id variable is set to zero and protocols requiring
valid router ID should just refuse to start, reporting such error to the log.
-rw-r--r-- | nest/iface.c | 23 | ||||
-rw-r--r-- | nest/iface.h | 1 | ||||
-rw-r--r-- | sysdep/unix/main.c | 1 |
3 files changed, 24 insertions, 1 deletions
diff --git a/nest/iface.c b/nest/iface.c index f6f33a9..5f356fd 100644 --- a/nest/iface.c +++ b/nest/iface.c @@ -15,6 +15,8 @@ static pool *if_pool; +u32 router_id; + /* * Neighbor Cache * @@ -196,7 +198,7 @@ if_dump_all(void) debug("Known network interfaces:\n"); WALK_LIST(i, iface_list) if_dump(i); - debug("\n"); + debug("\nRouter ID: %08x\n\n", router_id); } static inline int @@ -325,6 +327,25 @@ if_feed_baby(struct proto *p) } void +auto_router_id(void) /* FIXME: What if we run IPv6??? */ +{ + struct iface *i, *j; + + if (router_id) + return; + j = NULL; + WALK_LIST(i, iface_list) + if ((i->flags & IF_UP) && + !(i->flags & (IF_UNNUMBERED | IF_LOOPBACK | IF_IGNORE)) && + (!j || ipa_to_u32(i->ip) < ipa_to_u32(j->ip))) + j = i; + if (!j) /* FIXME: allow configuration or running without RID */ + die("Cannot determine router ID, please configure manually"); + router_id = ipa_to_u32(j->ip); + debug("Router ID set to %08x (%s)\n", router_id, j->name); +} + +void if_init(void) { if_pool = rp_new(&root_pool, "Interfaces"); diff --git a/nest/iface.h b/nest/iface.h index ff6ddee..ea93720 100644 --- a/nest/iface.h +++ b/nest/iface.h @@ -54,6 +54,7 @@ void if_dump_all(void); void if_update(struct iface *); void if_end_update(void); void if_feed_baby(struct proto *); +void auto_router_id(void); /* * Neighbor Cache. We hold (direct neighbor, protocol) pairs we've seen diff --git a/sysdep/unix/main.c b/sysdep/unix/main.c index 4c60ee6..3d927cb 100644 --- a/sysdep/unix/main.c +++ b/sysdep/unix/main.c @@ -86,6 +86,7 @@ main(void) signal_init(); scan_if_init(); + auto_router_id(); protos_start(); |