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.
This commit is contained in:
Martin Mares 1998-10-19 18:13:36 +00:00
parent 0804525255
commit 7d83290780
3 changed files with 24 additions and 1 deletions

View file

@ -15,6 +15,8 @@
static pool *if_pool; static pool *if_pool;
u32 router_id;
/* /*
* Neighbor Cache * Neighbor Cache
* *
@ -196,7 +198,7 @@ if_dump_all(void)
debug("Known network interfaces:\n"); debug("Known network interfaces:\n");
WALK_LIST(i, iface_list) WALK_LIST(i, iface_list)
if_dump(i); if_dump(i);
debug("\n"); debug("\nRouter ID: %08x\n\n", router_id);
} }
static inline int static inline int
@ -324,6 +326,25 @@ if_feed_baby(struct proto *p)
p->if_notify(p, IF_CHANGE_CREATE | ((i->flags & IF_UP) ? IF_CHANGE_UP : 0), NULL, i); p->if_notify(p, IF_CHANGE_CREATE | ((i->flags & IF_UP) ? IF_CHANGE_UP : 0), NULL, i);
} }
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 void
if_init(void) if_init(void)
{ {

View file

@ -54,6 +54,7 @@ void if_dump_all(void);
void if_update(struct iface *); void if_update(struct iface *);
void if_end_update(void); void if_end_update(void);
void if_feed_baby(struct proto *); void if_feed_baby(struct proto *);
void auto_router_id(void);
/* /*
* Neighbor Cache. We hold (direct neighbor, protocol) pairs we've seen * Neighbor Cache. We hold (direct neighbor, protocol) pairs we've seen

View file

@ -86,6 +86,7 @@ main(void)
signal_init(); signal_init();
scan_if_init(); scan_if_init();
auto_router_id();
protos_start(); protos_start();