diff options
author | Jeff Layton <jlayton@redhat.com> | 2009-08-14 12:57:59 -0400 |
---|---|---|
committer | J. Bruce Fields <bfields@citi.umich.edu> | 2009-08-21 11:27:44 -0400 |
commit | fbf4665f41b02e757ab9d9198df65e319388e728 (patch) | |
tree | ec0b8b4f3809ee38088504bf51440ee12f501085 /include/linux/sunrpc | |
parent | 7077ecbabd626cce1fcf5cc9766c83ec04d919f9 (diff) |
nfsd: populate sin6_scope_id on callback address with scopeid from rq_addr on SETCLIENTID call
When a SETCLIENTID call comes in, one of the args given is the svc_rqst.
This struct contains an rq_addr field which holds the address that sent
the call. If this is an IPv6 address, then we can use the sin6_scope_id
field in this address to populate the sin6_scope_id field in the
callback address.
AFAICT, the rq_addr.sin6_scope_id is non-zero if and only if the client
mounted the server's link-local address.
Signed-off-by: Jeff Layton <jlayton@redhat.com>
Acked-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
Diffstat (limited to 'include/linux/sunrpc')
-rw-r--r-- | include/linux/sunrpc/clnt.h | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/include/linux/sunrpc/clnt.h b/include/linux/sunrpc/clnt.h index 044f531aee70..3d025588e56e 100644 --- a/include/linux/sunrpc/clnt.h +++ b/include/linux/sunrpc/clnt.h | |||
@@ -286,5 +286,20 @@ static inline bool rpc_copy_addr(struct sockaddr *dst, | |||
286 | return false; | 286 | return false; |
287 | } | 287 | } |
288 | 288 | ||
289 | /** | ||
290 | * rpc_get_scope_id - return scopeid for a given sockaddr | ||
291 | * @sa: sockaddr to get scopeid from | ||
292 | * | ||
293 | * Returns the value of the sin6_scope_id for AF_INET6 addrs, or 0 if | ||
294 | * not an AF_INET6 address. | ||
295 | */ | ||
296 | static inline u32 rpc_get_scope_id(const struct sockaddr *sa) | ||
297 | { | ||
298 | if (sa->sa_family != AF_INET6) | ||
299 | return 0; | ||
300 | |||
301 | return ((struct sockaddr_in6 *) sa)->sin6_scope_id; | ||
302 | } | ||
303 | |||
289 | #endif /* __KERNEL__ */ | 304 | #endif /* __KERNEL__ */ |
290 | #endif /* _LINUX_SUNRPC_CLNT_H */ | 305 | #endif /* _LINUX_SUNRPC_CLNT_H */ |