Re: [PATCH v1 01/16] nfsd: fix IPv6 address handling in the DRC

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, 28 Jan 2013 12:16:17 -0800 (PST)
Chuck Lever <chuck.lever@xxxxxxxxxx> wrote:

> 
> On Jan 28, 2013, at 3:05 PM, Jeff Layton <jlayton@xxxxxxxxxx> wrote:
> 
> > On Mon, 28 Jan 2013 11:51:13 -0800 (PST)
> > Chuck Lever <chuck.lever@xxxxxxxxxx> wrote:
> > 
> >> 
> >> On Jan 28, 2013, at 2:41 PM, Jeff Layton <jlayton@xxxxxxxxxx> wrote:
> >> 
> >>> Currently, it only stores the first 16 bytes of any address. struct
> >>> sockaddr_in6 is 28 bytes however, so we're currently ignoring the last
> >>> 12 bytes of the address.
> >>> 
> >>> Expand the c_addr field to a sockaddr_in6,
> >> 
> >> What do you do about link-local addresses?
> >> 
> > 
> > I use rpc_cmp_addr() which should handle the scope correctly for
> > link-local addrs.  Now that you mention it though, I think we may have a
> > bug in __rpc_copy_addr6. It doesn't touch the scope_id at all --
> > shouldn't we be setting the scopeid in that function as well?
> 
> It looks like rpc_copy_addr() is invoked to copy only source addresses, so the scope ID probably doesn't apply.  The comment over rpc_copy_addr() says it explicitly ignores port and scope ID.
> 

Well, it copies the source address of the client, but all of the
callers are in nfsd code. So I think it probably does matter:

Consider a server that has 2 interfaces, and 2 clients with identical
link-local addresses hitting the link local address of each interface.
The only way to distinguish them at that point is to look at their
scope_ids.

In the event that we're not using link-local addresses, the scopeid
should just be ignored. So I think we probably need something like this
patch too:

----------------------[snip]---------------------

sunrpc: copy scope ID in __rpc_copy_addr6

When copying an address, we should also copy the scopeid in the event
that this is a link-local address and the scope matters.

Signed-off-by: Jeff Layton <jlayton@xxxxxxxxxx>
---
 include/linux/sunrpc/clnt.h | 1 +
 1 file changed, 1 insertion(+)

diff --git a/include/linux/sunrpc/clnt.h b/include/linux/sunrpc/clnt.h
index 34206b8..4824286 100644
--- a/include/linux/sunrpc/clnt.h
+++ b/include/linux/sunrpc/clnt.h
@@ -242,6 +242,7 @@ static inline bool __rpc_copy_addr6(struct sockaddr *dst,
 
 	dsin6->sin6_family = ssin6->sin6_family;
 	dsin6->sin6_addr = ssin6->sin6_addr;
+	dsin6->sin6_scope_id = ssin6->sin6_scope_id;
 	return true;
 }
 #else	/* !(IS_ENABLED(CONFIG_IPV6) */
-- 
1.7.11.7


-- 
Jeff Layton <jlayton@xxxxxxxxxx>
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux