From: Sergey Temerkhanov Date: Wed, 8 Apr 2015 06:41:22 +0000 (-0500) Subject: net: Fix incorrect DHCP/BOOTP packets on 64-bit systems X-Git-Tag: KARO-TX6-2015-09-18~2600 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;ds=sidebyside;h=1046b5c4712d74fcc50d4572cba6593f7757abea;p=karo-tx-uboot.git 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 Signed-off-by: Sergey Temerkhanov Signed-off-by: Joe Hershberger Acked-by: Simon Glass --- diff --git a/include/net.h b/include/net.h index 75a9075525..d7fa52cb35 100644 --- a/include/net.h +++ b/include/net.h @@ -416,7 +416,7 @@ struct icmp_hdr { ushort id; ushort sequence; } echo; - ulong gateway; + u32 gateway; struct { ushort unused; ushort mtu; @@ -687,9 +687,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; @@ -708,9 +708,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 e388fd96de..53f83626e1 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; @@ -737,15 +736,15 @@ void bootp_request(void) #ifdef CONFIG_BOOTP_RANDOM_ID bootp_id = rand(); #else - 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); #endif 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 @@ -784,7 +783,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 @@ -820,7 +819,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; @@ -874,7 +873,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; @@ -928,7 +927,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 @@ -987,7 +986,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); @@ -1003,7 +1002,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 efc2100a4b..1a5928671a 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;