X-Git-Url: https://jfr.im/git/irc/quakenet/newserv.git/blobdiff_plain/47217d7bef39ecfc1387708f2604027a88bd8aa5..8855bb48b449ed06cfd3ce528b3c0a77c37cb24b:/lib/irc_ipv6.h diff --git a/lib/irc_ipv6.h b/lib/irc_ipv6.h index d78efc8d..58438578 100644 --- a/lib/irc_ipv6.h +++ b/lib/irc_ipv6.h @@ -3,6 +3,8 @@ #ifndef __irc_ipv6_H #define __irc_ipv6_H +#include + /* from res.h */ /** Structure to store an IP address. */ @@ -18,6 +20,8 @@ struct irc_sockaddr unsigned short port; /**< Port number, host-endian. */ }; +#define irc_bitlen(ADDR, BITS) (irc_in_addr_is_ipv4(ADDR) ? (BITS) - 96 : (BITS)) + /** Evaluate to non-zero if \a ADDR is a valid address (not all 0s and not all 1s). */ #define irc_in_addr_valid(ADDR) (((ADDR)->in6_16[0] && ~(ADDR)->in6_16[0]) \ || (ADDR)->in6_16[1] != (ADDR)->in6_16[0] \ @@ -29,8 +33,8 @@ struct irc_sockaddr || (ADDR)->in6_16[7] != (ADDR)->in6_16[0]) /** Evaluate to non-zero if \a ADDR (of type struct irc_in_addr) is an IPv4 address. */ #define irc_in_addr_is_ipv4(ADDR) (!(ADDR)->in6_16[0] && !(ADDR)->in6_16[1] && !(ADDR)->in6_16[2] \ - && !(ADDR)->in6_16[3] && !(ADDR)->in6_16[4] && (ADDR)->in6_16[6] \ - && (!(ADDR)->in6_16[5] || (ADDR)->in6_16[5] == 65535)) + && !(ADDR)->in6_16[3] && !(ADDR)->in6_16[4] && ((!(ADDR)->in6_16[5] \ + && (ADDR)->in6_16[6]) || (ADDR)->in6_16[5] == 65535)) /** Evaluate to non-zero if \a A is a different IP than \a B. */ #define irc_in_addr_cmp(A,B) (irc_in_addr_is_ipv4(A) ? ((A)->in6_16[6] != (B)->in6_16[6] \ || (A)->in6_16[7] != (B)->in6_16[7] || !irc_in_addr_is_ipv4(B)) \ @@ -52,14 +56,21 @@ struct irc_sockaddr */ #define SOCKIPLEN 45 +#define CIDRLEN SOCKIPLEN + 4 + /* from ircd_string.h */ extern const char* ircd_ntoa(const struct irc_in_addr* addr); extern const char* ircd_ntoa_r(char* buf, const struct irc_in_addr* addr); +extern const char * ircd_ntoa_masked(const struct irc_in_addr* addr, unsigned char bits); +extern const char* ircd_ntoa_masked_r(char* buf, const struct irc_in_addr* in, unsigned char bits); #define ircd_aton(ADDR, STR) ipmask_parse((STR), (ADDR), NULL) extern int ipmask_parse(const char *in, struct irc_in_addr *mask, unsigned char *bits_ptr); +extern int ipmask_check(const struct irc_in_addr *, const struct irc_in_addr *, unsigned char); +void ip_canonicalize_tunnel(struct irc_in_addr *out, const struct irc_in_addr *in); #define IPtostr(ipaddr) ircd_ntoa(&(ipaddr)) +#define CIDRtostr(ipaddr, bits) ircd_ntoa_masked(&(ipaddr), bits) #define irc_in_addr_v4_to_int(ADDR) ((ntohs((ADDR)->in6_16[6]) << 16) | ntohs((ADDR)->in6_16[7])) /* from numnicks.h */