diff options
author | ru <ru@FreeBSD.org> | 2001-10-17 18:07:05 +0000 |
---|---|---|
committer | ru <ru@FreeBSD.org> | 2001-10-17 18:07:05 +0000 |
commit | ecb4d3d05f89eabc8020bb6563d903164e3002a1 (patch) | |
tree | 6e9f67b95d216263dd912c61fa5f86b94ce2d728 /sys/net/rtsock.c | |
parent | ddef7c98c51d09f80ae57f4f83e00ee5b6e3ee72 (diff) | |
download | FreeBSD-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.c | 35 |
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; |