1 /* SPDX-License-Identifier: LGPL-2.1+ */
4 #include <netinet/in.h>
6 #include <sys/socket.h>
8 #include "hash-funcs.h"
19 union in_addr_union address
;
22 bool in4_addr_is_null(const struct in_addr
*a
);
23 int in_addr_is_null(int family
, const union in_addr_union
*u
);
25 int in_addr_is_multicast(int family
, const union in_addr_union
*u
);
27 bool in4_addr_is_link_local(const struct in_addr
*a
);
28 int in_addr_is_link_local(int family
, const union in_addr_union
*u
);
30 bool in4_addr_is_localhost(const struct in_addr
*a
);
31 int in_addr_is_localhost(int family
, const union in_addr_union
*u
);
33 int in_addr_equal(int family
, const union in_addr_union
*a
, const union in_addr_union
*b
);
34 int in_addr_prefix_intersect(int family
, const union in_addr_union
*a
, unsigned aprefixlen
, const union in_addr_union
*b
, unsigned bprefixlen
);
35 int in_addr_prefix_next(int family
, union in_addr_union
*u
, unsigned prefixlen
);
36 int in_addr_to_string(int family
, const union in_addr_union
*u
, char **ret
);
37 int in_addr_ifindex_to_string(int family
, const union in_addr_union
*u
, int ifindex
, char **ret
);
38 int in_addr_from_string(int family
, const char *s
, union in_addr_union
*ret
);
39 int in_addr_from_string_auto(const char *s
, int *ret_family
, union in_addr_union
*ret
);
40 int in_addr_ifindex_from_string_auto(const char *s
, int *family
, union in_addr_union
*ret
, int *ifindex
);
41 unsigned char in4_addr_netmask_to_prefixlen(const struct in_addr
*addr
);
42 struct in_addr
* in4_addr_prefixlen_to_netmask(struct in_addr
*addr
, unsigned char prefixlen
);
43 int in4_addr_default_prefixlen(const struct in_addr
*addr
, unsigned char *prefixlen
);
44 int in4_addr_default_subnet_mask(const struct in_addr
*addr
, struct in_addr
*mask
);
45 int in_addr_mask(int family
, union in_addr_union
*addr
, unsigned char prefixlen
);
46 int in_addr_prefix_covers(int family
, const union in_addr_union
*prefix
, unsigned char prefixlen
, const union in_addr_union
*address
);
47 int in_addr_parse_prefixlen(int family
, const char *p
, unsigned char *ret
);
48 int in_addr_prefix_from_string_internal(const char *p
, bool use_default_prefixlen
, int family
, union in_addr_union
*ret_prefix
, unsigned char *ret_prefixlen
);
49 int in_addr_prefix_from_string_auto_internal(const char *p
, bool use_default_prefixlen
, int *ret_family
, union in_addr_union
*ret_prefix
, unsigned char *ret_prefixlen
);
50 static inline int in_addr_prefix_from_string(const char *p
, int family
, union in_addr_union
*ret_prefix
, unsigned char *ret_prefixlen
) {
51 return in_addr_prefix_from_string_internal(p
, false, family
, ret_prefix
, ret_prefixlen
);
53 static inline int in_addr_prefix_from_string_auto(const char *p
, int *ret_family
, union in_addr_union
*ret_prefix
, unsigned char *ret_prefixlen
) {
54 return in_addr_prefix_from_string_auto_internal(p
, false, ret_family
, ret_prefix
, ret_prefixlen
);
56 static inline int in_addr_default_prefix_from_string(const char *p
, int family
, union in_addr_union
*ret_prefix
, unsigned char *ret_prefixlen
) {
57 return in_addr_prefix_from_string_internal(p
, true, family
, ret_prefix
, ret_prefixlen
);
59 static inline int in_addr_default_prefix_from_string_auto(const char *p
, int *ret_family
, union in_addr_union
*ret_prefix
, unsigned char *ret_prefixlen
) {
60 return in_addr_prefix_from_string_auto_internal(p
, true, ret_family
, ret_prefix
, ret_prefixlen
);
63 static inline size_t FAMILY_ADDRESS_SIZE(int family
) {
64 assert(IN_SET(family
, AF_INET
, AF_INET6
));
65 return family
== AF_INET6
? 16 : 4;
68 /* Workaround for clang, explicitly specify the maximum-size element here.
69 * See also oss-fuzz#11344. */
70 #define IN_ADDR_NULL ((union in_addr_union) { .in6 = {} })
72 extern const struct hash_ops in_addr_data_hash_ops
;