Re: Non-packed structures in IP headers

From
Florian Weimer <hidden>
Date
2021-10-09 07:05:35
Also in
linux-toolchains
Reply to
Cufi, Carles, 2021-10-04
* Carles Cufi:
quoted
* Carles Cufi:
quoted
I was looking through the structures for IPv{4,6} packet headers and
noticed that several of those that seem to be used to parse a packet
directly from the wire are not declared as packed. This surprised me
because, although I did find that provisions are made so that the
alignment of the structure, it is still technically possible for the
compiler to inject padding bytes inside those structures, since AFAIK
the C standard makes no guarantees about padding unless it's
instructed to pack the structure.
The C standards do not make such guarantees, but the platform ABI
standards describe struct layout and ensure that there is no padding.
Linux relies on that not just for networking, but also for the userspace
ABI, support for separately compiled kernel modules, and in other places.
That makes sense, but aren't ABI standards different for every
architecture? For example, I checked the Arm AAPCS[1] and it states:

"The size of an aggregate shall be the smallest multiple of its
alignment that is sufficient to hold all of its members."

Which, unless I am reading this wrong, means that the compiler would
indeed insert padding if the size of the IP headers structs was not
a multiple of 4. In this particular case, the struct sizes for the
IP headers are 20 and 40 bytes respectively, so there will be no
padding inserted. But I only checked a single architecture's ABI (or
Procedure Call Standard) documentation, is this true for all archs?
For structure layout in memory, there is a large overlap between ABIs.
There is divergence around long long (which is easily avoided by
adding padding manually), and potentially bit fileds (but I haven't
looked at that).

Things only get weird for pass-by-value structs and unions and return
types.
Thread (7 messages) 7 messages, 4 authors, last reply 2021-10-09
Keyboard shortcuts
hback out one level
jnext message in thread / next series-diff position
kprevious message in thread / previous series-diff position
ldrill in
Escclose help / fold thread tree
?toggle this help