As suggested by claudio@, RTM_MISS is no longer useful and it makes
rt_match() complicated with the upcoming KERNEL_LOCK dance.
This simplifies rtalloc(9) as RT_REPORT can also die. I'll update
the manuals if this is ok.
Index: net/if_mpe.c
===================================================================
RCS file: /cvs/src/sys/net/if_mpe.c,v
retrieving revision 1.50
diff -u -p -r1.50 if_mpe.c
--- net/if_mpe.c 6 Nov 2015 11:45:42 -0000 1.50
+++ net/if_mpe.c 2 Dec 2015 11:13:40 -0000
@@ -172,7 +172,7 @@ mpestart(struct ifnet *ifp0)
continue;
}
- rt = rtalloc(sa, RT_REPORT|RT_RESOLVE, 0);
+ rt = rtalloc(sa, RT_RESOLVE, 0);
if (!rtisvalid(rt)) {
m_freem(m);
rtfree(rt);
Index: net/if_mpw.c
===================================================================
RCS file: /cvs/src/sys/net/if_mpw.c,v
retrieving revision 1.10
diff -u -p -r1.10 if_mpw.c
--- net/if_mpw.c 6 Nov 2015 11:45:04 -0000 1.10
+++ net/if_mpw.c 2 Dec 2015 11:13:40 -0000
@@ -500,8 +500,7 @@ mpw_start(struct ifnet *ifp0)
struct shim_hdr *shim;
struct sockaddr_storage ss;
- rt = rtalloc((struct sockaddr *) &sc->sc_nexthop,
- RT_REPORT | RT_RESOLVE, 0);
+ rt = rtalloc((struct sockaddr *)&sc->sc_nexthop, RT_RESOLVE, 0);
if (!rtisvalid(rt)) {
rtfree(rt);
return;
Index: net/pf.c
===================================================================
RCS file: /cvs/src/sys/net/pf.c,v
retrieving revision 1.952
diff -u -p -r1.952 pf.c
--- net/pf.c 21 Nov 2015 11:29:40 -0000 1.952
+++ net/pf.c 2 Dec 2015 11:13:41 -0000
@@ -2934,7 +2934,7 @@ pf_calc_mss(struct pf_addr *addr, sa_fam
dst->sin_family = AF_INET;
dst->sin_len = sizeof(*dst);
dst->sin_addr = addr->v4;
- rt = rtalloc(sintosa(dst), RT_REPORT, rtableid);
+ rt = rtalloc(sintosa(dst), 0, rtableid);
break;
#ifdef INET6
case AF_INET6:
@@ -2943,7 +2943,7 @@ pf_calc_mss(struct pf_addr *addr, sa_fam
dst6->sin6_family = AF_INET6;
dst6->sin6_len = sizeof(*dst6);
dst6->sin6_addr = addr->v6;
- rt = rtalloc(sin6tosa(dst6), RT_REPORT, rtableid);
+ rt = rtalloc(sin6tosa(dst6), 0, rtableid);
break;
#endif /* INET6 */
}
@@ -5384,7 +5384,7 @@ pf_routable(struct pf_addr *addr, sa_fam
if (kif != NULL && kif->pfik_ifp->if_type == IFT_ENC)
goto out;
- rt0 = rtalloc((struct sockaddr *)&ss, RT_REPORT, rtableid);
+ rt0 = rtalloc((struct sockaddr *)&ss, 0, rtableid);
if (rt0 != NULL) {
/* No interface given, this is a no-route check */
if (kif == NULL)
@@ -5456,7 +5456,7 @@ pf_rtlabel_match(struct pf_addr *addr, s
#endif /* INET6 */
}
- rt = rtalloc((struct sockaddr *)&ss, RT_REPORT|RT_RESOLVE, rtableid);
+ rt = rtalloc((struct sockaddr *)&ss, RT_RESOLVE, rtableid);
if (rt != NULL) {
if (rt->rt_labelid == aw->v.rtlabel)
ret = 1;
@@ -5515,7 +5515,7 @@ pf_route(struct mbuf **m, struct pf_rule
rtableid = m0->m_pkthdr.ph_rtableid;
if (!r->rt) {
- rt = rtalloc(sintosa(dst), RT_REPORT|RT_RESOLVE, rtableid);
+ rt = rtalloc(sintosa(dst), RT_RESOLVE, rtableid);
if (rt == NULL) {
ipstat.ips_noroute++;
goto bad;
Index: net/route.c
===================================================================
RCS file: /cvs/src/sys/net/route.c,v
retrieving revision 1.280
diff -u -p -r1.280 route.c
--- net/route.c 2 Dec 2015 10:33:15 -0000 1.280
+++ net/route.c 2 Dec 2015 11:13:41 -0000
@@ -223,10 +223,6 @@ rtisvalid(struct rtentry *rt)
* "RT_RESOLVE" means that a corresponding L2 entry should
* be added to the routing table and resolved (via ARP or
* NDP), if it does not exist.
- *
- * "RT_REPORT" indicates that a message should be sent to
- * userland if no matching route has been found or if an
- * error occured while adding a L2 entry.
*/
struct rtentry *
rt_match(struct sockaddr *dst, uint32_t *src, int flags, unsigned int tableid)
@@ -246,20 +242,15 @@ rt_match(struct sockaddr *dst, uint32_t
rt0 = rt;
error = rtrequest(RTM_RESOLVE, &info, RTP_DEFAULT,
&rt, tableid);
- if (error) {
- rt0->rt_use++;
- goto miss;
+ if (error == 0) {
+ /* Inform listeners of the new route */
+ rt_sendmsg(rt, RTM_ADD, tableid);
+ rtfree(rt0);
}
- /* Inform listeners of the new route */
- rt_sendmsg(rt, RTM_ADD, tableid);
- rtfree(rt0);
}
rt->rt_use++;
} else {
rtstat.rts_unreach++;
-miss:
- if (ISSET(flags, RT_REPORT))
- rt_missmsg(RTM_MISS, &info, 0, 0, error, tableid);
}
KERNEL_UNLOCK();
splx(s);
@@ -349,7 +340,7 @@ rt_hash(struct rtentry *rt, uint32_t *sr
struct rtentry *
rtalloc_mpath(struct sockaddr *dst, uint32_t *src, unsigned int rtableid)
{
- return (_rtalloc(dst, src, RT_REPORT|RT_RESOLVE, rtableid));
+ return (_rtalloc(dst, src, RT_RESOLVE, rtableid));
}
#endif /* SMALL_KERNEL */
Index: net/route.h
===================================================================
RCS file: /cvs/src/sys/net/route.h,v
retrieving revision 1.124
diff -u -p -r1.124 route.h
--- net/route.h 2 Dec 2015 09:17:47 -0000 1.124
+++ net/route.h 2 Dec 2015 11:13:41 -0000
@@ -340,7 +340,6 @@ void rtlabel_unref(u_int16_t);
/*
* Values for additional argument to rtalloc()
*/
-#define RT_REPORT 0x1
#define RT_RESOLVE 0x2
extern struct rtstat rtstat;
@@ -379,7 +378,7 @@ void rt_timer_timer(void *);
int rtisvalid(struct rtentry *);
int rt_hash(struct rtentry *, uint32_t *);
#ifdef SMALL_KERNEL
-#define rtalloc_mpath(dst, s, rid) rtalloc((dst),
RT_REPORT|RT_RESOLVE, (rid))
+#define rtalloc_mpath(dst, s, rid) rtalloc((dst), RT_RESOLVE, (rid))
#else
struct rtentry *rtalloc_mpath(struct sockaddr *, uint32_t *, u_int);
#endif
Index: netinet/if_ether.c
===================================================================
RCS file: /cvs/src/sys/netinet/if_ether.c,v
retrieving revision 1.192
diff -u -p -r1.192 if_ether.c
--- netinet/if_ether.c 2 Dec 2015 09:28:46 -0000 1.192
+++ netinet/if_ether.c 2 Dec 2015 11:13:41 -0000
@@ -704,7 +704,7 @@ arplookup(u_int32_t addr, int create, in
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = addr;
sin.sin_other = proxy ? SIN_PROXY : 0;
- flags = (create) ? (RT_REPORT|RT_RESOLVE) : 0;
+ flags = (create) ? RT_RESOLVE : 0;
rt = rtalloc((struct sockaddr *)&sin, flags, tableid);
if (!rtisvalid(rt) || ISSET(rt->rt_flags, RTF_GATEWAY) ||
Index: netinet/ip_icmp.c
===================================================================
RCS file: /cvs/src/sys/netinet/ip_icmp.c,v
retrieving revision 1.147
diff -u -p -r1.147 ip_icmp.c
--- netinet/ip_icmp.c 1 Dec 2015 21:26:43 -0000 1.147
+++ netinet/ip_icmp.c 2 Dec 2015 11:13:41 -0000
@@ -748,7 +748,7 @@ icmp_reflect(struct mbuf *m, struct mbuf
sin.sin_addr = ip->ip_src;
/* keep packet in the original virtual instance */
- rt = rtalloc(sintosa(&sin), RT_REPORT|RT_RESOLVE, rtableid);
+ rt = rtalloc(sintosa(&sin), RT_RESOLVE, rtableid);
if (rt == NULL) {
ipstat.ips_noroute++;
m_freem(m);
@@ -933,7 +933,7 @@ icmp_mtudisc_clone(struct in_addr dst, u
sin.sin_len = sizeof(sin);
sin.sin_addr = dst;
- rt = rtalloc(sintosa(&sin), RT_REPORT|RT_RESOLVE, rtableid);
+ rt = rtalloc(sintosa(&sin), RT_RESOLVE, rtableid);
/* Check if the route is actually usable */
if (!rtisvalid(rt) || (rt->rt_flags & (RTF_REJECT|RTF_BLACKHOLE))) {
Index: netinet/ip_input.c
===================================================================
RCS file: /cvs/src/sys/netinet/ip_input.c,v
retrieving revision 1.262
diff -u -p -r1.262 ip_input.c
--- netinet/ip_input.c 23 Nov 2015 15:54:45 -0000 1.262
+++ netinet/ip_input.c 2 Dec 2015 11:13:41 -0000
@@ -1242,8 +1242,8 @@ ip_rtaddr(struct in_addr dst, u_int rtab
sin->sin_len = sizeof(*sin);
sin->sin_addr = dst;
- ipforward_rt.ro_rt = rtalloc(&ipforward_rt.ro_dst,
- RT_REPORT|RT_RESOLVE, rtableid);
+ ipforward_rt.ro_rt = rtalloc(&ipforward_rt.ro_dst, RT_RESOLVE,
+ rtableid);
}
if (ipforward_rt.ro_rt == 0)
return (NULL);
Index: netinet/ip_output.c
===================================================================
RCS file: /cvs/src/sys/netinet/ip_output.c,v
retrieving revision 1.309
diff -u -p -r1.309 ip_output.c
--- netinet/ip_output.c 1 Dec 2015 00:49:12 -0000 1.309
+++ netinet/ip_output.c 2 Dec 2015 11:13:41 -0000
@@ -501,7 +501,7 @@ sendit:
if (ro && ro->ro_rt != NULL) {
rtfree(ro->ro_rt);
ro->ro_rt = rtalloc(&ro->ro_dst,
- RT_REPORT|RT_RESOLVE,
+ RT_RESOLVE,
m->m_pkthdr.ph_rtableid);
}
if (rt_mtucloned)
@@ -1443,8 +1443,7 @@ ip_setmoptions(int optname, struct ip_mo
sin.sin_len = sizeof(sin);
sin.sin_family = AF_INET;
sin.sin_addr = mreq->imr_multiaddr;
- rt = rtalloc(sintosa(&sin), RT_REPORT|RT_RESOLVE,
- rtableid);
+ rt = rtalloc(sintosa(&sin), RT_RESOLVE, rtableid);
if (!rtisvalid(rt)) {
rtfree(rt);
error = EADDRNOTAVAIL;
@@ -1455,7 +1454,7 @@ ip_setmoptions(int optname, struct ip_mo
sin.sin_len = sizeof(sin);
sin.sin_family = AF_INET;
sin.sin_addr = mreq->imr_interface;
- rt = rtalloc(sintosa(&sin), RT_REPORT, rtableid);
+ rt = rtalloc(sintosa(&sin), 0, rtableid);
if (!rtisvalid(rt) || !ISSET(rt->rt_flags, RTF_LOCAL)) {
rtfree(rt);
error = EADDRNOTAVAIL;
Index: netinet6/icmp6.c
===================================================================
RCS file: /cvs/src/sys/netinet6/icmp6.c,v
retrieving revision 1.179
diff -u -p -r1.179 icmp6.c
--- netinet6/icmp6.c 1 Dec 2015 21:26:43 -0000 1.179
+++ netinet6/icmp6.c 2 Dec 2015 11:13:41 -0000
@@ -1912,7 +1912,7 @@ icmp6_mtudisc_clone(struct sockaddr *dst
struct rtentry *rt;
int error;
- rt = rtalloc(dst, RT_REPORT|RT_RESOLVE, rdomain);
+ rt = rtalloc(dst, RT_RESOLVE, rdomain);
if (rt == NULL)
return NULL;
Index: netinet6/in6_src.c
===================================================================
RCS file: /cvs/src/sys/netinet6/in6_src.c,v
retrieving revision 1.70
diff -u -p -r1.70 in6_src.c
--- netinet6/in6_src.c 25 Oct 2015 14:43:06 -0000 1.70
+++ netinet6/in6_src.c 2 Dec 2015 11:13:41 -0000
@@ -242,7 +242,7 @@ in6_selectsrc(struct in6_addr **in6src,
sa6->sin6_scope_id = dstsock->sin6_scope_id;
if (IN6_IS_ADDR_MULTICAST(dst)) {
ro->ro_rt = rtalloc(sin6tosa(&ro->ro_dst),
- RT_REPORT|RT_RESOLVE, ro->ro_tableid);
+ RT_RESOLVE, ro->ro_tableid);
} else {
ro->ro_rt = rtalloc_mpath(sin6tosa(&ro->ro_dst),
NULL, ro->ro_tableid);
Index: netinet6/ip6_output.c
===================================================================
RCS file: /cvs/src/sys/netinet6/ip6_output.c,v
retrieving revision 1.200
diff -u -p -r1.200 ip6_output.c
--- netinet6/ip6_output.c 29 Nov 2015 15:12:36 -0000 1.200
+++ netinet6/ip6_output.c 2 Dec 2015 11:13:41 -0000
@@ -1136,7 +1136,7 @@ ip6_getpmtu(struct route_in6 *ro_pmtu, s
sa6_dst->sin6_addr = *dst;
ro_pmtu->ro_rt = rtalloc(sin6tosa(&ro_pmtu->ro_dst),
- RT_REPORT|RT_RESOLVE, ro_pmtu->ro_tableid);
+ RT_RESOLVE, ro_pmtu->ro_tableid);
}
}
if (ro_pmtu->ro_rt) {
@@ -2195,7 +2195,7 @@ ip6_setmoptions(int optname, struct ip6_
dst->sin6_family = AF_INET6;
dst->sin6_addr = mreq->ipv6mr_multiaddr;
ro.ro_rt = rtalloc(sin6tosa(&ro.ro_dst),
- RT_REPORT|RT_RESOLVE, ro.ro_tableid);
+ RT_RESOLVE, ro.ro_tableid);
if (ro.ro_rt == NULL) {
error = EADDRNOTAVAIL;
break;
Index: netinet6/nd6.c
===================================================================
RCS file: /cvs/src/sys/netinet6/nd6.c,v
retrieving revision 1.173
diff -u -p -r1.173 nd6.c
--- netinet6/nd6.c 1 Dec 2015 12:22:18 -0000 1.173
+++ netinet6/nd6.c 2 Dec 2015 11:13:41 -0000
@@ -586,7 +586,7 @@ nd6_lookup(struct in6_addr *addr6, int c
sin6.sin6_len = sizeof(struct sockaddr_in6);
sin6.sin6_family = AF_INET6;
sin6.sin6_addr = *addr6;
- flags = (create) ? (RT_REPORT|RT_RESOLVE) : 0;
+ flags = (create) ? RT_RESOLVE : 0;
rt = rtalloc(sin6tosa(&sin6), flags, rtableid);
if (rt != NULL && (rt->rt_flags & RTF_LLINFO) == 0) {
Index: netmpls/mpls_input.c
===================================================================
RCS file: /cvs/src/sys/netmpls/mpls_input.c,v
retrieving revision 1.52
diff -u -p -r1.52 mpls_input.c
--- netmpls/mpls_input.c 2 Dec 2015 08:47:00 -0000 1.52
+++ netmpls/mpls_input.c 2 Dec 2015 11:13:42 -0000
@@ -156,7 +156,7 @@ do_v6:
}
}
- rt = rtalloc(smplstosa(smpls), RT_REPORT|RT_RESOLVE, 0);
+ rt = rtalloc(smplstosa(smpls), RT_RESOLVE, 0);
if (rt == NULL) {
/* no entry for this label */
#ifdef MPLS_DEBUG
@@ -372,7 +372,7 @@ mpls_do_error(struct mbuf *m, int type,
smpls->smpls_len = sizeof(*smpls);
smpls->smpls_label = shim->shim_label & MPLS_LABEL_MASK;
- rt = rtalloc(smplstosa(smpls), RT_REPORT|RT_RESOLVE, 0);
+ rt = rtalloc(smplstosa(smpls), RT_RESOLVE, 0);
if (rt == NULL) {
/* no entry for this label */
m_freem(m);