Fixes for MPR rework
authorHenning Rogge <henning.rogge@fkie.fraunhofer.de>
Mon, 13 Feb 2017 09:02:15 +0000 (10:02 +0100)
committerHenning Rogge <henning.rogge@fkie.fraunhofer.de>
Mon, 13 Feb 2017 09:02:15 +0000 (10:02 +0100)
src-plugins/nhdp/nhdp/nhdp_db.h
src-plugins/nhdp/nhdp/nhdp_domain.c
src-plugins/olsrv2/netjsoninfo/netjsoninfo.c
src-plugins/olsrv2/olsrv2/olsrv2.c
src-plugins/olsrv2/olsrv2/olsrv2_internal.h
src-plugins/olsrv2/olsrv2/olsrv2_routing.c

index 6dfdf1d..e058316 100644 (file)
@@ -130,7 +130,10 @@ struct nhdp_neighbor_domaindata {
   struct nhdp_metric metric;
 
   /*! pointer to the best link available to the neighbor */
-  struct nhdp_link *best_link;
+  struct nhdp_link *best_out_link;
+
+  /*! outgoing link metric of the best link */
+  uint32_t best_out_link_metric;
 
   /*! interface index for the best link available to the neighbor */
   unsigned best_link_ifindex;
index 9907e0b..c35e7ab 100644 (file)
@@ -417,7 +417,8 @@ nhdp_domain_init_neighbor(struct nhdp_neighbor *neigh) {
     neigh->_domaindata[i].metric.in = RFC7181_METRIC_INFINITE;
     neigh->_domaindata[i].metric.out = RFC7181_METRIC_INFINITE;
 
-    neigh->_domaindata[i].best_link = NULL;
+    neigh->_domaindata[i].best_out_link = NULL;
+    neigh->_domaindata[i].best_out_link_metric = RFC7181_METRIC_INFINITE;
     neigh->_domaindata[i].willingness = RFC7181_WILLINGNESS_NEVER;
 
 
@@ -495,20 +496,20 @@ nhdp_domain_recalculate_mpr(bool force_change) {
   struct nhdp_domain_listener *listener;
   struct nhdp_domain *domain;
 
-  bool changed_metric[NHDP_MAXIMUM_DOMAINS];
-  bool changed_mpr[NHDP_MAXIMUM_DOMAINS];
+  bool changed_metric;
+  bool changed_mpr;
 
-  memset(changed_metric, 0, sizeof(changed_metric));
-  memset(changed_mpr, 0, sizeof(changed_mpr));
-  
-  OONF_DEBUG(LOG_NHDP, "Recalculating MPR set?");
   list_for_each_element(&_domain_list, domain, _node) {
+    OONF_INFO(LOG_NHDP, "Recalculating MPR set for domain %u", domain->index);
+    changed_metric = false;
+    changed_mpr = false;
+
     /* recalculate the neighbor metrics and see if they changed */
-    changed_metric[domain->index] = _recalculate_neighbor_metrics(domain);
+    changed_metric = _recalculate_neighbor_metrics(domain);
 
-    if (changed_metric[domain->index]) {
+    if (changed_metric) {
       /* recalculate routing MPRs */
-      changed_mpr[domain->index] = _recalculate_mpr_set(domain);
+      changed_mpr = _recalculate_mpr_set(domain);
 
       if (domain->ext == _flooding_domain.ext && domain->mpr->update_flooding_mpr) {
         /* recalculating flooding MPR */
@@ -518,13 +519,16 @@ nhdp_domain_recalculate_mpr(bool force_change) {
 
     list_for_each_element(&_domain_listener_list, listener, _node) {
       /* trigger domain listeners */
-      if ((force_change || changed_metric[domain->index]) && listener->metric_update) {
+      if ((force_change || changed_metric) && listener->metric_update) {
         listener->metric_update(domain);
       }
-      if ((force_change || changed_mpr[domain->index]) && listener->mpr_update) {
+      if ((force_change || changed_mpr) && listener->mpr_update) {
         listener->mpr_update(domain);
       }
     }
+
+    OONF_INFO(LOG_NHDP, "domain %u: metric_change=%s, mpr_changed=%s",
+        domain->index, changed_metric ? "true" : "false", changed_mpr ? "true" : "false");
   }
 }
 
@@ -968,7 +972,6 @@ _recalculate_neighbor_metric(
   struct nhdp_l2hop *l2hop;
   struct nhdp_l2hop_domaindata *l2hopdata;
   struct nhdp_neighbor_domaindata *neighdata;
-  uint32_t old_outgoing;
   bool changed;
 #ifdef OONF_LOG_DEBUG_INFO
   struct netaddr_str nbuf;
@@ -977,19 +980,17 @@ _recalculate_neighbor_metric(
   neighdata = nhdp_domain_get_neighbordata(domain, neigh);
   changed = false;
 
-    /* copy old metric value */
-  old_outgoing = neighdata->metric.out;
-
   /* reset metric */
   neighdata->metric.in = RFC7181_METRIC_INFINITE;
   neighdata->metric.out = RFC7181_METRIC_INFINITE;
 
   /* reset best link */
-  neighdata->best_link = NULL;
+  neighdata->best_out_link = NULL;
   neighdata->best_link_ifindex = 0;
 
-  OONF_DEBUG(LOG_NHDP, "Recalculate neighbor %s metrics (ext %u):",
-      netaddr_to_string(&nbuf, &neigh->originator), domain->ext);
+  OONF_INFO(LOG_NHDP, "Recalculate neighbor %s metrics (ext %u): old_outgoing=%u",
+      netaddr_to_string(&nbuf, &neigh->originator), domain->ext,
+      neighdata->best_out_link_metric);
 
   /* get best metric */
   list_for_each_element(&neigh->_links, lnk, _neigh_node) {
@@ -1004,7 +1005,7 @@ _recalculate_neighbor_metric(
               linkdata->metric.out);
 
       neighdata->metric.out = linkdata->metric.out;
-      neighdata->best_link = lnk;
+      neighdata->best_out_link = lnk;
     }
     if (linkdata->metric.in < neighdata->metric.in) {
       OONF_DEBUG(LOG_NHDP, "Link on if %s has better incoming metric: %u",
@@ -1022,13 +1023,21 @@ _recalculate_neighbor_metric(
     }
   }
 
-  if (neighdata->best_link != NULL) {
-    OONF_DEBUG(LOG_NHDP, "Best link if: %s",
-        nhdp_interface_get_if_listener(neighdata->best_link->local_if)->data->name);
+  if (neighdata->best_out_link != NULL) {
+    linkdata = nhdp_domain_get_linkdata(domain, neighdata->best_out_link);
+
+    OONF_INFO(LOG_NHDP, "Best link: if=%s, link=%s, in=%u, out=%u",
+        nhdp_interface_get_if_listener(neighdata->best_out_link->local_if)->data->name,
+        netaddr_to_string(&nbuf, &neighdata->best_out_link->if_addr),
+        linkdata->metric.in, linkdata->metric.out);
     neighdata->best_link_ifindex =
-        nhdp_interface_get_if_listener(neighdata->best_link->local_if)->data->index;
+        nhdp_interface_get_if_listener(neighdata->best_out_link->local_if)->data->index;
+
+    changed |= neighdata->best_out_link_metric != linkdata->metric.out;
+    neighdata->best_out_link_metric = linkdata->metric.out;
   }
-  return changed || neighdata->metric.out != old_outgoing;
+
+  return changed;
 }
 
 /**
index 80685cc..e8fbc1c 100644 (file)
@@ -487,7 +487,7 @@ _print_edge_links(struct json_session *session,
 
   af_type = netaddr_get_address_family(&neigh->originator);
 
-  best_link = nhdp_domain_get_neighbordata(domain, neigh)->best_link;
+  best_link = nhdp_domain_get_neighbordata(domain, neigh)->best_out_link;
 
   json_start_array(session, "links");
 
index 351ae90..b229f48 100644 (file)
@@ -260,10 +260,10 @@ static struct oonf_rfc5444_protocol *_protocol;
 static bool _generate_tcs = true;
 
 /* Additional logging sources */
-static enum oonf_log_source LOG_OLSRV2;
-static enum oonf_log_source LOG_OLSRV2_R;
-static enum oonf_log_source LOG_OLSRV2_ROUTING;
-static enum oonf_log_source LOG_OLSRV2_W;
+enum oonf_log_source LOG_OLSRV2;
+enum oonf_log_source LOG_OLSRV2_R;
+enum oonf_log_source LOG_OLSRV2_ROUTING;
+enum oonf_log_source LOG_OLSRV2_W;
 
 /**
  * Initialize additional logging sources for NHDP
index e6b76b5..82403cc 100644 (file)
 #ifndef OLSRV2_INTERNAL_H_
 #define OLSRV2_INTERNAL_H_
 
+#include "common/common_types.h"
 #include "core/oonf_logging.h"
 
-/* headers only for use inside the NHDP subsystem */
-enum oonf_log_source LOG_OLSRV2;
-enum oonf_log_source LOG_OLSRV2_R;
-enum oonf_log_source LOG_OLSRV2_ROUTING;
-enum oonf_log_source LOG_OLSRV2_W;
+/* headers only for use inside the OLSRv2 subsystem */
+EXPORT enum oonf_log_source LOG_OLSRV2;
+EXPORT enum oonf_log_source LOG_OLSRV2_R;
+EXPORT enum oonf_log_source LOG_OLSRV2_ROUTING;
+EXPORT enum oonf_log_source LOG_OLSRV2_W;
 
 #endif /* OLSRV2_INTERNAL_H_ */
index bd219b8..209a8df 100644 (file)
@@ -437,6 +437,8 @@ olsrv2_routing_get_filter_list(void) {
  */
 static void
 _cb_mpr_update(struct nhdp_domain *domain) {
+  OONF_INFO(LOG_OLSRV2_ROUTING, "MPR update for domain %u", domain->index);
+
   _domain_changed[domain->index] = true;
   olsrv2_routing_trigger_update();
 }
@@ -447,6 +449,8 @@ _cb_mpr_update(struct nhdp_domain *domain) {
  */
 static void
 _cb_metric_update(struct nhdp_domain *domain) {
+  OONF_INFO(LOG_OLSRV2_ROUTING, "Metric update for domain %u", domain->index);
+
   _update_ansn = true;
   _domain_changed[domain->index] = true;
   olsrv2_routing_trigger_update();
@@ -679,7 +683,7 @@ _update_routing_entry(struct nhdp_domain *domain,
       netaddr_to_string(&nbuf1, &rtentry->route.p.key.dst),
       netaddr_to_string(&nbuf2, &rtentry->route.p.key.src),
       netaddr_to_string(&nbuf3, &first_hop->originator),
-      domain->ext, pathcost, neighdata->best_link->local_if->os_if_listener.data->name);
+      domain->ext, pathcost, neighdata->best_out_link->local_if->os_if_listener.data->name);
 
   /* remember originator */
   memcpy(&rtentry->originator, dst_originator, sizeof(struct netaddr));
@@ -695,12 +699,12 @@ _update_routing_entry(struct nhdp_domain *domain,
 
   /* copy gateway if necessary */
   if (single_hop
-      && netaddr_cmp(&neighdata->best_link->if_addr,
+      && netaddr_cmp(&neighdata->best_out_link->if_addr,
           &rtentry->route.p.key.dst) == 0) {
     netaddr_invalidate(&rtentry->route.p.gw);
   }
   else {
-    memcpy(&rtentry->route.p.gw, &neighdata->best_link->if_addr,
+    memcpy(&rtentry->route.p.gw, &neighdata->best_out_link->if_addr,
         sizeof(struct netaddr));
   }
 }