Date: Wed, 17 Jun 2009 09:25:57 -0700 From: Zachary Loafman <zml@FreeBSD.org> To: Martin <nakal@web.de> Cc: freebsd-current@freebsd.org Subject: Re: RPCPROG_MNT: RPC: Timed out / receiving NFS error when trying to mount NFS file system after make world Message-ID: <20090617162557.GA16254@isilon.com> In-Reply-To: <Pine.GSO.4.63.0906171130290.13367@muncher.cs.uoguelph.ca> References: <4A2504AA.1020406@zedat.fu-berlin.de> <20090603235227.GB15659@hades.panopticon> <Pine.GSO.4.63.0906051107540.24102@muncher.cs.uoguelph.ca> <20090615173315.1cdb39e1@zelda.local> <Pine.GSO.4.63.0906151617390.8894@muncher.cs.uoguelph.ca> <20090616000758.714912e6@zelda.local> <Pine.GSO.4.63.0906161515370.23973@muncher.cs.uoguelph.ca> <20090616215803.4a3aa748@zelda.local> <Pine.GSO.4.63.0906171130290.13367@muncher.cs.uoguelph.ca>
next in thread | previous in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
On Wed, Jun 17, 2009 at 11:35:19AM -0400, Rick Macklem wrote:
> One that might be worth trying is a pre-r192913 svc_dg.c. I'll email
> you a copy of that, in case you don't have an easy way to get one.
This was my rev, and may have some subtle issues on 8.0 (it was
originally a 6.x based patch). I've attached a lib/libc/rpc/svc_dg.c
patch from Rachel Hestilow that may fix your issue. Martin, can you test
it in your environment? I'll get it approved / checked in soon.
--
Zach Loafman | Staff Engineer | Isilon Systems
[-- Attachment #2 --]
Index: svc_dg.c
===================================================================
--- svc_dg.c (revision 120171)
+++ svc_dg.c (working copy)
@@ -222,20 +222,25 @@ svc_dg_recvfrom(int fd, char *buf, int b
if (!have_lin)
return rlen;
lin->sin_family = AF_INET;
lin->sin_port = 0;
*laddrlen = sizeof(struct sockaddr_in);
return rlen;
}
+/*
+ * Wrapper that acts like recvfrom. Captures the local address for
+ * incoming packets so that it can be sent out later using
+ * IP_SENDSRCADDR.
+ */
static bool_t
svc_dg_recv(xprt, msg)
SVCXPRT *xprt;
struct rpc_msg *msg;
{
struct svc_dg_data *su = su_data(xprt);
XDR *xdrs = &(su->su_xdrs);
char *reply;
struct sockaddr_storage ss;
socklen_t alen;
@@ -273,41 +278,45 @@ again:
if (su->su_cache != NULL) {
if (cache_get(xprt, msg, &reply, &replylen)) {
(void)_sendto(xprt->xp_fd, reply, replylen, 0,
(struct sockaddr *)(void *)&ss, alen);
return (FALSE);
}
}
return (TRUE);
}
+/*
+ * Wrapper for sendto. If laddr is set to a specific address,
+ * it will be sent out as a source address using IP_SENDSRCADDR.
+ */
static int
svc_dg_sendto(int fd, char *buf, int buflen,
const struct sockaddr *raddr, socklen_t raddrlen,
const struct sockaddr *laddr, socklen_t laddrlen)
{
struct msghdr msg;
struct iovec msg_iov[1];
struct sockaddr_in *laddr_in = (struct sockaddr_in *)laddr;
struct in_addr *lin = &laddr_in->sin_addr;
char tmp[CMSG_SPACE(sizeof(*lin))];
struct cmsghdr *cmsg;
memset((char *)&msg, 0, sizeof(msg));
msg_iov[0].iov_base = buf;
msg_iov[0].iov_len = buflen;
msg.msg_iov = msg_iov;
msg.msg_iovlen = 1;
msg.msg_namelen = raddrlen;
msg.msg_name = (char *)raddr;
- if (laddr->sa_family == AF_INET) {
+ if (laddr->sa_family == AF_INET && lin->s_addr != INADDR_ANY) {
msg.msg_control = (caddr_t)tmp;
msg.msg_controllen = CMSG_LEN(sizeof(*lin));
cmsg = CMSG_FIRSTHDR(&msg);
cmsg->cmsg_len = CMSG_LEN(sizeof(*lin));
cmsg->cmsg_level = IPPROTO_IP;
cmsg->cmsg_type = IP_SENDSRCADDR;
memcpy(CMSG_DATA(cmsg), lin, sizeof(*lin));
}
return _sendmsg(fd, &msg, 0);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20090617162557.GA16254>
