On Sat, Oct 24, 2015 at 07:04:52PM +0200, Alexander Bluhm wrote: > Hi, > > Instead of doing the the if_get() dance for rt_missmsg(), change the > function to take an interface index. > > ok?
Yes > bluhm > > Index: net/route.c > =================================================================== > RCS file: /data/mirror/openbsd/cvs/src/sys/net/route.c,v > retrieving revision 1.260 > diff -u -p -r1.260 route.c > --- net/route.c 24 Oct 2015 11:58:46 -0000 1.260 > +++ net/route.c 24 Oct 2015 16:55:36 -0000 > @@ -235,7 +235,7 @@ rtalloc(struct sockaddr *dst, int flags, > rtstat.rts_unreach++; > miss: > if (ISSET(flags, RT_REPORT)) > - rt_missmsg(RTM_MISS, &info, 0, NULL, error, tableid); > + rt_missmsg(RTM_MISS, &info, 0, 0, error, tableid); > } > KERNEL_UNLOCK(); > splx(s); > @@ -398,7 +398,7 @@ rt_sendmsg(struct rtentry *rt, int cmd, > info.rti_info[RTAX_IFA] = rt->rt_ifa->ifa_addr; > } > > - rt_missmsg(cmd, &info, rt->rt_flags, ifp, 0, rtableid); > + rt_missmsg(cmd, &info, rt->rt_flags, rt->rt_ifidx, 0, rtableid); > if_put(ifp); > } > > @@ -431,7 +431,7 @@ rtredirect(struct sockaddr *dst, struct > u_int32_t *stat = NULL; > struct rt_addrinfo info; > struct ifaddr *ifa; > - struct ifnet *ifp = NULL; > + unsigned int ifidx; > > splsoftassert(IPL_SOFTNET); > > @@ -440,7 +440,7 @@ rtredirect(struct sockaddr *dst, struct > error = ENETUNREACH; > goto out; > } > - ifp = ifa->ifa_ifp; > + ifidx = ifa->ifa_ifp->if_index; > rt = rtalloc(dst, 0, rdomain); > /* > * If the redirect isn't from our current router for this dst, > @@ -521,7 +521,7 @@ out: > info.rti_info[RTAX_GATEWAY] = gateway; > info.rti_info[RTAX_NETMASK] = netmask; > info.rti_info[RTAX_AUTHOR] = src; > - rt_missmsg(RTM_REDIRECT, &info, flags, ifp, error, rdomain); > + rt_missmsg(RTM_REDIRECT, &info, flags, ifidx, error, rdomain); > } > > /* > @@ -532,7 +532,7 @@ rtdeletemsg(struct rtentry *rt, u_int ta > { > int error; > struct rt_addrinfo info; > - struct ifnet *ifp; > + unsigned int ifidx; > > /* > * Request the new route so that the entry is not actually > @@ -544,12 +544,11 @@ rtdeletemsg(struct rtentry *rt, u_int ta > info.rti_info[RTAX_NETMASK] = rt_mask(rt); > info.rti_info[RTAX_GATEWAY] = rt->rt_gateway; > info.rti_flags = rt->rt_flags; > - ifp = if_get(rt->rt_ifidx); > + ifidx = rt->rt_ifidx; > error = rtrequest1(RTM_DELETE, &info, rt->rt_priority, &rt, tableid); > - rt_missmsg(RTM_DELETE, &info, info.rti_flags, ifp, error, tableid); > + rt_missmsg(RTM_DELETE, &info, info.rti_flags, ifidx, error, tableid); > if (error == 0) > rtfree(rt); > - if_put(ifp); > return (error); > } > > Index: net/route.h > =================================================================== > RCS file: /data/mirror/openbsd/cvs/src/sys/net/route.h,v > retrieving revision 1.116 > diff -u -p -r1.116 route.h > --- net/route.h 24 Oct 2015 11:47:07 -0000 1.116 > +++ net/route.h 24 Oct 2015 16:38:15 -0000 > @@ -357,8 +357,7 @@ void rt_maskedcopy(struct sockaddr *, > struct sockaddr *, struct sockaddr *); > void rt_sendmsg(struct rtentry *, int, u_int); > void rt_sendaddrmsg(struct rtentry *, int); > -void rt_missmsg(int, struct rt_addrinfo *, int, struct ifnet *, int, > - u_int); > +void rt_missmsg(int, struct rt_addrinfo *, int, u_int, int, u_int); > int rt_setgate(struct rtentry *, struct sockaddr *, unsigned int); > int rt_checkgate(struct ifnet *, struct rtentry *, struct sockaddr *, > unsigned int, struct rtentry **); > Index: net/rtsock.c > =================================================================== > RCS file: /data/mirror/openbsd/cvs/src/sys/net/rtsock.c,v > retrieving revision 1.176 > diff -u -p -r1.176 rtsock.c > --- net/rtsock.c 24 Oct 2015 11:58:47 -0000 1.176 > +++ net/rtsock.c 24 Oct 2015 16:37:27 -0000 > @@ -1075,8 +1075,8 @@ again: > * destination. > */ > void > -rt_missmsg(int type, struct rt_addrinfo *rtinfo, int flags, > - struct ifnet *ifp, int error, u_int tableid) > +rt_missmsg(int type, struct rt_addrinfo *rtinfo, int flags, u_int ifidx, > + int error, u_int tableid) > { > struct rt_msghdr *rtm; > struct mbuf *m; > @@ -1092,8 +1092,7 @@ rt_missmsg(int type, struct rt_addrinfo > rtm->rtm_errno = error; > rtm->rtm_tableid = tableid; > rtm->rtm_addrs = rtinfo->rti_addrs; > - if (ifp != NULL) > - rtm->rtm_index = ifp->if_index; > + rtm->rtm_index = ifidx; > if (sa == NULL) > route_proto.sp_protocol = 0; > else > Index: netinet/in_pcb.c > =================================================================== > RCS file: /data/mirror/openbsd/cvs/src/sys/netinet/in_pcb.c,v > retrieving revision 1.186 > diff -u -p -r1.186 in_pcb.c > --- netinet/in_pcb.c 23 Oct 2015 13:26:07 -0000 1.186 > +++ netinet/in_pcb.c 24 Oct 2015 16:38:59 -0000 > @@ -635,7 +635,7 @@ in_losing(struct inpcb *inp) > info.rti_info[RTAX_DST] = &inp->inp_route.ro_dst; > info.rti_info[RTAX_GATEWAY] = rt->rt_gateway; > info.rti_info[RTAX_NETMASK] = rt_mask(rt); > - rt_missmsg(RTM_LOSING, &info, rt->rt_flags, rt->rt_ifp, 0, > + rt_missmsg(RTM_LOSING, &info, rt->rt_flags, rt->rt_ifidx, 0, > inp->inp_rtableid); > if (rt->rt_flags & RTF_DYNAMIC) > (void)rtrequest1(RTM_DELETE, &info, rt->rt_priority, > -- :wq Claudio