#include "odhcp6c.h"
#include "ra.h"
+#ifdef EXT_BFD_PING
+#include "bfd.h"
+#endif
+
static void sighandler(int signal);
static int usage(void);
if (request_pd == 0)
request_pd = -1;
- ia_pd_mode = IA_MODE_TRY;
break;
case 'F':
script_call("bound");
bound = true;
syslog(LOG_NOTICE, "entering stateful-mode on %s", ifname);
+#ifdef EXT_BFD_PING
+ bfd_start(ifname, 3, 10);
+#endif
while (do_signal == 0 || do_signal == SIGUSR1) {
// Renew Cycle
script_call("rebound");
}
+#ifdef EXT_BFD_PING
+ bfd_stop();
+#endif
+
size_t ia_pd_len, ia_na_len, server_id_len;
odhcp6c_get_state(STATE_IA_PD, &ia_pd_len);
do_signal = 0;
bool ra_updated = ra_process();
+ if (ra_link_up())
+ do_signal = SIGUSR2;
+
if (ra_updated && (bound || allow_slaac_only == 0))
script_call("ra-updated"); // Immediate process urgent events
else if (ra_updated && !bound && allow_slaac_only > 0)
script_delay_call("ra-updated", allow_slaac_only);
+
+#ifdef EXT_BFD_PING
+ bfd_receive();
+#endif
}
return do_signal != 0;
size_t len;
struct odhcp6c_entry *x = odhcp6c_find_entry(state, new);
struct odhcp6c_entry *start = odhcp6c_get_state(state, &len);
- bool changed = true;
if (x && x->valid > new->valid && new->valid < safe)
new->valid = safe;
new->preferred >= x->preferred &&
new->preferred - x->preferred < 60 &&
x->class == new->class)
- changed = false;
+ return false;
x->valid = new->valid;
x->preferred = new->preferred;
x->t1 = new->t1;
} else if (x) {
odhcp6c_remove_state(state, (x - start) * sizeof(*x), sizeof(*x));
}
- return changed;
+ return true;
}