Rename "subsystems" directory to "base"
[oonf.git] / include / oonf / olsrv2 / olsrv2 / olsrv2_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 OLSRV2_ROUTING_H_
47 #define OLSRV2_ROUTING_H_
48
49 #include <oonf/libcommon/avl.h>
50 #include <oonf/oonf.h>
51 #include <oonf/libcommon/list.h>
52 #include <oonf/libcommon/netaddr.h>
53
54 #include <oonf/base/os_routing.h>
55
56 #include <oonf/nhdp/nhdp/nhdp.h>
57 #include <oonf/nhdp/nhdp/nhdp_db.h>
58 #include <oonf/nhdp/nhdp/nhdp_domain.h>
59
60 /*! minimum time between two dijkstra calculations in milliseconds */
61 enum
62 {
63   OLSRv2_DIJKSTRA_RATE_LIMITATION = 1000
64 };
65
66 /**
67  * representation of a node in the dijkstra tree
68  */
69 struct olsrv2_dijkstra_node {
70   /*! hook into the working list of the dijkstra */
71   struct avl_node _node;
72
73   /*! total path cost */
74   uint32_t path_cost;
75
76   /*! path hops to the target */
77   uint8_t path_hops;
78
79   /*! hopcount to be inserted into the route */
80   uint8_t distance;
81
82   /*! originator address of the router responsible for the prefix */
83   const struct netaddr *originator;
84
85   /*! pointer to nhpd neighbor that represents the first hop */
86   struct nhdp_neighbor *first_hop;
87
88   /**
89    * address of the last originator in the routing tree before
90    * the destination
91    */
92   const struct netaddr *last_originator;
93
94   /*! true if route is single-hop */
95   bool single_hop;
96
97   /*! true if this node is ourself */
98   bool local;
99
100   /*! true if node already has been processed */
101   bool done;
102 };
103
104 /**
105  * representation of one target in the routing entry set
106  */
107 struct olsrv2_routing_entry {
108   /*! Settings for the kernel route */
109   struct os_route route;
110
111   /*! nhdp domain of route */
112   struct nhdp_domain *domain;
113
114   /*! path cost to reach the target */
115   uint32_t path_cost;
116
117   /*! path hops to the target */
118   uint8_t path_hops;
119
120   /*! originator of node that announced the route */
121   struct netaddr originator;
122
123   /*! originator address of next hop */
124   struct netaddr next_originator;
125
126   /*! originator of last hop before target */
127   struct netaddr last_originator;
128
129   /**
130    * true if the entry represents a route that should be in the kernel,
131    * false if the entry should be removed from the kernel
132    */
133   bool set;
134
135   /*! true if this route is being processed by the kernel at the moment */
136   bool in_processing;
137
138   /*! old values of route before current dijstra run */
139   struct os_route_parameter _old;
140
141   /*! hook into working queues */
142   struct list_entity _working_node;
143
144   /*! global node */
145   struct avl_node _node;
146 };
147
148 /**
149  * routing domain specific parameters
150  */
151 struct olsrv2_routing_domain {
152   /*! true if IPv4 routes should set a source IP */
153   bool use_srcip_in_routes;
154
155   /*! protocol number for routes */
156   int protocol;
157
158   /*! routing table number for routes */
159   int table;
160
161   /*! metric value that should be used for routes */
162   int distance;
163
164   /*! domain uses source specific routing */
165   bool source_specific;
166 };
167
168 /**
169  * A filter that can modify or drop the result of the Dijkstra algorithm
170  */
171 struct olsrv2_routing_filter {
172   /**
173    * callback for routing filter, return false to drop route modification.
174    * filter can modify all parameters of the route.
175    * @param domain NHDP domain
176    * @param route_param operation system route parameters
177    * @return true if route should still be set/removed, false if it should be ignored
178    */
179   bool (*filter)(struct nhdp_domain *domain, struct os_route_parameter *route_param, bool set);
180
181   /*! node to hold all routing filters together */
182   struct list_entity _node;
183 };
184
185 int olsrv2_routing_init(void);
186 void olsrv2_routing_initiate_shutdown(void);
187 void olsrv2_routing_cleanup(void);
188
189 void olsrv2_routing_dijkstra_node_init(struct olsrv2_dijkstra_node *, const struct netaddr *originator);
190
191 EXPORT uint16_t olsrv2_routing_get_ansn(void);
192 EXPORT void olsrv2_routing_force_ansn_increment(uint16_t increment);
193
194 EXPORT void olsrv2_routing_set_domain_parameter(struct nhdp_domain *domain, struct olsrv2_routing_domain *parameter);
195
196 EXPORT void olsrv2_routing_domain_changed(struct nhdp_domain *domain, bool autoupdate_ansn);
197 EXPORT void olsrv2_routing_force_update(bool skip_wait);
198 EXPORT void olsrv2_routing_trigger_update(void);
199
200 EXPORT void olsrv2_routing_freeze_routes(bool freeze);
201
202 EXPORT const struct olsrv2_routing_domain *olsrv2_routing_get_parameters(struct nhdp_domain *);
203
204 EXPORT struct avl_tree *olsrv2_routing_get_tree(struct nhdp_domain *domain);
205 EXPORT struct list_entity *olsrv2_routing_get_filter_list(void);
206
207 /**
208  * Add a routing filter to the dijkstra processing list
209  * @param filter pointer to routing filter
210  */
211 static INLINE void
212 olsrv2_routing_filter_add(struct olsrv2_routing_filter *filter) {
213   list_add_tail(olsrv2_routing_get_filter_list(), &filter->_node);
214 }
215
216 /**
217  * Remove a routing filter from the dijkstra processing list
218  * @param filter pointer to routing filter
219  */
220 static INLINE void
221 olsrv2_routing_filter_remove(struct olsrv2_routing_filter *filter) {
222   list_remove(&filter->_node);
223 }
224
225 #endif /* OLSRV2_ROUTING_SET_H_ */