mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-13 21:10:28 +00:00
Resynchronise with babeld-1.3.1.
This commit is contained in:
parent
359be3d0e4
commit
52d54422bd
@ -467,38 +467,6 @@ DEFUN (no_babel_passive_interface,
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
interface_idle(babel_interface_nfo *babel_ifp)
|
||||
{
|
||||
return (idle_hello_interval > 0 &&
|
||||
babel_ifp->activity_time < babel_now.tv_sec - idle_time);
|
||||
}
|
||||
|
||||
int
|
||||
update_hello_interval(struct interface *ifp)
|
||||
{
|
||||
int rc = 0;
|
||||
unsigned short interval;
|
||||
struct babel_interface *babel_ifp = babel_get_if_nfo(ifp);
|
||||
|
||||
if(interface_idle(babel_ifp))
|
||||
interval = idle_hello_interval;
|
||||
else if(IF_CONF(ifp, hello_interval) > 0)
|
||||
interval = IF_CONF(ifp, hello_interval);
|
||||
else if((ifp->flags & BABEL_IF_WIRED))
|
||||
interval = wired_hello_interval;
|
||||
else
|
||||
interval = wireless_hello_interval;
|
||||
|
||||
if(babel_ifp->hello_interval != interval) {
|
||||
babel_ifp->hello_interval = interval;
|
||||
rc = 1;
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* This should be no more than half the hello interval, so that hellos
|
||||
aren't sent late. The result is in milliseconds. */
|
||||
unsigned
|
||||
@ -577,7 +545,6 @@ interface_recalculate(struct interface *ifp)
|
||||
babel_ifp->flags |= BABEL_IF_LQ;
|
||||
}
|
||||
|
||||
babel_ifp->activity_time = babel_now.tv_sec;
|
||||
/* Since the interface was marked as active above, the
|
||||
idle_hello_interval cannot be the one being used here. */
|
||||
babel_ifp->update_interval = babel_ifp->hello_interval * 4;
|
||||
@ -1004,7 +971,6 @@ babel_interface_allocate (void)
|
||||
/* Here are set the default values for an interface. */
|
||||
memset(babel_ifp, 0, sizeof(babel_interface_nfo));
|
||||
/* All flags are unset */
|
||||
babel_ifp->activity_time = babel_now.tv_sec;
|
||||
babel_ifp->bucket_time = babel_now.tv_sec;
|
||||
babel_ifp->bucket = BUCKET_TOKENS_MAX;
|
||||
babel_ifp->hello_seqno = (random() & 0xFFFF);
|
||||
|
@ -71,7 +71,6 @@ struct babel_interface {
|
||||
int update_bufsize;
|
||||
time_t bucket_time;
|
||||
unsigned int bucket;
|
||||
time_t activity_time;
|
||||
time_t last_update_time;
|
||||
unsigned short hello_seqno;
|
||||
unsigned hello_interval;
|
||||
@ -142,9 +141,6 @@ int babel_interface_delete (int, struct zclient *, zebra_size_t);
|
||||
int babel_interface_address_add (int, struct zclient *, zebra_size_t);
|
||||
int babel_interface_address_delete (int, struct zclient *, zebra_size_t);
|
||||
|
||||
/* others functions */
|
||||
int interface_idle(babel_interface_nfo *);
|
||||
int update_hello_interval(struct interface *ifp);
|
||||
unsigned jitter(babel_interface_nfo *, int);
|
||||
unsigned update_jitter(babel_interface_nfo *babel_ifp, int urgent);
|
||||
/* return "true" if "address" is one of our ipv6 addresses */
|
||||
|
@ -79,10 +79,9 @@ struct timeval babel_now; /* current time */
|
||||
unsigned char myid[8]; /* unique id (mac address of an interface) */
|
||||
int debug = BABEL_DEBUG_COMMON;
|
||||
|
||||
int idle_time = 320;
|
||||
int wireless_hello_interval = -1;
|
||||
int wired_hello_interval = -1;
|
||||
int idle_hello_interval = -1;
|
||||
int default_wireless_hello_interval = -1;
|
||||
int default_wired_hello_interval = -1;
|
||||
int resend_delay = -1;
|
||||
static const char *pidfile = PATH_BABELD_PID;
|
||||
|
||||
const unsigned char zeroes[16] = {0};
|
||||
@ -259,17 +258,19 @@ babel_init(int argc, char **argv)
|
||||
vty_init (master);
|
||||
memory_init ();
|
||||
|
||||
/* babeld inits (default options) */
|
||||
/* set default interval's values */
|
||||
if(wireless_hello_interval <= 0)
|
||||
wireless_hello_interval = 4000;
|
||||
wireless_hello_interval = MAX(wireless_hello_interval, 5);
|
||||
if(default_wireless_hello_interval <= 0)
|
||||
default_wireless_hello_interval = 4000;
|
||||
default_wireless_hello_interval = MAX(default_wireless_hello_interval, 5);
|
||||
|
||||
if(wired_hello_interval <= 0)
|
||||
wired_hello_interval = 4000;
|
||||
wired_hello_interval = MAX(wired_hello_interval, 5);
|
||||
if(default_wired_hello_interval <= 0)
|
||||
default_wired_hello_interval = 4000;
|
||||
default_wired_hello_interval = MAX(default_wired_hello_interval, 5);
|
||||
|
||||
resend_delay = 2000;
|
||||
resend_delay = MIN(resend_delay, default_wireless_hello_interval / 2);
|
||||
resend_delay = MIN(resend_delay, default_wired_hello_interval / 2);
|
||||
resend_delay = MAX(resend_delay, 20);
|
||||
|
||||
/* an assertion */
|
||||
if(parasitic && allow_duplicates >= 0) {
|
||||
/* Too difficult to get right. */
|
||||
zlog_err("Sorry, -P and -A are incompatible.");
|
||||
@ -561,10 +562,6 @@ show_babel_main_configuration (struct vty *vty)
|
||||
"vty address = %s%s"
|
||||
"vty port = %d%s"
|
||||
"id = %s%s"
|
||||
"idle time = %d%s"
|
||||
"wireless hello interval = %d%s"
|
||||
"wired hello interval = %d%s"
|
||||
"idle hello interval = %d%s"
|
||||
"parasitic = %s%s"
|
||||
"split-horizon = %s%s"
|
||||
"allow_duplicates = %s%s"
|
||||
@ -580,10 +577,6 @@ show_babel_main_configuration (struct vty *vty)
|
||||
VTY_NEWLINE,
|
||||
babel_vty_port, VTY_NEWLINE,
|
||||
format_eui64(myid), VTY_NEWLINE,
|
||||
idle_time, VTY_NEWLINE,
|
||||
wireless_hello_interval, VTY_NEWLINE,
|
||||
wired_hello_interval, VTY_NEWLINE,
|
||||
idle_hello_interval, VTY_NEWLINE,
|
||||
format_bool(parasitic), VTY_NEWLINE,
|
||||
format_bool(split_horizon), VTY_NEWLINE,
|
||||
format_bool(allow_duplicates), VTY_NEWLINE,
|
||||
|
@ -41,8 +41,8 @@ THE SOFTWARE.
|
||||
extern struct timeval babel_now; /* current time */
|
||||
extern struct thread_master *master; /* quagga's threads handler */
|
||||
extern int debug;
|
||||
extern int wireless_hello_interval, wired_hello_interval, idle_hello_interval;
|
||||
extern int idle_time;
|
||||
extern int default_wireless_hello_interval, default_wired_hello_interval;
|
||||
extern int resend_delay;
|
||||
|
||||
extern unsigned char myid[8];
|
||||
|
||||
|
@ -282,7 +282,6 @@ parse_packet(const unsigned char *from, struct interface *ifp,
|
||||
debugf(BABEL_DEBUG_COMMON,"Received hello %d (%d) from %s on %s.",
|
||||
seqno, interval,
|
||||
format_address(from), ifp->name);
|
||||
babel_get_if_nfo(ifp)->activity_time = babel_now.tv_sec;
|
||||
changed = update_neighbour(neigh, seqno, interval);
|
||||
update_neighbour_metric(neigh, changed);
|
||||
if(interval > 0)
|
||||
@ -466,7 +465,8 @@ parse_packet(const unsigned char *from, struct interface *ifp,
|
||||
update storm. Ignore a wildcard request that happens
|
||||
shortly after we sent a full update. */
|
||||
if(babel_ifp->last_update_time <
|
||||
babel_now.tv_sec - MAX(babel_ifp->hello_interval / 100, 1))
|
||||
(time_t)(babel_now.tv_sec -
|
||||
MAX(babel_ifp->hello_interval / 100, 1)))
|
||||
send_update(neigh->ifp, 0, NULL, 0);
|
||||
} else {
|
||||
send_update(neigh->ifp, 0, prefix, plen);
|
||||
@ -755,12 +755,10 @@ send_hello_noupdate(struct interface *ifp, unsigned interval)
|
||||
void
|
||||
send_hello(struct interface *ifp)
|
||||
{
|
||||
int changed;
|
||||
changed = update_hello_interval(ifp);
|
||||
babel_interface_nfo *babel_ifp = babel_get_if_nfo(ifp);
|
||||
send_hello_noupdate(ifp, (babel_ifp->hello_interval + 9) / 10);
|
||||
/* Send full IHU every 3 hellos, and marginal IHU each time */
|
||||
if(changed || babel_ifp->hello_seqno % 3 == 0)
|
||||
if(babel_ifp->hello_seqno % 3 == 0)
|
||||
send_ihu(NULL, ifp);
|
||||
else
|
||||
send_marginal_ihu(ifp);
|
||||
@ -1161,13 +1159,11 @@ send_update(struct interface *ifp, int urgent,
|
||||
buffer_update(ifp, prefix, plen);
|
||||
}
|
||||
} else {
|
||||
if(!interface_idle(babel_ifp)) {
|
||||
send_self_update(ifp);
|
||||
if(!parasitic) {
|
||||
debugf(BABEL_DEBUG_COMMON,"Sending update to %s for any.",
|
||||
ifp->name);
|
||||
for_all_installed_routes(buffer_update_callback, ifp);
|
||||
}
|
||||
send_self_update(ifp);
|
||||
if(!parasitic) {
|
||||
debugf(BABEL_DEBUG_COMMON,"Sending update to %s for any.",
|
||||
ifp->name);
|
||||
for_all_installed_routes(buffer_update_callback, ifp);
|
||||
}
|
||||
set_timeout(&babel_ifp->update_timeout, babel_ifp->update_interval);
|
||||
babel_ifp->last_update_time = babel_now.tv_sec;
|
||||
@ -1179,17 +1175,10 @@ void
|
||||
send_update_resend(struct interface *ifp,
|
||||
const unsigned char *prefix, unsigned char plen)
|
||||
{
|
||||
int delay;
|
||||
|
||||
assert(prefix != NULL);
|
||||
|
||||
send_update(ifp, 1, prefix, plen);
|
||||
|
||||
delay = 2000;
|
||||
delay = MIN(delay, wireless_hello_interval / 2);
|
||||
delay = MIN(delay, wired_hello_interval / 2);
|
||||
delay = MAX(delay, 10);
|
||||
record_resend(RESEND_UPDATE, prefix, plen, 0, 0, NULL, delay);
|
||||
record_resend(RESEND_UPDATE, prefix, plen, 0, 0, NULL, resend_delay);
|
||||
}
|
||||
|
||||
void
|
||||
@ -1249,10 +1238,8 @@ send_self_update(struct interface *ifp)
|
||||
return;
|
||||
}
|
||||
|
||||
if(!interface_idle(babel_get_if_nfo(ifp))) {
|
||||
debugf(BABEL_DEBUG_COMMON,"Sending self update to %s.", ifp->name);
|
||||
for_all_xroutes(send_xroute_update_callback, ifp);
|
||||
}
|
||||
debugf(BABEL_DEBUG_COMMON,"Sending self update to %s.", ifp->name);
|
||||
for_all_xroutes(send_xroute_update_callback, ifp);
|
||||
}
|
||||
|
||||
void
|
||||
@ -1501,19 +1488,13 @@ send_request_resend(struct neighbour *neigh,
|
||||
const unsigned char *prefix, unsigned char plen,
|
||||
unsigned short seqno, unsigned char *id)
|
||||
{
|
||||
int delay;
|
||||
|
||||
if(neigh)
|
||||
send_unicast_multihop_request(neigh, prefix, plen, seqno, id, 127);
|
||||
else
|
||||
send_multihop_request(NULL, prefix, plen, seqno, id, 127);
|
||||
|
||||
delay = 2000;
|
||||
delay = MIN(delay, wireless_hello_interval / 2);
|
||||
delay = MIN(delay, wired_hello_interval / 2);
|
||||
delay = MAX(delay, 10);
|
||||
record_resend(RESEND_REQUEST, prefix, plen, seqno, id,
|
||||
neigh ? neigh->ifp : NULL, delay);
|
||||
neigh ? neigh->ifp : NULL, resend_delay);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -123,7 +123,7 @@ record_resend(int kind, const unsigned char *prefix, unsigned char plen,
|
||||
else if(delay)
|
||||
resend->delay = delay;
|
||||
resend->time = babel_now;
|
||||
resend->max = kind == RESEND_REQUEST ? 128 : UPDATE_MAX;
|
||||
resend->max = RESEND_MAX;
|
||||
if(id && memcmp(resend->id, id, 8) == 0 &&
|
||||
seqno_compare(resend->seqno, seqno) > 0) {
|
||||
return 0;
|
||||
@ -140,7 +140,7 @@ record_resend(int kind, const unsigned char *prefix, unsigned char plen,
|
||||
if(resend == NULL)
|
||||
return -1;
|
||||
resend->kind = kind;
|
||||
resend->max = kind == RESEND_REQUEST ? 128 : UPDATE_MAX;
|
||||
resend->max = RESEND_MAX;
|
||||
resend->delay = delay;
|
||||
memcpy(resend->prefix, prefix, 16);
|
||||
resend->plen = plen;
|
||||
|
@ -37,7 +37,7 @@ THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#define REQUEST_TIMEOUT 65000
|
||||
#define UPDATE_MAX 4
|
||||
#define RESEND_MAX 3
|
||||
|
||||
#define RESEND_REQUEST 1
|
||||
#define RESEND_UPDATE 2
|
||||
|
@ -682,7 +682,7 @@ update_route(const unsigned char *router_id,
|
||||
int hold_time = MAX((4 * interval) / 100 + interval / 50, 15);
|
||||
|
||||
if(memcmp(router_id, myid, 8) == 0)
|
||||
return NULL; /* I have announced the route */
|
||||
return NULL;
|
||||
|
||||
if(martian_prefix(prefix, plen)) {
|
||||
zlog_err("Rejecting martian route to %s through %s.",
|
||||
|
Loading…
Reference in New Issue
Block a user