Cleanup Hello generation and move it into link_set.c
[olsrd.git] / src / lq_plugin.h
1
2 /*
3  * The olsr.org Optimized Link-State Routing daemon(olsrd)
4  * Copyright (c) 2004-2009, 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 #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 (0x00ffffff)
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 LQTEXT_MAXLENGTH 32
59
60 struct lq_linkdata_type {
61   const char *name;
62   size_t name_maxlen;
63   int32_t best, good, average, worst;
64 };
65
66 enum lq_linkdata_quality {
67   LQ_QUALITY_BEST,
68   LQ_QUALITY_GOOD,
69   LQ_QUALITY_AVERAGE,
70   LQ_QUALITY_BAD,
71   LQ_QUALITY_WORST
72 };
73
74 struct lq_handler {
75   const char *name;
76
77   void (*initialize) (void);
78   void (*deinitialize) (void);
79
80   olsr_linkcost(*calc_link_entry_cost) (struct link_entry *);
81   olsr_linkcost(*calc_lq_hello_neighbor_cost) (struct lq_hello_neighbor *);
82   olsr_linkcost(*calc_tc_edge_entry_cost) (struct tc_edge_entry *);
83
84   bool(*is_relevant_costchange) (olsr_linkcost c1, olsr_linkcost c2);
85
86   olsr_linkcost(*packet_loss_handler) (struct link_entry *, bool);
87
88   void (*memorize_foreign_hello) (struct link_entry *, struct lq_hello_neighbor *);
89   void (*copy_link_entry_lq_into_tc_edge_entry) (struct tc_edge_entry *, struct link_entry *);
90
91   void (*clear_link_entry) (struct link_entry *);
92   void (*clear_lq_hello_neighbor) (struct lq_hello_neighbor *);
93   void (*clear_tc_edge_entry) (struct tc_edge_entry *);
94
95   void (*serialize_hello_lq) (uint8_t **, struct link_entry *);
96   void (*serialize_tc_lq) (uint8_t **, struct link_entry *);
97   void (*deserialize_hello_lq) (uint8_t const **, struct lq_hello_neighbor *);
98   void (*deserialize_tc_lq) (uint8_t const **, struct tc_edge_entry *);
99
100   int (*get_link_entry_data) (struct link_entry *, int);
101
102   const char *(*print_cost) (olsr_linkcost cost, char *, size_t);
103   const char *(*print_link_entry_lq) (struct link_entry *, int, char *, size_t);
104
105   struct lq_linkdata_type *linkdata_hello;
106   int linkdata_hello_count;
107
108   size_t size_tc_edge;
109   size_t size_lq_hello_neighbor;
110   size_t size_link_entry;
111
112   uint8_t messageid_hello;
113   uint8_t messageid_tc;
114
115   size_t serialized_lqhello_size;
116   size_t serialized_lqtc_size;
117 };
118
119 void init_lq_handler(void);
120 void deinit_lq_handler(void);
121
122 olsr_linkcost olsr_calc_tc_cost(struct tc_edge_entry *);
123 bool olsr_is_relevant_costchange(olsr_linkcost c1, olsr_linkcost c2);
124
125 void olsr_serialize_hello_lq_pair(uint8_t **, struct link_entry *);
126 void olsr_deserialize_hello_lq_pair(const uint8_t **, struct lq_hello_neighbor *);
127 void olsr_serialize_tc_lq(uint8_t **curr, struct link_entry *lnk);
128 void olsr_deserialize_tc_lq_pair(const uint8_t **, struct tc_edge_entry *);
129
130 void olsr_update_packet_loss_worker(struct link_entry *, bool);
131 void olsr_memorize_foreign_hello_lq(struct link_entry *, struct lq_hello_neighbor *);
132
133 const char *EXPORT(olsr_get_linkcost_text) (olsr_linkcost, bool, char *, size_t);
134 const char *EXPORT(olsr_get_linkdata_text) (struct link_entry *, int, char *, size_t);
135 const char *EXPORT(olsr_get_linklabel) (int);
136 size_t EXPORT(olsr_get_linklabel_maxlength) (int);
137 size_t EXPORT(olsr_get_linklabel_count) (void);
138 enum lq_linkdata_quality EXPORT(olsr_get_linkdata_quality) (struct link_entry *, int);
139
140 void olsr_copylq_link_entry_2_tc_edge_entry(struct tc_edge_entry *, struct link_entry *);
141
142 struct tc_edge_entry *olsr_malloc_tc_edge_entry(void);
143 struct lq_hello_neighbor *olsr_malloc_lq_hello_neighbor(void);
144 struct link_entry *olsr_malloc_link_entry(void);
145
146 void olsr_free_link_entry(struct link_entry *);
147 void olsr_free_lq_hello_neighbor(struct lq_hello_neighbor *);
148 void olsr_free_tc_edge_entry(struct tc_edge_entry *);
149
150 uint8_t olsr_get_Hello_MessageId(void);
151 uint8_t olsr_get_TC_MessageId(void);
152
153 size_t olsr_sizeof_HelloLQ(void);
154 size_t olsr_sizeof_TCLQ(void);
155
156 /* Externals. */
157 extern struct lq_handler *EXPORT(active_lq_handler);
158
159 #endif /*LQPLUGIN_H_ */
160
161 /*
162  * Local Variables:
163  * c-basic-offset: 2
164  * indent-tabs-mode: nil
165  * End:
166  */