Applied: indent -sob -nhnl -nut $(find -name "*.[ch]")
[olsrd.git] / src / lq_plugin.h
1
2 /*
3  * The olsr.org Optimized Link-State Routing daemon(olsrd)
4  * Copyright (c) 2008 Henning Rogge <rogge@fgan.de>
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 #ifndef LQPLUGIN_H_
43 #define LQPLUGIN_H_
44
45 #include "tc_set.h"
46 #include "link_set.h"
47 #include "olsr_spf.h"
48 #include "lq_packet.h"
49 #include "packet.h"
50 #include "common/avl.h"
51
52 #define LINK_COST_BROKEN (1<<22)
53 #define ROUTE_COST_BROKEN (0xffffffff)
54 #define ZERO_ROUTE_COST 0
55
56 #define MINIMAL_USEFUL_LQ 0.1
57 #define LQ_PLUGIN_RELEVANT_COSTCHANGE 16
58
59 #define LQ_QUICKSTART_STEPS 12
60 #define LQ_QUICKSTART_AGING 0.25
61
62 struct lqtextbuffer
63 {
64   char buf[16];
65 };
66
67 struct lq_handler
68 {
69   void (*initialize) (void);
70
71     olsr_linkcost (*calc_hello_cost) (const void *lq);
72     olsr_linkcost (*calc_tc_cost) (const void *lq);
73
74     olsr_bool (*is_relevant_costchange) (olsr_linkcost c1, olsr_linkcost c2);
75
76     olsr_linkcost (*packet_loss_handler) (struct link_entry * entry, void *lq,
77                                           olsr_bool lost);
78
79   void (*memorize_foreign_hello) (void *local, void *foreign);
80   void (*copy_link_lq_into_tc) (void *target, void *source);
81   void (*clear_hello) (void *target);
82   void (*clear_tc) (void *target);
83
84   int (*serialize_hello_lq) (unsigned char *buff, void *lq);
85   int (*serialize_tc_lq) (unsigned char *buff, void *lq);
86   void (*deserialize_hello_lq) (const olsr_u8_t ** curr, void *lq);
87   void (*deserialize_tc_lq) (const olsr_u8_t ** curr, void *lq);
88
89   const char *(*print_hello_lq) (void *ptr, char separator,
90                                  struct lqtextbuffer * buffer);
91   const char *(*print_tc_lq) (void *ptr, char separator,
92                               struct lqtextbuffer * buffer);
93   const char *(*print_cost) (olsr_linkcost cost,
94                              struct lqtextbuffer * buffer);
95
96   size_t hello_lq_size;
97   size_t tc_lq_size;
98 };
99
100 struct lq_handler_node
101 {
102   struct avl_node node;
103   struct lq_handler *handler;
104   char name[0];
105 };
106
107 AVLNODE2STRUCT (lq_handler_tree2lq_handler_node, struct lq_handler_node,
108                 node);
109
110 #define OLSR_FOR_ALL_LQ_HANDLERS(lq) \
111 { \
112   struct avl_node *lq_tree_node, *next_lq_tree_node; \
113   for (lq_tree_node = avl_walk_first(&lq_handler_tree); \
114     lq_tree_node; lq_tree_node = next_lq_tree_node) { \
115     next_lq_tree_node = avl_walk_next(lq_tree_node); \
116     lq = lq_handler_tree2lq_handler_node(lq_tree_node);
117 #define OLSR_FOR_ALL_LQ_HANDLERS_END(tc) }}
118
119 int avl_strcasecmp (const void *str1, const void *str2);
120 void init_lq_handler_tree (void);
121
122 void register_lq_handler (struct lq_handler *handler, const char *name);
123 int activate_lq_handler (const char *name);
124
125 olsr_linkcost olsr_calc_tc_cost (const struct tc_edge_entry *);
126 olsr_bool olsr_is_relevant_costchange (olsr_linkcost c1, olsr_linkcost c2);
127
128 int olsr_serialize_hello_lq_pair (unsigned char *buff,
129                                   struct lq_hello_neighbor *neigh);
130 void olsr_deserialize_hello_lq_pair (const olsr_u8_t ** curr,
131                                      struct hello_neighbor *neigh);
132 int olsr_serialize_tc_lq_pair (unsigned char *buff,
133                                struct tc_mpr_addr *neigh);
134 void olsr_deserialize_tc_lq_pair (const olsr_u8_t ** curr,
135                                   struct tc_edge_entry *edge);
136
137 void olsr_update_packet_loss_worker (struct link_entry *entry,
138                                      olsr_bool lost);
139 void olsr_memorize_foreign_hello_lq (struct link_entry *local,
140                                      struct hello_neighbor *foreign);
141
142 const char *get_link_entry_text (struct link_entry *entry, char separator,
143                                  struct lqtextbuffer *buffer);
144 const char *get_tc_edge_entry_text (struct tc_edge_entry *entry,
145                                     char separator,
146                                     struct lqtextbuffer *buffer);
147 const char *get_linkcost_text (olsr_linkcost cost, olsr_bool route,
148                                struct lqtextbuffer *buffer);
149
150 void olsr_copy_hello_lq (struct lq_hello_neighbor *target,
151                          struct link_entry *source);
152 void olsr_copylq_link_entry_2_tc_mpr_addr (struct tc_mpr_addr *target,
153                                            struct link_entry *source);
154 void olsr_copylq_link_entry_2_tc_edge_entry (struct tc_edge_entry *target,
155                                              struct link_entry *source);
156 void olsr_clear_tc_lq (struct tc_mpr_addr *target);
157
158 struct hello_neighbor *olsr_malloc_hello_neighbor (const char *id);
159 struct tc_mpr_addr *olsr_malloc_tc_mpr_addr (const char *id);
160 struct lq_hello_neighbor *olsr_malloc_lq_hello_neighbor (const char *id);
161 struct link_entry *olsr_malloc_link_entry (const char *id);
162
163 /* Externals. */
164 extern struct lq_handler *active_lq_handler;
165
166 #endif /*LQPLUGIN_H_ */
167
168 /*
169  * Local Variables:
170  * c-basic-offset: 2
171  * End:
172  */