94fa52868130102e44f3600b8ab7be3b323c3c45
[oonf.git] / include / oonf / subsystems / os_routing.h
1
2 /*
3  * The olsr.org Optimized Link-State Routing daemon version 2 (olsrd2)
4  * Copyright (c) 2004-2015, the olsr.org team - see HISTORY file
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * * Redistributions of source code must retain the above copyright
12  *   notice, this list of conditions and the following disclaimer.
13  * * Redistributions in binary form must reproduce the above copyright
14  *   notice, this list of conditions and the following disclaimer in
15  *   the documentation and/or other materials provided with the
16  *   distribution.
17  * * Neither the name of olsr.org, olsrd nor the names of its
18  *   contributors may be used to endorse or promote products derived
19  *   from this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32  * POSSIBILITY OF SUCH DAMAGE.
33  *
34  * Visit http://www.olsr.org for more information.
35  *
36  * If you find this software useful feel free to make a donation
37  * to the project. For more information see the website or contact
38  * the copyright holders.
39  *
40  */
41
42 /**
43  * @file
44  */
45
46 #ifndef OS_ROUTING_H_
47 #define OS_ROUTING_H_
48
49 #include <stdio.h>
50 #include <sys/time.h>
51
52 #include <oonf/oonf.h>
53 #include <oonf/libcommon/list.h>
54 #include <oonf/libcommon/netaddr.h>
55 #include <oonf/libcore/oonf_logging.h>
56 #include <oonf/subsystems/os_interface.h>
57 #include <oonf/subsystems/os_system.h>
58
59 /*! subsystem identifier */
60 #define OONF_OS_ROUTING_SUBSYSTEM "os_routing"
61
62 struct os_route;
63 struct os_route_listener;
64 struct os_route_str;
65
66 /* make sure default values for routing are there */
67 #ifndef RTPROT_UNSPEC
68 /*! unspecified routing protocol */
69 #define RTPROT_UNSPEC 0
70 #endif
71 #ifndef RT_TABLE_UNSPEC
72 /*! unspecified routing table */
73 #define RT_TABLE_UNSPEC 0
74 #endif
75
76 /**
77  * Struct for text representation of a route
78  */
79 struct os_route_str {
80   /*! text buffer for maximum length of representation */
81   char buf[
82     /* header */
83     1 +
84     /* src-ip */
85     8 +
86     sizeof(struct netaddr_str)
87     /* gw */
88     + 4 +
89     sizeof(struct netaddr_str)
90     /* dst [type] */
91     + 5 +
92     sizeof(struct netaddr_str)
93     /* src-prefix */
94     + 12 +
95     sizeof(struct netaddr_str)
96     /* metric */
97     + 7 +
98     11
99     /* table, protocol */
100     + 6 + 4 + 9 + 4 + 3 + IF_NAMESIZE + 2 + 10 +
101     2
102     /* footer and 0-byte */
103     + 2];
104 };
105
106 /**
107  * types of kernel routes
108  */
109 enum os_route_type
110 {
111   OS_ROUTE_UNDEFINED,
112   OS_ROUTE_UNICAST,
113   OS_ROUTE_LOCAL,
114   OS_ROUTE_BROADCAST,
115   OS_ROUTE_MULTICAST,
116   OS_ROUTE_THROW,
117   OS_ROUTE_UNREACHABLE,
118   OS_ROUTE_PROHIBIT,
119   OS_ROUTE_BLACKHOLE,
120   OS_ROUTE_NAT,
121 };
122
123 /**
124  * key of a route, both source and destination prefix
125  */
126 struct os_route_key {
127   /*! destination prefix of route */
128   struct netaddr dst;
129
130   /*! source prefix of route */
131   struct netaddr src;
132 };
133
134 struct os_route_parameter {
135   /*! address family */
136   unsigned char family;
137
138   /*! type of route */
139   enum os_route_type type;
140
141   /*! combination of source and destination */
142   struct os_route_key key;
143
144   /*! gateway and destination */
145   struct netaddr gw;
146
147   /*! source IP that should be used for outgoing IP packets of this route */
148   struct netaddr src_ip;
149
150   /*! metric of the route */
151   int metric;
152
153   /*! routing table protocol */
154   unsigned char table;
155
156   /*! routing routing protocol */
157   unsigned char protocol;
158
159   /*! index of outgoing interface */
160   unsigned int if_index;
161 };
162
163 /* include os-specific headers */
164 #if defined(__linux__)
165 #include <oonf/subsystems/os_linux/os_routing_linux.h>
166 #else
167 #error "Unknown operation system"
168 #endif
169
170 /**
171  * Handler for changing a route in the kernel
172  * or querying the route status
173  */
174 struct os_route {
175   /*! parameters of route, separate to make it easy to compare routes */
176   struct os_route_parameter p;
177
178   /*! used for delivering feedback about netlink commands */
179   struct os_route_internal _internal;
180
181   /**
182    * Callback triggered when the route has been set
183    * @param route this route object
184    * @param error -1 if an error happened, 0 otherwise
185    */
186   void (*cb_finished)(struct os_route *route, int error);
187
188   /**
189    * Callback triggered for each route found in the FIB
190    * @param filter this route object used to filter the
191    *   data from the kernel
192    * @param route kernel route that matches the filter
193    */
194   void (*cb_get)(struct os_route *filter, struct os_route *route);
195 };
196
197 /**
198  * Listener for kernel route changes
199  */
200 struct os_route_listener {
201   /*! used for delivering feedback about netlink commands */
202   struct os_route_listener_internal _internal;
203
204   /**
205    * Callback triggered when a route changes in the kernel
206    * @param route changed route
207    * @param set true if route has been set/changed,
208    *   false if it has been removed
209    */
210   void (*cb_get)(const struct os_route *route, bool set);
211 };
212
213 /* prototypes for all os_routing functions */
214 static INLINE bool os_routing_supports_source_specific(int af_family);
215 static INLINE int os_routing_set(struct os_route *, bool set, bool del_similar);
216 static INLINE int os_routing_query(struct os_route *);
217 static INLINE void os_routing_interrupt(struct os_route *);
218 static INLINE bool os_routing_is_in_progress(struct os_route *);
219
220 static INLINE void os_routing_listener_add(struct os_route_listener *);
221 static INLINE void os_routing_listener_remove(struct os_route_listener *);
222
223 static INLINE const char *os_routing_to_string(struct os_route_str *buf, const struct os_route_parameter *route_param);
224
225 static INLINE void os_routing_init_wildcard_route(struct os_route *);
226
227 static INLINE void os_routing_init_half_os_route_key(
228   struct netaddr *any, struct netaddr *specific, const struct netaddr *source);
229
230 static INLINE void os_routing_init_sourcespec_prefix(struct os_route_key *prefix, const struct netaddr *destination);
231 static INLINE void os_routing_init_sourcespec_src_prefix(struct os_route_key *prefix, const struct netaddr *source);
232
233 /* AVL comparators are a special case so we don't do the INLINE trick here */
234 EXPORT int os_routing_avl_cmp_route_key(const void *, const void *);
235
236 #endif /* OS_ROUTING_H_ */