]> jfr.im git - irc/quakenet/newserv.git/blame - lib/irc_ipv6.h
Rename trusts_cidr2str to CIDRtostr() and move it to lib/irc_ipv6.c.
[irc/quakenet/newserv.git] / lib / irc_ipv6.h
CommitLineData
526e7c1d
P
1/* IPv6 helper prototypes */
2
3#ifndef __irc_ipv6_H
4#define __irc_ipv6_H
5
e03b3e2b
CP
6#include <limits.h>
7
526e7c1d
P
8/* from res.h */
9
10/** Structure to store an IP address. */
11struct irc_in_addr
12{
13 unsigned short in6_16[8]; /**< IPv6 encoded parts, little-endian. */
14};
15
16/** Structure to store an IP address and port number. */
17struct irc_sockaddr
18{
19 struct irc_in_addr addr; /**< IP address. */
20 unsigned short port; /**< Port number, host-endian. */
21};
22
dfa52f1d
P
23#define irc_bitlen(ADDR, BITS) (irc_in_addr_is_ipv4(ADDR) ? (BITS) - 96 : (BITS))
24
526e7c1d
P
25/** Evaluate to non-zero if \a ADDR is a valid address (not all 0s and not all 1s). */
26#define irc_in_addr_valid(ADDR) (((ADDR)->in6_16[0] && ~(ADDR)->in6_16[0]) \
27 || (ADDR)->in6_16[1] != (ADDR)->in6_16[0] \
28 || (ADDR)->in6_16[2] != (ADDR)->in6_16[0] \
29 || (ADDR)->in6_16[3] != (ADDR)->in6_16[0] \
30 || (ADDR)->in6_16[4] != (ADDR)->in6_16[0] \
31 || (ADDR)->in6_16[5] != (ADDR)->in6_16[0] \
32 || (ADDR)->in6_16[6] != (ADDR)->in6_16[0] \
33 || (ADDR)->in6_16[7] != (ADDR)->in6_16[0])
34/** Evaluate to non-zero if \a ADDR (of type struct irc_in_addr) is an IPv4 address. */
35#define irc_in_addr_is_ipv4(ADDR) (!(ADDR)->in6_16[0] && !(ADDR)->in6_16[1] && !(ADDR)->in6_16[2] \
7e7f5936
P
36 && !(ADDR)->in6_16[3] && !(ADDR)->in6_16[4] && ((!(ADDR)->in6_16[5] \
37 && (ADDR)->in6_16[6]) || (ADDR)->in6_16[5] == 65535))
526e7c1d
P
38/** Evaluate to non-zero if \a A is a different IP than \a B. */
39#define irc_in_addr_cmp(A,B) (irc_in_addr_is_ipv4(A) ? ((A)->in6_16[6] != (B)->in6_16[6] \
40 || (A)->in6_16[7] != (B)->in6_16[7] || !irc_in_addr_is_ipv4(B)) \
41 : memcmp((A), (B), sizeof(struct irc_in_addr)))
42/** Evaluate to non-zero if \a ADDR is a loopback address. */
43#define irc_in_addr_is_loopback(ADDR) (!(ADDR)->in6_16[0] && !(ADDR)->in6_16[1] && !(ADDR)->in6_16[2] \
44 && !(ADDR)->in6_16[3] && !(ADDR)->in6_16[4] \
45 && ((!(ADDR)->in6_16[5] \
46 && ((!(ADDR)->in6_16[6] && (ADDR)->in6_16[7] == htons(1)) \
47 || (ntohs((ADDR)->in6_16[6]) & 0xff00) == 0x7f00)) \
48 || (((ADDR)->in6_16[5] == 65535) \
49 && (ntohs((ADDR)->in6_16[6]) & 0xff00) == 0x7f00)))
50
51
52/* from ircd_defs.h */
53
54/** Maximum length of a numeric IP (v4 or v6) address.
55 * "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"
56 */
57#define SOCKIPLEN 45
58
3898f973
GB
59#define CIDRLEN SOCKIPLEN + 4
60
526e7c1d
P
61/* from ircd_string.h */
62
63extern const char* ircd_ntoa(const struct irc_in_addr* addr);
64extern const char* ircd_ntoa_r(char* buf, const struct irc_in_addr* addr);
3898f973
GB
65extern const char * ircd_ntoa_masked(const struct irc_in_addr* addr, unsigned char bits);
66extern const char* ircd_ntoa_masked_r(char* buf, const struct irc_in_addr* in, unsigned char bits);
526e7c1d
P
67#define ircd_aton(ADDR, STR) ipmask_parse((STR), (ADDR), NULL)
68extern int ipmask_parse(const char *in, struct irc_in_addr *mask, unsigned char *bits_ptr);
873f4217 69extern int ipmask_check(const struct irc_in_addr *, const struct irc_in_addr *, unsigned char);
4338f313 70void ip_canonicalize_tunnel(struct irc_in_addr *out, const struct irc_in_addr *in);
526e7c1d
P
71
72#define IPtostr(ipaddr) ircd_ntoa(&(ipaddr))
3898f973 73#define CIDRtostr(ipaddr, bits) ircd_ntoa_masked(&(ipaddr), bits)
7b1dadec 74#define irc_in_addr_v4_to_int(ADDR) ((ntohs((ADDR)->in6_16[6]) << 16) | ntohs((ADDR)->in6_16[7]))
526e7c1d
P
75
76/* from numnicks.h */
77
78extern const char* iptobase64(char* buf, const struct irc_in_addr* addr, unsigned int count, int v6_ok);
79extern void base64toip(const char* s, struct irc_in_addr* addr);
80
81/* from ircd_chattr.h */
82
83/** Array mapping characters to attribute bitmasks. */
84extern const unsigned int IRCD_CharAttrTab[];
85
86#define NTL_DIGIT 0x0008 /**< 0123456789 */
87
88/** Test whether a character is a digit. */
89#define IsDigit(c) (IRCD_CharAttrTab[(c) - CHAR_MIN] & NTL_DIGIT)
90
91#endif /* __irc_ipv6_H */