Added some de-initializing funcs to plugins, lq_plugins, netfilter, parser
[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 "common/avl.h"
50
51 #define LINK_COST_BROKEN (1<<22)
52 #define ROUTE_COST_BROKEN (0xffffffff)
53 #define ZERO_ROUTE_COST 0
54
55 #define MINIMAL_USEFUL_LQ 0.1
56 #define LQ_PLUGIN_RELEVANT_COSTCHANGE 16
57
58 #define LQ_QUICKSTART_STEPS 12
59 #define LQ_QUICKSTART_AGING 0.25
60
61 struct lqtextbuffer {
62   char buf[16];
63 };
64
65 struct lq_handler {
66   void (*initialize)(void);
67   void (*deinitialize)(void);
68
69   olsr_linkcost (*calc_link_entry_cost) (struct link_entry *);
70   olsr_linkcost (*calc_lq_hello_neighbor_cost) (struct lq_hello_neighbor *);
71   olsr_linkcost (*calc_tc_mpr_addr_cost) (struct tc_mpr_addr *);
72   olsr_linkcost (*calc_tc_edge_entry_cost) (struct tc_edge_entry *);
73
74   bool (*is_relevant_costchange) (olsr_linkcost c1, olsr_linkcost c2);
75
76   olsr_linkcost (*packet_loss_handler) (struct link_entry *, bool);
77
78   void (*memorize_foreign_hello) (struct link_entry *, struct lq_hello_neighbor *);
79   void (*copy_link_entry_lq_into_tc_mpr_addr) (struct tc_mpr_addr *, struct link_entry *);
80   void (*copy_link_entry_lq_into_tc_edge_entry) (struct tc_edge_entry *, struct link_entry *);
81   void (*copy_link_lq_into_neighbor) (struct lq_hello_neighbor *, struct link_entry *);
82
83   void (*clear_link_entry) (struct link_entry *);
84   void (*clear_lq_hello_neighbor) (struct lq_hello_neighbor *);
85   void (*clear_tc_mpr_addr) (struct tc_mpr_addr *);
86   void (*clear_tc_edge_entry) (struct tc_edge_entry *);
87
88   int (*serialize_hello_lq) (unsigned char *, struct lq_hello_neighbor *);
89   int (*serialize_tc_lq) (unsigned char *, struct tc_mpr_addr *);
90   void (*deserialize_hello_lq) (uint8_t const **, struct lq_hello_neighbor *);
91   void (*deserialize_tc_lq) (uint8_t const ** , struct tc_edge_entry *);
92
93   char *(*print_link_entry_lq) (struct link_entry *, char , struct lqtextbuffer *);
94   char *(*print_tc_edge_entry_lq) (struct tc_edge_entry *, char , struct lqtextbuffer *);
95   char *(*print_cost) (olsr_linkcost cost, struct lqtextbuffer *);
96
97   size_t size_tc_edge;
98   size_t size_tc_mpr_addr;
99   size_t size_lq_hello_neighbor;
100   size_t size_link_entry;
101
102   uint8_t messageid_hello;
103   uint8_t messageid_tc;
104 };
105
106 struct lq_handler_node {
107   struct avl_node node;
108   struct lq_handler *handler;
109   char name[0];
110 };
111
112 AVLNODE2STRUCT(lq_handler_tree2lq_handler_node, struct lq_handler_node, node);
113
114 #define OLSR_FOR_ALL_LQ_HANDLERS(lq) \
115 { \
116   struct avl_node *lq_tree_node, *next_lq_tree_node; \
117   for (lq_tree_node = avl_walk_first(&lq_handler_tree); \
118     lq_tree_node; lq_tree_node = next_lq_tree_node) { \
119     next_lq_tree_node = avl_walk_next(lq_tree_node); \
120     lq = lq_handler_tree2lq_handler_node(lq_tree_node);
121 #define OLSR_FOR_ALL_LQ_HANDLERS_END(lq) }}
122
123 void init_lq_handler_tree(void);
124
125 void activate_lq_handler(void);
126 void register_lq_handler(struct lq_handler *, const char *);
127 void deactivate_lq_handler(void);
128
129 olsr_linkcost olsr_calc_tc_cost(struct tc_edge_entry *);
130 bool olsr_is_relevant_costchange(olsr_linkcost c1, olsr_linkcost c2);
131
132 int olsr_serialize_hello_lq_pair(unsigned char *, struct lq_hello_neighbor *);
133 void olsr_deserialize_hello_lq_pair(const uint8_t **, struct lq_hello_neighbor *);
134 int olsr_serialize_tc_lq_pair(unsigned char *, struct tc_mpr_addr *);
135 void olsr_deserialize_tc_lq_pair(const uint8_t **, struct tc_edge_entry *);
136
137 void olsr_update_packet_loss_worker(struct link_entry *, bool);
138 void olsr_memorize_foreign_hello_lq(struct link_entry *, struct lq_hello_neighbor *);
139
140 const char *EXPORT(get_link_entry_text)(struct link_entry *,
141                                         char, struct lqtextbuffer *);
142 const char *EXPORT(get_tc_edge_entry_text)(struct tc_edge_entry *,
143                                    char, struct lqtextbuffer *);
144 const char *EXPORT(get_linkcost_text)(olsr_linkcost, bool, struct lqtextbuffer *);
145
146 void olsr_copy_hello_lq(struct lq_hello_neighbor *, struct link_entry *);
147 void olsr_copylq_link_entry_2_tc_mpr_addr(struct tc_mpr_addr *,
148                                           struct link_entry *);
149 void olsr_copylq_link_entry_2_tc_edge_entry(struct tc_edge_entry *,
150                                             struct link_entry *);
151 #if 0
152 void olsr_clear_tc_lq(struct tc_mpr_addr *);
153 #endif
154
155 struct tc_edge_entry *olsr_malloc_tc_edge_entry(void);
156 struct tc_mpr_addr *olsr_malloc_tc_mpr_addr(void);
157 struct lq_hello_neighbor *olsr_malloc_lq_hello_neighbor(void);
158 struct link_entry *olsr_malloc_link_entry(void);
159
160 void olsr_free_link_entry(struct link_entry *);
161 void olsr_free_lq_hello_neighbor(struct lq_hello_neighbor *);
162 void olsr_free_tc_edge_entry(struct tc_edge_entry *);
163 void olsr_free_tc_mpr_addr(struct tc_mpr_addr *);
164
165 uint8_t olsr_get_Hello_MessageId(void);
166 uint8_t olsr_get_TC_MessageId(void);
167
168 /* Externals. */
169 extern struct lq_handler *active_lq_handler;
170
171
172 #endif /*LQPLUGIN_H_ */
173
174 /*
175  * Local Variables:
176  * c-basic-offset: 2
177  * indent-tabs-mode: nil
178  * End:
179  */