1d94084e1bf4219466be5354a9488a98f10e2943
[olsrd.git] / src / lq_plugin_default.c
1 #include "tc_set.h"
2 #include "link_set.h"
3 #include "lq_route.h"
4 #include "lq_packet.h"
5 #include "packet.h"
6 #include "olsr.h"
7 #include "lq_plugin_default.h"
8
9 olsr_linkcost default_calc_cost(const void *ptr) {
10   const struct default_lq *lq = ptr;
11   
12   float etx = (lq->lq < 0.1 || lq->nlq < 0.1 ? LINK_COST_BROKEN : 1.0/(lq->lq * lq->nlq));
13   olsr_linkcost cost = (olsr_linkcost)(etx  * LQ_PLUGIN_LC_MULTIPLIER);
14   
15   if (cost > LINK_COST_BROKEN)
16     return LINK_COST_BROKEN;
17   if (cost == 0)
18     return 1;
19   return cost;
20 }
21
22 int default_olsr_serialize_hello_lq_pair(unsigned char *buff, void *ptr) {
23   struct default_lq *lq = ptr;
24   
25   buff[0] = (unsigned char)(lq->lq * 255);
26   buff[1] = (unsigned char)(lq->nlq * 255);
27   buff[2] = (unsigned char)(0);
28   buff[3] = (unsigned char)(0);
29   
30   return 4;
31 }
32
33 void default_olsr_deserialize_hello_lq_pair(const olsr_u8_t **curr, void *ptr) {
34   struct default_lq *lq = ptr;
35   
36   pkt_get_lq(curr, &lq->lq);
37   pkt_get_lq(curr, &lq->nlq);
38   pkt_ignore_u16(curr);
39 }
40
41 olsr_bool default_olsr_is_relevant_costchange(olsr_linkcost c1, olsr_linkcost c2) {
42   if (c1 > c2) {
43     return c2 - c1 > LQ_PLUGIN_RELEVANT_COSTCHANGE;
44   }
45   return c1 - c2 > LQ_PLUGIN_RELEVANT_COSTCHANGE;
46 }
47
48 int default_olsr_serialize_tc_lq_pair(unsigned char *buff, void *ptr) {
49   struct default_lq *lq = ptr;
50   
51   buff[0] = (unsigned char)(lq->lq * 255);
52   buff[1] = (unsigned char)(lq->nlq * 255);
53   buff[2] = (unsigned char)(0);
54   buff[3] = (unsigned char)(0);
55   
56   return 4;
57 }
58
59 void default_olsr_deserialize_tc_lq_pair(const olsr_u8_t **curr, void *ptr) {
60   struct default_lq *lq = ptr;
61   
62   pkt_get_lq(curr, &lq->lq);
63   pkt_get_lq(curr, &lq->nlq);
64   pkt_ignore_u16(curr);
65 }
66
67 olsr_linkcost default_packet_loss_worker(void *ptr, olsr_bool lost) {
68   struct default_lq *tlq = ptr;
69   float alpha;
70   
71   // calculate exponental factor for the new link quality, could be directly done in configuration !
72   alpha = 1 / (float)(olsr_cnf->lq_wsize);
73   
74   // exponential moving average
75   tlq->lq *= (1 - alpha);
76   if (lost == 0) {
77     tlq->lq += alpha;
78   }
79   return default_calc_cost(ptr);
80 }
81
82 void default_olsr_memorize_foreign_hello_lq(void *ptrLocal, void *ptrForeign) {
83   struct default_lq *local = ptrLocal;
84   struct default_lq *foreign = ptrForeign;
85   
86   if (foreign) {
87     local->nlq = foreign->lq;
88   }
89   else {
90     local->nlq = 0;
91   }
92 }
93
94 void default_olsr_copy_link_lq_into_tc(void *target, void *source) {
95   memcpy(target, source, sizeof(struct default_lq));
96 }
97
98 void default_olsr_clear_lq(void *target) {
99   memset(target, 0, sizeof(struct default_lq));
100 }
101
102 char *default_olsr_print_lq(void *ptr) {
103   static char output_buffer[16];
104   struct default_lq *lq = ptr;
105   
106   sprintf(output_buffer, "%2.3f/%2.3f", lq->lq, lq->nlq);
107   return output_buffer;
108 }
109
110 char *default_olsr_print_cost(olsr_linkcost cost) {
111   static char output_buffer[16];
112   sprintf(output_buffer, "%2.3f", ((float)cost)/LQ_PLUGIN_LC_MULTIPLIER);
113   return output_buffer;
114 }