static uint8_t *state_data[_STATE_MAX] = {NULL};
static size_t state_len[_STATE_MAX] = {0};
-static volatile int do_signal = 0;
+static volatile bool signal_io = false;
+static volatile bool signal_usr1 = false;
+static volatile bool signal_usr2 = false;
+static volatile bool signal_term = false;
+
static int urandom_fd = -1, allow_slaac_only = 0;
static bool bound = false, release = true;
static time_t last_update = 0;
script_call("started");
- while (do_signal != SIGTERM) { // Main logic
+ while (!signal_term) { // Main logic
odhcp6c_clear_state(STATE_SERVER_ID);
odhcp6c_clear_state(STATE_IA_NA);
odhcp6c_clear_state(STATE_IA_PD);
odhcp6c_clear_state(STATE_SNTP_IP);
- odhcp6c_clear_state(STATE_SNTP_FQDN);
+ odhcp6c_clear_state(STATE_NTP_IP);
+ odhcp6c_clear_state(STATE_NTP_FQDN);
odhcp6c_clear_state(STATE_SIP_IP);
odhcp6c_clear_state(STATE_SIP_FQDN);
dhcpv6_set_ia_mode(ia_na_mode, ia_pd_mode);
syslog(LOG_NOTICE, "(re)starting transaction on %s", ifname);
- do_signal = 0;
+ signal_usr1 = signal_usr2 = false;
int mode = dhcpv6_request(DHCPV6_MSG_SOLICIT);
odhcp6c_signal_process();
do {
int res = dhcpv6_request(mode == DHCPV6_STATELESS ?
DHCPV6_MSG_INFO_REQ : DHCPV6_MSG_REQUEST);
+ bool signalled = odhcp6c_signal_process();
- odhcp6c_signal_process();
if (res > 0)
break;
- else if (do_signal > 0) {
+ else if (signalled) {
mode = -1;
break;
}
bound = true;
syslog(LOG_NOTICE, "entering stateless-mode on %s", ifname);
- while (do_signal == 0 || do_signal == SIGUSR1) {
- do_signal = 0;
- script_call("informed");
+ while (!signal_usr2 && !signal_term) {
+ signal_usr1 = false;
+ script_call("informed");
int res = dhcpv6_poll_reconfigure();
odhcp6c_signal_process();
if (res > 0)
continue;
- if (do_signal == SIGUSR1) {
- do_signal = 0; // Acknowledged
+ if (signal_usr1) {
+ signal_usr1 = false; // Acknowledged
continue;
- } else if (do_signal > 0)
+ }
+ if (signal_usr2 || signal_term)
break;
res = dhcpv6_request(DHCPV6_MSG_INFO_REQ);
odhcp6c_signal_process();
- if (do_signal == SIGUSR1)
+ if (signal_usr1)
continue;
else if (res < 0)
break;
bfd_start(ifname, bfd_loss, bfd_interval);
#endif
- while (do_signal == 0 || do_signal == SIGUSR1) {
+ while (!signal_usr2 && !signal_term) {
// Renew Cycle
// Wait for T1 to expire or until we get a reconfigure
int res = dhcpv6_poll_reconfigure();
}
// Handle signal, if necessary
- if (do_signal == SIGUSR1)
- do_signal = 0; // Acknowledged
- else if (do_signal > 0)
+ if (signal_usr1)
+ signal_usr1 = false; // Acknowledged
+ if (signal_usr2 || signal_term)
break; // Other signal type
// Send renew as T1 expired
- res = dhcpv6_request(DHCPV6_MSG_RENEW);
+ size_t ia_pd_len, ia_na_len;
+ odhcp6c_get_state(STATE_IA_PD, &ia_pd_len);
+ odhcp6c_get_state(STATE_IA_NA, &ia_na_len);
+
+ // If we have any IAs, send renew, otherwise request
+ if (ia_pd_len == 0 && ia_na_len == 0)
+ res = dhcpv6_request(DHCPV6_MSG_REQUEST);
+ else
+ res = dhcpv6_request(DHCPV6_MSG_RENEW);
+
odhcp6c_signal_process();
if (res > 0) { // Renew was succesfull
// Publish updates
script_call("updated");
continue; // Renew was successful
}
-
+
odhcp6c_clear_state(STATE_SERVER_ID); // Remove binding
// If we have IAs, try rebind otherwise restart
bool odhcp6c_signal_process(void)
{
- if (do_signal == SIGIO) {
- do_signal = 0;
+ while (signal_io) {
+ signal_io = false;
+
bool ra_updated = ra_process();
if (ra_link_up())
- do_signal = SIGUSR2;
+ signal_usr2 = true;
if (ra_updated && (bound || allow_slaac_only == 0))
script_call("ra-updated"); // Immediate process urgent events
#endif
}
- return do_signal != 0;
+ return signal_usr1 || signal_usr2 || signal_term;
}
uint8_t *n = odhcp6c_resize_state(state, len);
if (n) {
uint8_t *sdata = state_data[state];
-
+
memmove(sdata + offset + len, sdata + offset, len_after);
memcpy(sdata + offset, data, len);
}
if (signal == SIGCHLD)
while (waitpid(-1, NULL, WNOHANG) > 0);
else if (signal == SIGUSR1)
- do_signal = SIGUSR1;
+ signal_usr1 = true;
else if (signal == SIGUSR2)
- do_signal = SIGUSR2;
+ signal_usr2 = true;
else if (signal == SIGIO)
- do_signal = SIGIO;
+ signal_io = true;
else
- do_signal = SIGTERM;
+ signal_term = true;
}