new etx_ff (freifunk) routing plugin
authorHenning Rogge <rogge@fgan.de>
Tue, 1 Jul 2008 07:37:28 +0000 (09:37 +0200)
committerHenning Rogge <rogge@fgan.de>
Tue, 1 Jul 2008 07:37:28 +0000 (09:37 +0200)
modifications of etx fpm plugin to allow values grow to 1.0

src/lq_plugin_default_ff.c
src/lq_plugin_default_ff.h

index 9129fb7..5204995 100644 (file)
@@ -3,31 +3,31 @@
  * Copyright (c) 2008 Henning Rogge <rogge@fgan.de>
  * All rights reserved.
  *
- * Redistribution and use in source and binary forms, with or without 
- * modification, are permitted provided that the following conditions 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
  * are met:
  *
- * * Redistributions of source code must retain the above copyright 
+ * * Redistributions of source code must retain the above copyright
  *   notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright 
- *   notice, this list of conditions and the following disclaimer in 
- *   the documentation and/or other materials provided with the 
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in
+ *   the documentation and/or other materials provided with the
  *   distribution.
- * * Neither the name of olsr.org, olsrd nor the names of its 
- *   contributors may be used to endorse or promote products derived 
+ * * Neither the name of olsr.org, olsrd nor the names of its
+ *   contributors may be used to endorse or promote products derived
  *   from this software without specific prior written permission.
  *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGE.
  *
  * Visit http://www.olsr.org for more information.
