Put MPRSet capabilities into neighbor table.
authorHenning Rogge <hrogge@googlemail.com>
Sat, 30 May 2009 18:30:50 +0000 (20:30 +0200)
committerHenning Rogge <hrogge@googlemail.com>
Sat, 30 May 2009 18:30:50 +0000 (20:30 +0200)
18 files changed:
lib/bmf/src/Bmf.c
lib/debuginfo/src/olsrd_debuginfo.c
lib/httpinfo/src/olsrd_httpinfo.c
lib/httpinfo/src/olsrd_plugin.h
lib/mdns/src/mdns.c
lib/txtinfo/src/olsrd_txtinfo.c
src/generate_msg.c
src/link_set.c
src/link_set.h
src/lq_packet.c
src/lq_packet.h
src/mpr_selector_set.c [deleted file]
src/mpr_selector_set.h [deleted file]
src/neighbor_table.c
src/neighbor_table.h
src/olsr.c
src/process_package.c
src/scheduler.c

index 91f1464..e118d80 100644 (file)
 #include "ipcalc.h"
 #include "olsr.h"
 #include "mid_set.h"            /* mid_lookup_main_addr() */
-#include "mpr_selector_set.h"   /* olsr_lookup_mprs_set() */
 #include "link_set.h"           /* get_best_link_to_neighbor() */
 #include "net_olsr.h"           /* ipequal */
 #include "olsr_logging.h"
+#include "neighbor_table.h"
 
 /* BMF includes */
 #include "NetworkInterfaces.h"  /* TBmfInterface, CreateBmfNetworkInterfaces(), CloseBmfNetworkInterfaces() */
@@ -103,6 +103,16 @@ MainAddressOf(union olsr_ip_addr *ip)
   return result;
 }                               /* MainAddressOf */
 
+static bool
+isMprOfAddress(union olsr_ip_addr *ip) {
+  struct nbr_entry *nbr;
+
+  nbr = olsr_lookup_nbr_entry(ip, true);
+  if (nbr) {
+    return nbr->mprs_count > 0;
+  }
+  return false;
+}
 /* -------------------------------------------------------------------------
  * Function   : EncapsulateAndForwardPacket
  * Description: Encapsulate a captured raw IP packet and forward it
@@ -305,7 +315,7 @@ BmfPacketCaptured(struct TBmfInterface *intf, unsigned char sllPkttype, unsigned
 
   /* Check with OLSR if I am MPR for that neighbor */
   /* TODO: olsr_lookup_mprs_set() is not thread-safe! */
-  iAmMpr = olsr_lookup_mprs_set(origIp) != NULL;
+  iAmMpr = isMprOfAddress(origIp);
 
   /* Check with each network interface what needs to be done on it */
   for (walker = BmfInterfaces; walker != NULL; walker = walker->next) {
@@ -575,7 +585,7 @@ BmfEncapsulationPacketReceived(struct TBmfInterface *intf,
   /* if (EtherTunTapFd >= 0) */
   /* Check if I am MPR for the forwarder */
   /* TODO: olsr_lookup_mprs_set() is not thread-safe! */
-  iAmMpr = (olsr_lookup_mprs_set(MainAddressOf(forwardedBy)) != NULL);
+  iAmMpr = isMprOfAddress(forwardedBy);
 
   /* Compose destination address for next hop */
   memset(&forwardTo, 0, sizeof(forwardTo));
index c3eeab7..ab32853 100644 (file)
@@ -45,7 +45,6 @@
 #include "olsr.h"
 #include "ipcalc.h"
 #include "neighbor_table.h"
-#include "mpr_selector_set.h"
 #include "tc_set.h"
 #include "hna_set.h"
 #include "mid_set.h"
index 61f74e1..f9fa756 100644 (file)
@@ -965,7 +965,9 @@ build_neigh_body(struct autobuf *abuf)
                  "<td>%s</td>"
                  "<td>%d</td>",
                  neigh->is_sym ? "YES" : "NO",
-                 neigh->is_mpr ? "YES" : "NO", olsr_lookup_mprs_set(&neigh->nbr_addr) ? "YES" : "NO", neigh->willingness);
+                 neigh->is_mpr ? "YES" : "NO",
+                 neigh->mprs_count > 0 ? "YES" : "NO",
+                 neigh->willingness);
 
     abuf_puts(abuf, "<td><select>\n" "<option>IP ADDRESS</option>\n");
 
