net: Fix incorrect DHCP/BOOTP packets on 64-bit systems

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>
master
Sergey Temerkhanov 9 years ago committed by Simon Glass
parent bc0571fc10
commit 5917e7d165
  1. 10
      include/net.h
  2. 33
      net/bootp.c
  3. 4
      net/bootp.h

@ -416,7 +416,7 @@ struct icmp_hdr {
ushort id; ushort id;
ushort sequence; ushort sequence;
} echo; } echo;
ulong gateway; u32 gateway;
struct { struct {
ushort unused; ushort unused;
ushort mtu; ushort mtu;
@ -684,9 +684,9 @@ static inline struct in_addr net_read_ip(void *from)
} }
/* return ulong *in network byteorder* */ /* 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)); memcpy((void *)&l, (void *)from, sizeof(l));
return l; return l;
@ -705,9 +705,9 @@ static inline void net_copy_ip(void *to, void *from)
} }
/* copy ulong */ /* 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));
} }
/** /**

@ -51,7 +51,7 @@
#define CONFIG_BOOTP_ID_CACHE_SIZE 4 #define CONFIG_BOOTP_ID_CACHE_SIZE 4
#endif #endif
ulong bootp_ids[CONFIG_BOOTP_ID_CACHE_SIZE]; u32 bootp_ids[CONFIG_BOOTP_ID_CACHE_SIZE];
unsigned int bootp_num_ids; unsigned int bootp_num_ids;
int bootp_try; int bootp_try;
ulong bootp_start; ulong bootp_start;
@ -62,7 +62,7 @@ char net_root_path[64] = {0,}; /* Our bootpath */
#if defined(CONFIG_CMD_DHCP) #if defined(CONFIG_CMD_DHCP)
static dhcp_state_t dhcp_state = INIT; static dhcp_state_t dhcp_state = INIT;
static unsigned long dhcp_leasetime; static u32 dhcp_leasetime;
static struct in_addr dhcp_server_ip; static struct in_addr dhcp_server_ip;
static void dhcp_handler(uchar *pkt, unsigned dest, struct in_addr sip, static void dhcp_handler(uchar *pkt, unsigned dest, struct in_addr sip,
unsigned src, unsigned len); unsigned src, unsigned len);
@ -128,7 +128,7 @@ static int check_packet(uchar *pkt, unsigned dest, unsigned src, unsigned len)
retval = -4; retval = -4;
else if (bp->bp_hlen != HWL_ETHER) else if (bp->bp_hlen != HWL_ETHER)
retval = -5; 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; retval = -6;
debug("Filtering pkt = %d\n", retval); 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 */ store_net_params(bp); /* Store net parameters from reply */
/* Retrieve extended information (we must parse the vendor area) */ /* Retrieve extended information (we must parse the vendor area) */
if (net_read_long((ulong *)&bp->bp_vend[0]) == if (net_read_u32((u32 *)&bp->bp_vend[0]) == htonl(BOOTP_VENDOR_MAGIC))
htonl(BOOTP_VENDOR_MAGIC))
bootp_process_vendor((uchar *)&bp->bp_vend[4], len); bootp_process_vendor((uchar *)&bp->bp_vend[4], len);
net_set_timeout_handler(0, (thand_f *)0); net_set_timeout_handler(0, (thand_f *)0);
@ -666,7 +665,7 @@ void bootp_request(void)
#ifdef CONFIG_BOOTP_RANDOM_DELAY #ifdef CONFIG_BOOTP_RANDOM_DELAY
ulong rand_ms; ulong rand_ms;
#endif #endif
ulong bootp_id; u32 bootp_id;
struct in_addr zero_ip; struct in_addr zero_ip;
struct in_addr bcast_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 * Bootp ID is the lower 4 bytes of our ethernet address
* plus the current time in ms. * plus the current time in ms.
*/ */
bootp_id = ((ulong)net_ethaddr[2] << 24) bootp_id = ((u32)net_ethaddr[2] << 24)
| ((ulong)net_ethaddr[3] << 16) | ((u32)net_ethaddr[3] << 16)
| ((ulong)net_ethaddr[4] << 8) | ((u32)net_ethaddr[4] << 8)
| (ulong)net_ethaddr[5]; | (u32)net_ethaddr[5];
bootp_id += get_timer(0); bootp_id += get_timer(0);
bootp_id = htonl(bootp_id); bootp_id = htonl(bootp_id);
bootp_add_id(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 * 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) #if defined(CONFIG_CMD_SNTP) && defined(CONFIG_BOOTP_TIMEOFFSET)
case 2: /* Time offset */ case 2: /* Time offset */
to_ptr = &net_ntp_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); net_ntp_time_offset = ntohl(net_ntp_time_offset);
break; break;
#endif #endif
@ -816,7 +815,7 @@ static void dhcp_process_options(uchar *popt, struct bootp_hdr *bp)
break; break;
#endif #endif
case 51: case 51:
net_copy_long(&dhcp_leasetime, (ulong *)(popt + 2)); net_copy_u32(&dhcp_leasetime, (u32 *)(popt + 2));
break; break;
case 53: /* Ignore Message Type Option */ case 53: /* Ignore Message Type Option */
break; break;
@ -870,7 +869,7 @@ static void dhcp_process_options(uchar *popt, struct bootp_hdr *bp)
static int dhcp_message_type(unsigned char *popt) 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; return -1;
popt += 4; 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 * 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 * 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"); debug("TRANSITIONING TO REQUESTING STATE\n");
dhcp_state = REQUESTING; 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)) htonl(BOOTP_VENDOR_MAGIC))
dhcp_process_options((u8 *)&bp->bp_vend[4], bp); 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"); debug("DHCP State: REQUESTING\n");
if (dhcp_message_type((u8 *)bp->bp_vend) == DHCP_ACK) { 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)) htonl(BOOTP_VENDOR_MAGIC))
dhcp_process_options((u8 *)&bp->bp_vend[4], bp); dhcp_process_options((u8 *)&bp->bp_vend[4], bp);
/* Store net params from reply */ /* Store net params from reply */

@ -38,7 +38,7 @@ struct bootp_hdr {
uchar bp_hlen; /* Hardware address length */ uchar bp_hlen; /* Hardware address length */
# define HWL_ETHER 6 # define HWL_ETHER 6
uchar bp_hops; /* Hop count (gateway thing) */ 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_secs; /* Seconds since boot */
ushort bp_spare1; /* Alignment */ ushort bp_spare1; /* Alignment */
struct in_addr bp_ciaddr; /* Client IP address */ struct in_addr bp_ciaddr; /* Client IP address */
@ -59,7 +59,7 @@ struct bootp_hdr {
*/ */
/* bootp.c */ /* bootp.c */
extern ulong bootp_id; /* ID of cur BOOTP request */ extern u32 bootp_id; /* ID of cur BOOTP request */
extern int bootp_try; extern int bootp_try;

Loading…
Cancel
Save