Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 31 Mar 2009 16:13:38 -0400 (EDT)
From:      Rick Macklem <rmacklem@uoguelph.ca>
To:        Julian Elischer <julian@elischer.org>
Cc:        freebsd-arch@freebsd.org
Subject:   Re: getting a callback ip address for nfsv4 client
Message-ID:  <Pine.GSO.4.63.0903311604100.15846@muncher.cs.uoguelph.ca>
In-Reply-To: <49D13E9C.8010005@elischer.org>
References:  <Pine.GSO.4.63.0903301733120.17182@muncher.cs.uoguelph.ca> <49D13E9C.8010005@elischer.org>

next in thread | previous in thread | raw e-mail | index | archive | help


On Mon, 30 Mar 2009, Julian Elischer wrote:

>
> So you want to do a route lookup so use rtalloc or friends
> (see route.c).
>

First off, I should say that, if there is a better mailing list for
this kind of thing, please let me know. Also, if this fails, it is
not the end of the world. All that happens is that the server doesn't
issue delegations to the client, since the callbacks aren't working.

Given that I'd like to avoid having code in nfs fiddling
with *inp's and such, since it would have to worry about what global
vars it can use, locking on them, etc., I haven't worried about what
Max Laier mentioned and just used rtalloc().

Would someone like to review this function and see what you think?

nfscl_getmyip(struct nfsmount *nmp, int *isinet6p)
{
 	struct route ro;
 	struct sockaddr_in *sin, *rsin;
 	struct rtentry *rt;
 	u_int8_t *retp = NULL;
 	static struct in_addr laddr;

 	*isinet6p = 0;
 	/*
 	 * Loop up a route for the destination address.
 	 */
 	if (nmp->nm_nam->sa_family == AF_INET) {
 		bzero(&ro, sizeof (ro));
 		rsin = (struct sockaddr_in *)&ro.ro_dst;
 		sin = (struct sockaddr_in *)nmp->nm_nam;
 		rsin->sin_family = AF_INET;
 		rsin->sin_len = sizeof (struct sockaddr_in);
 		rsin->sin_addr = sin->sin_addr;
 		rtalloc(&ro);
 		rt = ro.ro_rt;
 		if (rt != NULL) {
 			if (rt->rt_ifp != NULL &&
 			    rt->rt_ifa != NULL &&
 			    ((rt->rt_ifp->if_flags & IFF_LOOPBACK) == 0) &&
 			    rt->rt_ifa->ifa_addr->sa_family == AF_INET) {
 				sin = (struct sockaddr_in *)
 				    rt->rt_ifa->ifa_addr;
 				laddr = sin->sin_addr;
 				retp = (u_int8_t *)&laddr;
 			}
 			RTFREE(rt);
 		}
#ifdef INET6
 	} else if (nmp->nm_nam->sa_family == AF_INET6) {
 		struct sockaddr_in6 *sin6, *rsin6;
 		struct route_in6 ro6;
 		static struct in6_addr laddr6;

 		bzero(&ro6, sizeof (ro6));
 		rsin6 = (struct sockaddr_in6 *)&ro6.ro_dst;
 		sin6 = (struct sockaddr_in6 *)nmp->nm_nam;
 		rsin6->sin6_family = AF_INET6;
 		rsin6->sin6_len = sizeof (struct sockaddr_in6);
 		rsin6->sin6_addr = sin6->sin6_addr;
 		rtalloc((struct route *)&ro6);
 		rt = ro6.ro_rt;
 		if (rt != NULL) {
 			if (rt->rt_ifp != NULL &&
 			    rt->rt_ifa != NULL &&
 			    ((rt->rt_ifp->if_flags & IFF_LOOPBACK) == 0) &&
 			    rt->rt_ifa->ifa_addr->sa_family == AF_INET6) {
 				sin6 = (struct sockaddr_in6 *)
 				    rt->rt_ifa->ifa_addr;
 				laddr6 = sin6->sin6_addr;
 				retp = (u_int8_t *)&laddr6;
 				*isinet6p = 1;
 			}
 			RTFREE(rt);
 		}
#endif
 	}
 	return (retp);
}

Thanks everyone, for your help sofar, rick






Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.GSO.4.63.0903311604100.15846>