> On 12 May 2023, at 15:07, Alexander Bluhm <[email protected]> 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;
>