
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