From patchwork Tue Mar 31 17:17:31 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sergey Temerkhanov X-Patchwork-Id: 456723 X-Patchwork-Delegate: joe.hershberger@gmail.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from theia.denx.de (theia.denx.de [85.214.87.163]) by ozlabs.org (Postfix) with ESMTP id 6A70B140083 for ; Wed, 1 Apr 2015 05:41:09 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="verification failed; unprotected key" header.d=gmail.com header.i=@gmail.com header.b=isGTjeGI; dkim-adsp=none (unprotected policy); dkim-atps=neutral Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 8DB9C4A04E; Tue, 31 Mar 2015 20:41:05 +0200 (CEST) Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id xM5Tra5qM9jz; Tue, 31 Mar 2015 20:41:05 +0200 (CEST) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id D318C4A03C; Tue, 31 Mar 2015 20:41:04 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 677754A03C for ; Tue, 31 Mar 2015 19:16:19 +0200 (CEST) Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id wicK53SDXWOm for ; Tue, 31 Mar 2015 19:16:19 +0200 (CEST) X-policyd-weight: NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5 NOT_IN_BL_NJABL=-1.5 (only DNSBL check requested) Received: from mail-la0-f51.google.com (mail-la0-f51.google.com [209.85.215.51]) by theia.denx.de (Postfix) with ESMTPS id 0F7DE4A039 for ; Tue, 31 Mar 2015 19:16:15 +0200 (CEST) Received: by labe2 with SMTP id e2so17954633lab.3 for ; Tue, 31 Mar 2015 10:16:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=YVjeiKnSJHSKLrJG/GMXEtCA+mPbMpciSZDjQqTRhj8=; b=isGTjeGIf37WSFP5o9xVwqq418OF+rqTRx7tgrFBq9s9/asKyjWzHpKZPrnNWLqwTd fMsF+39LBbBkIMGI8lYmiwAboB9uE5stAaw1vR9umKBWGcPTUhBu1grmwrKVxzdTFIw9 PI/zLSzTiItw1L3CEcZ/fAIfDgqos09Fhff6EOM1ipqnpH4CM4Dn2/rZluqiA1/ekCPp zLMg46OnHK9fahS0japNDS9/FAEf5jhEbnuDobWgeWyoUkx0017lWFFzvmOxCnTYOUgT x3xXO/uVoHSSTQfzS4yTY3nDZohXFQUKBztMegKRFEUlcoomSS/4fVMWyTZ+qc6XFv3x D5rA== X-Received: by 10.112.151.211 with SMTP id us19mr3565449lbb.120.1427822175225; Tue, 31 Mar 2015 10:16:15 -0700 (PDT) Received: from snickers.office.auriga.msk ([81.19.133.99]) by mx.google.com with ESMTPSA id t10sm1385846lbb.5.2015.03.31.10.16.13 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 31 Mar 2015 10:16:14 -0700 (PDT) From: Sergey Temerkhanov To: u-boot@lists.denx.de Date: Tue, 31 Mar 2015 20:17:31 +0300 Message-Id: <1427822251-32521-1-git-send-email-s.temerkhanov@gmail.com> X-Mailer: git-send-email 2.2.0 X-Mailman-Approved-At: Tue, 31 Mar 2015 20:41:03 +0200 Cc: Radha Mohan Chintakuntla Subject: [U-Boot] [PATCH] net: Fix incorrect DHCP/BOOTP packet layout on 64-bit systems X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.15 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" This commit fixes incorrect DHCP/BOOTP packet layout caused by 'ulong' type size difference on 64 and 32-bit architectures. It also converts protocol header structures to use explicitly sized fields and renames NetReadLong()/NetCopyLong() to NetReadU32/NetCopyU32() accordingly Signed-off-by: Radha Mohan Chintakuntla Signed-off-by: Sergey Temerkhanov Cc: joe.hershberger@gmail.com --- include/net.h | 122 +++++++++++++++++++++++++++++----------------------------- net/bootp.c | 24 ++++++------ net/bootp.h | 24 ++++++------ 3 files changed, 85 insertions(+), 85 deletions(-) diff --git a/include/net.h b/include/net.h index 237c932..588ab7d 100644 --- a/include/net.h +++ b/include/net.h @@ -183,9 +183,9 @@ u32 ether_crc(size_t len, unsigned char const *p); */ struct ethernet_hdr { - uchar et_dest[6]; /* Destination node */ - uchar et_src[6]; /* Source node */ - ushort et_protlen; /* Protocol or length */ + u8 et_dest[6]; /* Destination node */ + u8 et_src[6]; /* Source node */ + u16 et_protlen; /* Protocol or length */ }; /* Ethernet header size */ @@ -194,16 +194,16 @@ struct ethernet_hdr { #define ETH_FCS_LEN 4 /* Octets in the FCS */ struct e802_hdr { - uchar et_dest[6]; /* Destination node */ - uchar et_src[6]; /* Source node */ - ushort et_protlen; /* Protocol or length */ - uchar et_dsap; /* 802 DSAP */ - uchar et_ssap; /* 802 SSAP */ - uchar et_ctl; /* 802 control */ - uchar et_snap1; /* SNAP */ - uchar et_snap2; - uchar et_snap3; - ushort et_prot; /* 802 protocol */ + u8 et_dest[6]; /* Destination node */ + u8 et_src[6]; /* Source node */ + u16 et_protlen; /* Protocol or length */ + u8 et_dsap; /* 802 DSAP */ + u8 et_ssap; /* 802 SSAP */ + u8 et_ctl; /* 802 control */ + u8 et_snap1; /* SNAP */ + u8 et_snap2; + u8 et_snap3; + u16 et_prot; /* 802 protocol */ }; /* 802 + SNAP + ethernet header size */ @@ -213,11 +213,11 @@ struct e802_hdr { * Virtual LAN Ethernet header */ struct vlan_ethernet_hdr { - uchar vet_dest[6]; /* Destination node */ - uchar vet_src[6]; /* Source node */ - ushort vet_vlan_type; /* PROT_VLAN */ - ushort vet_tag; /* TAG of VLAN */ - ushort vet_type; /* protocol type */ + u8 vet_dest[6]; /* Destination node */ + u8 vet_src[6]; /* Source node */ + u16 vet_vlan_type; /* PROT_VLAN */ + u16 vet_tag; /* TAG of VLAN */ + u16 vet_type; /* protocol type */ }; /* VLAN Ethernet header size */ @@ -235,14 +235,14 @@ struct vlan_ethernet_hdr { * Internet Protocol (IP) header. */ struct ip_hdr { - uchar ip_hl_v; /* header length and version */ - uchar ip_tos; /* type of service */ - ushort ip_len; /* total length */ - ushort ip_id; /* identification */ - ushort ip_off; /* fragment offset field */ - uchar ip_ttl; /* time to live */ - uchar ip_p; /* protocol */ - ushort ip_sum; /* checksum */ + u8 ip_hl_v; /* header length and version */ + u8 ip_tos; /* type of service */ + u16 ip_len; /* total length */ + u16 ip_id; /* identification */ + u16 ip_off; /* fragment offset field */ + u8 ip_ttl; /* time to live */ + u8 ip_p; /* protocol */ + u16 ip_sum; /* checksum */ IPaddr_t ip_src; /* Source IP address */ IPaddr_t ip_dst; /* Destination IP address */ }; @@ -259,20 +259,20 @@ struct ip_hdr { * Internet Protocol (IP) + UDP header. */ struct ip_udp_hdr { - uchar ip_hl_v; /* header length and version */ - uchar ip_tos; /* type of service */ - ushort ip_len; /* total length */ - ushort ip_id; /* identification */ - ushort ip_off; /* fragment offset field */ - uchar ip_ttl; /* time to live */ - uchar ip_p; /* protocol */ - ushort ip_sum; /* checksum */ + u8 ip_hl_v; /* header length and version */ + u8 ip_tos; /* type of service */ + u16 ip_len; /* total length */ + u16 ip_id; /* identification */ + u16 ip_off; /* fragment offset field */ + u8 ip_ttl; /* time to live */ + u8 ip_p; /* protocol */ + u16 ip_sum; /* checksum */ IPaddr_t ip_src; /* Source IP address */ IPaddr_t ip_dst; /* Destination IP address */ - ushort udp_src; /* UDP source port */ - ushort udp_dst; /* UDP destination port */ - ushort udp_len; /* Length of UDP packet */ - ushort udp_xsum; /* Checksum */ + u16 udp_src; /* UDP source port */ + u16 udp_dst; /* UDP destination port */ + u16 udp_len; /* Length of UDP packet */ + u16 udp_xsum; /* Checksum */ }; #define IP_UDP_HDR_SIZE (sizeof(struct ip_udp_hdr)) @@ -282,14 +282,14 @@ struct ip_udp_hdr { * Address Resolution Protocol (ARP) header. */ struct arp_hdr { - ushort ar_hrd; /* Format of hardware address */ + u16 ar_hrd; /* Format of hardware address */ # define ARP_ETHER 1 /* Ethernet hardware address */ - ushort ar_pro; /* Format of protocol address */ - uchar ar_hln; /* Length of hardware address */ + u16 ar_pro; /* Format of protocol address */ + u8 ar_hln; /* Length of hardware address */ # define ARP_HLEN 6 - uchar ar_pln; /* Length of protocol address */ + u8 ar_pln; /* Length of protocol address */ # define ARP_PLEN 4 - ushort ar_op; /* Operation */ + u16 ar_op; /* Operation */ # define ARPOP_REQUEST 1 /* Request to resolve address */ # define ARPOP_REPLY 2 /* Response to previous request */ @@ -301,16 +301,16 @@ struct arp_hdr { * the sizes above, and are defined as appropriate for * specific hardware/protocol combinations. */ - uchar ar_data[0]; + u8 ar_data[0]; #define ar_sha ar_data[0] #define ar_spa ar_data[ARP_HLEN] #define ar_tha ar_data[ARP_HLEN + ARP_PLEN] #define ar_tpa ar_data[ARP_HLEN + ARP_PLEN + ARP_HLEN] #if 0 - uchar ar_sha[]; /* Sender hardware address */ - uchar ar_spa[]; /* Sender protocol address */ - uchar ar_tha[]; /* Target hardware address */ - uchar ar_tpa[]; /* Target protocol address */ + u8 ar_sha[]; /* Sender hardware address */ + u8 ar_spa[]; /* Sender protocol address */ + u8 ar_tha[]; /* Target hardware address */ + u8 ar_tpa[]; /* Target protocol address */ #endif /* 0 */ }; @@ -332,20 +332,20 @@ struct arp_hdr { #define ICMP_NOT_REACH_PORT 3 /* Port unreachable */ struct icmp_hdr { - uchar type; - uchar code; - ushort checksum; + u8 type; + u8 code; + u16 checksum; union { struct { - ushort id; - ushort sequence; + u16 id; + u16 sequence; } echo; - ulong gateway; + u32 gateway; struct { - ushort unused; - ushort mtu; + u16 unused; + u16 mtu; } frag; - uchar data[0]; + u8 data[0]; } un; }; @@ -608,9 +608,9 @@ static inline IPaddr_t NetReadIP(void *from) } /* return ulong *in network byteorder* */ -static inline ulong NetReadLong(ulong *from) +static inline u32 NetReadU32(u32 *from) { - ulong l; + u32 l; memcpy((void *)&l, (void *)from, sizeof(l)); return l; @@ -629,9 +629,9 @@ static inline void NetCopyIP(void *to, void *from) } /* copy ulong */ -static inline void NetCopyLong(ulong *to, ulong *from) +static inline void NetCopyU32(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 8106601..8ce0bdd 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 BootpTry; ulong bootp_start; @@ -59,7 +59,7 @@ ulong bootp_timeout; #if defined(CONFIG_CMD_DHCP) static dhcp_state_t dhcp_state = INIT; -static unsigned long dhcp_leasetime; +static u32 dhcp_leasetime; static IPaddr_t NetDHCPServerIP; static void DhcpHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src, unsigned len); @@ -125,7 +125,7 @@ static int BootpCheckPkt(uchar *pkt, unsigned dest, unsigned src, unsigned len) retval = -4; else if (bp->bp_hlen != HWL_ETHER) retval = -5; - else if (!bootp_match_id(NetReadLong((ulong *)&bp->bp_id))) + else if (!bootp_match_id(NetReadU32(&bp->bp_id))) retval = -6; debug("Filtering pkt = %d\n", retval); @@ -350,7 +350,7 @@ BootpHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src, BootpCopyNetParams(bp); /* Store net parameters from reply */ /* Retrieve extended information (we must parse the vendor area) */ - if (NetReadLong((ulong *)&bp->bp_vend[0]) == htonl(BOOTP_VENDOR_MAGIC)) + if (NetReadU32((u32 *)&bp->bp_vend[0]) == htonl(BOOTP_VENDOR_MAGIC)) BootpVendorProcess((uchar *)&bp->bp_vend[4], len); NetSetTimeout(0, (thand_f *)0); @@ -661,7 +661,7 @@ BootpRequest(void) #ifdef CONFIG_BOOTP_RANDOM_DELAY ulong rand_ms; #endif - ulong BootpID; + u32 BootpID; bootstage_mark_name(BOOTSTAGE_ID_BOOTP_START, "bootp_start"); #if defined(CONFIG_CMD_DHCP) @@ -732,7 +732,7 @@ BootpRequest(void) BootpID += get_timer(0); BootpID = htonl(BootpID); bootp_add_id(BootpID); - NetCopyLong(&bp->bp_id, &BootpID); + NetCopyU32(&bp->bp_id, &BootpID); /* * Calculate proper packet lengths taking into account the @@ -770,7 +770,7 @@ static void DhcpOptionsProcess(uchar *popt, struct Bootp_t *bp) #if defined(CONFIG_CMD_SNTP) && defined(CONFIG_BOOTP_TIMEOFFSET) case 2: /* Time offset */ to_ptr = &NetTimeOffset; - NetCopyLong((ulong *)to_ptr, (ulong *)(popt + 2)); + NetCopyU32((u32 *)to_ptr, (u32 *)(popt + 2)); NetTimeOffset = ntohl(NetTimeOffset); break; #endif @@ -806,7 +806,7 @@ static void DhcpOptionsProcess(uchar *popt, struct Bootp_t *bp) break; #endif case 51: - NetCopyLong(&dhcp_leasetime, (ulong *) (popt + 2)); + NetCopyU32(&dhcp_leasetime, (u32 *) (popt + 2)); break; case 53: /* Ignore Message Type Option */ break; @@ -860,7 +860,7 @@ static void DhcpOptionsProcess(uchar *popt, struct Bootp_t *bp) static int DhcpMessageType(unsigned char *popt) { - if (NetReadLong((ulong *)popt) != htonl(BOOTP_VENDOR_MAGIC)) + if (NetReadU32((u32 *)popt) != htonl(BOOTP_VENDOR_MAGIC)) return -1; popt += 4; @@ -911,7 +911,7 @@ static void DhcpSendRequestPkt(struct Bootp_t *bp_offer) * ID is the id of the OFFER packet */ - NetCopyLong(&bp->bp_id, &bp_offer->bp_id); + NetCopyU32(&bp->bp_id, &bp_offer->bp_id); /* * Copy options from OFFER packet if present @@ -970,7 +970,7 @@ DhcpHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src, debug("TRANSITIONING TO REQUESTING STATE\n"); dhcp_state = REQUESTING; - if (NetReadLong((ulong *)&bp->bp_vend[0]) == + if (NetReadU32((u32 *)&bp->bp_vend[0]) == htonl(BOOTP_VENDOR_MAGIC)) DhcpOptionsProcess((u8 *)&bp->bp_vend[4], bp); @@ -986,7 +986,7 @@ DhcpHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src, debug("DHCP State: REQUESTING\n"); if (DhcpMessageType((u8 *)bp->bp_vend) == DHCP_ACK) { - if (NetReadLong((ulong *)&bp->bp_vend[0]) == + if (NetReadU32((u32 *)&bp->bp_vend[0]) == htonl(BOOTP_VENDOR_MAGIC)) DhcpOptionsProcess((u8 *)&bp->bp_vend[4], bp); /* Store net params from reply */ diff --git a/net/bootp.h b/net/bootp.h index 3b95a0a..a771655 100644 --- a/net/bootp.h +++ b/net/bootp.h @@ -30,25 +30,25 @@ extern u8 *dhcp_vendorex_proc(u8 *e); /*rtn next e if mine,else NULL */ #endif struct Bootp_t { - uchar bp_op; /* Operation */ + u8 bp_op; /* Operation */ # define OP_BOOTREQUEST 1 # define OP_BOOTREPLY 2 - uchar bp_htype; /* Hardware type */ + u8 bp_htype; /* Hardware type */ # define HWT_ETHER 1 - uchar bp_hlen; /* Hardware address length */ + u8 bp_hlen; /* Hardware address length */ # define HWL_ETHER 6 - uchar bp_hops; /* Hop count (gateway thing) */ - ulong bp_id; /* Transaction ID */ - ushort bp_secs; /* Seconds since boot */ - ushort bp_spare1; /* Alignment */ + u8 bp_hops; /* Hop count (gateway thing) */ + u32 bp_id; /* Transaction ID */ + u16 bp_secs; /* Seconds since boot */ + u16 bp_spare1; /* Alignment */ IPaddr_t bp_ciaddr; /* Client IP address */ IPaddr_t bp_yiaddr; /* Your (client) IP address */ IPaddr_t bp_siaddr; /* Server IP address */ IPaddr_t bp_giaddr; /* Gateway IP address */ - uchar bp_chaddr[16]; /* Client hardware address */ - char bp_sname[64]; /* Server host name */ - char bp_file[128]; /* Boot file name */ - char bp_vend[OPT_FIELD_SIZE]; /* Vendor information */ + char bp_chaddr[16]; /* Client hardware address */ + char bp_sname[64]; /* Server host name */ + char bp_file[128]; /* Boot file name */ + char bp_vend[OPT_FIELD_SIZE]; /* Vendor information */ }; #define BOOTP_HDR_SIZE sizeof(struct Bootp_t) @@ -59,7 +59,7 @@ struct Bootp_t { */ /* bootp.c */ -extern ulong BootpID; /* ID of cur BOOTP request */ +extern u32 BootpID; /* ID of cur BOOTP request */ extern char BootFile[128]; /* Boot file name */ extern int BootpTry;