aboutsummaryrefslogtreecommitdiff
path: root/networking/udhcp/dhcpc.c
diff options
context:
space:
mode:
Diffstat (limited to 'networking/udhcp/dhcpc.c')
-rw-r--r--networking/udhcp/dhcpc.c23
1 files changed, 16 insertions, 7 deletions
diff --git a/networking/udhcp/dhcpc.c b/networking/udhcp/dhcpc.c
index e2e5b0a82..115cddbf0 100644
--- a/networking/udhcp/dhcpc.c
+++ b/networking/udhcp/dhcpc.c
@@ -43,11 +43,17 @@ static void change_listen_mode(int new_mode)
43{ 43{
44 DEBUG("entering %s listen mode", 44 DEBUG("entering %s listen mode",
45 new_mode ? (new_mode == 1 ? "kernel" : "raw") : "none"); 45 new_mode ? (new_mode == 1 ? "kernel" : "raw") : "none");
46
47 listen_mode = new_mode;
46 if (sockfd >= 0) { 48 if (sockfd >= 0) {
47 close(sockfd); 49 close(sockfd);
48 sockfd = -1; 50 sockfd = -1;
49 } 51 }
50 listen_mode = new_mode; 52 if (new_mode == LISTEN_KERNEL)
53 sockfd = udhcp_listen_socket(/*INADDR_ANY,*/ CLIENT_PORT, client_config.interface);
54 else if (new_mode != LISTEN_NONE)
55 sockfd = udhcp_raw_socket(client_config.ifindex);
56 /* else LISTEN_NONE: sockfd stay closed */
51} 57}
52 58
53 59
@@ -320,12 +326,15 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
320 for (;;) { 326 for (;;) {
321 unsigned timestamp_before_wait; 327 unsigned timestamp_before_wait;
322 328
323 if (listen_mode != LISTEN_NONE && sockfd < 0) { 329 //bb_error_msg("sockfd:%d, listen_mode:%d", sockfd, listen_mode);
324 if (listen_mode == LISTEN_KERNEL) 330
325 sockfd = udhcp_listen_socket(/*INADDR_ANY,*/ CLIENT_PORT, client_config.interface); 331 /* Was opening raw or udp socket here
326 else 332 * if (listen_mode != LISTEN_NONE && sockfd < 0),
327 sockfd = udhcp_raw_socket(client_config.ifindex); 333 * but on fast network renew responses return faster
328 } 334 * than we open sockets. Thus this code is moved
335 * to change_listen_mode(). Thus we open listen socket
336 * BEFORE we send renew request (see "case BOUND:"). */
337
329 max_fd = udhcp_sp_fd_set(&rfds, sockfd); 338 max_fd = udhcp_sp_fd_set(&rfds, sockfd);
330 339
331 tv.tv_sec = timeout - already_waited_sec; 340 tv.tv_sec = timeout - already_waited_sec;