diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2010-11-28 01:10:51 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2010-11-28 01:10:51 +0100 |
commit | fa5e295600b7810b5246daab8fca69de1f9b78b7 (patch) | |
tree | 507b2d587d8ec3651617406c690e14eec61b4a91 /networking | |
parent | b271ad46dc85655d8ef077d57102b239b874097a (diff) | |
download | busybox-fa5e295600b7810b5246daab8fca69de1f9b78b7.tar.gz |
dhcpd: smaller code: do not look for REQUESTED_IP twice
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>
Diffstat (limited to 'networking')
-rw-r--r-- | networking/udhcp/dhcpd.c | 56 |
1 files changed, 30 insertions, 26 deletions
diff --git a/networking/udhcp/dhcpd.c b/networking/udhcp/dhcpd.c index a015cf038..ac77b511d 100644 --- a/networking/udhcp/dhcpd.c +++ b/networking/udhcp/dhcpd.c @@ -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 ) { |