]> git.decadent.org.uk Git - odhcp6c.git/blobdiff - src/odhcp6c.c
Include IAs in Request to be more compatible with some servers
[odhcp6c.git] / src / odhcp6c.c
index df89eb9baeb68c050b620e3541cfd27eccb6d719..f732d9e8fa52b36f1f2f5d314e94e98967df8851 100644 (file)
@@ -192,7 +192,7 @@ int main(_unused int argc, char* const argv[])
 
        while (do_signal != SIGTERM) { // Main logic
                odhcp6c_clear_state(STATE_SERVER_ID);
-               odhcp6c_clear_state(STATE_SERVER_CAND);
+               odhcp6c_clear_state(STATE_IA_NA);
                odhcp6c_clear_state(STATE_IA_PD);
                odhcp6c_clear_state(STATE_SNTP_IP);
                odhcp6c_clear_state(STATE_SNTP_FQDN);
@@ -201,6 +201,15 @@ int main(_unused int argc, char* const argv[])
                dhcpv6_set_ia_na_mode(ia_na_mode);
                bound = false;
 
+               // Server candidates need deep-delete
+               size_t cand_len;
+               struct dhcpv6_server_cand *cand = odhcp6c_get_state(STATE_SERVER_CAND, &cand_len);
+               for (size_t i = 0; i < cand_len / sizeof(*cand); ++i) {
+                       free(cand[i].ia_na);
+                       free(cand[i].ia_pd);
+               }
+               odhcp6c_clear_state(STATE_SERVER_CAND);
+
                syslog(LOG_NOTICE, "(re)starting transaction on %s", ifname);
 
                do_signal = 0;
@@ -405,6 +414,18 @@ size_t odhcp6c_remove_state(enum odhcp6c_state state, size_t offset, size_t len)
 }
 
 
+void* odhcp6c_move_state(enum odhcp6c_state state, size_t *len)
+{
+       *len = state_len[state];
+       void *data = state_data[state];
+
+       state_len[state] = 0;
+       state_data[state] = NULL;
+
+       return data;
+}
+
+
 void* odhcp6c_get_state(enum odhcp6c_state state, size_t *len)
 {
        *len = state_len[state];