Merge branch 'master' into mpr_rework
[oonf.git] / src-plugins / nhdp / nhdp / nhdp_domain.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 NHDP_DOMAIN_H_
47 #define NHDP_DOMAIN_H_
48
49 #include "common/common_types.h"
50 #include "common/list.h"
51 #include "subsystems/oonf_rfc5444.h"
52
53 #include "nhdp/nhdp_interfaces.h"
54 #include "nhdp/nhdp_db.h"
55
56 /*! memory class for nhdp domain */
57 #define NHDP_CLASS_DOMAIN             "nhdp_domain"
58
59 /**
60  * NHDP domain constants
61  */
62 enum {
63   /*! maximum length of metric name */
64   NHDP_DOMAIN_METRIC_MAXLEN = 16,
65
66   /*! maximum length of mpr name */
67   NHDP_DOMAIN_MPR_MAXLEN = 16,
68 };
69
70 /**
71  * Buffer for string representation of a linkmetric value
72  */
73 struct nhdp_metric_str {
74   /*! buffer for maximum sized text link metric */
75   char buf[128];
76 };
77
78 /**
79  *  Metric handler for a NHDP domain.
80  */
81 struct nhdp_domain_metric {
82   /*! name of linkmetric */
83   const char *name;
84
85   /*! minimum metric value*/
86   uint32_t metric_minimum;
87
88   /*! maximum metric value */
89   uint32_t metric_maximum;
90
91   /*! default incoming link metric for "no default handling" metrics */
92   uint32_t incoming_link_start;
93
94   /*! default outgoing link metric for "no default handling" metrics */
95   uint32_t outgoing_link_start;
96
97   /*! default incoming 2-hop link metric for "no default handling" metrics */
98   uint32_t incoming_2hop_start;
99
100   /*! default outgoing 2-hop link metric for "no default handling" metrics */
101   uint32_t outgoing_2hop_start;
102
103   /*! true if metrics should not be handled by nhdp reader/writer */
104   bool no_default_handling;
105
106   /**
107    * callback to convert link metric into string representation
108    * @param buf buffer to put string into
109    * @param cost link metric
110    * @return pointer to buffer
111    */
112   const char *(*link_to_string)(struct nhdp_metric_str *buf, uint32_t cost);
113
114   /**
115    * callback to convert path metric into string representation
116    * @param buf buffer to put string into
117    * @param cost path metric
118    * @param hopcount hopcount of path
119    * @return pointer to buffer
120    */
121   const char *(*path_to_string)(struct nhdp_metric_str *buf,
122       uint32_t cost,  uint8_t hopcount);
123
124   /*! conversion of internal metric data into string */
125   /**
126    * callback to convert internal metric state into string
127    * @param buf buffer to put internal state into
128    * @param lnk nhdp link
129    * @return pointer to buffer
130    */
131   const char *(*internal_link_to_string)(
132       struct nhdp_metric_str *buf, struct nhdp_link *lnk);
133
134   /**
135    * callback to enable metric
136    */
137   void (*enable)(void);
138
139   /**
140    * callback to disable metric
141    */
142   void (*disable)(void);
143
144   /*! reference count */
145   int _refcount;
146
147   /*! node for tree of metrics */
148   struct avl_node _node;
149 };
150
151 struct nhdp_domain;
152
153 /**
154  * MPR handler for a NHDP domain
155  */
156 struct nhdp_domain_mpr {
157   /*! name of handler */
158   const char *name;
159
160   /**
161    * callback to calculate MPR set
162    * @param domain NHDP domain to update MPR set
163    */
164   void (*update_mpr)(struct nhdp_domain *domain);
165
166   /**
167    * callback to enable mpr
168    */
169   void (*enable)(void);
170
171   /**
172    * callback to disable mpr
173    */
174   void (*disable)(void);
175
176   /*! reference count */
177   int _refcount;
178
179   /*! node for tree of MPR algorithms */
180   struct avl_node _node;
181 };
182
183 /**
184  * NHDP domain
185  *
186  * A domain is a topology on the mesh, including its own
187  * metric and routing MPR set. Both is transmitted over a
188  * specified TLV extension value on MPR and LQ TLVs.
189  */
190 struct nhdp_domain {
191   /*! name of metric */
192   char metric_name[NHDP_DOMAIN_METRIC_MAXLEN];
193
194   /*! name of MPR algorithm */
195   char mpr_name[NHDP_DOMAIN_MPR_MAXLEN];
196
197   /*! pointer to metric definition */
198   struct nhdp_domain_metric *metric;
199
200   /*! pointer to mpr definition */
201   struct nhdp_domain_mpr *mpr;
202
203   /*! flooding willingness */
204   uint8_t local_willingness;
205
206   /*! metric tlv extension */
207   uint8_t ext;
208
209   /*! index in the domain array */
210   int index;
211
212   /*! temporary storage for willingness processing */
213   uint8_t _tmp_willingness;
214
215   /*! storage for the up to four additional link metrics */
216   struct rfc5444_writer_tlvtype _metric_addrtlvs[4];
217
218   /*! list of nhdp domains */
219   struct list_entity _node;
220 };
221
222 /**
223  * listener for NHDP domain updates
224  */
225 struct nhdp_domain_listener {
226     /**
227      * Callback to inform about a NHDP neighbor MPR update
228      * @param domain NHDP domain of which the MPR set changed
229      */
230     void (*mpr_update)(struct nhdp_domain *domain);
231
232     /**
233      * Callback to inform about a NHDP neighbor metric update
234      * @param domain NHDP domain of which the metric changed
235      */
236     void (*metric_update)(struct nhdp_domain *domain);
237
238   /*! hook into global domain updater list */
239   struct list_entity _node;
240 };
241
242 void nhdp_domain_init(struct oonf_rfc5444_protocol *);
243 void nhdp_domain_cleanup(void);
244
245 EXPORT size_t nhdp_domain_get_count(void);
246 EXPORT struct nhdp_domain *nhdp_domain_add(uint8_t ext);
247 EXPORT struct nhdp_domain *nhdp_domain_configure(uint8_t ext,
248     const char *metric_name, const char *mpr_name, uint8_t willingness);
249
250 EXPORT int nhdp_domain_metric_add(struct nhdp_domain_metric *);
251 EXPORT void nhdp_domain_metric_remove(struct nhdp_domain_metric *);
252
253 EXPORT int nhdp_domain_mpr_add(struct nhdp_domain_mpr *);
254 EXPORT void nhdp_domain_mpr_remove(struct nhdp_domain_mpr *);
255
256 EXPORT void nhdp_domain_listener_add(struct nhdp_domain_listener *);
257 EXPORT void nhdp_domain_listener_remove(struct nhdp_domain_listener *);
258
259 EXPORT struct nhdp_domain *nhdp_domain_get_by_ext(uint8_t);
260
261 EXPORT void nhdp_domain_init_link(struct nhdp_link *);
262 EXPORT void nhdp_domain_init_l2hop(struct nhdp_l2hop *);
263 EXPORT void nhdp_domain_init_neighbor(struct nhdp_neighbor *);
264
265 EXPORT void nhdp_domain_process_metric_linktlv(struct nhdp_domain *,
266     struct nhdp_link *lnk, uint8_t *value);
267 EXPORT void nhdp_domain_process_metric_2hoptlv(struct nhdp_domain *d,
268     struct nhdp_l2hop *l2hop, uint8_t *value);
269
270 EXPORT void nhdp_domain_recalculate_mpr(bool force_update);
271 EXPORT bool nhdp_domain_node_is_mpr(void);
272
273 EXPORT size_t nhdp_domain_process_mprtypes_tlv(
274     uint8_t *mprtypes, size_t mprtypes_size,
275     struct rfc5444_reader_tlvblock_entry *tlv);
276 EXPORT void nhdp_domain_process_mpr_tlv(uint8_t *mprtypes, size_t mprtypes_size,
277     struct nhdp_neighbor *, struct rfc5444_reader_tlvblock_entry *tlv);
278 EXPORT void nhdp_domain_process_willingness_tlv(
279     uint8_t *mpr_types, size_t mprtypes_size,
280     struct rfc5444_reader_tlvblock_entry *tlv);
281 EXPORT void nhdp_domain_store_willingness(struct nhdp_neighbor *);
282 EXPORT size_t nhdp_domain_encode_mprtypes_tlvvalue(
283     uint8_t *mprtypes, size_t mprtypes_size);
284 EXPORT size_t nhdp_domain_encode_mpr_tlvvalue(
285     uint8_t *tlvvalue, size_t tlvsize, struct nhdp_neighbor *);
286 EXPORT size_t nhdp_domain_encode_willingness_tlvvalue(
287     uint8_t *tlvvalue, size_t tlvsize);
288
289 EXPORT bool nhdp_domain_set_incoming_metric(
290     struct nhdp_domain_metric *metric, struct nhdp_link *lnk, uint32_t metric_in);
291
292 EXPORT struct list_entity *nhdp_domain_get_list(void);
293 EXPORT struct list_entity *nhdp_domain_get_listener_list(void);
294 EXPORT const struct nhdp_domain *nhdp_domain_get_flooding_domain(void);
295 EXPORT void nhdp_domain_set_flooding_mpr(const char *mpr_name, uint8_t willingness);
296 EXPORT const struct nhdp_domain *nhdp_domain_get_flooding_domain(void);
297
298 /**
299  * @param domain NHDP domain
300  * @param lnk NHDP link
301  * @return domain data of specified link
302  */
303 static INLINE struct nhdp_link_domaindata *
304 nhdp_domain_get_linkdata(const struct nhdp_domain *domain, struct nhdp_link *lnk) {
305   return &lnk->_domaindata[domain->index];
306 }
307
308 /**
309  * @param domain NHDP domain
310  * @param neigh NHDP neighbor
311  * @return domain data of specified neighbor
312  */
313 static INLINE struct nhdp_neighbor_domaindata *
314 nhdp_domain_get_neighbordata(
315     const struct nhdp_domain *domain, struct nhdp_neighbor *neigh) {
316   return &neigh->_domaindata[domain->index];
317 }
318
319 /**
320  * @param domain NHDP domain
321  * @param l2hop NHDP twohop neighbor
322  * @return domain data of specified twohop neighbor
323  */
324 static INLINE struct nhdp_l2hop_domaindata *
325 nhdp_domain_get_l2hopdata(
326     const struct nhdp_domain *domain, struct nhdp_l2hop *l2hop) {
327   return &l2hop->_domaindata[domain->index];
328 }
329
330
331 /**
332  * @param buf pointer to metric output buffer
333  * @param domain pointer to metric domain
334  * @param metric raw metric value
335  * @return pointer to string representation of metric
336  */
337 static INLINE const char *
338 nhdp_domain_get_link_metric_value(struct nhdp_metric_str *buf,
339     const struct nhdp_domain *domain, uint32_t metric) {
340   return domain->metric->link_to_string(buf, metric);
341 }
342
343 /**
344  * @param buf pointer to metric output buffer
345  * @param domain pointer to metric domain
346  * @param metric raw path metric value
347  * @param hopcount path hopcount
348  * @return pointer to string representation of metric
349  */
350 static INLINE const char *
351 nhdp_domain_get_path_metric_value(struct nhdp_metric_str *buf,
352     const struct nhdp_domain *domain, uint32_t metric, uint8_t hopcount) {
353   return domain->metric->path_to_string(buf, metric, hopcount);
354 }
355
356 /**
357  * @param buf pointer to metric output buffer
358  * @param metric pointer to metric
359  * @param lnk nhdp link
360  * @return pointer to string internal representation of metric
361  */
362 static INLINE const char *
363 nhdp_domain_get_internal_link_metric_value(struct nhdp_metric_str *buf,
364     const struct nhdp_domain_metric *metric, struct nhdp_link *lnk) {
365   return metric->internal_link_to_string(buf, lnk);
366 }
367
368 #endif /* NHDP_DOMAIN_H_ */