From mboxrd@z Thu Jan 1 00:00:00 1970 From: Bart Veer To: grante@visi.com Cc: ecos-discuss@sources.redhat.com Subject: Re: [ECOS] RedBoot sending incorrect TCP window size Date: Fri, 09 Feb 2001 05:40:00 -0000 Message-id: <200102091340.f19De5J22761@sheesh.cambridge.redhat.com> References: <20010208105133.A1381@visi.com> <3A82FE61.7F6F2EE8@ri.silicomp.fr> <20010208145836.A2740@visi.com> X-SW-Source: 2001-02/msg00140.html >>>>> "Grant" == Grant Edwards writes: Grant> On Thu, Feb 08, 2001 at 09:15:29PM +0100, Donnat Eric wrote: >> > All occurrences of "sizeof (eth_header_t)" in net.h, tcp.c, udp.c >> > need to be replace by a hard coded constant. I'll send a patch >> > later today... >> >> You can always avoid the hard coded constant by computing the >> "real" limit of the struct as the offset to the last field + >> the size of this last field. This should always work if the >> last field is not a struct/bitfield ! (See stddef.h) Grant> For some things that might be a better solution. On a more Grant> pragmatic note, the size of an Ethernet header is etched in Grant> billions of pieces of silicon spread all over the world. Grant> It's 14. Always. Everywhere. It's not going to change. >> To finnish with the "sizeof" story, you will see with following >> sample that the reported value of sizeof is compatible with the >> data representation and obviously with pointer arithmetic. Look >> at gernerated asm. Grant> I agree that the sizeof value is consistent with the code Grant> generated by the compiler. It's just not consistent with Grant> the size of an Ethernet header. :) I suspect that there have been arguments about the behaviour of sizeof() in gcc since the early days of the compiler. In fact the issue will have arisen with most C compilers. There simply is no good solution. The definition of sizeof() in the C specification is not sufficiently precise. Sometimes you want sizeof(struct) to be a minimal value, 14 bytes in your case, and for different structures you may want a value of 16 bytes that takes external padding into account, e.g. for figuring out what is using up all of the heap. Most C programmers get caught out by this problem sooner or later. Possibly there should be a gcc extension __packed_sizeof(), returning a number that excludes external padding. This would not be a complete solution: people would still use sizeof() in a non-portable fashion. However it might make it easier to write portable code. Any further discussion of such an extension should happen in the appropriate gcc mailing list. Bart