Rename "subsystems" directory to "base"
[oonf.git] / include / oonf / base / os_linux / os_routing_linux.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_LINUX_H_
47 #define OS_ROUTING_LINUX_H_
48
49 #include <oonf/libcommon/avl.h>
50 #include <oonf/oonf.h>
51 #include <oonf/libcommon/list.h>
52
53 /**
54  * linux specifc data for changing a kernel route
55  */
56 struct os_route_internal {
57   /*! hook into list of route change handlers */
58   struct avl_node _node;
59
60   /*! netlink sequence number of command sent to the kernel */
61   uint32_t nl_seq;
62 };
63
64 /**
65  * linux specific data for listening to kernel route changes
66  */
67 struct os_route_listener_internal {
68   /*! hook into list of kernel route listeners */
69   struct list_entity _node;
70 };
71
72 #include <oonf/base/os_generic/os_routing_generic_init_half_route_key.h>
73 #include <oonf/base/os_generic/os_routing_generic_rt_to_string.h>
74
75 EXPORT bool os_routing_linux_supports_source_specific(int af_family);
76 EXPORT int os_routing_linux_set(struct os_route *, bool set, bool del_similar);
77 EXPORT int os_routing_linux_query(struct os_route *);
78 EXPORT void os_routing_linux_interrupt(struct os_route *);
79 EXPORT bool os_routing_linux_is_in_progress(struct os_route *);
80
81 EXPORT void os_routing_linux_listener_add(struct os_route_listener *);
82 EXPORT void os_routing_linux_listener_remove(struct os_route_listener *);
83
84 EXPORT const char *os_routing_linux_to_string(struct os_route_str *buf, const struct os_route_parameter *route_param);
85
86 EXPORT void os_routing_linux_init_wildcard_route(struct os_route *);
87
88 /**
89  * Check if kernel supports source-specific routing
90  * @param af_family address family
91  * @return true if source-specific routing is supported for
92  *   address family
93  */
94 static INLINE bool
95 os_routing_supports_source_specific(int af_family) {
96   return os_routing_linux_supports_source_specific(af_family);
97 }
98
99 /**
100  * Update an entry of the kernel routing table. This call will only trigger
101  * the change, the real change will be done as soon as the netlink socket is
102  * writable.
103  * @param route data of route to be set/removed
104  * @param set true if route should be set, false if it should be removed
105  * @param del_similar true if similar routes that block this one should be
106  *   removed.
107  * @return -1 if an error happened, 0 otherwise
108  */
109 static INLINE int
110 os_routing_set(struct os_route *route, bool set, bool del_similar) {
111   return os_routing_linux_set(route, set, del_similar);
112 }
113
114 /**
115  * Request all routing data of a certain address family
116  * @param route pointer to routing filter
117  * @return -1 if an error happened, 0 otherwise
118  */
119 static INLINE int
120 os_routing_query(struct os_route *route) {
121   return os_routing_linux_query(route);
122 }
123
124 /**
125  * Stop processing of a routing command
126  * @param route pointer to os_route
127  */
128 static INLINE void
129 os_routing_interrupt(struct os_route *route) {
130   os_routing_linux_interrupt(route);
131 }
132
133 /**
134  * @param route os route
135  * @return true if route is being processed by the kernel,
136  *   false otherwise
137  */
138 static INLINE bool
139 os_routing_is_in_progress(struct os_route *route) {
140   return os_routing_linux_is_in_progress(route);
141 }
142
143 /**
144  * Add routing change listener
145  * @param listener routing change listener
146  */
147 static INLINE void
148 os_routing_listener_add(struct os_route_listener *listener) {
149   os_routing_linux_listener_add(listener);
150 }
151
152 /**
153  * Remove routing change listener
154  * @param listener routing change listener
155  */
156 static INLINE void
157 os_routing_listener_remove(struct os_route_listener *listener) {
158   os_routing_linux_listener_remove(listener);
159 }
160
161 /**
162  * Initializes a route with default values. Will zero all
163  * other fields in the struct.
164  * @param route route to be initialized
165  */
166 static INLINE void
167 os_routing_init_wildcard_route(struct os_route *route) {
168   return os_routing_linux_init_wildcard_route(route);
169 }
170
171 /**
172  * Print OS route to string buffer
173  * @param buf pointer to string buffer
174  * @param route_param route parameters
175  * @return pointer to string buffer, NULL if an error happened
176  */
177 static INLINE const char *
178 os_routing_to_string(struct os_route_str *buf, const struct os_route_parameter *route_param) {
179   return os_routing_generic_rt_to_string(buf, route_param);
180 }
181
182 /**
183  * Copy one address to 'specific', fill the other one with the
184  * fitting IP_ANY value
185  * @param any buffer for IP_ANY
186  * @param specific buffer for source
187  * @param source source IP value to copy
188  */
189 static INLINE void
190 os_routing_init_half_os_route_key(struct netaddr *any, struct netaddr *specific, const struct netaddr *source) {
191   return os_routing_generic_init_half_os_route_key(any, specific, source);
192 }
193
194 /**
195  * Initialize a source specific route key with a destination.
196  * Overwrites the source prefix with the IP_ANY of the
197  * corresponding address family
198  * @param prefix target source specific route key
199  * @param destination destination prefix
200  */
201 static INLINE void
202 os_routing_init_sourcespec_prefix(struct os_route_key *prefix, const struct netaddr *destination) {
203   os_routing_generic_init_half_os_route_key(&prefix->src, &prefix->dst, destination);
204 }
205
206 /**
207  * Initialize a source specific route key with a source.
208  * Overwrites the destination prefix with the IP_ANY of the
209  * corresponding address family
210  * @param prefix target source specific route key
211  * @param source source prefix
212  */
213 static INLINE void
214 os_routing_init_sourcespec_src_prefix(struct os_route_key *prefix, const struct netaddr *source) {
215   os_routing_init_half_os_route_key(&prefix->dst, &prefix->src, source);
216 }
217
218 #endif /* OS_ROUTING_LINUX_H_ */