[PATCH] net: ipv6: fix alignment errors on ARM

Vyacheslav V. Mitrofanov v.v.mitrofanov at yadro.com
Thu Jan 19 09:18:58 CET 2023


On Wed, 2023-01-18 at 20:52 +0300, Sergei Antonov wrote:
> Commands "ping6" and "tftpboot ... -ipv6" did not work on ARM because
> machine code expects 4-byte alignment and some structures from net6.h
> are not aligned in memory.
> 
> Fix by adding __packed, since it is already used in this file.
> 
> Signed-off-by: Sergei Antonov <saproj at gmail.com>
> ---
>  include/net6.h | 6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/include/net6.h b/include/net6.h
> index 9b3de028e6dc..2d7c5a096046 100644
> --- a/include/net6.h
> +++ b/include/net6.h
> @@ -24,7 +24,7 @@ struct in6_addr {
>  #define s6_addr                in6_u.u6_addr8
>  #define s6_addr16      in6_u.u6_addr16
>  #define s6_addr32      in6_u.u6_addr32
> -};
> +} __packed;
> 
>  #define IN6ADDRSZ      sizeof(struct in6_addr)
>  #define INETHADDRSZ    sizeof(net_ethaddr)
> @@ -62,7 +62,7 @@ struct ip6_hdr {
>         u8              hop_limit;
>         struct in6_addr saddr;
>         struct in6_addr daddr;
> -};
> +} __packed;
>  #define IP6_HDR_SIZE (sizeof(struct ip6_hdr))
> 
>  /* struct udp_hdr - User Datagram Protocol header */
> @@ -164,7 +164,7 @@ struct icmp6hdr {
>  #define icmp6_addrconf_managed icmp6_dataun.u_nd_ra.managed
>  #define icmp6_addrconf_other   icmp6_dataun.u_nd_ra.other
>  #define icmp6_rt_lifetime      icmp6_dataun.u_nd_ra.rt_lifetime
> -};
> +} __packed;
> 
>  extern struct in6_addr const net_null_addr_ip6;        /* NULL IPv6
> address */
>  extern struct in6_addr net_gateway6;   /* Our gateways IPv6 address
> */
> --
> 2.34.1
> 
Hello, Sergei!

I didn't get you a little bit. You mean holes between fields of
structures or alignment of the beginning?

Frankly speaking I always thought that in that kind of structure like
below it is not necessary. To be honest I disassembled the same code on
arm and there were no holes. There is no "pack" attribute in linux too.
https://elixir.bootlin.com/linux/latest/source/include/uapi/linux/in6.h#L33

May be it could be other kind of error? 
union
{
u8      u6_addr8[16];
__be16  u6_addr16[8];
__be32  u6_addr32[4];
};
If you don't mind I add Ramon and Simon...


More information about the U-Boot mailing list