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