Hi Roy, Roy Marples wrote:
> On 14/01/2021 11:03, Simon Burge wrote: > > Sure, I will have a look. Anything IPv6 related I might need a helping > > hand to get a test case though :). > > As they share a similar structure, you solve one you likely solve the other. > I can assume you have working IPv4 ;) In general where we can define the structure that are passed in an interface, regardless if it's a ioctl or sysctl or whatever, we should try to design the structure so that it's the same regardless of if it's built with 32-bit or 64-bit userlands. This is hard where you have pointers, both otherwise is usually possible with a bit of planning. You especially need to watch out for long which is a different size on 32-bit/64-bit userlands and also for int64_t which can align differently depending on the architecture. If you can do a printf of the struct size with a variety of arches and they're all the same then good! amd64, i386, mips64 (n32), sparc would probably cover the range of cases to test on (a compile test will do if you look at the generated code for what is passed to printf). The general rule is if we can avoid touching compat/netbsd32 then life is easier! The issue with in_nbrinfo and in6_nbrinfo is that there's a "long" in the structure, so this has different sizes depending on your native long size. I _think_ this is the is value out of the la_asked member of struct llentry which is a uint16_t so we can just make it an int the your structures will align nicely. In both cases the ifname name is 16 bytes. For in_nbrinfo in_addr is effectively an int so we have just four ints after the ifname. For in6_nbrinfo the in6_addr is 128 bytes so aligns nicely, then a couple more ints after that. If "asked" is from struct llentry then the attached patch should work without requiring any compat32 support. If you're happy with this, I'll test a bit more then commit. Cheers, Simon. Index: netinet/in_var.h =================================================================== RCS file: /cvsroot/src/sys/netinet/in_var.h,v retrieving revision 1.98 diff -d -p -u -r1.98 in_var.h --- netinet/in_var.h 11 Sep 2020 15:22:12 -0000 1.98 +++ netinet/in_var.h 15 Jan 2021 02:18:01 -0000 @@ -118,7 +118,7 @@ struct in_ifaddr { struct in_nbrinfo { char ifname[IFNAMSIZ]; /* if name, e.g. "en0" */ struct in_addr addr; /* IPv4 address of the neighbor */ - long asked; /* number of queries already sent for this addr */ + int asked; /* number of queries already sent for this addr */ int state; /* reachability state */ int expire; /* lifetime for NDP state transition */ }; Index: netinet6/nd6.h =================================================================== RCS file: /cvsroot/src/sys/netinet6/nd6.h,v retrieving revision 1.91 diff -d -p -u -r1.91 nd6.h --- netinet6/nd6.h 11 Sep 2020 15:03:33 -0000 1.91 +++ netinet6/nd6.h 15 Jan 2021 02:18:01 -0000 @@ -83,7 +83,7 @@ struct nd_kifinfo { struct in6_nbrinfo { char ifname[IFNAMSIZ]; /* if name, e.g. "en0" */ struct in6_addr addr; /* IPv6 address of the neighbor */ - long asked; /* number of queries already sent for this addr */ + int asked; /* number of queries already sent for this addr */ int isrouter; /* if it acts as a router */ int state; /* reachability state */ int expire; /* lifetime for NDP state transition */