[U-Boot] [PATCH v2 22/25] net: Fix incorrect DHCP/BOOTP packets on 64-bit systems

Joe Hershberger joe.hershberger at ni.com
Wed Apr 8 08:41:22 CEST 2015


From: Sergey Temerkhanov <s.temerkhanov at gmail.com>

This commit fixes incorrect DHCP/BOOTP packet layout caused by
'ulong' type size difference on 64 and 32-bit architectures.
It also renames NetReadLong()/NetCopyLong() to
net_read_u32/net_copy_u32() accordingly.


Signed-off-by: Radha Mohan Chintakuntla <rchintakuntla at cavium.com>
Signed-off-by: Sergey Temerkhanov <s.temerkhanov at gmail.com>
Signed-off-by: Joe Hershberger <joe.hershberger at ni.com>
---

Changes in v2: None

 include/net.h | 10 +++++-----
 net/bootp.c   | 33 ++++++++++++++++-----------------
 net/bootp.h   |  4 ++--
 3 files changed, 23 insertions(+), 24 deletions(-)

diff --git a/include/net.h b/include/net.h
index e9131f7..def1fd9 100644
--- a/include/net.h
+++ b/include/net.h
@@ -410,7 +410,7 @@ struct icmp_hdr {
 			ushort	id;
 			ushort	sequence;
 		} echo;
-		ulong	gateway;
+		u32	gateway;
 		struct {
 			ushort	unused;
 			ushort	mtu;
@@ -678,9 +678,9 @@ static inline struct in_addr net_read_ip(void *from)
 }
 
 /* return ulong *in network byteorder* */
-static inline ulong net_read_long(ulong *from)
+static inline u32 net_read_u32(u32 *from)
 {
-	ulong l;
+	u32 l;
 
 	memcpy((void *)&l, (void *)from, sizeof(l));
 	return l;
@@ -699,9 +699,9 @@ static inline void net_copy_ip(void *to, void *from)
 }
 
 /* copy ulong */
-static inline void net_copy_long(ulong *to, ulong *from)
+static inline void net_copy_u32(u32 *to, u32 *from)
 {
-	memcpy((void *)to, (void *)from, sizeof(ulong));
+	memcpy((void *)to, (void *)from, sizeof(u32));
 }
 
 /**
diff --git a/net/bootp.c b/net/bootp.c
index 500850c..43466af 100644
--- a/net/bootp.c
+++ b/net/bootp.c
@@ -51,7 +51,7 @@
 #define CONFIG_BOOTP_ID_CACHE_SIZE 4
 #endif
 
-ulong		bootp_ids[CONFIG_BOOTP_ID_CACHE_SIZE];
+u32		bootp_ids[CONFIG_BOOTP_ID_CACHE_SIZE];
 unsigned int	bootp_num_ids;
 int		bootp_try;
 ulong		bootp_start;
@@ -62,7 +62,7 @@ char net_root_path[64] = {0,}; /* Our bootpath */
 
 #if defined(CONFIG_CMD_DHCP)
 static dhcp_state_t dhcp_state = INIT;
-static unsigned long dhcp_leasetime;
+static u32 dhcp_leasetime;
 static struct in_addr dhcp_server_ip;
 static void dhcp_handler(uchar *pkt, unsigned dest, struct in_addr sip,
 			unsigned src, unsigned len);
@@ -128,7 +128,7 @@ static int check_packet(uchar *pkt, unsigned dest, unsigned src, unsigned len)
 		retval = -4;
 	else if (bp->bp_hlen != HWL_ETHER)
 		retval = -5;
-	else if (!bootp_match_id(net_read_long((ulong *)&bp->bp_id)))
+	else if (!bootp_match_id(net_read_u32(&bp->bp_id)))
 		retval = -6;
 
 	debug("Filtering pkt = %d\n", retval);
