net: Fix incorrect DHCP/BOOTP packets on 64-bit systems
authorSergey Temerkhanov <s.temerkhanov@gmail.com>
Wed, 8 Apr 2015 06:41:22 +0000 (01:41 -0500)
committerSimon Glass <sjg@chromium.org>
Sat, 18 Apr 2015 17:11:35 +0000 (11:11 -0600)
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@cavium.com>
Signed-off-by: Sergey Temerkhanov <s.temerkhanov@gmail.com>
Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
Acked-by: Simon Glass <sjg@chromium.org>
include/net.h
net/bootp.c
net/bootp.h

index 4488cc7d6504e18886479e6b3d184b8de3644394..16fa117586a23a2b02764d1b69ec2e87577e9aa2 100644 (file)
@@ -416,7 +416,7 @@ struct icmp_hdr {
                        ushort  id;
                        ushort  sequence;
                } echo;
-               ulong   gateway;
+               u32     gateway;
                struct {
                        ushort  unused;
                        ushort  mtu;
@@ -684,9 +684,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;
@@ -705,9 +705,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));
 }
 
 /**
index 500850c3b8fcd1164e0de4b063bc23964bb157e3..43466af2f39293f415b9c473e3da060a0e99766d 100644 (file)
@@ -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 */
index efc2100a4b52cc6728ef806528bb8acd52ab5581..1a5928671a4190bd60394f6c3944e8f5d38d5e8d 100644 (file)
@@ -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;