The netmask argument is always NULL and the flags are always the same.
RTF_GATEWAY|RTF_HOST routes *are* routes created by redirect.
I need this simplification to move forward with my rt_mask() cleanup.
ok?
Index: net/route.c
===================================================================
RCS file: /cvs/src/sys/net/route.c,v
retrieving revision 1.277
diff -u -p -r1.277 route.c
--- net/route.c 27 Nov 2015 11:52:44 -0000 1.277
+++ net/route.c 1 Dec 2015 16:52:10 -0000
@@ -529,8 +529,7 @@ ifafree(struct ifaddr *ifa)
*/
void
rtredirect(struct sockaddr *dst, struct sockaddr *gateway,
- struct sockaddr *netmask, int flags, struct sockaddr *src,
- struct rtentry **rtp, u_int rdomain)
+ struct sockaddr *src, struct rtentry **rtp, unsigned int rdomain)
{
struct rtentry *rt;
int error = 0;
@@ -538,6 +537,7 @@ rtredirect(struct sockaddr *dst, struct
struct rt_addrinfo info;
struct ifaddr *ifa;
unsigned int ifidx = 0;
+ int flags = RTF_GATEWAY|RTF_HOST;
splsoftassert(IPL_SOFTNET);
@@ -557,8 +557,7 @@ rtredirect(struct sockaddr *dst, struct
#define equal(a1, a2) \
((a1)->sa_len == (a2)->sa_len && \
bcmp((caddr_t)(a1), (caddr_t)(a2), (a1)->sa_len) == 0)
- if (!(flags & RTF_DONE) && rt &&
- (!equal(src, rt->rt_gateway) || rt->rt_ifa != ifa))
+ if (rt != NULL && (!equal(src, rt->rt_gateway) || rt->rt_ifa != ifa))
error = EINVAL;
else if (ifa_ifwithaddr(gateway, rdomain) != NULL)
error = EHOSTUNREACH;
@@ -574,21 +573,20 @@ rtredirect(struct sockaddr *dst, struct
goto create;
/*
* Don't listen to the redirect if it's
- * for a route to an interface.
+ * for a route to an interface.
*/
- if (rt->rt_flags & RTF_GATEWAY) {
- if (((rt->rt_flags & RTF_HOST) == 0) && (flags & RTF_HOST)) {
+ if (ISSET(rt->rt_flags, RTF_GATEWAY)) {
+ if (!ISSET(rt->rt_flags, RTF_HOST)) {
/*
* Changing from route to net => route to host.
* Create new route, rather than smashing route to net.
*/
create:
rtfree(rt);
- flags |= RTF_GATEWAY | RTF_DYNAMIC;
+ flags |= RTF_DYNAMIC;
bzero(&info, sizeof(info));
info.rti_info[RTAX_DST] = dst;
info.rti_info[RTAX_GATEWAY] = gateway;
- info.rti_info[RTAX_NETMASK] = netmask;
info.rti_ifa = ifa;
info.rti_flags = flags;
rt = NULL;
@@ -624,7 +622,6 @@ out:
bzero((caddr_t)&info, sizeof(info));
info.rti_info[RTAX_DST] = dst;
info.rti_info[RTAX_GATEWAY] = gateway;
- info.rti_info[RTAX_NETMASK] = netmask;
info.rti_info[RTAX_AUTHOR] = src;
rt_missmsg(RTM_REDIRECT, &info, flags, ifidx, error, rdomain);
}
Index: net/route.h
===================================================================
RCS file: /cvs/src/sys/net/route.h,v
retrieving revision 1.122
diff -u -p -r1.122 route.h
--- net/route.h 29 Nov 2015 16:02:18 -0000 1.122
+++ net/route.h 1 Dec 2015 16:49:26 -0000
@@ -392,9 +392,7 @@ int rt_ifa_del(struct ifaddr *, int, st
int rt_ifa_addlocal(struct ifaddr *);
int rt_ifa_dellocal(struct ifaddr *);
int rtioctl(u_long, caddr_t, struct proc *);
-void rtredirect(struct sockaddr *, struct sockaddr *,
- struct sockaddr *, int, struct sockaddr *,
- struct rtentry **, u_int);
+void rtredirect(struct sockaddr *, struct sockaddr *, struct sockaddr *,
struct rtentry **, unsigned int);
int rtrequest(int, struct rt_addrinfo *, u_int8_t, struct rtentry **,
u_int);
void rt_if_remove(struct ifnet *);
Index: netinet/ip_icmp.c
===================================================================
RCS file: /cvs/src/sys/netinet/ip_icmp.c,v
retrieving revision 1.146
diff -u -p -r1.146 ip_icmp.c
--- netinet/ip_icmp.c 21 Nov 2015 11:26:59 -0000 1.146
+++ netinet/ip_icmp.c 1 Dec 2015 16:36:52 -0000
@@ -652,9 +652,8 @@ reflect:
&ip->ip_dst.s_addr))
goto freeit;
#endif
- rtredirect(sintosa(&sdst), sintosa(&sgw), NULL,
- RTF_GATEWAY | RTF_HOST, sintosa(&ssrc),
- &newrt, m->m_pkthdr.ph_rtableid);
+ rtredirect(sintosa(&sdst), sintosa(&sgw),
+ sintosa(&ssrc), &newrt, m->m_pkthdr.ph_rtableid);
if (newrt != NULL && icmp_redirtimeout != 0) {
(void)rt_timer_add(newrt, icmp_redirect_timeout,
icmp_redirect_timeout_q, m->m_pkthdr.ph_rtableid);
Index: netinet6/icmp6.c
===================================================================
RCS file: /cvs/src/sys/netinet6/icmp6.c,v
retrieving revision 1.178
diff -u -p -r1.178 icmp6.c
--- netinet6/icmp6.c 21 Nov 2015 11:23:07 -0000 1.178
+++ netinet6/icmp6.c 1 Dec 2015 16:37:04 -0000
@@ -1517,8 +1517,7 @@ icmp6_redirect_input(struct mbuf *m, int
bcopy(&redtgt6, &sgw.sin6_addr, sizeof(struct in6_addr));
bcopy(&reddst6, &sdst.sin6_addr, sizeof(struct in6_addr));
bcopy(&src6, &ssrc.sin6_addr, sizeof(struct in6_addr));
- rtredirect(sin6tosa(&sdst), sin6tosa(&sgw), NULL,
- RTF_GATEWAY | RTF_HOST, sin6tosa(&ssrc),
+ rtredirect(sin6tosa(&sdst), sin6tosa(&sgw), sin6tosa(&ssrc),
&newrt, m->m_pkthdr.ph_rtableid);
if (newrt) {