]> jfr.im git - irc/quakenet/newserv.git/blobdiff - lib/irc_ipv6.h
TRUSTS: require sqlite
[irc/quakenet/newserv.git] / lib / irc_ipv6.h
index d78efc8d529b7bb85a944dbcb447cd0ed4483643..584385787ed04f24cb9432591a7de9880da5d4c4 100644 (file)
@@ -3,6 +3,8 @@
 #ifndef __irc_ipv6_H
 #define __irc_ipv6_H
 
+#include <limits.h>
+
 /* 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 */