a383b12fc843f90dd628a9308244669ac668ec5b
[olsrd.git] / src / ipcalc.h
1
2 /*
3  * The olsr.org Optimized Link-State Routing daemon(olsrd)
4  * Copyright (c) 2007, Bernd Petrovitsch <bernd-at-firmix.at>
5  * Copyright (c) 2007, Hannes Gredler <hannes-at-gredler.at>
6  * Copyright (c) 2007, Sven-Ola Tuecke <sven-ola-at-gmx.de>
7  * Copyright (c) 2008, Bernd Petrovitsch <bernd-at-firmix.at>
8  * Copyright (c) 2008, Hannes Gredler <hannes-at-gredler.at>
9  * Copyright (c) 2008, Sven-Ola Tuecke <sven-ola-at-gmx.de>
10  * Copyright (c) 2009, Henning Rogge <rogge-at-fgan.de>
11  * Copyright (c) 2009, Sven-Ola Tuecke <sven-ola-at-gmx.de>
12  * All rights reserved.
13  *
14  * Redistribution and use in source and binary forms, with or without
15  * modification, are permitted provided that the following conditions
16  * are met:
17  *
18  * * Redistributions of source code must retain the above copyright
19  *   notice, this list of conditions and the following disclaimer.
20  * * Redistributions in binary form must reproduce the above copyright
21  *   notice, this list of conditions and the following disclaimer in
22  *   the documentation and/or other materials provided with the
23  *   distribution.
24  * * Neither the name of olsr.org, olsrd nor the names of its
25  *   contributors may be used to endorse or promote products derived
26  *   from this software without specific prior written permission.
27  *
28  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
29  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
30  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
31  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
32  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
33  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
34  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
35  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
36  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
37  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
38  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
39  * POSSIBILITY OF SUCH DAMAGE.
40  *
41  * Visit http://www.olsr.org for more information.
42  *
43  * If you find this software useful feel free to make a donation
44  * to the project. For more information see the website or contact
45  * the copyright holders.
46  *
47  */
48
49 #ifndef _IPCALC
50 #define _IPCALC
51
52 #include "olsr_types.h"
53 #include "defs.h"
54 #include "olsr_cfg.h"
55
56 #include <limits.h>
57 #include <string.h>
58 #include <arpa/inet.h>
59
60 extern const union olsr_ip_addr all_zero;
61
62 struct ipaddr_str {
63   char buf[MAX(INET6_ADDRSTRLEN, INET_ADDRSTRLEN)];
64 };
65
66 struct ipprefix_str {
67   /* We need for IPv6 an IP address + '/' + prefix and for IPv4 an IP address + '/' + a netmask */
68   char buf[MAX(INET6_ADDRSTRLEN + 1 + 3, INET_ADDRSTRLEN + 1 + 2)];
69 };
70
71 /*
72  * Macros for comparing and copying IP addresses
73  */
74 static INLINE int
75 ip4cmp(const struct in_addr *a, const struct in_addr *b)
76 {
77   return a->s_addr > b->s_addr ? +1 : a->s_addr < b->s_addr ? -1 : 0;
78 }
79
80 static INLINE int
81 ip6cmp(const struct in6_addr *a, const struct in6_addr *b)
82 {
83   return memcmp(a, b, sizeof(*a));
84 }
85
86 static INLINE int
87 ipcmp(int ip_version, const union olsr_ip_addr *a, const union olsr_ip_addr *b)
88 {
89   return ip_version == AF_INET ? ip4cmp(&a->v4, &b->v4) : ip6cmp(&a->v6, &b->v6);
90 }
91
92 static INLINE int
93 olsr_ipcmp(const union olsr_ip_addr *a, const union olsr_ip_addr *b)
94 {
95   return ipcmp(olsr_cnf->ip_version, a, b);
96 }
97
98 /* Do not use this - this is as evil as the COPY_IP() macro was and only used in
99  * source which also needs cleanups.
100  */
101 static INLINE void
102 genipcopy(void *dst, const void *src)
103 {
104   memcpy(dst, src, olsr_cnf->ipsize);
105 }
106
107 int ip_in_net(const union olsr_ip_addr *ipaddr, const struct olsr_ip_prefix *net, int ip_version);
108
109
110 int EXPORT(prefix_to_netmask) (uint8_t *, int, uint8_t);
111
112 static INLINE int
113 olsr_prefix_to_netmask(union olsr_ip_addr *adr, uint8_t prefixlen)
114 {
115   return prefix_to_netmask(adr->v6.s6_addr, olsr_cnf->ipsize, prefixlen);
116 }
117
118 uint8_t EXPORT(netmask_to_prefix) (const uint8_t *, int);
119
120 static INLINE uint8_t
121 olsr_netmask_to_prefix(const union olsr_ip_addr *adr)
122 {
123   return netmask_to_prefix(adr->v6.s6_addr, olsr_cnf->ipsize);
124 }
125
126 static INLINE uint8_t
127 olsr_netmask4_to_prefix(const uint32_t * a)
128 {
129   return netmask_to_prefix((const uint8_t *)a, sizeof(*a));
130 }
131 static INLINE uint8_t
132 olsr_netmask6_to_prefix(const struct in6_addr *a)
133 {
134   return netmask_to_prefix((const uint8_t *)a, sizeof(*a));
135 }
136
137 static INLINE const char *
138 ip4_to_string(struct ipaddr_str *const buf, const struct in_addr addr4)
139 {
140   return inet_ntop(AF_INET, &addr4, buf->buf, sizeof(buf->buf));
141 }
142
143 static INLINE const char *
144 ip6_to_string(struct ipaddr_str *const buf, const struct in6_addr *const addr6)
145 {
146   return inet_ntop(AF_INET6, addr6, buf->buf, sizeof(buf->buf));
147 }
148
149 static INLINE const char *
150 ip_to_string(int af, struct ipaddr_str *const buf, const union olsr_ip_addr *addr)
151 {
152   return inet_ntop(af, addr, buf->buf, sizeof(buf->buf));
153 }
154
155 static INLINE const char *
156 olsr_ip_to_string(struct ipaddr_str *const buf, const union olsr_ip_addr *addr)
157 {
158   return ip_to_string(olsr_cnf->ip_version, buf, addr);
159 }
160
161 const char *EXPORT(ip_prefix_to_string) (int af, struct ipprefix_str * const buf, const struct olsr_ip_prefix * prefix);
162
163 static INLINE const char *
164 olsr_ip_prefix_to_string(struct ipprefix_str *const buf, const struct olsr_ip_prefix *prefix)
165 {
166   return ip_prefix_to_string(olsr_cnf->ip_version, buf, prefix);
167 }
168
169 const char *sockaddr_to_string(char *buf, int bufsize, const struct sockaddr *const addr, unsigned int addrsize);
170
171 /* we need to handle one value specifically since shifting 32 bits of a 32 bit integer is the same as shifting 0 bits.
172  * The result is in host-byte-order.
173  */
174 static INLINE uint32_t
175 prefix_to_netmask4(uint8_t prefixlen)
176 {
177   return prefixlen == 0 ? 0 : (~0U << (32 - prefixlen));
178 }
179
180 extern const struct in6_addr EXPORT(in6addr_v4mapped_loopback);
181
182 void EXPORT(ip_map_4to6) (union olsr_ip_addr *ip);
183
184 #endif
185
186 /*
187  * Local Variables:
188  * c-basic-offset: 2
189  * indent-tabs-mode: nil
190  * End:
191  */