mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-24 21:54:01 +00:00
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>
This commit is contained in:
parent
bc0571fc10
commit
5917e7d165
3 changed files with 23 additions and 24 deletions
|
@ -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));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
33
net/bootp.c
33
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 */
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue