dhcpd: smaller code: do not look for REQUESTED_IP twice
authorDenys Vlasenko <vda.linux@googlemail.com>
Sun, 28 Nov 2010 00:10:51 +0000 (01:10 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sun, 28 Nov 2010 00:10:51 +0000 (01:10 +0100)
   text    data     bss     dec     hex filename
 883235     936   17192  901363   dc0f3 busybox_old
 883219     936   17192  901347   dc0e3 busybox_unstripped

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

index a015cf0..ac77b51 100644 (file)
@@ -133,7 +133,10 @@ static uint32_t select_lease_time(struct dhcp_packet *packet)
 
 /* We got a DHCP DISCOVER. Send an OFFER. */
 /* NOINLINE: limit stack usage in caller */
-static NOINLINE void send_offer(struct dhcp_packet *oldpacket, uint32_t static_lease_nip, struct dyn_lease *lease)
+static NOINLINE void send_offer(struct dhcp_packet *oldpacket,
+               uint32_t static_lease_nip,
+               struct dyn_lease *lease,
+               uint8_t *requested_ip_opt)
 {
        struct dhcp_packet packet;
        uint32_t lease_time_sec;
@@ -147,7 +150,6 @@ static NOINLINE void send_offer(struct dhcp_packet *oldpacket, uint32_t static_l
        if (!static_lease_nip) {
                /* We have no static lease for client's chaddr */
                uint32_t req_nip;
-               uint8_t *req_ip_opt;
                const char *p_host_name;
 
                if (lease) {
@@ -158,9 +160,9 @@ static NOINLINE void send_offer(struct dhcp_packet *oldpacket, uint32_t static_l
                        packet.yiaddr = lease->lease_nip;
                }
                /* Or: if client has requested an IP */
-               else if ((req_ip_opt = udhcp_get_option(oldpacket, DHCP_REQUESTED_IP)) != NULL
+               else if (requested_ip_opt != NULL
                 /* (read IP) */
-                && (move_from_unaligned32(req_nip, req_ip_opt), 1)
+                && (move_from_unaligned32(req_nip, requested_ip_opt), 1)
                 /* and the IP is in the lease range */
                 && ntohl(req_nip) >= server_config.start_ip
                 && ntohl(req_nip) <= server_config.end_ip
@@ -283,16 +285,12 @@ struct dyn_lease *g_leases;
 int udhcpd_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 int udhcpd_main(int argc UNUSED_PARAM, char **argv)
 {
-       fd_set rfds;
        int server_socket = -1, retval, max_sock;
-       struct dhcp_packet packet;
        uint8_t *state;
-       uint32_t static_lease_nip;
        unsigned timeout_end;
        unsigned num_ips;
        unsigned opt;
        struct option_set *option;
-       struct dyn_lease *lease, fake_lease;
        IF_FEATURE_UDHCP_PORT(char *str_P;)
 
 #if ENABLE_FEATURE_UDHCP_PORT
@@ -372,11 +370,15 @@ int udhcpd_main(int argc UNUSED_PARAM, char **argv)
 
        timeout_end = monotonic_sec() + server_config.auto_time;
        while (1) { /* loop until universe collapses */
+               fd_set rfds;
+               struct dhcp_packet packet;
                int bytes;
                struct timeval tv;
                uint8_t *server_id_opt;
-               uint8_t *requested_opt;
+               uint8_t *requested_ip_opt;
                uint32_t requested_nip = requested_nip; /* for compiler */
+               uint32_t static_lease_nip;
+               struct dyn_lease *lease, fake_lease;
 
                if (server_socket < 0) {
                        server_socket = udhcp_listen_socket(/*INADDR_ANY,*/ SERVER_PORT,
@@ -443,6 +445,18 @@ int udhcpd_main(int argc UNUSED_PARAM, char **argv)
                        continue;
                }
 
+               /* Get SERVER_ID if present */
+               server_id_opt = udhcp_get_option(&packet, DHCP_SERVER_ID);
+               if (server_id_opt) {
+                       uint32_t server_id_net;
+                       move_from_unaligned32(server_id_net, server_id_opt);
+                       if (server_id_net != server_config.server_nip) {
+                               /* client talks to somebody else */
+                               log1("server ID doesn't match, ignoring");
+                               continue;
+                       }
+               }
+
                /* Look for a static/dynamic lease */
                static_lease_nip = get_static_nip_by_mac(server_config.static_leases, &packet.chaddr);
                if (static_lease_nip) {
@@ -455,20 +469,10 @@ int udhcpd_main(int argc UNUSED_PARAM, char **argv)
                        lease = find_lease_by_mac(packet.chaddr);
                }
 
-               /* Get REQUESTED_IP and SERVER_ID if present */
-               server_id_opt = udhcp_get_option(&packet, DHCP_SERVER_ID);
-               if (server_id_opt) {
-                       uint32_t server_id_net;
-                       move_from_unaligned32(server_id_net, server_id_opt);
-                       if (server_id_net != server_config.server_nip) {
-                               /* client talks to somebody else */
-                               log1("server ID doesn't match, ignoring");
-                               continue;
-                       }
-               }
-               requested_opt = udhcp_get_option(&packet, DHCP_REQUESTED_IP);
-               if (requested_opt) {
-                       move_from_unaligned32(requested_nip, requested_opt);
+               /* Get REQUESTED_IP if present */
+               requested_ip_opt = udhcp_get_option(&packet, DHCP_REQUESTED_IP);
+               if (requested_ip_opt) {
+                       move_from_unaligned32(requested_nip, requested_ip_opt);
                }
 
                switch (state[0]) {
@@ -476,7 +480,7 @@ int udhcpd_main(int argc UNUSED_PARAM, char **argv)
                case DHCPDISCOVER:
                        log1("Received DISCOVER");
 
-                       send_offer(&packet, static_lease_nip, lease);
+                       send_offer(&packet, static_lease_nip, lease, requested_ip_opt);
                        break;
 
                case DHCPREQUEST:
@@ -567,7 +571,7 @@ o DHCPREQUEST generated during REBINDING state:
    A DHCP server MAY extend a client's lease only if it has local
    administrative authority to do so.
 */
-                       if (!requested_opt) {
+                       if (!requested_ip_opt) {
                                requested_nip = packet.ciaddr;
                                if (requested_nip == 0) {
                                        log1("no requested IP and no ciaddr, ignoring");
@@ -603,7 +607,7 @@ o DHCPREQUEST generated during REBINDING state:
                         */
                        log1("Received DECLINE");
                        if (server_id_opt
-                        && requested_opt
+                        && requested_ip_opt
                         && lease  /* chaddr matches this lease */
                         && requested_nip == lease->lease_nip
                        ) {