diff options
Diffstat (limited to 'include/linux/sunrpc/clnt.h')
-rw-r--r-- | include/linux/sunrpc/clnt.h | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/include/linux/sunrpc/clnt.h b/include/linux/sunrpc/clnt.h index ab3f6e90caa5..b17df361be82 100644 --- a/include/linux/sunrpc/clnt.h +++ b/include/linux/sunrpc/clnt.h | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <linux/sunrpc/timer.h> | 22 | #include <linux/sunrpc/timer.h> |
23 | #include <asm/signal.h> | 23 | #include <asm/signal.h> |
24 | #include <linux/path.h> | 24 | #include <linux/path.h> |
25 | #include <net/ipv6.h> | ||
25 | 26 | ||
26 | struct rpc_inode; | 27 | struct rpc_inode; |
27 | 28 | ||
@@ -188,5 +189,52 @@ static inline void rpc_set_port(struct sockaddr *sap, | |||
188 | #define IPV6_SCOPE_DELIMITER '%' | 189 | #define IPV6_SCOPE_DELIMITER '%' |
189 | #define IPV6_SCOPE_ID_LEN sizeof("%nnnnnnnnnn") | 190 | #define IPV6_SCOPE_ID_LEN sizeof("%nnnnnnnnnn") |
190 | 191 | ||
192 | static inline bool __rpc_cmp_addr4(const struct sockaddr *sap1, | ||
193 | const struct sockaddr *sap2) | ||
194 | { | ||
195 | const struct sockaddr_in *sin1 = (const struct sockaddr_in *)sap1; | ||
196 | const struct sockaddr_in *sin2 = (const struct sockaddr_in *)sap2; | ||
197 | |||
198 | return sin1->sin_addr.s_addr == sin2->sin_addr.s_addr; | ||
199 | } | ||
200 | |||
201 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | ||
202 | static inline bool __rpc_cmp_addr6(const struct sockaddr *sap1, | ||
203 | const struct sockaddr *sap2) | ||
204 | { | ||
205 | const struct sockaddr_in6 *sin1 = (const struct sockaddr_in6 *)sap1; | ||
206 | const struct sockaddr_in6 *sin2 = (const struct sockaddr_in6 *)sap2; | ||
207 | return ipv6_addr_equal(&sin1->sin6_addr, &sin2->sin6_addr); | ||
208 | } | ||
209 | #else /* !(CONFIG_IPV6 || CONFIG_IPV6_MODULE) */ | ||
210 | static inline bool __rpc_cmp_addr6(const struct sockaddr *sap1, | ||
211 | const struct sockaddr *sap2) | ||
212 | { | ||
213 | return false; | ||
214 | } | ||
215 | #endif /* !(CONFIG_IPV6 || CONFIG_IPV6_MODULE) */ | ||
216 | |||
217 | /** | ||
218 | * rpc_cmp_addr - compare the address portion of two sockaddrs. | ||
219 | * @sap1: first sockaddr | ||
220 | * @sap2: second sockaddr | ||
221 | * | ||
222 | * Just compares the family and address portion. Ignores port, scope, etc. | ||
223 | * Returns true if the addrs are equal, false if they aren't. | ||
224 | */ | ||
225 | static inline bool rpc_cmp_addr(const struct sockaddr *sap1, | ||
226 | const struct sockaddr *sap2) | ||
227 | { | ||
228 | if (sap1->sa_family == sap2->sa_family) { | ||
229 | switch (sap1->sa_family) { | ||
230 | case AF_INET: | ||
231 | return __rpc_cmp_addr4(sap1, sap2); | ||
232 | case AF_INET6: | ||
233 | return __rpc_cmp_addr6(sap1, sap2); | ||
234 | } | ||
235 | } | ||
236 | return false; | ||
237 | } | ||
238 | |||
191 | #endif /* __KERNEL__ */ | 239 | #endif /* __KERNEL__ */ |
192 | #endif /* _LINUX_SUNRPC_CLNT_H */ | 240 | #endif /* _LINUX_SUNRPC_CLNT_H */ |