@@ -356,8 +356,7 @@ static void bootp_handler(uchar *pkt, unsigned dest, struct in_addr sip,
 	store_net_params(bp);		/* Store net parameters from reply */
 
 	/* Retrieve extended information (we must parse the vendor area) */
-	if (net_read_long((ulong *)&bp->bp_vend[0]) ==
-	    htonl(BOOTP_VENDOR_MAGIC))
+	if (net_read_u32((u32 *)&bp->bp_vend[0]) == htonl(BOOTP_VENDOR_MAGIC))
 		bootp_process_vendor((uchar *)&bp->bp_vend[4], len);
 
 	net_set_timeout_handler(0, (thand_f *)0);
@@ -666,7 +665,7 @@ void bootp_request(void)
 #ifdef CONFIG_BOOTP_RANDOM_DELAY
 	ulong rand_ms;
 #endif
-	ulong bootp_id;
+	u32 bootp_id;
 	struct in_addr zero_ip;
 	struct in_addr bcast_ip;
 
@@ -734,14 +733,14 @@ void bootp_request(void)
 	 *	Bootp ID is the lower 4 bytes of our ethernet address
 	 *	plus the current time in ms.
 	 */
-	bootp_id = ((ulong)net_ethaddr[2] << 24)
-		| ((ulong)net_ethaddr[3] << 16)
-		| ((ulong)net_ethaddr[4] << 8)
-		| (ulong)net_ethaddr[5];
+	bootp_id = ((u32)net_ethaddr[2] << 24)
+		| ((u32)net_ethaddr[3] << 16)
+		| ((u32)net_ethaddr[4] << 8)
+		| (u32)net_ethaddr[5];
 	bootp_id += get_timer(0);
 	bootp_id = htonl(bootp_id);
 	bootp_add_id(bootp_id);
-	net_copy_long(&bp->bp_id, &bootp_id);
+	net_copy_u32(&bp->bp_id, &bootp_id);
 
 	/*
 	 * Calculate proper packet lengths taking into account the
@@ -780,7 +779,7 @@ static void dhcp_process_options(uchar *popt, struct bootp_hdr *bp)
 #if defined(CONFIG_CMD_SNTP) && defined(CONFIG_BOOTP_TIMEOFFSET)
 		case 2:		/* Time offset	*/
 			to_ptr = &net_ntp_time_offset;
-			net_copy_long((ulong *)to_ptr, (ulong *)(popt + 2));
+			net_copy_u32((u32 *)to_ptr, (u32 *)(popt + 2));
 			net_ntp_time_offset = ntohl(net_ntp_time_offset);
 			break;
 #endif
@@ -816,7 +815,7 @@ static void dhcp_process_options(uchar *popt, struct bootp_hdr *bp)
 			break;
 #endif
 		case 51:
-			net_copy_long(&dhcp_leasetime, (ulong *)(popt + 2));
+			net_copy_u32(&dhcp_leasetime, (u32 *)(popt + 2));
 			break;
 		case 53:	/* Ignore Message Type Option */
 			break;
@@ -870,7 +869,7 @@ static void dhcp_process_options(uchar *popt, struct bootp_hdr *bp)
 
 static int dhcp_message_type(unsigned char *popt)
 {
-	if (net_read_long((ulong *)popt) != htonl(BOOTP_VENDOR_MAGIC))
+	if (net_read_u32((u32 *)popt) != htonl(BOOTP_VENDOR_MAGIC))
 		return -1;
 
 	popt += 4;
@@ -924,7 +923,7 @@ static void dhcp_send_request_packet(struct bootp_hdr *bp_offer)
 	 * ID is the id of the OFFER packet
 	 */
 
-	net_copy_long(&bp->bp_id, &bp_offer->bp_id);
+	net_copy_u32(&bp->bp_id, &bp_offer->bp_id);
 
 	/*
 	 * Copy options from OFFER packet if present
@@ -983,7 +982,7 @@ static void dhcp_handler(uchar *pkt, unsigned dest, struct in_addr sip,
 			debug("TRANSITIONING TO REQUESTING STATE\n");
 			dhcp_state = REQUESTING;
 
-			if (net_read_long((ulong *)&bp->bp_vend[0]) ==
+			if (net_read_u32((u32 *)&bp->bp_vend[0]) ==
 						htonl(BOOTP_VENDOR_MAGIC))
 				dhcp_process_options((u8 *)&bp->bp_vend[4], bp);
 
@@ -999,7 +998,7 @@ static void dhcp_handler(uchar *pkt, unsigned dest, struct in_addr sip,
 		debug("DHCP State: REQUESTING\n");
 
 		if (dhcp_message_type((u8 *)bp->bp_vend) == DHCP_ACK) {
-			if (net_read_long((ulong *)&bp->bp_vend[0]) ==
+			if (net_read_u32((u32 *)&bp->bp_vend[0]) ==
 						htonl(BOOTP_VENDOR_MAGIC))
 				dhcp_process_options((u8 *)&bp->bp_vend[4], bp);
 			/* Store net params from reply */
diff --git a/net/bootp.h b/net/bootp.h
index efc2100..1a59286 100644
--- a/net/bootp.h
+++ b/net/bootp.h
@@ -38,7 +38,7 @@ struct bootp_hdr {
 	uchar		bp_hlen;	/* Hardware address length	*/
 # define HWL_ETHER	6
 	uchar		bp_hops;	/* Hop count (gateway thing)	*/
-	ulong		bp_id;		/* Transaction ID		*/
+	u32		bp_id;		/* Transaction ID		*/
 	ushort		bp_secs;	/* Seconds since boot		*/
 	ushort		bp_spare1;	/* Alignment			*/
 	struct in_addr	bp_ciaddr;	/* Client IP address		*/
@@ -59,7 +59,7 @@ struct bootp_hdr {
  */
 
 /* bootp.c */
-extern ulong	bootp_id;		/* ID of cur BOOTP request	*/
+extern u32	bootp_id;		/* ID of cur BOOTP request	*/
 extern int	bootp_try;
 
 
-- 
1.7.11.5



More information about the U-Boot mailing list