summaryrefslogtreecommitdiff
path: root/networking/udhcp/d6_dhcpc.c
diff options
context:
space:
mode:
Diffstat (limited to 'networking/udhcp/d6_dhcpc.c')
-rw-r--r--networking/udhcp/d6_dhcpc.c32
1 files changed, 20 insertions, 12 deletions
diff --git a/networking/udhcp/d6_dhcpc.c b/networking/udhcp/d6_dhcpc.c
index c68dc8c..b2df9f0 100644
--- a/networking/udhcp/d6_dhcpc.c
+++ b/networking/udhcp/d6_dhcpc.c
@@ -1090,6 +1090,8 @@ static void change_listen_mode(int new_mode)
static void perform_d6_release(struct in6_addr *server_ipv6, struct in6_addr *our_cur_ipv6)
{
+ change_listen_mode(LISTEN_NONE);
+
/* send release packet */
if (client_data.state == BOUND
|| client_data.state == RENEWING
@@ -1107,7 +1109,6 @@ static void perform_d6_release(struct in6_addr *server_ipv6, struct in6_addr *ou
* of the states above.
*/
d6_run_script_no_option("deconfig");
- change_listen_mode(LISTEN_NONE);
client_data.state = RELEASED;
}
@@ -1311,7 +1312,6 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
client_data.state = INIT_SELECTING;
d6_run_script_no_option("deconfig");
- change_listen_mode(LISTEN_RAW);
packet_num = 0;
timeout = 0;
lease_remaining = 0;
@@ -1387,8 +1387,10 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
switch (client_data.state) {
case INIT_SELECTING:
if (!discover_retries || packet_num < discover_retries) {
- if (packet_num == 0)
+ if (packet_num == 0) {
+ change_listen_mode(LISTEN_RAW);
xid = random_xid();
+ }
/* multicast */
if (opt & OPT_l)
send_d6_info_request(xid);
@@ -1399,6 +1401,7 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
continue;
}
leasefail:
+ change_listen_mode(LISTEN_NONE);
d6_run_script_no_option("leasefail");
#if BB_MMU /* -b is not supported on NOMMU */
if (opt & OPT_b) { /* background if no lease */
@@ -1435,7 +1438,6 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
* "discover...select...discover..." loops
* were seen in the wild. Treat them similarly
* to "no response to discover" case */
- change_listen_mode(LISTEN_RAW);
client_data.state = INIT_SELECTING;
goto leasefail;
case BOUND:
@@ -1470,11 +1472,11 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
/* Timed out, enter rebinding state */
log1s("entering rebinding state");
client_data.state = REBINDING;
+ /* Switch to bcast receive */
+ change_listen_mode(LISTEN_RAW);
packet_num = 0;
/* fall right through */
case REBINDING:
- /* Switch to bcast receive */
- change_listen_mode(LISTEN_RAW);
/* Lease is *really* about to run out,
* try to find DHCP server using broadcast */
if (lease_remaining > 0 && packet_num < 3) {
@@ -1487,6 +1489,7 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
continue;
}
/* Timed out, enter init state */
+ change_listen_mode(LISTEN_NONE);
bb_simple_info_msg("lease lost, entering init state");
d6_run_script_no_option("deconfig");
client_data.state = INIT_SELECTING;
@@ -1522,12 +1525,15 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
/* Start things over */
case RENEW_REQUESTED: /* two or more SIGUSR1 received */
+ change_listen_mode(LISTEN_NONE);
d6_run_script_no_option("deconfig");
- /* case REQUESTING: break; */
- /* case RELEASED: break; */
- /* case INIT_SELECTING: break; */
+
+ default:
+ /* case REQUESTING: */
+ /* case RELEASED: */
+ /* case INIT_SELECTING: */
+ change_listen_mode(LISTEN_NONE);
}
- change_listen_mode(LISTEN_RAW);
client_data.state = INIT_SELECTING;
packet_num = 0;
/* Kill any timeouts, user wants this to hurry along */
@@ -1535,6 +1541,7 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
continue;
case SIGUSR2:
perform_d6_release(&srv6_buf, requested_ipv6);
+ /* ^^^ switches to LISTEN_NONE */
timeout = INT_MAX;
continue;
case SIGTERM:
@@ -1592,6 +1599,8 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
unsigned address_timeout;
unsigned prefix_timeout;
type_is_ok:
+ change_listen_mode(LISTEN_NONE);
+
address_timeout = 0;
prefix_timeout = 0;
option = d6_find_option(packet.d6_options, packet_end, D6_OPT_STATUS_CODE);
@@ -1602,7 +1611,6 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
packet_end, "nak");
if (client_data.state != REQUESTING)
d6_run_script_no_option("deconfig");
- change_listen_mode(LISTEN_RAW);
sleep(3); /* avoid excessive network traffic */
client_data.state = INIT_SELECTING;
client_data.first_secs = 0; /* make secs field count from 0 */
@@ -1624,6 +1632,7 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
client6_data.server_id = option;
if (packet.d6_msg_type == D6_MSG_ADVERTISE) {
/* enter requesting state */
+ change_listen_mode(LISTEN_RAW);
client_data.state = REQUESTING;
timeout = 0;
packet_num = 0;
@@ -1826,7 +1835,6 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
// BOUND_for_half_lease:
timeout = (unsigned)lease_remaining / 2;
client_data.state = BOUND;
- change_listen_mode(LISTEN_NONE);
packet_num = 0;
continue; /* back to main loop */
}