Index: etherboot-5.4.3/src/core/nic.c
===================================================================
--- etherboot-5.4.3.orig/src/core/nic.c	2008-07-07 15:57:49.000000000 -0700
+++ etherboot-5.4.3/src/core/nic.c	2008-07-07 16:02:53.000000000 -0700
@@ -1005,8 +1005,10 @@
 		return 1;
 	}
 #endif /* PXE_DHCP_STRICT */
+#if 0
 	if (memcmp(&bootpreply->bp_siaddr, &zeroIP, sizeof(in_addr)) == 0)
 		return 0;
+#endif
 	if ((memcmp(broadcast, bootpreply->bp_hwaddr, ETH_ALEN) != 0) &&
 		(memcmp(arptable[ARP_CLIENT].node, bootpreply->bp_hwaddr, ETH_ALEN) != 0)) {
 		return 0;
@@ -1132,6 +1134,7 @@
 			return(1);
 		dhcp_reply = 0;
 		/* Construct the DHCPREQUEST packet */
+		memcpy(&ip.bp.bp_ciaddr, &arptable[ARP_CLIENT].ipaddr, sizeof(in_addr));
 		memcpy(ip.bp.bp_vend, rfc1533_cookie, sizeof rfc1533_cookie);
 		memcpy(ip.bp.bp_vend + sizeof rfc1533_cookie, dhcprequest, sizeof dhcprequest);
 		/* Beware: the magic numbers 9 and 15 depend on
@@ -1149,7 +1152,7 @@
 			udp_transmit(IP_BROADCAST, BOOTP_CLIENT, BOOTP_SERVER,
 				     sizeof(struct bootpip_t), &ip);
 			dhcp_reply=0;
-			timeout = rfc2131_sleep_interval(TIMEOUT, reqretry++);
+			timeout = rfc2131_sleep_interval(BOOTP_TIMEOUT, reqretry++);
 			if (!await_reply(await_bootp, 0, NULL, timeout))
 				continue;
 			if (dhcp_reply != DHCPACK)
@@ -1168,7 +1171,8 @@
 					printf ( "\nSending ProxyDHCP request to %@...", arptable[ARP_PROXYDHCP].ipaddr.s_addr);
 					udp_transmit(arptable[ARP_PROXYDHCP].ipaddr.s_addr, BOOTP_CLIENT, PROXYDHCP_SERVER,
 						     sizeof(struct bootpip_t), &ip);
-					timeout = rfc2131_sleep_interval(TIMEOUT, reqretry++);
+					reqretry++;
+					timeout = reqretry * TICKS_PER_SEC;
 					if (await_reply(await_bootp, 0, NULL, timeout)) {
 						break;
 					}
@@ -1197,7 +1201,8 @@
 					memset(&arptable[ARP_SERVER].node, 0, ETH_ALEN);
 					udp_transmit(pxe_boot_menu[0].ip.s_addr, PXE_BOOT_CLIENT,
 						     PXE_BOOT_SERVER, sizeof(struct bootpip_t), &ip);
-					timeout = rfc2131_sleep_interval(TIMEOUT, reqretry++);
+					reqretry++;
+					timeout = reqretry * TICKS_PER_SEC;
 					if (await_reply(await_bootp, 0, NULL, timeout)) {
 						break;
 					}
Index: etherboot-5.4.3/src/Config
===================================================================
--- etherboot-5.4.3.orig/src/Config	2008-07-07 16:00:04.000000000 -0700
+++ etherboot-5.4.3/src/Config	2008-07-07 16:00:17.000000000 -0700
@@ -436,6 +436,7 @@
 # Limit the delay on packet loss/congestion to a more bearable value. See
 # description above.  If unset, do not limit the delay between resend.
 CFLAGS+=	-DBACKOFF_LIMIT=6 -DCONGESTED
+CFLAGS+=	-DMAX_BOOTP_RETRIES=4
 
 # More optional features
 CFLAGS+=	-DTRY_FLOPPY_FIRST=0
