[U-Boot] Question about bootp structure pack

rickou at rickou.net rickou at rickou.net
Tue Feb 21 19:38:38 UTC 2017


Hi everyone, 

I’m using u-boot-2015.07 in one of my project based on vpac270 soc module.
u-boot is well configured and build is fine without error.
Gcc is v3.4.5 and glibc v2.3.6 built by crosstool 0.43 for arm-softfloat-linux-gnu

My problem is when i use DHCP command to retrieve a file from my TFTP server, i can’t get any IP from the DHCP server.
After analysing ethernet frames on server side i found that frame do not arrive at all on server.
After checking debug détails on U-boot, it seem bootp frame is not good because of some 0x00 paddings Inside the frame. (at end of header for example)

If i add the attribute packed to the bootp header struct and ethernet header, now all is working fine !

In net/bootp.h :
struct bootp_hdr {
	u8		bp_op;		/* Operation			*/
# define OP_BOOTREQUEST	1
# define OP_BOOTREPLY	2
	u8		bp_htype;	/* Hardware type		*/
# define HWT_ETHER	1
	u8		bp_hlen;	/* Hardware address length	*/
# define HWL_ETHER	6
	u8		bp_hops;	/* Hop count (gateway thing)	*/
	u32		bp_id;		/* Transaction ID		*/
	u16		bp_secs;	/* Seconds since boot		*/
	u16		bp_spare1;	/* Alignment			*/
	struct in_addr	bp_ciaddr;	/* Client IP address		*/
	struct in_addr	bp_yiaddr;	/* Your (client) IP address	*/
	struct in_addr	bp_siaddr;	/* Server IP address		*/
	struct in_addr	bp_giaddr;	/* Gateway IP address		*/
	u8		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	*/
} __attribute__((packed));

#define BOOTP_HDR_SIZE	sizeof(struct bootp_hdr)

And in include/net.h
struct ethernet_hdr {
	u8		et_dest[6];	/* Destination node		*/
	u8		et_src[6];	/* Source node			*/
	u16		et_protlen;	/* Protocol or length		*/
} __attribute__((packed));

I think the uboot src should work as is, because I have checked uboot source modification since 2015.07, but no changes on the struct definition and header_size still made with sizeof(struct).
So i think, the problem come from my side and perhaps from gcc itself.

But i don’t understand why gcc should pack these structs.. i think normal use is to not pack.. except if makefile include some build option to do that, my gcc toolchain do not understand..

Someone can help me to understand what i made wrong ? and help me to resolve this problem without patching  ?




Provenance : Courrier pour Windows 10



More information about the U-Boot mailing list