From owner-freebsd-arch@FreeBSD.ORG Mon Mar 30 22:00:41 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 3C5C3106564A for ; Mon, 30 Mar 2009 22:00:41 +0000 (UTC) (envelope-from julian@elischer.org) Received: from outN.internet-mail-service.net (outn.internet-mail-service.net [216.240.47.237]) by mx1.freebsd.org (Postfix) with ESMTP id 240DF8FC08 for ; Mon, 30 Mar 2009 22:00:41 +0000 (UTC) (envelope-from julian@elischer.org) Received: from idiom.com (mx0.idiom.com [216.240.32.160]) by out.internet-mail-service.net (Postfix) with ESMTP id 19CF853305; Mon, 30 Mar 2009 14:49:59 -0700 (PDT) X-Client-Authorized: MaGic Cook1e X-Client-Authorized: MaGic Cook1e Received: from julian-mac.elischer.org (nat.ironport.com [63.251.108.100]) by idiom.com (Postfix) with ESMTP id 1F6E32D603B; Mon, 30 Mar 2009 14:49:56 -0700 (PDT) Message-ID: <49D13E9C.8010005@elischer.org> Date: Mon, 30 Mar 2009 14:50:20 -0700 From: Julian Elischer User-Agent: Thunderbird 2.0.0.21 (Macintosh/20090302) MIME-Version: 1.0 To: Rick Macklem References: In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit 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: Mon, 30 Mar 2009 22:00:41 -0000 Rick Macklem wrote: > Well, since the last one turned out to be too easy, here's one I think > is a little tougher... > > The nfsv4 client needs to know an ip address for the machine, that can > be used by servers to do callbacks on the client. I currently use the > following, which I know isn't correct, but usually works ok: > > loopb = htonl(INADDR_LOOPBACK); > TAILQ_FOREACH(ia, &in_ifaddrhead, ia_link) { > if (IA_SIN(ia)->sin_addr.s_addr != loopb) > return (&(IA_SIN(ia)->sin_addr.s_addr)); > } > return (NULL); It's important that the address you use be an address that is in the same 'security domain' as the client.. The best way to do that is to find an address that is on the interface that will be used to send the packet out. So you want to do a route lookup so use rtalloc or friends (see route.c). you want to use the same code that is used in ip_output (or is it {udp/tcp}_output?) to fidn the local address when teh user specifies INADDR_ANY. > > Now, I could just make it a constant set by an rc script (argument to > the callback daemon or a sysctl variable), but that's a bother for > laptops using dhcp and similar. I think allowing an argument to the > callback daemon is a good fallback, but it would be nice if it didn't > normally have to be set for things to work ok. > > Any ideas on how to do this? > > Thanks in advance for any help, rick > ps: Part of the reason that the above loop doesn't seem to be good > enough is that it requires "options VIMAGE_GLOBALS" to build. > > _______________________________________________ > freebsd-arch@freebsd.org mailing list > http://lists.freebsd.org/mailman/listinfo/freebsd-arch > To unsubscribe, send any mail to "freebsd-arch-unsubscribe@freebsd.org"