Remove the olsr-specific duplicated types
[olsrd.git] / src / lq_plugin_default_float.c
1 /*
2  * The olsr.org Optimized Link-State Routing daemon(olsrd)
3  * Copyright (c) 2008 Henning Rogge <rogge@fgan.de>
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without 
7  * modification, are permitted provided that the following conditions 
8  * are met:
9  *
10  * * Redistributions of source code must retain the above copyright 
11  *   notice, this list of conditions and the following disclaimer.
12  * * Redistributions in binary form must reproduce the above copyright 
13  *   notice, this list of conditions and the following disclaimer in 
14  *   the documentation and/or other materials provided with the 
15  *   distribution.
16  * * Neither the name of olsr.org, olsrd nor the names of its 
17  *   contributors may be used to endorse or promote products derived 
18  *   from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
22  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
23  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
24  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
25  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
26  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
27  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
28  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
30  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
31  * POSSIBILITY OF SUCH DAMAGE.
32  *
33  * Visit http://www.olsr.org for more information.
34  *
35  * If you find this software useful feel free to make a donation
36  * to the project. For more information see the website or contact
37  * the copyright holders.
38  *
39  */
40
41 #include "tc_set.h"
42 #include "link_set.h"
43 #include "olsr_spf.h"
44 #include "lq_packet.h"
45 #include "packet.h"
46 #include "olsr.h"
47 #include "lq_plugin_default_float.h"
48
49 /* Default lq plugin settings */
50 struct lq_handler lq_etx_float_handler = {
51   &default_lq_initialize_float,
52   
53   &default_lq_calc_cost_float,
54   &default_lq_calc_cost_float,
55
56   &default_lq_is_relevant_costchange_float,
57
58   &default_lq_packet_loss_worker_float,
59   &default_lq_memorize_foreign_hello_float,
60   &default_lq_copy_link2tc_float,
61   &default_lq_clear_float,
62   &default_lq_clear_float,
63
64   &default_lq_serialize_hello_lq_pair_float,
65   &default_lq_serialize_tc_lq_pair_float,
66   &default_lq_deserialize_hello_lq_pair_float,
67   &default_lq_deserialize_tc_lq_pair_float,
68
69   &default_lq_print_float,
70   &default_lq_print_float,
71   &default_lq_print_cost_float,
72
73   sizeof(struct default_lq_float),
74   sizeof(struct default_lq_float)
75 };
76
77 void default_lq_initialize_float(void) {
78   return;
79 }
80
81 olsr_linkcost default_lq_calc_cost_float(const void *ptr) {
82   const struct default_lq_float *lq = ptr;
83   olsr_linkcost cost;
84   
85   if (lq->lq < MINIMAL_USEFUL_LQ || lq->nlq < MINIMAL_USEFUL_LQ) {
86     return LINK_COST_BROKEN;
87   }
88   
89   cost = (olsr_linkcost)(1.0/(lq->lq * lq->nlq) * LQ_PLUGIN_LC_MULTIPLIER);
90   
91   if (cost > LINK_COST_BROKEN)
92     return LINK_COST_BROKEN;
93   if (cost == 0) {
94     return 1;
95   }
96   return cost;
97 }
98
99 int default_lq_serialize_hello_lq_pair_float(unsigned char *buff, void *ptr) {
100   struct default_lq_float *lq = ptr;
101   
102   buff[0] = (unsigned char)(lq->lq * 255);
103   buff[1] = (unsigned char)(lq->nlq * 255);
104   buff[2] = 0;
105   buff[3] = 0;
106   
107   return 4;
108 }
109
110 void default_lq_deserialize_hello_lq_pair_float(const uint8_t **curr, void *ptr) {
111   struct default_lq_float *lq = ptr;
112   uint8_t lq_value, nlq_value;
113   
114   pkt_get_u8(curr, &lq_value);
115   pkt_get_u8(curr, &nlq_value);
116   pkt_ignore_u16(curr);
117   
118   lq->lq = (float)lq_value / 255.0;
119   lq->nlq = (float)nlq_value / 255.0;
120 }
121
122 bool default_lq_is_relevant_costchange_float(olsr_linkcost c1, olsr_linkcost c2) {
123   if (c1 > c2) {
124     return c2 - c1 > LQ_PLUGIN_RELEVANT_COSTCHANGE;
125   }
126   return c1 - c2 > LQ_PLUGIN_RELEVANT_COSTCHANGE;
127 }
128
129 int default_lq_serialize_tc_lq_pair_float(unsigned char *buff, void *ptr) {
130   struct default_lq_float *lq = ptr;
131   
132   buff[0] = (unsigned char)(lq->lq * 255);
133   buff[1] = (unsigned char)(lq->nlq * 255);
134   buff[2] = 0;
135   buff[3] = 0;
136   
137   return 4;
138 }
139
140 void default_lq_deserialize_tc_lq_pair_float(const uint8_t **curr, void *ptr) {
141   struct default_lq_float *lq = ptr;
142   uint8_t lq_value, nlq_value;
143   
144   pkt_get_u8(curr, &lq_value);
145   pkt_get_u8(curr, &nlq_value);
146   pkt_ignore_u16(curr);
147   
148   lq->lq = (float)lq_value / 255.0;
149   lq->nlq = (float)nlq_value / 255.0;
150 }
151
152 olsr_linkcost default_lq_packet_loss_worker_float(struct link_entry *link, void *ptr, bool lost) {
153   struct default_lq_float *tlq = ptr;
154   float alpha = olsr_cnf->lq_aging;
155   
156   if (tlq->quickstart < LQ_QUICKSTART_STEPS) {
157     alpha = LQ_QUICKSTART_AGING; /* fast enough to get the LQ value within 6 Hellos up to 0.9 */
158     tlq->quickstart++;
159   }
160   // exponential moving average
161   tlq->lq *= (1 - alpha);
162   if (lost == 0) {
163     tlq->lq += (alpha * link->loss_link_multiplier / 65536);
164   }
165   return default_lq_calc_cost_float(ptr);
166 }
167
168 void default_lq_memorize_foreign_hello_float(void *ptrLocal, void *ptrForeign) {
169   struct default_lq_float *local = ptrLocal;
170   struct default_lq_float *foreign = ptrForeign;
171   
172   if (foreign) {
173     local->nlq = foreign->lq;
174   }
175   else {
176     local->nlq = 0;
177   }
178 }
179
180 void default_lq_copy_link2tc_float(void *target, void *source) {
181   memcpy(target, source, sizeof(struct default_lq_float));
182 }
183
184 void default_lq_clear_float(void *target) {
185   memset(target, 0, sizeof(struct default_lq_float));
186 }
187
188 const char *default_lq_print_float(void *ptr, char separator, struct lqtextbuffer *buffer) {
189   struct default_lq_float *lq = ptr;
190   
191   snprintf(buffer->buf, sizeof(struct lqtextbuffer), "%2.3f%c%2.3f",
192       lq->lq,
193       separator,
194       lq->nlq);
195   return buffer->buf;
196 }
197
198 const char *default_lq_print_cost_float(olsr_linkcost cost, struct lqtextbuffer *buffer) {
199   snprintf(buffer->buf, sizeof(struct lqtextbuffer), "%2.3f", ((float)cost)/LQ_PLUGIN_LC_MULTIPLIER );
200         
201
202   return buffer->buf;
203 }
204
205 /*
206  * Local Variables:
207  * c-basic-offset: 2
208  * indent-tabs-mode: nil
209  * End:
210  */