net/utils: Introduce inet_addr_is_any
authorSagi Grimberg <sagi@grimberg.me>
Wed, 24 Jan 2018 18:24:24 +0000 (20:24 +0200)
committerJens Axboe <axboe@kernel.dk>
Mon, 26 Mar 2018 14:53:43 +0000 (08:53 -0600)
Can be useful to check INET_ANY address for both ipv4/ipv6 addresses.

Reviewed-by: Bart Van Assche <bart.vanassche@wdc.com>
Signed-off-by: Sagi Grimberg <sagi@grimberg.me>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Jens Axboe <axboe@kernel.dk>
include/linux/inet.h
net/core/utils.c

index 636ebe87e6f886a2edbb6e3e8bd01b360998127a..97defc1139e91dcd278e8fba22a9882e7ac32105 100644 (file)
@@ -59,5 +59,6 @@ extern int in6_pton(const char *src, int srclen, u8 *dst, int delim, const char
 
 extern int inet_pton_with_scope(struct net *net, unsigned short af,
                const char *src, const char *port, struct sockaddr_storage *addr);
+extern bool inet_addr_is_any(struct sockaddr *addr);
 
 #endif /* _LINUX_INET_H */
index 93066bd0305ab73dbee756125e2cb77b7f46aa44..d47863b07a606a5a1e98906471ee23b447dd1f9a 100644 (file)
@@ -403,6 +403,29 @@ int inet_pton_with_scope(struct net *net, __kernel_sa_family_t af,
 }
 EXPORT_SYMBOL(inet_pton_with_scope);
 
+bool inet_addr_is_any(struct sockaddr *addr)
+{
+       if (addr->sa_family == AF_INET6) {
+               struct sockaddr_in6 *in6 = (struct sockaddr_in6 *)addr;
+               const struct sockaddr_in6 in6_any =
+                       { .sin6_addr = IN6ADDR_ANY_INIT };
+
+               if (!memcmp(in6->sin6_addr.s6_addr,
+                           in6_any.sin6_addr.s6_addr, 16))
+                       return true;
+       } else if (addr->sa_family == AF_INET) {
+               struct sockaddr_in *in = (struct sockaddr_in *)addr;
+
+               if (in->sin_addr.s_addr == htonl(INADDR_ANY))
+                       return true;
+       } else {
+               pr_warn("unexpected address family %u\n", addr->sa_family);
+       }
+
+       return false;
+}
+EXPORT_SYMBOL(inet_addr_is_any);
+
 void inet_proto_csum_replace4(__sum16 *sum, struct sk_buff *skb,
                              __be32 from, __be32 to, bool pseudohdr)
 {