On Thu, 2023-01-19 at 14:05 +0300, Sergei Antonov wrote: > > On Thu, 19 Jan 2023 at 11:18, Vyacheslav V. Mitrofanov > <[email protected]> wrote: > > 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 <[email protected]> > > > --- > > > 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? > > No, it is not about holes between fields. It is about the address at > which a structure is placed in memory. In combination with store > merging it leads to unaligned memory access. At least for struct > ip6_hdr, which I studied using assembly listing files. The struct > ip6_hdr is not placed at 4-byte aligned address because it is 14 > bytes > off from the beginning of the Ethernet packet. > > Also see how the corresponding IPv4 struct ip_hdr from net.h was > fixed > by commit 704f3acfcf553. I should have referred to it in my commit > description. > I got you. It makes sense. Thanks!
Reviewed-by: Viacheslav Mitrofanov <[email protected]>

