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/netinet6 | |
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/netinet6')
-rw-r--r-- | sys/netinet6/in6_pcb.c | 8 | ||||
-rw-r--r-- | sys/netinet6/nd6.c | 4 | ||||
-rw-r--r-- | sys/netinet6/nd6.h | 2 |
3 files changed, 6 insertions, 8 deletions
diff --git a/sys/netinet6/in6_pcb.c b/sys/netinet6/in6_pcb.c index 417ad0c..a82ab84 100644 --- a/sys/netinet6/in6_pcb.c +++ b/sys/netinet6/in6_pcb.c @@ -980,15 +980,13 @@ in6_losing(in6p) if ((rt = in6p->in6p_route.ro_rt) != NULL) { bzero((caddr_t)&info, sizeof(info)); - info.rti_info[RTAX_DST] = - (struct sockaddr *)&in6p->in6p_route.ro_dst; + info.rti_flags = rt->rt_flags; + info.rti_info[RTAX_DST] = rt_key(rt); info.rti_info[RTAX_GATEWAY] = rt->rt_gateway; info.rti_info[RTAX_NETMASK] = rt_mask(rt); rt_missmsg(RTM_LOSING, &info, rt->rt_flags, 0); if (rt->rt_flags & RTF_DYNAMIC) - (void)rtrequest(RTM_DELETE, rt_key(rt), - rt->rt_gateway, rt_mask(rt), rt->rt_flags, - (struct rtentry **)0); + (void)rtrequest1(RTM_DELETE, &info, NULL); in6p->in6p_route.ro_rt = NULL; rtfree(rt); /* diff --git a/sys/netinet6/nd6.c b/sys/netinet6/nd6.c index 6fa087a..2dd1758 100644 --- a/sys/netinet6/nd6.c +++ b/sys/netinet6/nd6.c @@ -1085,10 +1085,10 @@ nd6_nud_hint(rt, dst6, force) } void -nd6_rtrequest(req, rt, sa) +nd6_rtrequest(req, rt, info) int req; struct rtentry *rt; - struct sockaddr *sa; /* xxx unused */ + struct rt_addrinfo *info; /* xxx unused */ { struct sockaddr *gate = rt->rt_gateway; struct llinfo_nd6 *ln = (struct llinfo_nd6 *)rt->rt_llinfo; diff --git a/sys/netinet6/nd6.h b/sys/netinet6/nd6.h index a2b3423..f3c17be 100644 --- a/sys/netinet6/nd6.h +++ b/sys/netinet6/nd6.h @@ -353,7 +353,7 @@ struct llinfo_nd6 *nd6_free __P((struct rtentry *)); void nd6_nud_hint __P((struct rtentry *, struct in6_addr *, int)); int nd6_resolve __P((struct ifnet *, struct rtentry *, struct mbuf *, struct sockaddr *, u_char *)); -void nd6_rtrequest __P((int, struct rtentry *, struct sockaddr *)); +void nd6_rtrequest __P((int, struct rtentry *, struct rt_addrinfo *)); int nd6_ioctl __P((u_long, caddr_t, struct ifnet *)); struct rtentry *nd6_cache_lladdr __P((struct ifnet *, struct in6_addr *, char *, int, int, int)); |