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