X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=src%2Fodhcp6c.c;h=b67ed11843b25cda7e13e7e6727a404f94fa0c0d;hb=31ce2ea9f57322d526daf266c7fca4bd407297cb;hp=6a1d1b4bdcc2caae05a79bfeda822f9339c1304d;hpb=6bc31b22abc26b9ee31b789d56a8e2a07aa4c569;p=odhcp6c.git diff --git a/src/odhcp6c.c b/src/odhcp6c.c index 6a1d1b4..b67ed11 100644 --- a/src/odhcp6c.c +++ b/src/odhcp6c.c @@ -41,7 +41,7 @@ static size_t state_len[_STATE_MAX] = {0}; static volatile int do_signal = 0; static int urandom_fd = -1; -static bool bound = false, allow_slaac_only = false; +static bool bound = false, allow_slaac_only = true; int main(_unused int argc, char* const argv[]) @@ -62,7 +62,7 @@ int main(_unused int argc, char* const argv[]) while ((c = getopt(argc, argv, "SN:P:c:r:s:hdp:")) != -1) { switch (c) { case 'S': - allow_slaac_only = true; + allow_slaac_only = false; break; case 'N': @@ -77,6 +77,7 @@ int main(_unused int argc, char* const argv[]) break; case 'P': + allow_slaac_only = false; request_pd = strtoul(optarg, NULL, 10); if (request_pd == 0) request_pd = -1; @@ -182,8 +183,11 @@ int main(_unused int argc, char* const argv[]) dhcpv6_set_ia_na_mode(ia_na_mode); bound = false; + syslog(LOG_NOTICE, "(re)starting transaction on %s", ifname); + do_signal = 0; int res = dhcpv6_request(DHCPV6_MSG_SOLICIT); + odhcp6c_signal_process(); if (res < 0) { continue; // Might happen if we got a signal @@ -192,6 +196,7 @@ int main(_unused int argc, char* const argv[]) do_signal = 0; res = dhcpv6_request(DHCPV6_MSG_INFO_REQ); + odhcp6c_signal_process(); if (do_signal == SIGUSR1) continue; else if (res < 0) @@ -200,6 +205,7 @@ int main(_unused int argc, char* const argv[]) script_call("informed"); bound = true; + syslog(LOG_NOTICE, "entering stateless-mode on %s", ifname); if (dhcpv6_poll_reconfigure() > 0) script_call("informed"); @@ -212,13 +218,16 @@ int main(_unused int argc, char* const argv[]) if (dhcpv6_request(DHCPV6_MSG_REQUEST) < 0) continue; + odhcp6c_signal_process(); script_call("bound"); bound = true; + syslog(LOG_NOTICE, "entering stateful-mode on %s", ifname); while (do_signal == 0 || do_signal == SIGUSR1) { // Renew Cycle // Wait for T1 to expire or until we get a reconfigure int res = dhcpv6_poll_reconfigure(); + odhcp6c_signal_process(); if (res >= 0) { if (res > 0) script_call("updated"); @@ -242,6 +251,7 @@ int main(_unused int argc, char* const argv[]) r = dhcpv6_request(DHCPV6_MSG_REQUEST); else r = dhcpv6_request(DHCPV6_MSG_RENEW); + odhcp6c_signal_process(); if (r > 0) // Publish updates script_call("updated"); if (r >= 0) @@ -251,6 +261,7 @@ int main(_unused int argc, char* const argv[]) // If we have IAs, try rebind otherwise restart res = dhcpv6_request(DHCPV6_MSG_REBIND); + odhcp6c_signal_process(); odhcp6c_get_state(STATE_IA_PD, &ia_pd_new); odhcp6c_get_state(STATE_IA_NA, &ia_na_new); @@ -288,7 +299,7 @@ static int usage(void) const char buf[] = "Usage: odhcp6c [options] \n" "\nFeature options:\n" - " -S Allow SLAAC-only assignment\n" + " -S Don't allow SLAAC-only (implied by -P)\n" " -N Mode for requesting addresses [try|force|none]\n" " -P Request IPv6-Prefix (0 = auto)\n" " -c Override client-ID (base-16 encoded)\n" @@ -317,6 +328,8 @@ static uint8_t* odhcp6c_resize_state(enum odhcp6c_state state, ssize_t len) { if (len == 0) return state_data[state] + state_len[state]; + else if (state_len[state] + len > 1024) + return NULL; uint8_t *n = realloc(state_data[state], state_len[state] + len); if (n || state_len[state] + len == 0) { @@ -401,10 +414,12 @@ void odhcp6c_update_entry_safe(enum odhcp6c_state state, struct odhcp6c_entry *n new->valid = safe; if (new->valid > 0) { - if (x) - *x = *new; - else + if (x) { + x->valid = new->valid; + x->preferred = new->preferred; + } else { odhcp6c_add_state(state, new, sizeof(*new)); + } } else if (x) { odhcp6c_remove_state(state, (x - start) * sizeof(*x), sizeof(*x)); }