Hi, I have converted all calls to rtrequest1() into a common pattern. In the man page I tried to clarify the usage of the returned route.
ok? bluhm Index: sys/net/route.c =================================================================== RCS file: /data/mirror/openbsd/cvs/src/sys/net/route.c,v retrieving revision 1.221 diff -u -p -r1.221 route.c --- sys/net/route.c 18 Aug 2015 08:56:16 -0000 1.221 +++ sys/net/route.c 19 Aug 2015 10:58:52 -0000 @@ -301,9 +301,11 @@ struct rtentry * rtalloc(struct sockaddr *dst, int flags, unsigned int tableid) { struct rtentry *rt; - struct rtentry *newrt = 0; + struct rtentry *newrt = NULL; struct rt_addrinfo info; - int s = splsoftnet(), err = 0, msgtype = RTM_MISS; + int s, error = 0, msgtype = RTM_MISS; + + s = splsoftnet(); bzero(&info, sizeof(info)); info.rti_info[RTAX_DST] = dst; @@ -312,14 +314,15 @@ rtalloc(struct sockaddr *dst, int flags, if (rt != NULL) { newrt = rt; if ((rt->rt_flags & RTF_CLONING) && ISSET(flags, RT_RESOLVE)) { - err = rtrequest1(RTM_RESOLVE, &info, RTP_DEFAULT, + error = rtrequest1(RTM_RESOLVE, &info, RTP_DEFAULT, &newrt, tableid); - if (err) { + if (error) { newrt = rt; rt->rt_refcnt++; goto miss; } - if ((rt = newrt) && (rt->rt_flags & RTF_XRESOLVE)) { + rt = newrt; + if (rt->rt_flags & RTF_XRESOLVE) { msgtype = RTM_RESOLVE; goto miss; } @@ -333,7 +336,7 @@ miss: if (ISSET(flags, RT_REPORT)) { bzero((caddr_t)&info, sizeof(info)); info.rti_info[RTAX_DST] = dst; - rt_missmsg(msgtype, &info, 0, NULL, err, tableid); + rt_missmsg(msgtype, &info, 0, NULL, error, tableid); } } splx(s); @@ -510,7 +513,7 @@ create: rt = NULL; error = rtrequest1(RTM_ADD, &info, RTP_DEFAULT, &rt, rdomain); - if (rt != NULL) + if (error == 0) flags = rt->rt_flags; stat = &rtstat.rts_dynamic; } else { @@ -1142,7 +1145,7 @@ int rt_ifa_add(struct ifaddr *ifa, int flags, struct sockaddr *dst) { struct ifnet *ifp = ifa->ifa_ifp; - struct rtentry *rt = NULL; + struct rtentry *rt; struct sockaddr_rtlabel sa_rl; struct rt_addrinfo info; u_short rtableid = ifp->if_rdomain; @@ -1175,7 +1178,7 @@ rt_ifa_add(struct ifaddr *ifa, int flags prio = RTP_LOCAL; error = rtrequest1(RTM_ADD, &info, prio, &rt, rtableid); - if (error == 0 && rt != NULL) { + if (error == 0) { if (rt->rt_ifa != ifa) { printf("%s: wrong ifa (%p) was (%p)\n", __func__, ifa, rt->rt_ifa); @@ -1206,7 +1209,7 @@ int rt_ifa_del(struct ifaddr *ifa, int flags, struct sockaddr *dst) { struct ifnet *ifp = ifa->ifa_ifp; - struct rtentry *rt, *nrt = NULL; + struct rtentry *rt; struct mbuf *m = NULL; struct sockaddr *deldst; struct rt_addrinfo info; @@ -1257,11 +1260,11 @@ rt_ifa_del(struct ifaddr *ifa, int flags if (flags & (RTF_LOCAL|RTF_BROADCAST)) prio = RTP_LOCAL; - error = rtrequest1(RTM_DELETE, &info, prio, &nrt, rtableid); - if (error == 0 && (rt = nrt) != NULL) { - rt_sendmsg(nrt, RTM_DELETE, rtableid); + error = rtrequest1(RTM_DELETE, &info, prio, &rt, rtableid); + if (error == 0) { + rt_sendmsg(rt, RTM_DELETE, rtableid); if (flags & RTF_LOCAL) - rt_sendaddrmsg(nrt, RTM_DELADDR); + rt_sendaddrmsg(rt, RTM_DELADDR); if (rt->rt_refcnt <= 0) { rt->rt_refcnt++; rtfree(rt); Index: sys/net/rtsock.c =================================================================== RCS file: /data/mirror/openbsd/cvs/src/sys/net/rtsock.c,v retrieving revision 1.167 diff -u -p -r1.167 rtsock.c --- sys/net/rtsock.c 17 Aug 2015 09:46:26 -0000 1.167 +++ sys/net/rtsock.c 19 Aug 2015 10:58:52 -0000 @@ -595,7 +595,7 @@ route_output(struct mbuf *m, ...) } error = rtrequest1(rtm->rtm_type, &info, prio, &saved_nrt, tableid); - if (error == 0 && saved_nrt) { + if (error == 0) { rt_setmetrics(rtm->rtm_inits, &rtm->rtm_rmx, &saved_nrt->rt_rmx); /* write back the priority the kernel used */ Index: sys/netinet/in_pcb.c =================================================================== RCS file: /data/mirror/openbsd/cvs/src/sys/netinet/in_pcb.c,v retrieving revision 1.172 diff -u -p -r1.172 in_pcb.c --- sys/netinet/in_pcb.c 19 Jul 2015 02:35:35 -0000 1.172 +++ sys/netinet/in_pcb.c 19 Aug 2015 11:00:17 -0000 @@ -668,7 +668,7 @@ in_losing(struct inpcb *inp) inp->inp_rtableid); if (rt->rt_flags & RTF_DYNAMIC) (void)rtrequest1(RTM_DELETE, &info, rt->rt_priority, - (struct rtentry **)0, inp->inp_rtableid); + NULL, inp->inp_rtableid); /* * A new route can be allocated * the next time output is attempted. Index: sys/netinet6/in6.c =================================================================== RCS file: /data/mirror/openbsd/cvs/src/sys/netinet6/in6.c,v retrieving revision 1.163 diff -u -p -r1.163 in6.c --- sys/netinet6/in6.c 18 Aug 2015 08:48:36 -0000 1.163 +++ sys/netinet6/in6.c 19 Aug 2015 10:58:52 -0000 @@ -924,8 +924,8 @@ in6_update_ifa(struct ifnet *ifp, struct info.rti_info[RTAX_NETMASK] = sin6tosa(&mltmask); info.rti_info[RTAX_IFA] = sin6tosa(&ia6->ia_addr); info.rti_flags = RTF_UP | RTF_CLONING; - error = rtrequest1(RTM_ADD, &info, RTP_CONNECTED, - NULL, ifp->if_rdomain); + error = rtrequest1(RTM_ADD, &info, RTP_CONNECTED, NULL, + ifp->if_rdomain); if (error) goto cleanup; } else { Index: sys/netinet6/nd6.c =================================================================== RCS file: /data/mirror/openbsd/cvs/src/sys/netinet6/nd6.c,v retrieving revision 1.144 diff -u -p -r1.144 nd6.c --- sys/netinet6/nd6.c 17 Aug 2015 09:58:10 -0000 1.144 +++ sys/netinet6/nd6.c 19 Aug 2015 10:58:52 -0000 @@ -646,7 +646,7 @@ nd6_lookup(struct in6_addr *addr6, int c if (!rt) { if (create && ifp) { struct rt_addrinfo info; - int e; + int error; /* * If no route is available and create is set, @@ -671,18 +671,9 @@ nd6_lookup(struct in6_addr *addr6, int c info.rti_info[RTAX_DST] = sin6tosa(&sin6); info.rti_info[RTAX_GATEWAY] = (struct sockaddr *)ifp->if_sadl; - if ((e = rtrequest1(RTM_ADD, &info, RTP_CONNECTED, - &rt, rtableid)) != 0) { -#if 0 - char ip[INET6_ADDRSTRLEN]; - log(LOG_ERR, "%s: failed to add route for a " - "neighbor(%s), errno=%d\n", __func__, - inet_ntop(AF_INET6, addr6, ip, sizeof(ip)), - e); -#endif - return (NULL); - } - if (rt == NULL) + error = rtrequest1(RTM_ADD, &info, RTP_CONNECTED, &rt, + rtableid); + if (error) return (NULL); if (rt->rt_llinfo) { struct llinfo_nd6 *ln = Index: sys/netinet6/nd6_rtr.c =================================================================== RCS file: /data/mirror/openbsd/cvs/src/sys/netinet6/nd6_rtr.c,v retrieving revision 1.115 diff -u -p -r1.115 nd6_rtr.c --- sys/netinet6/nd6_rtr.c 18 Aug 2015 08:52:25 -0000 1.115 +++ sys/netinet6/nd6_rtr.c 19 Aug 2015 10:58:52 -0000 @@ -602,7 +602,7 @@ defrouter_addreq(struct nd_defrouter *ne { struct rt_addrinfo info; struct sockaddr_in6 def, mask, gate; - struct rtentry *rt = NULL; + struct rtentry *rt; int s; int error; @@ -625,12 +625,11 @@ defrouter_addreq(struct nd_defrouter *ne s = splsoftnet(); error = rtrequest1(RTM_ADD, &info, RTP_DEFAULT, &rt, new->ifp->if_rdomain); - if (rt) { + if (error == 0) { rt_sendmsg(rt, RTM_ADD, new->ifp->if_rdomain); rtfree(rt); - } - if (error == 0) new->installed = 1; + } splx(s); return; } @@ -705,7 +704,8 @@ defrouter_delreq(struct nd_defrouter *dr { struct rt_addrinfo info; struct sockaddr_in6 def, mask, gw; - struct rtentry *oldrt = NULL; + struct rtentry *rt; + int error; #ifdef DIAGNOSTIC if (!dr) @@ -728,17 +728,17 @@ defrouter_delreq(struct nd_defrouter *dr info.rti_info[RTAX_GATEWAY] = sin6tosa(&gw); info.rti_info[RTAX_NETMASK] = sin6tosa(&mask); - rtrequest1(RTM_DELETE, &info, RTP_DEFAULT, &oldrt, + error = rtrequest1(RTM_DELETE, &info, RTP_DEFAULT, &rt, dr->ifp->if_rdomain); - if (oldrt) { - rt_sendmsg(oldrt, RTM_DELETE, dr->ifp->if_rdomain); - if (oldrt->rt_refcnt <= 0) { + if (error == 0) { + rt_sendmsg(rt, RTM_DELETE, dr->ifp->if_rdomain); + if (rt->rt_refcnt <= 0) { /* * XXX: borrowed from the RTM_DELETE case of * rtrequest1(). */ - oldrt->rt_refcnt++; - rtfree(oldrt); + rt->rt_refcnt++; + rtfree(rt); } } @@ -1778,10 +1778,10 @@ nd6_prefix_onlink(struct nd_prefix *pr) struct ifnet *ifp = pr->ndpr_ifp; struct sockaddr_in6 mask6; struct nd_prefix *opr; - u_long rtflags; - int error = 0; - struct rtentry *rt = NULL; + struct rtentry *rt; char addr[INET6_ADDRSTRLEN]; + u_long rtflags; + int error; /* sanity check */ if ((pr->ndpr_stateflags & NDPRF_ONLINK) != 0) @@ -1856,7 +1856,7 @@ nd6_prefix_onlink(struct nd_prefix *pr) info.rti_info[RTAX_NETMASK] = sin6tosa(&mask6); error = rtrequest1(RTM_ADD, &info, RTP_CONNECTED, &rt, ifp->if_rdomain); - if (error == 0 && rt != NULL) { + if (error == 0) { pr->ndpr_stateflags |= NDPRF_ONLINK; rt_sendmsg(rt, RTM_ADD, ifp->if_rdomain); rtfree(rt); @@ -1869,12 +1869,12 @@ int nd6_prefix_offlink(struct nd_prefix *pr) { struct rt_addrinfo info; - int error = 0; struct ifnet *ifp = pr->ndpr_ifp; struct nd_prefix *opr; struct sockaddr_in6 sa6, mask6; - struct rtentry *rt = NULL; + struct rtentry *rt; char addr[INET6_ADDRSTRLEN]; + int error; /* sanity check */ if ((pr->ndpr_stateflags & NDPRF_ONLINK) == 0) { @@ -1898,14 +1898,14 @@ nd6_prefix_offlink(struct nd_prefix *pr) bzero(&info, sizeof(info)); info.rti_info[RTAX_DST] = sin6tosa(&sa6); info.rti_info[RTAX_NETMASK] = sin6tosa(&mask6); + error = rtrequest1(RTM_DELETE, &info, RTP_CONNECTED, &rt, ifp->if_rdomain); if (error == 0) { pr->ndpr_stateflags &= ~NDPRF_ONLINK; /* report the route deletion to the routing socket. */ - if (rt != NULL) - rt_sendmsg(rt, RTM_DELETE, ifp->if_rdomain); + rt_sendmsg(rt, RTM_DELETE, ifp->if_rdomain); /* * There might be the same prefix on another interface, @@ -1946,6 +1946,12 @@ nd6_prefix_offlink(struct nd_prefix *pr) } } } + + if (rt->rt_refcnt <= 0) { + /* XXX: we should free the entry ourselves. */ + rt->rt_refcnt++; + rtfree(rt); + } } else { /* XXX: can we still set the NDPRF_ONLINK flag? */ nd6log((LOG_ERR, @@ -1953,14 +1959,6 @@ nd6_prefix_offlink(struct nd_prefix *pr) "%s/%d on %s (errno = %d)\n", inet_ntop(AF_INET6, &sa6.sin6_addr, addr, sizeof(addr)), pr->ndpr_plen, ifp->if_xname, error)); - } - - if (rt != NULL) { - if (rt->rt_refcnt <= 0) { - /* XXX: we should free the entry ourselves. */ - rt->rt_refcnt++; - rtfree(rt); - } } return (error); Index: share/man/man9/rtrequest1.9 =================================================================== RCS file: /data/mirror/openbsd/cvs/src/share/man/man9/rtrequest1.9,v retrieving revision 1.3 diff -u -p -r1.3 rtrequest1.9 --- share/man/man9/rtrequest1.9 15 Oct 2014 11:58:13 -0000 1.3 +++ share/man/man9/rtrequest1.9 18 Aug 2015 22:22:46 -0000 @@ -80,13 +80,12 @@ and the requested action is then a default priority based on the priority of the associated interface is chosen. .It Fa rtp -Points to the cloning entry if the action is -.Dv RTM_RESOLVE -or, if the action is -.Dv RTM_DELETE -and it is non-NULL, a pointer to the removed entry is placed there. -In this case, the caller must take care of releasing the returned entry by -calling +Must be non-NULL and point to the cloning entry if the action is +.Dv RTM_RESOLVE . +In all cases when no error is returned and it is non-NULL, a pointer +to the deleted or added entry is placed there. +Then the caller must take care of releasing the returned reference +by calling .Xr rtfree 9 . .It Fa rtableid The ID of the routing table to modify.