@@ -59,10 +59,10 @@ struct lq_handler lq_etx_ff_handler = {
 
     &default_lq_is_relevant_costchange_ff,
     &default_lq_packet_loss_worker_ff,
-    
-    &default_lq_memorize_foreign_hello_ff, 
+
+    &default_lq_memorize_foreign_hello_ff,
     &default_lq_copy_link2tc_ff,
-    &default_lq_clear_ff,
+    &default_lq_clear_ff_hello,
     &default_lq_clear_ff,
 
     &default_lq_serialize_hello_lq_pair_ff,
@@ -74,49 +74,49 @@ struct lq_handler lq_etx_ff_handler = {
     &default_lq_print_ff,
     &default_lq_print_cost_ff,
 
-    sizeof(struct default_lq_ff),
+    sizeof(struct default_lq_ff_hello),
     sizeof(struct default_lq_ff)
 };
 
 static void default_lq_parser_ff(struct olsr *olsr, struct interface *in_if, union olsr_ip_addr *from_addr) {
   const union olsr_ip_addr *main_addr;
   struct link_entry *lnk;
-  struct default_lq_ff *lq;
+  struct default_lq_ff_hello *lq;
   olsr_u32_t seq_diff;
-  
+
   /* Find main address */
   if (!(main_addr = mid_lookup_main_addr(from_addr)))
     main_addr = from_addr;
-  
+
   /* Loopup link entry */
   lnk = lookup_link_entry(main_addr, NULL, in_if);
   if (lnk == NULL) {
     return;
   }
-  
-  lq = (struct default_lq_ff *)lnk->linkquality;
-  
+
+  lq = (struct default_lq_ff_hello *)lnk->linkquality;
+
   if (lq->last_seq_nr > olsr->olsr_seqno) {
     seq_diff = (olsr_u32_t)olsr->olsr_seqno + 65536 - lq->last_seq_nr;
   } else {
     seq_diff = olsr->olsr_seqno - lq->last_seq_nr;
   }
-  
+
   /* Jump in sequence numbers ? */
   if (seq_diff > 256) {
     seq_diff = 1;
   }
-  
+
   lq->received[lq->activePtr]++;
   lq->lost[lq->activePtr] += (seq_diff - 1);
-  
+
   lq->last_seq_nr = olsr->olsr_seqno;
 }
 
 static void default_lq_ff_timer(void __attribute__((unused)) *context) {
   struct link_entry *link;
   OLSR_FOR_ALL_LINK_ENTRIES(link) {
-    struct default_lq_ff *tlq = (struct default_lq_ff *)link->linkquality;
+    struct default_lq_ff_hello *tlq = (struct default_lq_ff_hello *)link->linkquality;
     fpm ratio;
     olsr_u16_t i, received, lost;
 
@@ -134,7 +134,7 @@ static void default_lq_ff_timer(void __attribute__((unused)) *context) {
 
     /* calculate link quality */
     if (received + lost == 0) {
-      tlq->valueLq = 0;
+      tlq->lq.valueLq = 0;
     }
     else {
       // start with link-loss-factor
@@ -145,7 +145,7 @@ static void default_lq_ff_timer(void __attribute__((unused)) *context) {
       ratio = fpmidiv(ratio, (int)(received + lost));
       ratio = fpmmuli(ratio, 255);
 
-      tlq->valueLq = (olsr_u8_t)(fpmtoi(ratio));
+      tlq->lq.valueLq = (olsr_u8_t)(fpmtoi(ratio));
     }
     link->linkcost = default_lq_calc_cost_ff(tlq);
 
@@ -164,13 +164,13 @@ void default_lq_initialize_ff(void) {
 olsr_linkcost default_lq_calc_cost_ff(const void *ptr) {
   const struct default_lq_ff *lq = ptr;
   olsr_linkcost cost;
-  
+
   if (lq->valueLq < (unsigned int)(255 * MINIMAL_USEFUL_LQ) || lq->valueNlq < (unsigned int)(255 * MINIMAL_USEFUL_LQ)) {
     return LINK_COST_BROKEN;
   }
-  
+
   cost = fpmidiv(itofpm(255 * 255), (int)lq->valueLq * (int)lq->valueNlq);
-  
+
   if (cost > LINK_COST_BROKEN)
     return LINK_COST_BROKEN;
   if (cost == 0)
@@ -180,18 +180,18 @@ olsr_linkcost default_lq_calc_cost_ff(const void *ptr) {
 
 int default_lq_serialize_hello_lq_pair_ff(unsigned char *buff, void *ptr) {
   struct default_lq_ff *lq = ptr;
-  
+
   buff[0] = (unsigned char)lq->valueLq;
   buff[1] = (unsigned char)lq->valueNlq;
   buff[2] = (unsigned char)(0);
   buff[3] = (unsigned char)(0);
-  
+
   return 4;
 }
 
 void default_lq_deserialize_hello_lq_pair_ff(const olsr_u8_t **curr, void *ptr) {
   struct default_lq_ff *lq = ptr;
-  
+
   pkt_get_u8(curr, &lq->valueLq);
   pkt_get_u8(curr, &lq->valueNlq);
   pkt_ignore_u16(curr);
@@ -206,18 +206,18 @@ olsr_bool default_lq_is_relevant_costchange_ff(olsr_linkcost c1, olsr_linkcost c
 
 int default_lq_serialize_tc_lq_pair_ff(unsigned char *buff, void *ptr) {
   struct default_lq_ff *lq = ptr;
-  
+
   buff[0] = (unsigned char)lq->valueLq;
   buff[1] = (unsigned char)lq->valueNlq;
   buff[2] = (unsigned char)(0);
   buff[3] = (unsigned char)(0);
-  
+
   return 4;
 }
 
 void default_lq_deserialize_tc_lq_pair_ff(const olsr_u8_t **curr, void *ptr) {
   struct default_lq_ff *lq = ptr;
-  
+
   pkt_get_u8(curr, &lq->valueLq);
   pkt_get_u8(curr, &lq->valueNlq);
   pkt_ignore_u16(curr);
@@ -230,7 +230,7 @@ olsr_linkcost default_lq_packet_loss_worker_ff(struct link_entry __attribute__((
 void default_lq_memorize_foreign_hello_ff(void *ptrLocal, void *ptrForeign) {
   struct default_lq_ff *local = ptrLocal;
   struct default_lq_ff *foreign = ptrForeign;
-  
+
   if (foreign) {
     local->valueNlq = foreign->valueLq;
   } else {
@@ -243,11 +243,14 @@ void default_lq_copy_link2tc_ff(void *target, void *source) {
 }
 
 void default_lq_clear_ff(void *target) {
-  struct default_lq_ff *local = target;
-  int i;
-  
   memset(target, 0, sizeof(struct default_lq_ff));
-  
+}
+
+void default_lq_clear_ff_hello(void *target) {
+  struct default_lq_ff_hello *local = target;
+  int i;
+
+  default_lq_clear_ff(&local->lq);
   local->windowSize = LQ_FF_QUICKSTART_INIT;
   for (i=0; i<LQ_FF_WINDOW; i++) {
     local->lost[i] = 3;
@@ -256,7 +259,7 @@ void default_lq_clear_ff(void *target) {
 
 const char *default_lq_print_ff(void *ptr, struct lqtextbuffer *buffer) {
   struct default_lq_ff *lq = ptr;
-  
+
   sprintf(buffer->buf, "%s/%s", fpmtoa(fpmidiv(itofpm((int)lq->valueLq), 255)), fpmtoa(fpmidiv(itofpm((int)lq->valueNlq), 255)));
   return buffer->buf;
 }
index 48b10c8..8d3a7a1 100644 (file)
@@ -3,31 +3,31 @@
  * Copyright (c) 2008 Henning Rogge <rogge@fgan.de>
  * All rights reserved.
  *
- * Redistribution and use in source and binary forms, with or without 
- * modification, are permitted provided that the following conditions 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
  * are met:
  *
- * * Redistributions of source code must retain the above copyright 
+ * * Redistributions of source code must retain the above copyright
  *   notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright 
- *   notice, this list of conditions and the following disclaimer in 
- *   the documentation and/or other materials provided with the 
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in
+ *   the documentation and/or other materials provided with the
  *   distribution.
- * * Neither the name of olsr.org, olsrd nor the names of its 
- *   contributors may be used to endorse or promote products derived 
+ * * Neither the name of olsr.org, olsrd nor the names of its
+ *   contributors may be used to endorse or promote products derived
  *   from this software without specific prior written permission.
  *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGE.
  *
  * Visit http://www.olsr.org for more information.
 #define LQ_FF_QUICKSTART_INIT 4
 
 struct default_lq_ff {
-       olsr_u8_t valueLq;
-       olsr_u8_t valueNlq;
+  olsr_u8_t valueLq;
+  olsr_u8_t valueNlq;
+};
+
+struct default_lq_ff_hello {
+  struct default_lq_ff lq;
        olsr_u8_t windowSize, activePtr;
        olsr_u16_t last_seq_nr;
        olsr_u16_t received[LQ_FF_WINDOW], lost[LQ_FF_WINDOW];
@@ -76,6 +80,7 @@ void default_lq_deserialize_tc_lq_pair_ff(const olsr_u8_t **curr, void *lq);
 
 void default_lq_copy_link2tc_ff(void *target, void *source);
 void default_lq_clear_ff(void *target);
+void default_lq_clear_ff_hello(void *target);
 
 const char *default_lq_print_ff(void *ptr, struct lqtextbuffer *buffer);
 const char *default_lq_print_cost_ff(olsr_linkcost cost, struct lqtextbuffer *buffer);