index f259f50..07a9717 100644 (file)
@@ -61,7 +61,6 @@
 #include "tc_set.h"
 #include "hna_set.h"
 #include "mid_set.h"
-#include "mpr_selector_set.h"
 #include "routing_table.h"
 
 #define PLUGIN_NAME    "OLSRD httpinfo plugin"
index f5ae044..64823bd 100644 (file)
@@ -48,7 +48,6 @@ Written by Saverio Proto <zioproto@gmail.com> and Claudio Pisa <clauz@ninux.org>
 #include "ipcalc.h"
 #include "olsr.h"               /* //OLSR_PRINTF */
 #include "mid_set.h"            /* mid_lookup_main_addr() */
-#include "mpr_selector_set.h"   /* olsr_lookup_mprs_set() */
 #include "link_set.h"           /* get_best_link_to_neighbor() */
 #include "net_olsr.h"           /* ipequal */
 #include "olsr_logging.h"
index 48caa3b..eec560a 100644 (file)
@@ -45,7 +45,6 @@
 #include "olsr.h"
 #include "ipcalc.h"
 #include "neighbor_table.h"
-#include "mpr_selector_set.h"
 #include "tc_set.h"
 #include "hna_set.h"
 #include "mid_set.h"
@@ -190,7 +189,8 @@ txtinfo_neigh(struct comport_connection *con,  char *cmd __attribute__ ((unused)
                        olsr_ip_to_string(&buf1, &neigh->nbr_addr),
                        neigh->is_sym ? "YES" : "NO",
                        neigh->is_mpr ? "YES" : "NO",
-                       olsr_lookup_mprs_set(&neigh->nbr_addr) ? "YES" : "NO", neigh->willingness, neigh->con_tree.count) < 0) {
+                       neigh->mprs_count > 0 ? "YES" : "NO",
+                       neigh->willingness, neigh->con_tree.count) < 0) {
         return ABUF_ERROR;
     }
   } OLSR_FOR_ALL_NBR_ENTRIES_END(neigh);
index 1e3c7f2..3efdab3 100644 (file)
@@ -49,7 +49,6 @@
  */
 #include "mid_set.h"
 #include "tc_set.h"
-#include "mpr_selector_set.h"
 #include "neighbor_table.h"
 #include "net_olsr.h"
 
index f092188..50955cf 100644 (file)
@@ -295,6 +295,10 @@ olsr_delete_link_entry(struct link_entry *link)
     olsr_delete_nbr_entry(link->neighbor);
   } else {
     link->neighbor->linkcount--;
+
+    if (link->is_mprs) {
+      link->neighbor->mprs_count --;
+    }
   }
 
   /* Kill running timers */
