From owner-freebsd-arch@FreeBSD.ORG Tue Mar 31 20:07:46 2009 Return-Path: Delivered-To: freebsd-arch@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 9F6DB106564A for ; Tue, 31 Mar 2009 20:07:46 +0000 (UTC) (envelope-from rmacklem@uoguelph.ca) Received: from skerryvore.cs.uoguelph.ca (skerryvore.cs.uoguelph.ca [131.104.94.204]) by mx1.freebsd.org (Postfix) with ESMTP id 5D4F28FC23 for ; Tue, 31 Mar 2009 20:07:46 +0000 (UTC) (envelope-from rmacklem@uoguelph.ca) Received: from muncher.cs.uoguelph.ca (muncher.cs.uoguelph.ca [131.104.91.102]) by skerryvore.cs.uoguelph.ca (8.13.1/8.13.1) with ESMTP id n2VK7hxT007982; Tue, 31 Mar 2009 16:07:43 -0400 Received: from localhost (rmacklem@localhost) by muncher.cs.uoguelph.ca (8.11.7p3+Sun/8.11.6) with ESMTP id n2VKDcO17420; Tue, 31 Mar 2009 16:13:38 -0400 (EDT) X-Authentication-Warning: muncher.cs.uoguelph.ca: rmacklem owned process doing -bs Date: Tue, 31 Mar 2009 16:13:38 -0400 (EDT) From: Rick Macklem X-X-Sender: rmacklem@muncher.cs.uoguelph.ca To: Julian Elischer In-Reply-To: <49D13E9C.8010005@elischer.org> Message-ID: References: <49D13E9C.8010005@elischer.org> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed X-Scanned-By: MIMEDefang 2.63 on 131.104.94.204 Cc: freebsd-arch@freebsd.org Subject: Re: getting a callback ip address for nfsv4 client X-BeenThere: freebsd-arch@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussion related to FreeBSD architecture List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 31 Mar 2009 20:07:47 -0000 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