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:
parent
0804525255
commit
7d83290780
3 changed files with 24 additions and 1 deletions
23
nest/iface.c
23
nest/iface.c
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -86,6 +86,7 @@ main(void)
|
||||||
signal_init();
|
signal_init();
|
||||||
|
|
||||||
scan_if_init();
|
scan_if_init();
|
||||||
|
auto_router_id();
|
||||||
|
|
||||||
protos_start();
|
protos_start();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue