return 0;
}
-int in_addr_mask(int family, union in_addr_union *addr, unsigned char prefixlen) {
- assert(addr);
-
- if (family == AF_INET) {
- struct in_addr mask;
+int in4_addr_mask(struct in_addr *addr, unsigned char prefixlen) {
+ struct in_addr mask;
- if (!in4_addr_prefixlen_to_netmask(&mask, prefixlen))
- return -EINVAL;
+ assert(addr);
- addr->in.s_addr &= mask.s_addr;
- return 0;
- }
+ if (!in4_addr_prefixlen_to_netmask(&mask, prefixlen))
+ return -EINVAL;
- if (family == AF_INET6) {
- unsigned i;
+ addr->s_addr &= mask.s_addr;
+ return 0;
+}
- for (i = 0; i < 16; i++) {
- uint8_t mask;
+int in6_addr_mask(struct in6_addr *addr, unsigned char prefixlen) {
+ unsigned i;
- if (prefixlen >= 8) {
- mask = 0xFF;
- prefixlen -= 8;
- } else {
- mask = 0xFF << (8 - prefixlen);
- prefixlen = 0;
- }
+ for (i = 0; i < 16; i++) {
+ uint8_t mask;
- addr->in6.s6_addr[i] &= mask;
+ if (prefixlen >= 8) {
+ mask = 0xFF;
+ prefixlen -= 8;
+ } else {
+ mask = 0xFF << (8 - prefixlen);
+ prefixlen = 0;
}
- return 0;
+ addr->s6_addr[i] &= mask;
}
- return -EAFNOSUPPORT;
+ return 0;
+}
+
+int in_addr_mask(int family, union in_addr_union *addr, unsigned char prefixlen) {
+ assert(addr);
+
+ switch (family) {
+ case AF_INET:
+ return in4_addr_mask(&addr->in, prefixlen);
+ case AF_INET6:
+ return in6_addr_mask(&addr->in6, prefixlen);
+ default:
+ return -EAFNOSUPPORT;
+ }
}
int in_addr_prefix_covers(int family,
struct in_addr* in4_addr_prefixlen_to_netmask(struct in_addr *addr, unsigned char prefixlen);
int in4_addr_default_prefixlen(const struct in_addr *addr, unsigned char *prefixlen);
int in4_addr_default_subnet_mask(const struct in_addr *addr, struct in_addr *mask);
+int in4_addr_mask(struct in_addr *addr, unsigned char prefixlen);
+int in6_addr_mask(struct in6_addr *addr, unsigned char prefixlen);
int in_addr_mask(int family, union in_addr_union *addr, unsigned char prefixlen);
int in_addr_prefix_covers(int family, const union in_addr_union *prefix, unsigned char prefixlen, const union in_addr_union *address);
int in_addr_parse_prefixlen(int family, const char *p, unsigned char *ret);