summaryrefslogtreecommitdiffstats
path: root/sys/net/rtsock.c
diff options
context:
space:
mode:
authorru <ru@FreeBSD.org>2001-10-17 18:07:05 +0000
committerru <ru@FreeBSD.org>2001-10-17 18:07:05 +0000
commitecb4d3d05f89eabc8020bb6563d903164e3002a1 (patch)
tree6e9f67b95d216263dd912c61fa5f86b94ce2d728 /sys/net/rtsock.c
parentddef7c98c51d09f80ae57f4f83e00ee5b6e3ee72 (diff)
downloadFreeBSD-src-ecb4d3d05f89eabc8020bb6563d903164e3002a1.zip
FreeBSD-src-ecb4d3d05f89eabc8020bb6563d903164e3002a1.tar.gz
Pull post-4.4BSD change to sys/net/route.c from BSD/OS 4.2.
Have sys/net/route.c:rtrequest1(), which takes ``rt_addrinfo *'' as the argument. Pass rt_addrinfo all the way down to rtrequest1 and ifa->ifa_rtrequest. 3rd argument of ifa->ifa_rtrequest is now ``rt_addrinfo *'' instead of ``sockaddr *'' (almost noone is using it anyways). Benefit: the following command now works. Previously we needed two route(8) invocations, "add" then "change". # route add -inet6 default ::1 -ifp gif0 Remove unsafe typecast in rtrequest(), from ``rtentry *'' to ``sockaddr *''. It was introduced by 4.3BSD-Reno and never corrected. Obtained from: BSD/OS, NetBSD MFC after: 1 month PR: kern/28360
Diffstat (limited to 'sys/net/rtsock.c')
-rw-r--r--sys/net/rtsock.c35
1 files changed, 14 insertions, 21 deletions
diff --git a/sys/net/rtsock.c b/sys/net/rtsock.c
index efd7d57..84f38d6 100644
--- a/sys/net/rtsock.c
+++ b/sys/net/rtsock.c
@@ -309,11 +309,13 @@ route_output(m, so)
senderr(EPROTONOSUPPORT);
}
rtm->rtm_pid = curproc->p_pid;
+ bzero(&info, sizeof(info));
info.rti_addrs = rtm->rtm_addrs;
if (rt_xaddrs((caddr_t)(rtm + 1), len + (caddr_t)rtm, &info)) {
dst = 0;
senderr(EINVAL);
}
+ info.rti_flags = rtm->rtm_flags;
if (dst == 0 || (dst->sa_family >= AF_MAX)
|| (gate != 0 && (gate->sa_family >= AF_MAX)))
senderr(EINVAL);
@@ -339,8 +341,7 @@ route_output(m, so)
case RTM_ADD:
if (gate == 0)
senderr(EINVAL);
- error = rtrequest(RTM_ADD, dst, gate, netmask,
- rtm->rtm_flags, &saved_nrt);
+ error = rtrequest1(RTM_ADD, &info, &saved_nrt);
if (error == 0 && saved_nrt) {
rt_setmetrics(rtm->rtm_inits,
&rtm->rtm_rmx, &saved_nrt->rt_rmx);
@@ -353,8 +354,7 @@ route_output(m, so)
break;
case RTM_DELETE:
- error = rtrequest(RTM_DELETE, dst, gate, netmask,
- rtm->rtm_flags, &saved_nrt);
+ error = rtrequest1(RTM_DELETE, &info, &saved_nrt);
if (error == 0) {
if ((rt = saved_nrt))
rt->rt_refcnt++;
@@ -411,9 +411,6 @@ route_output(m, so)
break;
case RTM_CHANGE:
- if (gate && (error = rt_setgate(rt, rt_key(rt), gate)))
- senderr(error);
-
/*
* If they tried to change things but didn't specify
* the required gateway, then just use the old one.
@@ -427,30 +424,27 @@ route_output(m, so)
/* new gateway could require new ifaddr, ifp;
flags may also be different; ifp may be specified
by ll sockaddr when protocol address is ambiguous */
- if (ifpaddr && (ifa = ifa_ifwithnet(ifpaddr)) &&
- (ifp = ifa->ifa_ifp) && (ifaaddr || gate))
- ifa = ifaof_ifpforaddr(ifaaddr ? ifaaddr : gate,
- ifp);
- else if ((ifaaddr && (ifa = ifa_ifwithaddr(ifaaddr))) ||
- (gate && (ifa = ifa_ifwithroute(rt->rt_flags,
- rt_key(rt), gate))))
- ifp = ifa->ifa_ifp;
- if (ifa) {
+ if ((error = rt_getifa(&info)) != 0)
+ senderr(error);
+ if (gate != NULL &&
+ (error = rt_setgate(rt, rt_key(rt), gate)) != 0)
+ senderr(error);
+ if ((ifa = info.rti_ifa) != NULL) {
register struct ifaddr *oifa = rt->rt_ifa;
if (oifa != ifa) {
if (oifa && oifa->ifa_rtrequest)
- oifa->ifa_rtrequest(RTM_DELETE,
- rt, gate);
+ oifa->ifa_rtrequest(RTM_DELETE, rt,
+ &info);
IFAFREE(rt->rt_ifa);
rt->rt_ifa = ifa;
ifa->ifa_refcnt++;
- rt->rt_ifp = ifp;
+ rt->rt_ifp = info.rti_ifp;
}
}
rt_setmetrics(rtm->rtm_inits, &rtm->rtm_rmx,
&rt->rt_rmx);
if (rt->rt_ifa && rt->rt_ifa->ifa_rtrequest)
- rt->rt_ifa->ifa_rtrequest(RTM_ADD, rt, gate);
+ rt->rt_ifa->ifa_rtrequest(RTM_ADD, rt, &info);
if (genmask)
rt->rt_genmask = genmask;
/*
@@ -548,7 +542,6 @@ rt_xaddrs(cp, cplim, rtinfo)
register struct sockaddr *sa;
register int i;
- bzero(rtinfo->rti_info, sizeof(rtinfo->rti_info));
for (i = 0; (i < RTAX_MAX) && (cp < cplim); i++) {
if ((rtinfo->rti_addrs & (1 << i)) == 0)
continue;
OpenPOWER on IntegriCloud