Remove the olsr-specific duplicated types
[olsrd.git] / src / lq_plugin_default_fpm.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 "lq_plugin.h"
44 #include "olsr_spf.h"
45 #include "lq_packet.h"
46 #include "packet.h"
47 #include "olsr.h"
48 #include "lq_plugin_default_fpm.h"
49
50 /* etx lq plugin (fpm version) settings */
51 struct lq_handler lq_etx_fpm_handler = {
52     &default_lq_initialize_fpm,
53     
54     &default_lq_calc_cost_fpm,
55     &default_lq_calc_cost_fpm,
56     
57     &default_lq_is_relevant_costchange_fpm,
58     
59     &default_lq_packet_loss_worker_fpm,
60     &default_lq_memorize_foreign_hello_fpm,
61     &default_lq_copy_link2tc_fpm,
62     &default_lq_clear_fpm,
63     &default_lq_clear_fpm,
64     
65     &default_lq_serialize_hello_lq_pair_fpm,
66     &default_lq_serialize_tc_lq_pair_fpm,
67     &default_lq_deserialize_hello_lq_pair_fpm,
68     &default_lq_deserialize_tc_lq_pair_fpm,
69     
70     &default_lq_print_fpm,
71     &default_lq_print_fpm,
72     &default_lq_print_cost_fpm, 
73     
74     sizeof(struct default_lq_fpm),
75     sizeof(struct default_lq_fpm)
76 };
77
78 uint32_t aging_factor_new, aging_factor_old;
79 uint32_t aging_quickstart_new, aging_quickstart_old;
80
81 void default_lq_initialize_fpm(void) {
82   aging_factor_new = (uint32_t)(olsr_cnf->lq_aging * LQ_FPM_INTERNAL_MULTIPLIER);
83   aging_factor_old = LQ_FPM_INTERNAL_MULTIPLIER - aging_factor_new;
84   
85   aging_quickstart_new = (uint32_t)(LQ_QUICKSTART_AGING * LQ_FPM_INTERNAL_MULTIPLIER);
86   aging_quickstart_old = LQ_FPM_INTERNAL_MULTIPLIER - aging_quickstart_new;
87 }
88
89 olsr_linkcost default_lq_calc_cost_fpm(const void *ptr) {
90   const struct default_lq_fpm *lq = ptr;
91   olsr_linkcost cost;
92   
93   if (lq->valueLq < (unsigned int)(255 * MINIMAL_USEFUL_LQ) || lq->valueNlq < (unsigned int)(255 * MINIMAL_USEFUL_LQ)) {
94     return LINK_COST_BROKEN;
95   }
96   
97   cost = LQ_FPM_LINKCOST_MULTIPLIER * 255/(int)lq->valueLq * 255/(int)lq->valueNlq;
98
99   if (cost > LINK_COST_BROKEN)
100     return LINK_COST_BROKEN;
101   if (cost == 0)
102     return 1;
103   return cost;
104 }
105
106 int default_lq_serialize_hello_lq_pair_fpm(unsigned char *buff, void *ptr) {
107   struct default_lq_fpm *lq = ptr;
108   
109   buff[0] = (unsigned char)lq->valueLq;
110   buff[1] = (unsigned char)lq->valueNlq;
111   buff[2] = (unsigned char)(0);
112   buff[3] = (unsigned char)(0);
113   
114   return 4;
115 }
116
117 void default_lq_deserialize_hello_lq_pair_fpm(const uint8_t **curr, void *ptr) {
118   struct default_lq_fpm *lq = ptr;
119   
120   pkt_get_u8(curr, &lq->valueLq);
121   pkt_get_u8(curr, &lq->valueNlq);
122   pkt_ignore_u16(curr);
123 }
124
125 bool default_lq_is_relevant_costchange_fpm(olsr_linkcost c1, olsr_linkcost c2) {
126   if (c1 > c2) {
127     return c2 - c1 > LQ_PLUGIN_RELEVANT_COSTCHANGE_FPM;
128   }
129   return c1 - c2 > LQ_PLUGIN_RELEVANT_COSTCHANGE_FPM;
130 }
131
132 int default_lq_serialize_tc_lq_pair_fpm(unsigned char *buff, void *ptr) {
133   struct default_lq_fpm *lq = ptr;
134   
135   buff[0] = (unsigned char)lq->valueLq;
136   buff[1] = (unsigned char)lq->valueNlq;
137   buff[2] = (unsigned char)(0);
138   buff[3] = (unsigned char)(0);
139   
140   return 4;
141 }
142
143 void default_lq_deserialize_tc_lq_pair_fpm(const uint8_t **curr, void *ptr) {
144   struct default_lq_fpm *lq = ptr;
145   
146   pkt_get_u8(curr, &lq->valueLq);
147   pkt_get_u8(curr, &lq->valueNlq);
148   pkt_ignore_u16(curr);
149 }
150
151 olsr_linkcost default_lq_packet_loss_worker_fpm(struct link_entry *link, void *ptr, bool lost) {
152   struct default_lq_fpm *tlq = ptr;
153   uint32_t alpha_old = aging_factor_old;
154   uint32_t alpha_new = aging_factor_new;
155   
156   uint32_t value;
157   // fpm link_loss_factor = fpmidiv(itofpm(link->loss_link_multiplier), 65536);
158   
159   if (tlq->quickstart < LQ_QUICKSTART_STEPS) {
160     alpha_new = aging_quickstart_new;
161     alpha_old = aging_quickstart_old;
162     tlq->quickstart++;
163   }
164
165   // exponential moving average
166   value = (uint32_t)(tlq->valueLq) * LQ_FPM_INTERNAL_MULTIPLIER / 255;
167
168   value = (value * alpha_old + LQ_FPM_INTERNAL_MULTIPLIER-1) / LQ_FPM_INTERNAL_MULTIPLIER;
169   
170   if (!lost) {
171     uint32_t ratio;
172     
173     ratio = (alpha_new * link->loss_link_multiplier + LINK_LOSS_MULTIPLIER-1) / LINK_LOSS_MULTIPLIER;
174     value += ratio;
175   }
176   tlq->valueLq = (value * 255 + LQ_FPM_INTERNAL_MULTIPLIER-1) / LQ_FPM_INTERNAL_MULTIPLIER;
177   
178   return default_lq_calc_cost_fpm(ptr);
179 }
180
181 void default_lq_memorize_foreign_hello_fpm(void *ptrLocal, void *ptrForeign) {
182   struct default_lq_fpm *local = ptrLocal;
183   struct default_lq_fpm *foreign = ptrForeign;
184   
185   if (foreign) {
186     local->valueNlq = foreign->valueLq;
187   }
188   else {
189     local->valueNlq = 0;
190   }
191 }
192
193 void default_lq_copy_link2tc_fpm(void *target, void *source) {
194   memcpy(target, source, sizeof(struct default_lq_fpm));
195 }
196
197 void default_lq_clear_fpm(void *target) {
198   memset(target, 0, sizeof(struct default_lq_fpm));
199 }
200
201 const char *default_lq_print_fpm(void *ptr, char separator, struct lqtextbuffer *buffer) {
202   struct default_lq_fpm *lq = ptr;
203   
204   snprintf(buffer->buf, sizeof(buffer->buf), "%0.3f%c%0.3f",
205       (float)(lq->valueLq) / 255.0,
206       separator,
207       (float)(lq->valueNlq) / 255.0);
208   return buffer->buf;
209 }
210
211 const char *default_lq_print_cost_fpm(olsr_linkcost cost, struct lqtextbuffer *buffer) {
212   snprintf(buffer->buf, sizeof(buffer->buf), "%.3f", (float)(cost) / LQ_FPM_LINKCOST_MULTIPLIER);
213   return buffer->buf;
214 }
215
216 /*
217  * Local Variables:
218  * c-basic-offset: 2
219  * indent-tabs-mode: nil
220  * End:
221  */