[git commit master 1/1] dhcpd: smaller code: do not look for REQUESTED_IP twice

Denys Vlasenko vda.linux at googlemail.com
Sun Nov 28 00:10:51 UTC 2010


commit: http://git.busybox.net/busybox/commit/?id=fa5e295600b7810b5246daab8fca69de1f9b78b7
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master

   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 at googlemail.com>
---
 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 a015cf0..ac77b51 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
 			) {
-- 
1.7.2.2



More information about the busybox-cvs mailing list