@@ -490,9 +494,12 @@ add_link_entry(const union olsr_ip_addr *local,
 
   link->linkcost = LINK_COST_BROKEN;
 
+  link->is_mprs = false;
+
   /* Add to queue */
   list_add_before(&link_entry_head, &link->link_list);
 
+
   /*
    * Create the neighbor entry
    */
index ee5b061..3cc9c83 100644 (file)
@@ -67,6 +67,8 @@ struct link_entry {
   struct nbr_entry *neighbor;
   uint8_t prev_status;
 
+  bool is_mprs;
+
   /*
    * packet loss
    */
index c81def4..dc97404 100644 (file)
@@ -46,7 +46,6 @@
 #include "interfaces.h"
 #include "link_set.h"
 #include "neighbor_table.h"
-#include "mpr_selector_set.h"
 #include "mid_set.h"
 #include "mantissa.h"
 #include "process_package.h"    // XXX - remove
@@ -62,6 +61,15 @@ bool lq_tc_pending = false;
 
 static unsigned char msg_buffer[MAXMESSAGESIZE - OLSR_HEADERSIZE];
 
+static uint16_t local_ansn_number = 0;
+
+uint16_t get_local_ansn_number(bool increase) {
+  if (increase)
+    local_ansn_number++;
+  return local_ansn_number;
+}
+
+
 static void
 create_lq_hello(struct lq_hello_message *lq_hello, struct interface *outif)
 {
@@ -178,7 +186,7 @@ create_lq_tc(struct lq_tc_message *lq_tc, struct interface *outif)
 
   lq_tc->from = olsr_cnf->router_id;
 
-  lq_tc->ansn = get_local_ansn();
+  lq_tc->ansn = get_local_ansn_number(false);
 
   lq_tc->neigh = NULL;
 
@@ -198,7 +206,7 @@ create_lq_tc(struct lq_tc_message *lq_tc, struct interface *outif)
      *
      * Only consider MPRs and MPR selectors
      */
-    if (olsr_cnf->tc_redundancy == 1 && !walker->is_mpr && !olsr_lookup_mprs_set(&walker->nbr_addr)) {
+    if (olsr_cnf->tc_redundancy == 1 && !walker->is_mpr && walker->mprs_count == 0) {
       continue;
     }
 
@@ -207,7 +215,7 @@ create_lq_tc(struct lq_tc_message *lq_tc, struct interface *outif)
      *
      * Only consider MPR selectors
      */
-    if (olsr_cnf->tc_redundancy == 0 && !olsr_lookup_mprs_set(&walker->nbr_addr)) {
+    if (olsr_cnf->tc_redundancy == 0 && walker->mprs_count == 0) {
       continue;
     }
 
index 18e970c..b051af7 100644 (file)
@@ -289,6 +289,8 @@ pkt_put_prefixlen(uint8_t ** p, uint8_t var)
   *p += olsr_cnf->ipsize;
 }
 
+uint16_t EXPORT(get_local_ansn_number)(bool increase);
+
 void olsr_output_lq_hello(void *para);
 
 void olsr_output_lq_tc(void *para);
diff --git a/src/mpr_selector_set.c b/src/mpr_selector_set.c
deleted file mode 100644 (file)
index da0b434..0000000
+++ /dev/null
@@ -1,179 +0,0 @@
-
-/*
- * The olsr.org Optimized Link-State Routing daemon(olsrd)
- * Copyright (c) 2004-2009, the olsr.org team - see HISTORY file
- * All rights reserved.
- *
- * 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
- *   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
- *   distribution.
- * * 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
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * Visit http://www.olsr.org for more information.
- *
- * If you find this software useful feel free to make a donation
- * to the project. For more information see the website or contact
- * the copyright holders.
- *
- */
-#include "mpr_selector_set.h"
-#include "link_set.h"
-#include "olsr.h"
-#include "olsr_logging.h"
-
-uint16_t ansn = 0;
-
-static struct olsr_cookie_info *mpr_sel_timer_cookie;
-static struct olsr_cookie_info *mpr_sel_mem_cookie;
-
-/* Root of MPR selector tree */
-static struct avl_tree mprs_tree;
-
-
-void
-olsr_init_mprs(void)
-{
-  OLSR_INFO(LOG_MPRS, "Initialize MPR set...\n");
-
-  avl_init(&mprs_tree, avl_comp_default);
-
-  /*
-   * Get some cookies for getting stats to ease troubleshooting.
-   */
-  mpr_sel_timer_cookie = olsr_alloc_cookie("MPR Selector", OLSR_COOKIE_TYPE_TIMER);
-
-  mpr_sel_mem_cookie = olsr_alloc_cookie("MPR Selector", OLSR_COOKIE_TYPE_MEMORY);
-  olsr_cookie_set_memory_size(mpr_sel_mem_cookie, sizeof(struct mpr_selector));
-}
-
-/**
- * Wrapper for the timer callback.
- */
-static void
-olsr_expire_mpr_sel_entry(void *context)
-{
-  struct mpr_selector *mpr_sel = context;
-#if !defined REMOVE_LOG_DEBUG
-  struct ipaddr_str buf;
-#endif
-  OLSR_DEBUG(LOG_MPRS, "MPRS: Timing out %st\n", olsr_ip_to_string(&buf, &mpr_sel->MS_main_addr));
-
-  mpr_sel->MS_timer = NULL;
-
-  avl_delete(&mprs_tree, &mpr_sel->mprs_node);
-
-  /* Delete entry */
-  olsr_cookie_free(mpr_sel_mem_cookie, mpr_sel);
-  signal_link_changes(true);
-}
-
-/**
- * Lookup an entry in the MPR selector table
- * based on address
- *
- * @param addr the addres to check for
- *
- * @return a pointer to the entry or NULL
- */
-struct mpr_selector *
-olsr_lookup_mprs_set(const union olsr_ip_addr *addr)
-{
-  struct avl_node *node;
-
-  node = avl_find(&mprs_tree, addr);
-  if (node) {
-    return mprs_sel_node_to_mpr_sel(node);
-  }
-  return NULL;
-}
-
-
-/**
- * Update a MPR selector entry or create an new
- * one if it does not exist
- *
- * @param addr the address of the MPR selector
- * @param vtime tha validity time of the entry
- *
- * @return 1 if a new entry was added 0 if not
- */
-int
-olsr_update_mprs_set(const union olsr_ip_addr *addr, olsr_reltime vtime)
-{
-  int rv;
-#if !defined REMOVE_LOG_DEBUG
-  struct ipaddr_str buf;
-#endif
-  struct mpr_selector *mprs;
-
-  mprs = olsr_lookup_mprs_set(addr);
-  if (mprs == NULL) {
-    mprs = olsr_cookie_malloc(mpr_sel_mem_cookie);
-
-    OLSR_DEBUG(LOG_MPRS, "MPRS: adding %s\n", olsr_ip_to_string(&buf, addr));
-
-    /* Fill struct */
-    mprs->MS_main_addr = *addr;
-
-    /* Queue */
-    mprs->mprs_node.key = &mprs->MS_main_addr;
-    avl_insert(&mprs_tree, &mprs->mprs_node, AVL_DUP_NO);
-
-    signal_link_changes(true);
-    rv = 1;
-  } else {
-    OLSR_DEBUG(LOG_MPRS, "MPRS: Update %s\n", olsr_ip_to_string(&buf, addr));
-    rv = 0;
-  }
-  olsr_set_timer(&mprs->MS_timer,
-                 vtime, OLSR_MPR_SEL_JITTER, OLSR_TIMER_ONESHOT, &olsr_expire_mpr_sel_entry, mprs, mpr_sel_timer_cookie);
-  return rv;
-}
-
-
-/**
- *Print the current MPR selector set to STDOUT
- */
-void
-olsr_print_mprs_set(void)
-{
-#if !defined REMOVE_LOG_INFO
-  struct ipaddr_str buf;
-  struct mpr_selector *mprs;
-
-  OLSR_INFO(LOG_MPRS, "MPR SELECTORS:\n");
-
-  OLSR_FOR_ALL_MPRS_ENTRIES(mprs) {
-    OLSR_INFO_NH(LOG_MPRS, "\t%s\n", olsr_ip_to_string(&buf, &mprs->MS_main_addr));
-  } OLSR_FOR_ALL_MPRS_ENTRIES_END(mprs);
-#endif
-}
-
-/*
- * Local Variables:
- * c-basic-offset: 2
- * indent-tabs-mode: nil
- * End:
- */
diff --git a/src/mpr_selector_set.h b/src/mpr_selector_set.h
deleted file mode 100644 (file)
index 1aad334..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-
-/*
- * The olsr.org Optimized Link-State Routing daemon(olsrd)
- * Copyright (c) 2004-2009, the olsr.org team - see HISTORY file
- * All rights reserved.
- *
- * 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
- *   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
- *   distribution.
- * * 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
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * Visit http://www.olsr.org for more information.
- *
- * If you find this software useful feel free to make a donation
- * to the project. For more information see the website or contact
- * the copyright holders.
- *
- */
-#ifndef _OLSR_MPRS_SET
-#define _OLSR_MPRS_SET
-
-#include "mantissa.h"
-#include "defs.h"
-#include "common/avl.h"
-
-#define OLSR_MPR_SEL_JITTER 5   /* percent */
-
-struct mpr_selector {
-  struct avl_node mprs_node;
-  union olsr_ip_addr MS_main_addr;
-  struct timer_entry *MS_timer;
-};
-
-/* inline to recast from avl_node back to mprs_selector */
-AVLNODE2STRUCT(mprs_sel_node_to_mpr_sel, struct mpr_selector, mprs_node);
-
-/*
- * macros for traversing all mpr selectors.
- * it is recommended to use this because it hides all the internal
- * datastructure from the callers.
- *
- * the loop prefetches the next node in order to not loose context if
- * for example the caller wants to delete the current entry.
- */
-#define OLSR_FOR_ALL_MPRS_ENTRIES(mprs) \
-{ \
-  struct avl_node *mprs_tree_node, *next_mprs_tree_node; \
-  for (mprs_tree_node = avl_walk_first(&mprs_tree); \
-    mprs_tree_node; mprs_tree_node = next_mprs_tree_node) { \
-    next_mprs_tree_node = avl_walk_next(mprs_tree_node); \
-    mprs = mprs_sel_node_to_mpr_sel(mprs_tree_node);
-#define OLSR_FOR_ALL_MPRS_ENTRIES_END(mprs) }}
-
-extern uint16_t ansn;
-
-void olsr_init_mprs(void);
-
-static INLINE uint16_t
-get_local_ansn(void)
-{
-  return ansn;
-}
-
-static INLINE void
-increase_local_ansn(void)
-{
-  ansn++;
-}
-
-struct mpr_selector *EXPORT(olsr_lookup_mprs_set) (const union olsr_ip_addr *);
-
-int olsr_update_mprs_set(const union olsr_ip_addr *, olsr_reltime);
-
-void
-  olsr_print_mprs_set(void);
-
-#endif
-
-/*
- * Local Variables:
- * c-basic-offset: 2
- * indent-tabs-mode: nil
- * End:
- */
index 505d6e0..4466bb7 100644 (file)
@@ -46,7 +46,6 @@
 #include "olsr.h"
 #include "scheduler.h"
 #include "link_set.h"
-#include "mpr_selector_set.h"
 #include "net_olsr.h"
 #include "olsr_logging.h"
 
@@ -454,7 +453,8 @@ olsr_print_neighbor_table(void)
                  ipwidth, olsr_ip_to_string(&buf, &nbr->nbr_addr),
                  nbr->is_sym ? "YES" : "NO",
                  nbr->is_mpr ? "YES" : "NO",
-                 olsr_lookup_mprs_set(&nbr->nbr_addr) == NULL ? "NO  " : "YES ", nbr->willingness);
+                 nbr->mprs_count == 0  ? "NO  " : "YES ",
+                 nbr->willingness);
   } OLSR_FOR_ALL_NBR_ENTRIES_END(nbr);
 
   OLSR_INFO(LOG_2NEIGH, "\n--- %s ----------------------- TWO-HOP NEIGHBORS\n\n"
index 75c4e8a..b059f38 100644 (file)
@@ -80,8 +80,8 @@ struct nbr_entry {
   unsigned int is_mpr:1;
   unsigned int was_mpr:1;              /* Used to detect changes in MPR */
   unsigned int skip:1;
-  int nbr2_nocov;
   unsigned int linkcount;
+  uint16_t mprs_count;           /* >0 if we are choosen as an MPR by this neighbor */
   struct avl_tree con_tree;      /* subtree for connectors to nbr2 */
 };
 
index b68cfd2..8b8c095 100644 (file)
@@ -48,7 +48,6 @@
 #include "link_set.h"
 #include "tc_set.h"
 #include "duplicate_set.h"
-#include "mpr_selector_set.h"
 #include "mid_set.h"
 #include "lq_mpr.h"
 #include "olsr_spf.h"
@@ -233,9 +232,6 @@ olsr_init_tables(void)
   /* Initialize HNA set */
   olsr_init_hna_set();
 
-  /* Initialize MPRS */
-  olsr_init_mprs();
-
   /* Start periodic SPF and RIB recalculation */
   if (olsr_cnf->lq_dinter > 0.0) {
     periodic_spf_timer_cookie = olsr_alloc_cookie("Periodic SPF", OLSR_COOKIE_TYPE_TIMER);
@@ -294,7 +290,7 @@ olsr_forward_message(union olsr_message *m, struct interface *in_if, union olsr_
   }
 
   /* Check MPR */
-  if (olsr_lookup_mprs_set(src) == NULL) {
+  if (neighbor->mprs_count == 0) {
     OLSR_DEBUG(LOG_PACKET_PARSING, "Not forwarding message type %d because we are no MPR for %s\n",
         m->v4.olsr_msgtype, olsr_ip_to_string(&buf, src));
     /* don't forward packages if not a MPR */
index 2bc0da7..da321f3 100644 (file)
@@ -43,7 +43,6 @@
 #include "link_set.h"
 #include "hna_set.h"
 #include "neighbor_table.h"
-#include "mpr_selector_set.h"
 #include "mid_set.h"
 #include "olsr.h"
 #include "parser.h"
@@ -256,6 +255,21 @@ deserialize_hello(struct lq_hello_message *hello, const void *ser)
 }
 
 
+static void olsr_update_mprs_set(struct lq_hello_message *message, struct link_entry *link) {
+  bool new_mprs_status;
+
+  new_mprs_status = lookup_mpr_status(message, link->inter);
+
+  if (new_mprs_status && !link->is_mprs) {
+    link->neighbor->mprs_count++;
+  }
+  if (!new_mprs_status && link->is_mprs) {
+    link->neighbor->mprs_count--;
+  }
+
+  link->is_mprs = new_mprs_status;
+}
+
 static void
 hello_tap(struct lq_hello_message *message, struct interface *in_if, const union olsr_ip_addr *from_addr)
 {
@@ -274,6 +288,8 @@ hello_tap(struct lq_hello_message *message, struct interface *in_if, const union
     }
   }
 
+  olsr_update_mprs_set(message, lnk);
+
   /*
    * memorize our neighbour's idea of the link quality, so that we
    * know the link quality in both directions
@@ -286,12 +302,6 @@ hello_tap(struct lq_hello_message *message, struct interface *in_if, const union
   /* update packet loss for link quality calculation */
   olsr_update_packet_loss(lnk);
 
-  /* Check if we are chosen as MPR */
-  if (lookup_mpr_status(message, in_if)) {
-    /* source_addr is always the main addr of a node! */
-    olsr_update_mprs_set(&message->comm.orig, message->comm.vtime);
-  }
-
   /* Check willingness */
   if (lnk->neighbor->willingness != message->will) {
 #if !defined REMOVE_LOG_DEBUG
index c892666..bbe7a74 100644 (file)
@@ -42,7 +42,6 @@
 #include "scheduler.h"
 #include "log.h"
 #include "link_set.h"
-#include "mpr_selector_set.h"
 #include "olsr.h"
 #include "olsr_cookie.h"
 #include "net_os.h"
@@ -471,8 +470,7 @@ olsr_scheduler(void)
 
     /* Check for changes in topology */
     if (link_changes) {
-      OLSR_DEBUG(LOG_SCHEDULER, "ANSN UPDATED %d\n\n", get_local_ansn());
-      increase_local_ansn();
+      OLSR_DEBUG(LOG_SCHEDULER, "ANSN UPDATED %d\n\n", get_local_ansn_number(true));
       link_changes = false;
     }