> On 12 May 2023, at 15:07, Alexander Bluhm <alexander.bl...@gmx.net> wrote: > > On Fri, May 12, 2023 at 11:43:42AM +0000, Klemens Nanni wrote: >>> Access rt_llinfo and check for NULL without checking RTF_LLINFO >>> flag before. They are changed togehter with the arp or nd6 mutex. >> >> It is the same change, but I'd commit ARP separately (you don't change >> any locking semantics there). > > I had prepared a smaller diff already. Here is the part that does > not touch the locking. Just some cleanup to get ARP and ND6 in > sync. > > Let's start with that and discuss locking separately. > > ok? >
ok mvs > bluhm > > Index: netinet/if_ether.c > =================================================================== > RCS file: /data/mirror/openbsd/cvs/src/sys/netinet/if_ether.c,v > retrieving revision 1.264 > diff -u -p -r1.264 if_ether.c > --- netinet/if_ether.c 7 May 2023 16:23:23 -0000 1.264 > +++ netinet/if_ether.c 12 May 2023 11:15:07 -0000 > @@ -388,10 +388,8 @@ arpresolve(struct ifnet *ifp, struct rte > rt->rt_expire - arpt_keep / 8 < uptime) { > > mtx_enter(&arp_mtx); > - if (ISSET(rt->rt_flags, RTF_LLINFO)) { > - la = (struct llinfo_arp *)rt->rt_llinfo; > - KASSERT(la != NULL); > - > + la = (struct llinfo_arp *)rt->rt_llinfo; > + if (la != NULL) { > if (la->la_refreshed + 30 < uptime) { > la->la_refreshed = uptime; > refresh = 1; > @@ -412,12 +410,11 @@ arpresolve(struct ifnet *ifp, struct rte > goto bad; > > mtx_enter(&arp_mtx); > - if (!ISSET(rt->rt_flags, RTF_LLINFO)) { > + la = (struct llinfo_arp *)rt->rt_llinfo; > + if (la == NULL) { > mtx_leave(&arp_mtx); > goto bad; > } > - la = (struct llinfo_arp *)rt->rt_llinfo; > - KASSERT(la != NULL); > > /* > * There is an arptab entry, but no ethernet address > Index: netinet6/nd6.c > =================================================================== > RCS file: /data/mirror/openbsd/cvs/src/sys/netinet6/nd6.c,v > retrieving revision 1.278 > diff -u -p -r1.278 nd6.c > --- netinet6/nd6.c 8 May 2023 13:14:21 -0000 1.278 > +++ netinet6/nd6.c 12 May 2023 11:58:54 -0000 > @@ -527,6 +527,7 @@ nd6_lookup(const struct in6_addr *addr6, > if (rt == NULL) { > if (create && ifp) { > struct rt_addrinfo info; > + struct llinfo_nd6 *ln; > struct ifaddr *ifa; > int error; > > @@ -556,11 +557,9 @@ nd6_lookup(const struct in6_addr *addr6, > rtableid); > if (error) > return (NULL); > - if (rt->rt_llinfo != NULL) { > - struct llinfo_nd6 *ln = > - (struct llinfo_nd6 *)rt->rt_llinfo; > + ln = (struct llinfo_nd6 *)rt->rt_llinfo; > + if (ln != NULL) > ln->ln_state = ND6_LLINFO_NOSTATE; > - } > } else > return (NULL); > } > @@ -741,7 +740,7 @@ void > nd6_rtrequest(struct ifnet *ifp, int req, struct rtentry *rt) > { > struct sockaddr *gate = rt->rt_gateway; > - struct llinfo_nd6 *ln = (struct llinfo_nd6 *)rt->rt_llinfo; > + struct llinfo_nd6 *ln; > struct ifaddr *ifa; > struct in6_ifaddr *ifa6; > > @@ -1027,10 +1026,10 @@ void > nd6_cache_lladdr(struct ifnet *ifp, const struct in6_addr *from, char *lladdr, > int lladdrlen, int type, int code) > { > - struct rtentry *rt = NULL; > - struct llinfo_nd6 *ln = NULL; > + struct rtentry *rt; > + struct llinfo_nd6 *ln; > int is_newentry; > - struct sockaddr_dl *sdl = NULL; > + struct sockaddr_dl *sdl; > int do_update; > int olladdr; > int llchange; > @@ -1257,7 +1256,7 @@ nd6_resolve(struct ifnet *ifp, struct rt > { > struct sockaddr_dl *sdl; > struct rtentry *rt; > - struct llinfo_nd6 *ln = NULL; > + struct llinfo_nd6 *ln; > struct in6_addr saddr6; > time_t uptime; > int solicit = 0; >