[U-Boot] DHCP regression on 2009-06

Robin Getz rgetz at blackfin.uclinux.org
Fri Jul 10 21:18:06 CEST 2009


On Fri 10 Jul 2009 12:27, Robin Getz pondered:
> http://git.denx.de/?p=u-boot/u-boot-net.git;a=commitdiff;h=3c172c4fdbbb5
> 858fae38478d6399be4a16be3fc
> 
> causes a regression on my network's DHCP server.
> 
> The part of the diff that causes the problem:
> 
>  #if defined(CONFIG_CMD_DHCP)
> 
>                 case DHCP:
> -                       /* Start with a clean slate... */
>                         BootpTry = 0;
> -                       NetOurIP = 0;
> -                       NetServerIP = getenv_IPaddr ("serverip");
>                         DhcpRequest();          /* Basically same as
> BOOTP */
>                         break;
> 
> Since we are leaving the "NetOurIP" to whatever it was... The test at:
> NetReceive():
> 
>          case PROT_IP:
>             [snip]
>                 tmp = NetReadIP(&ip->ip_dst);
>                 if (NetOurIP && tmp != NetOurIP && tmp != 0xFFFFFFFF) {
> #ifdef CONFIG_MCAST_TFTP
>                         if (Mcast_addr != tmp)
> #endif
>                         return;
>                 }
> 
> Will return - (we leave the 'NetOurIP' set to the old value, the offered
> 
> address (what is in tmp) is not our's and tmp is not 0xFFFFFFFF).
> 
> You never process the DHCP_OFFER...
> 
> There are multiple ways of fixing things - setting "NetOurIP = 0;"
> (revert one line of the change, which may expose the bug that Michael 
> was trying to fix) or try to be more tricky in the "not our address"
> check.... 
> 

I did verify that reverting the line exposes the bug that Michael fixed,
and so did this -- which seemed to work for my limited testing...

Index: net/bootp.c
===================================================================
--- net/bootp.c	(revision 1961)
+++ net/bootp.c	(working copy)
@@ -83,7 +83,7 @@
 
 #endif
 
-static int BootpCheckPkt(uchar *pkt, unsigned dest, unsigned src, unsigned len)
+int BootpCheckPkt(uchar *pkt, unsigned dest, unsigned src, unsigned len)
 {
 	Bootp_t *bp = (Bootp_t *) pkt;
 	int retval = 0;
Index: net/net.c
===================================================================
--- net/net.c	(revision 1961)
+++ net/net.c	(working copy)
@@ -1368,7 +1377,11 @@
 			return;
 		}
 		tmp = NetReadIP(&ip->ip_dst);
-		if (NetOurIP && tmp != NetOurIP && tmp != 0xFFFFFFFF) {
+		if (NetOurIP && tmp != NetOurIP && tmp != 0xFFFFFFFF &&
+			BootpCheckPkt((uchar *)ip +IP_HDR_SIZE,
+                                                ntohs(ip->udp_dst),
+                                                ntohs(ip->udp_src),
+                                                ntohs(ip->udp_len) - 8)) {
 #ifdef CONFIG_MCAST_TFTP
 			if (Mcast_addr != tmp)
 #endif




More information about the U-Boot mailing list