Thread (6 messages) 6 messages, 4 authors, 2021-10-09

RE: Non-packed structures in IP headers

flat view

From: Cufi, Carles <hidden>
Date: 2021-10-04 10:30:39
Also in: netdev

Hi Florian,

Thanks for your response.
* 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? 
Sometimes there are alignment concerns in the way these structs are used,
but I believe the kernel generally controls placement of the data that is
being worked on, so that does not matter, either.
I did see those when browsing the code, thanks for confirming this. It is really padding that I am concerned about, and not alignment.
Therefore, I do not believe this is an actual problem.
Would the static assert still make sense in order to check this for all architectures?

Thanks,

Carles

[1] https://github.com/ARM-software/abi-aa/blob/2bcab1e3b22d55170c563c3c7940134089176746/aapcs64/aapcs64.rst#aggregates
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help