dhcp: get rid of last global data
authorDenys Vlasenko <vda.linux@googlemail.com>
Sun, 26 May 2019 11:05:04 +0000 (13:05 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sun, 26 May 2019 11:05:04 +0000 (13:05 +0200)
function                                             old     new   delta
udhcpc_main                                         2680    2684      +4
state                                                  1       -      -1
listen_mode                                            1       -      -1
sockfd                                                 4       -      -4
------------------------------------------------------------------------------
(add/remove: 0/3 grow/shrink: 1/0 up/down: 4/-6)               Total: -2 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
networking/udhcp/d6_dhcpc.c
networking/udhcp/dhcpc.c
networking/udhcp/dhcpc.h

index 6cc2316c43420d76eaaf4b0d8f21fd60e525c499..1973af99b6904d5d6416a53db7cf06ef0665f3c2 100644 (file)
@@ -903,13 +903,12 @@ static NOINLINE int d6_recv_raw_packet(struct in6_addr *peer_ipv6, struct d6_pac
 
 /*** Main ***/
 
-static int sockfd = -1;
-
+/* Values for client_config.listen_mode */
 #define LISTEN_NONE   0
 #define LISTEN_KERNEL 1
 #define LISTEN_RAW    2
-static smallint listen_mode;
 
+/* Values for client_config.state */
 /* initial state: (re)start DHCP negotiation */
 #define INIT_SELECTING  0
 /* discover was sent, DHCPOFFER reply received */
@@ -924,7 +923,6 @@ static smallint listen_mode;
 #define RENEW_REQUESTED 5
 /* release, possibly manually requested (SIGUSR2) */
 #define RELEASED        6
-static smallint state;
 
 static int d6_raw_socket(int ifindex)
 {
@@ -1018,35 +1016,35 @@ static void change_listen_mode(int new_mode)
                        : "none"
        );
 
-       listen_mode = new_mode;
-       if (sockfd >= 0) {
-               close(sockfd);
-               sockfd = -1;
+       client_config.listen_mode = new_mode;
+       if (client_config.sockfd >= 0) {
+               close(client_config.sockfd);
+               client_config.sockfd = -1;
        }
        if (new_mode == LISTEN_KERNEL)
-               sockfd = udhcp_listen_socket(/*INADDR_ANY,*/ CLIENT_PORT6, client_config.interface);
+               client_config.sockfd = udhcp_listen_socket(/*INADDR_ANY,*/ CLIENT_PORT6, client_config.interface);
        else if (new_mode != LISTEN_NONE)
-               sockfd = d6_raw_socket(client_config.ifindex);
-       /* else LISTEN_NONE: sockfd stays closed */
+               client_config.sockfd = d6_raw_socket(client_config.ifindex);
+       /* else LISTEN_NONE: client_config.sockfd stays closed */
 }
 
 /* Called only on SIGUSR1 */
 static void perform_renew(void)
 {
        bb_info_msg("performing DHCP renew");
-       switch (state) {
+       switch (client_config.state) {
        case BOUND:
                change_listen_mode(LISTEN_KERNEL);
        case RENEWING:
        case REBINDING:
-               state = RENEW_REQUESTED;
+               client_config.state = RENEW_REQUESTED;
                break;
        case RENEW_REQUESTED: /* impatient are we? fine, square 1 */
                d6_run_script_no_option("deconfig");
        case REQUESTING:
        case RELEASED:
                change_listen_mode(LISTEN_RAW);
-               state = INIT_SELECTING;
+               client_config.state = INIT_SELECTING;
                break;
        case INIT_SELECTING:
                break;
@@ -1056,10 +1054,10 @@ static void perform_renew(void)
 static void perform_d6_release(struct in6_addr *server_ipv6, struct in6_addr *our_cur_ipv6)
 {
        /* send release packet */
-       if (state == BOUND
-        || state == RENEWING
-        || state == REBINDING
-        || state == RENEW_REQUESTED
+       if (client_config.state == BOUND
+        || client_config.state == RENEWING
+        || client_config.state == REBINDING
+        || client_config.state == RENEW_REQUESTED
        ) {
                bb_info_msg("unicasting a release");
                send_d6_release(server_ipv6, our_cur_ipv6); /* unicast */
@@ -1073,7 +1071,7 @@ static void perform_d6_release(struct in6_addr *server_ipv6, struct in6_addr *ou
  */
        d6_run_script_no_option("deconfig");
        change_listen_mode(LISTEN_NONE);
-       state = RELEASED;
+       client_config.state = RELEASED;
 }
 
 ///static uint8_t* alloc_dhcp_option(int code, const char *str, int extra)
@@ -1174,6 +1172,7 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
        IF_FEATURE_UDHCP_PORT(CLIENT_PORT6 = 546;)
        client_config.interface = "eth0";
        client_config.script = CONFIG_UDHCPC_DEFAULT_SCRIPT;
+       client_config.sockfd = -1;
 
        /* Parse command line */
        opt = getopt32long(argv, "^"
@@ -1278,7 +1277,7 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
        /* Set up the signal pipe */
        udhcp_sp_setup();
 
-       state = INIT_SELECTING;
+       client_config.state = INIT_SELECTING;
        d6_run_script_no_option("deconfig");
        change_listen_mode(LISTEN_RAW);
        packet_num = 0;
@@ -1297,16 +1296,16 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
                /* silence "uninitialized!" warning */
                unsigned timestamp_before_wait = timestamp_before_wait;
 
-               //bb_error_msg("sockfd:%d, listen_mode:%d", sockfd, listen_mode);
+               //bb_error_msg("sockfd:%d, listen_mode:%d", client_config.sockfd, client_config.listen_mode);
 
                /* Was opening raw or udp socket here
-                * if (listen_mode != LISTEN_NONE && sockfd < 0),
+                * if (client_config.listen_mode != LISTEN_NONE && client_config.sockfd < 0),
                 * but on fast network renew responses return faster
                 * than we open sockets. Thus this code is moved
                 * to change_listen_mode(). Thus we open listen socket
                 * BEFORE we send renew request (see "case BOUND:"). */
 
-               udhcp_sp_fd_set(pfds, sockfd);
+               udhcp_sp_fd_set(pfds, client_config.sockfd);
 
                tv = timeout - already_waited_sec;
                retval = 0;
@@ -1348,7 +1347,7 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
                        /* We will restart the wait in any case */
                        already_waited_sec = 0;
 
-                       switch (state) {
+                       switch (client_config.state) {
                        case INIT_SELECTING:
                                if (!discover_retries || packet_num < discover_retries) {
                                        if (packet_num == 0)
@@ -1397,11 +1396,11 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
                                 * were seen in the wild. Treat them similarly
                                 * to "no response to discover" case */
                                change_listen_mode(LISTEN_RAW);
-                               state = INIT_SELECTING;
+                               client_config.state = INIT_SELECTING;
                                goto leasefail;
                        case BOUND:
                                /* 1/2 lease passed, enter renewing state */
-                               state = RENEWING;
+                               client_config.state = RENEWING;
                                client_config.first_secs = 0; /* make secs field count from 0 */
                                change_listen_mode(LISTEN_KERNEL);
                                log1("entering renew state");
@@ -1425,7 +1424,7 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
                                }
                                /* Timed out, enter rebinding state */
                                log1("entering rebinding state");
-                               state = REBINDING;
+                               client_config.state = REBINDING;
                                /* fall right through */
                        case REBINDING:
                                /* Switch to bcast receive */
@@ -1441,7 +1440,7 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
                                /* Timed out, enter init state */
                                bb_info_msg("lease lost, entering init state");
                                d6_run_script_no_option("deconfig");
-                               state = INIT_SELECTING;
+                               client_config.state = INIT_SELECTING;
                                client_config.first_secs = 0; /* make secs field count from 0 */
                                /*timeout = 0; - already is */
                                packet_num = 0;
@@ -1461,7 +1460,7 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
                        client_config.first_secs = 0; /* make secs field count from 0 */
                        already_waited_sec = 0;
                        perform_renew();
-                       if (state == RENEW_REQUESTED) {
+                       if (client_config.state == RENEW_REQUESTED) {
                                /* We might be either on the same network
                                 * (in which case renew might work),
                                 * or we might be on a completely different one
@@ -1496,15 +1495,15 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
                        int len;
 
                        /* A packet is ready, read it */
-                       if (listen_mode == LISTEN_KERNEL)
-                               len = d6_recv_kernel_packet(&srv6_buf, &packet, sockfd);
+                       if (client_config.listen_mode == LISTEN_KERNEL)
+                               len = d6_recv_kernel_packet(&srv6_buf, &packet, client_config.sockfd);
                        else
-                               len = d6_recv_raw_packet(&srv6_buf, &packet, sockfd);
+                               len = d6_recv_raw_packet(&srv6_buf, &packet, client_config.sockfd);
                        if (len == -1) {
                                /* Error is severe, reopen socket */
                                bb_error_msg("read error: "STRERROR_FMT", reopening socket" STRERROR_ERRNO);
                                sleep(discover_timeout); /* 3 seconds by default */
-                               change_listen_mode(listen_mode); /* just close and reopen */
+                               change_listen_mode(client_config.listen_mode); /* just close and reopen */
                        }
                        /* If this packet will turn out to be unrelated/bogus,
                         * we will go back and wait for next one.
@@ -1521,7 +1520,7 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
                        continue;
                }
 
-               switch (state) {
+               switch (client_config.state) {
                case INIT_SELECTING:
                        if (packet.d6_msg_type == D6_MSG_ADVERTISE)
                                goto type_is_ok;
@@ -1547,11 +1546,11 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
                                        bb_info_msg("received DHCP NAK (%u)", option->data[4]);
                                        d6_run_script(packet.d6_options,
                                                        packet_end, "nak");
-                                       if (state != REQUESTING)
+                                       if (client_config.state != REQUESTING)
                                                d6_run_script_no_option("deconfig");
                                        change_listen_mode(LISTEN_RAW);
                                        sleep(3); /* avoid excessive network traffic */
-                                       state = INIT_SELECTING;
+                                       client_config.state = INIT_SELECTING;
                                        client_config.first_secs = 0; /* make secs field count from 0 */
                                        requested_ipv6 = NULL;
                                        timeout = 0;
@@ -1572,7 +1571,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 */
-                                       state = REQUESTING;
+                                       client_config.state = REQUESTING;
                                        timeout = 0;
                                        packet_num = 0;
                                        already_waited_sec = 0;
@@ -1747,9 +1746,9 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
                                        timeout = 61;
                                /* enter bound state */
                                d6_run_script(packet.d6_options, packet_end,
-                                       (state == REQUESTING ? "bound" : "renew"));
+                                       (client_config.state == REQUESTING ? "bound" : "renew"));
 
-                               state = BOUND;
+                               client_config.state = BOUND;
                                change_listen_mode(LISTEN_NONE);
                                if (opt & OPT_q) { /* quit after lease */
                                        goto ret0;
index 0e673ae7e7b7572ca499f4b4dfdb6c882313af3e..7b1b23706d15fe260ef5ea1b43c8ca4a98e00a93 100644 (file)
@@ -984,13 +984,12 @@ static NOINLINE int udhcp_recv_raw_packet(struct dhcp_packet *dhcp_pkt, int fd)
 
 /*** Main ***/
 
-static int sockfd = -1;
-
+/* Values for client_config.listen_mode */
 #define LISTEN_NONE   0
 #define LISTEN_KERNEL 1
 #define LISTEN_RAW    2
-static smallint listen_mode;
 
+/* Values for client_config.state */
 /* initial state: (re)start DHCP negotiation */
 #define INIT_SELECTING  0
 /* discover was sent, DHCPOFFER reply received */
@@ -1005,7 +1004,6 @@ static smallint listen_mode;
 #define RENEW_REQUESTED 5
 /* release, possibly manually requested (SIGUSR2) */
 #define RELEASED        6
-static smallint state;
 
 static int udhcp_raw_socket(int ifindex)
 {
@@ -1102,35 +1100,35 @@ static void change_listen_mode(int new_mode)
                        : "none"
        );
 
-       listen_mode = new_mode;
-       if (sockfd >= 0) {
-               close(sockfd);
-               sockfd = -1;
+       client_config.listen_mode = new_mode;
+       if (client_config.sockfd >= 0) {
+               close(client_config.sockfd);
+               client_config.sockfd = -1;
        }
        if (new_mode == LISTEN_KERNEL)
-               sockfd = udhcp_listen_socket(/*INADDR_ANY,*/ CLIENT_PORT, client_config.interface);
+               client_config.sockfd = udhcp_listen_socket(/*INADDR_ANY,*/ CLIENT_PORT, client_config.interface);
        else if (new_mode != LISTEN_NONE)
-               sockfd = udhcp_raw_socket(client_config.ifindex);
-       /* else LISTEN_NONE: sockfd stays closed */
+               client_config.sockfd = udhcp_raw_socket(client_config.ifindex);
+       /* else LISTEN_NONE: client_config.sockfd stays closed */
 }
 
 /* Called only on SIGUSR1 */
 static void perform_renew(void)
 {
        bb_info_msg("performing DHCP renew");
-       switch (state) {
+       switch (client_config.state) {
        case BOUND:
                change_listen_mode(LISTEN_KERNEL);
        case RENEWING:
        case REBINDING:
-               state = RENEW_REQUESTED;
+               client_config.state = RENEW_REQUESTED;
                break;
        case RENEW_REQUESTED: /* impatient are we? fine, square 1 */
                udhcp_run_script(NULL, "deconfig");
        case REQUESTING:
        case RELEASED:
                change_listen_mode(LISTEN_RAW);
-               state = INIT_SELECTING;
+               client_config.state = INIT_SELECTING;
                break;
        case INIT_SELECTING:
                break;
@@ -1143,10 +1141,10 @@ static void perform_release(uint32_t server_addr, uint32_t requested_ip)
        struct in_addr temp_addr;
 
        /* send release packet */
-       if (state == BOUND
-        || state == RENEWING
-        || state == REBINDING
-        || state == RENEW_REQUESTED
+       if (client_config.state == BOUND
+        || client_config.state == RENEWING
+        || client_config.state == REBINDING
+        || client_config.state == RENEW_REQUESTED
        ) {
                temp_addr.s_addr = server_addr;
                strcpy(buffer, inet_ntoa(temp_addr));
@@ -1165,7 +1163,7 @@ static void perform_release(uint32_t server_addr, uint32_t requested_ip)
        udhcp_run_script(NULL, "deconfig");
 
        change_listen_mode(LISTEN_NONE);
-       state = RELEASED;
+       client_config.state = RELEASED;
 }
 
 static uint8_t* alloc_dhcp_option(int code, const char *str, int extra)
@@ -1270,6 +1268,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
        IF_FEATURE_UDHCP_PORT(CLIENT_PORT = 68;)
        client_config.interface = "eth0";
        client_config.script = CONFIG_UDHCPC_DEFAULT_SCRIPT;
+       client_config.sockfd = -1;
        str_V = "udhcp "BB_VER;
 
        /* Parse command line */
@@ -1397,7 +1396,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
        /* We want random_xid to be random... */
        srand(monotonic_us());
 
-       state = INIT_SELECTING;
+       client_config.state = INIT_SELECTING;
        udhcp_run_script(NULL, "deconfig");
        change_listen_mode(LISTEN_RAW);
        packet_num = 0;
@@ -1415,16 +1414,16 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
                /* silence "uninitialized!" warning */
                unsigned timestamp_before_wait = timestamp_before_wait;
 
-               //bb_error_msg("sockfd:%d, listen_mode:%d", sockfd, listen_mode);
+               //bb_error_msg("sockfd:%d, listen_mode:%d", client_config.sockfd, client_config.listen_mode);
 
                /* Was opening raw or udp socket here
-                * if (listen_mode != LISTEN_NONE && sockfd < 0),
+                * if (client_config.listen_mode != LISTEN_NONE && client_config.sockfd < 0),
                 * but on fast network renew responses return faster
                 * than we open sockets. Thus this code is moved
                 * to change_listen_mode(). Thus we open listen socket
                 * BEFORE we send renew request (see "case BOUND:"). */
 
-               udhcp_sp_fd_set(pfds, sockfd);
+               udhcp_sp_fd_set(pfds, client_config.sockfd);
 
                tv = timeout - already_waited_sec;
                retval = 0;
@@ -1466,7 +1465,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
                        /* We will restart the wait in any case */
                        already_waited_sec = 0;
 
-                       switch (state) {
+                       switch (client_config.state) {
                        case INIT_SELECTING:
                                if (!discover_retries || packet_num < discover_retries) {
                                        if (packet_num == 0)
@@ -1515,11 +1514,11 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
                                 * were seen in the wild. Treat them similarly
                                 * to "no response to discover" case */
                                change_listen_mode(LISTEN_RAW);
-                               state = INIT_SELECTING;
+                               client_config.state = INIT_SELECTING;
                                goto leasefail;
                        case BOUND:
                                /* 1/2 lease passed, enter renewing state */
-                               state = RENEWING;
+                               client_config.state = RENEWING;
                                client_config.first_secs = 0; /* make secs field count from 0 */
                                change_listen_mode(LISTEN_KERNEL);
                                log1("entering renew state");
@@ -1556,7 +1555,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
                                }
                                /* Timed out or error, enter rebinding state */
                                log1("entering rebinding state");
-                               state = REBINDING;
+                               client_config.state = REBINDING;
                                /* fall right through */
                        case REBINDING:
                                /* Switch to bcast receive */
@@ -1572,7 +1571,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
                                /* Timed out, enter init state */
                                bb_info_msg("lease lost, entering init state");
                                udhcp_run_script(NULL, "deconfig");
-                               state = INIT_SELECTING;
+                               client_config.state = INIT_SELECTING;
                                client_config.first_secs = 0; /* make secs field count from 0 */
                                /*timeout = 0; - already is */
                                packet_num = 0;
@@ -1592,7 +1591,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
                        client_config.first_secs = 0; /* make secs field count from 0 */
                        already_waited_sec = 0;
                        perform_renew();
-                       if (state == RENEW_REQUESTED) {
+                       if (client_config.state == RENEW_REQUESTED) {
                                /* We might be either on the same network
                                 * (in which case renew might work),
                                 * or we might be on a completely different one
@@ -1627,15 +1626,15 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
                        int len;
 
                        /* A packet is ready, read it */
-                       if (listen_mode == LISTEN_KERNEL)
-                               len = udhcp_recv_kernel_packet(&packet, sockfd);
+                       if (client_config.listen_mode == LISTEN_KERNEL)
+                               len = udhcp_recv_kernel_packet(&packet, client_config.sockfd);
                        else
-                               len = udhcp_recv_raw_packet(&packet, sockfd);
+                               len = udhcp_recv_raw_packet(&packet, client_config.sockfd);
                        if (len == -1) {
                                /* Error is severe, reopen socket */
                                bb_error_msg("read error: "STRERROR_FMT", reopening socket" STRERROR_ERRNO);
                                sleep(discover_timeout); /* 3 seconds by default */
-                               change_listen_mode(listen_mode); /* just close and reopen */
+                               change_listen_mode(client_config.listen_mode); /* just close and reopen */
                        }
                        /* If this packet will turn out to be unrelated/bogus,
                         * we will go back and wait for next one.
@@ -1666,7 +1665,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
                        continue;
                }
 
-               switch (state) {
+               switch (client_config.state) {
                case INIT_SELECTING:
                        /* Must be a DHCPOFFER */
                        if (*message == DHCPOFFER) {
@@ -1708,7 +1707,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
                                requested_ip = packet.yiaddr;
 
                                /* enter requesting state */
-                               state = REQUESTING;
+                               client_config.state = REQUESTING;
                                timeout = 0;
                                packet_num = 0;
                                already_waited_sec = 0;
@@ -1763,10 +1762,10 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
                                                        "(got ARP reply), declining");
                                                send_decline(/*xid,*/ server_addr, packet.yiaddr);
 
-                                               if (state != REQUESTING)
+                                               if (client_config.state != REQUESTING)
                                                        udhcp_run_script(NULL, "deconfig");
                                                change_listen_mode(LISTEN_RAW);
-                                               state = INIT_SELECTING;
+                                               client_config.state = INIT_SELECTING;
                                                client_config.first_secs = 0; /* make secs field count from 0 */
                                                requested_ip = 0;
                                                timeout = tryagain_timeout;
@@ -1783,7 +1782,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
                                requested_ip = packet.yiaddr;
 
                                start = monotonic_sec();
-                               udhcp_run_script(&packet, state == REQUESTING ? "bound" : "renew");
+                               udhcp_run_script(&packet, client_config.state == REQUESTING ? "bound" : "renew");
                                already_waited_sec = (unsigned)monotonic_sec() - start;
                                timeout = lease_seconds / 2;
                                if ((unsigned)timeout < already_waited_sec) {
@@ -1791,7 +1790,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
                                        timeout = already_waited_sec = 0;
                                }
 
-                               state = BOUND;
+                               client_config.state = BOUND;
                                change_listen_mode(LISTEN_NONE);
                                if (opt & OPT_q) { /* quit after lease */
                                        goto ret0;
@@ -1833,11 +1832,11 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
                                /* return to init state */
                                bb_info_msg("received %s", "DHCP NAK");
                                udhcp_run_script(&packet, "nak");
-                               if (state != REQUESTING)
+                               if (client_config.state != REQUESTING)
                                        udhcp_run_script(NULL, "deconfig");
                                change_listen_mode(LISTEN_RAW);
                                sleep(3); /* avoid excessive network traffic */
-                               state = INIT_SELECTING;
+                               client_config.state = INIT_SELECTING;
                                client_config.first_secs = 0; /* make secs field count from 0 */
                                requested_ip = 0;
                                timeout = 0;
index 7fdbc9a6c34792c763fd94164a08d7af9edd5e83..2618b12b5c59518b18797cc96e3e6fc7c5ad17e3 100644 (file)
@@ -24,6 +24,10 @@ struct client_config_t {
 
        uint16_t first_secs;
        uint16_t last_secs;
+
+       int sockfd;
+       smallint listen_mode;
+       smallint state;
 } FIX_ALIASING;
 
 /* server_config sits in 1st half of bb_common_bufsiz1 */