From: Yu Watanabe Date: Fri, 17 Sep 2021 12:38:00 +0000 (+0900) Subject: in-addr-util: introduce in{4,6}_addr_mask() X-Git-Tag: v250-rc1~552^2~20 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=333f7d8920f0c199818eb8f59ff7fccccd063be1;p=thirdparty%2Fsystemd.git in-addr-util: introduce in{4,6}_addr_mask() --- diff --git a/src/basic/in-addr-util.c b/src/basic/in-addr-util.c index c262dfe1560..af3724d9d1f 100644 --- a/src/basic/in-addr-util.c +++ b/src/basic/in-addr-util.c @@ -621,40 +621,49 @@ int in4_addr_default_subnet_mask(const struct in_addr *addr, struct in_addr *mas 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, diff --git a/src/basic/in-addr-util.h b/src/basic/in-addr-util.h index 1d610c10c83..50d51297e0b 100644 --- a/src/basic/in-addr-util.h +++ b/src/basic/in-addr-util.h @@ -89,6 +89,8 @@ unsigned char in4_addr_netmask_to_prefixlen(const struct in_addr *addr); 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);