diff options
| author | Jeff Layton <jlayton@redhat.com> | 2009-08-14 12:57:55 -0400 |
|---|---|---|
| committer | J. Bruce Fields <bfields@citi.umich.edu> | 2009-08-21 11:27:43 -0400 |
| commit | be3ad6b0b675fd1d6b48362ca30bdee75fbef6b4 (patch) | |
| tree | a71d748cce9e6284e18aa681ed30ab8775415480 /include | |
| parent | 4516fc0454e7ffe2f369e80045b23c2b32155004 (diff) | |
sunrpc: add common routine for copying address portion of a sockaddr
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')
| -rw-r--r-- | include/linux/sunrpc/clnt.h | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/include/linux/sunrpc/clnt.h b/include/linux/sunrpc/clnt.h index b17df361be82..044f531aee70 100644 --- a/include/linux/sunrpc/clnt.h +++ b/include/linux/sunrpc/clnt.h | |||
| @@ -198,6 +198,17 @@ static inline bool __rpc_cmp_addr4(const struct sockaddr *sap1, | |||
| 198 | return sin1->sin_addr.s_addr == sin2->sin_addr.s_addr; | 198 | return sin1->sin_addr.s_addr == sin2->sin_addr.s_addr; |
| 199 | } | 199 | } |
| 200 | 200 | ||
| 201 | static inline bool __rpc_copy_addr4(struct sockaddr *dst, | ||
| 202 | const struct sockaddr *src) | ||
| 203 | { | ||
| 204 | const struct sockaddr_in *ssin = (struct sockaddr_in *) src; | ||
| 205 | struct sockaddr_in *dsin = (struct sockaddr_in *) dst; | ||
| 206 | |||
| 207 | dsin->sin_family = ssin->sin_family; | ||
| 208 | dsin->sin_addr.s_addr = ssin->sin_addr.s_addr; | ||
| 209 | return true; | ||
| 210 | } | ||
| 211 | |||
| 201 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | 212 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) |
| 202 | static inline bool __rpc_cmp_addr6(const struct sockaddr *sap1, | 213 | static inline bool __rpc_cmp_addr6(const struct sockaddr *sap1, |
| 203 | const struct sockaddr *sap2) | 214 | const struct sockaddr *sap2) |
| @@ -206,12 +217,29 @@ static inline bool __rpc_cmp_addr6(const struct sockaddr *sap1, | |||
| 206 | const struct sockaddr_in6 *sin2 = (const struct sockaddr_in6 *)sap2; | 217 | const struct sockaddr_in6 *sin2 = (const struct sockaddr_in6 *)sap2; |
| 207 | return ipv6_addr_equal(&sin1->sin6_addr, &sin2->sin6_addr); | 218 | return ipv6_addr_equal(&sin1->sin6_addr, &sin2->sin6_addr); |
| 208 | } | 219 | } |
| 220 | |||
| 221 | static inline bool __rpc_copy_addr6(struct sockaddr *dst, | ||
| 222 | const struct sockaddr *src) | ||
| 223 | { | ||
| 224 | const struct sockaddr_in6 *ssin6 = (const struct sockaddr_in6 *) src; | ||
| 225 | struct sockaddr_in6 *dsin6 = (struct sockaddr_in6 *) dst; | ||
| 226 | |||
| 227 | dsin6->sin6_family = ssin6->sin6_family; | ||
| 228 | ipv6_addr_copy(&dsin6->sin6_addr, &ssin6->sin6_addr); | ||
| 229 | return true; | ||
| 230 | } | ||
| 209 | #else /* !(CONFIG_IPV6 || CONFIG_IPV6_MODULE) */ | 231 | #else /* !(CONFIG_IPV6 || CONFIG_IPV6_MODULE) */ |
| 210 | static inline bool __rpc_cmp_addr6(const struct sockaddr *sap1, | 232 | static inline bool __rpc_cmp_addr6(const struct sockaddr *sap1, |
| 211 | const struct sockaddr *sap2) | 233 | const struct sockaddr *sap2) |
| 212 | { | 234 | { |
| 213 | return false; | 235 | return false; |
| 214 | } | 236 | } |
| 237 | |||
| 238 | static inline bool __rpc_copy_addr6(struct sockaddr *dst, | ||
| 239 | const struct sockaddr *src) | ||
| 240 | { | ||
| 241 | return false; | ||
| 242 | } | ||
| 215 | #endif /* !(CONFIG_IPV6 || CONFIG_IPV6_MODULE) */ | 243 | #endif /* !(CONFIG_IPV6 || CONFIG_IPV6_MODULE) */ |
| 216 | 244 | ||
| 217 | /** | 245 | /** |
| @@ -236,5 +264,27 @@ static inline bool rpc_cmp_addr(const struct sockaddr *sap1, | |||
| 236 | return false; | 264 | return false; |
| 237 | } | 265 | } |
| 238 | 266 | ||
| 267 | /** | ||
| 268 | * rpc_copy_addr - copy the address portion of one sockaddr to another | ||
| 269 | * @dst: destination sockaddr | ||
| 270 | * @src: source sockaddr | ||
| 271 | * | ||
| 272 | * Just copies the address portion and family. Ignores port, scope, etc. | ||
| 273 | * Caller is responsible for making certain that dst is large enough to hold | ||
| 274 | * the address in src. Returns true if address family is supported. Returns | ||
| 275 | * false otherwise. | ||
| 276 | */ | ||
| 277 | static inline bool rpc_copy_addr(struct sockaddr *dst, | ||
| 278 | const struct sockaddr *src) | ||
| 279 | { | ||
| 280 | switch (src->sa_family) { | ||
| 281 | case AF_INET: | ||
| 282 | return __rpc_copy_addr4(dst, src); | ||
| 283 | case AF_INET6: | ||
| 284 | return __rpc_copy_addr6(dst, src); | ||
| 285 | } | ||
| 286 | return false; | ||
| 287 | } | ||
| 288 | |||
| 239 | #endif /* __KERNEL__ */ | 289 | #endif /* __KERNEL__ */ |
| 240 | #endif /* _LINUX_SUNRPC_CLNT_H */ | 290 | #endif /* _LINUX_SUNRPC_CLNT_H */ |
