Force ANSN increase when locally attached networks are changed
authorHenning Rogge <henning.rogge@fkie.fraunhofer.de>
Tue, 12 Sep 2017 07:25:21 +0000 (09:25 +0200)
committerHenning Rogge <henning.rogge@fkie.fraunhofer.de>
Tue, 12 Sep 2017 07:25:21 +0000 (09:25 +0200)
src-plugins/olsrv2/olsrv2/olsrv2_lan.c
src-plugins/olsrv2/olsrv2/olsrv2_reader.c
src-plugins/olsrv2/olsrv2/olsrv2_routing.c
src-plugins/olsrv2/olsrv2/olsrv2_routing.h
src-plugins/olsrv2/olsrv2/olsrv2_tc.c

index b1b9e04..0218643 100644 (file)
@@ -55,6 +55,7 @@
 #include "nhdp/nhdp.h"
 #include "olsrv2/olsrv2.h"
 #include "olsrv2/olsrv2_lan.h"
+#include "olsrv2/olsrv2_routing.h"
 
 static void _remove(struct olsrv2_lan_entry *entry);
 
@@ -134,6 +135,7 @@ olsrv2_lan_add(struct nhdp_domain *domain,
   lan_data->outgoing_metric = metric;
   lan_data->distance = distance;
   lan_data->active = true;
+  olsrv2_routing_domain_changed(domain, true);
 
   tmp_dist = 0;
   entry->same_distance = true;
@@ -173,6 +175,7 @@ olsrv2_lan_remove(struct nhdp_domain *domain,
 
   lan_data = olsrv2_lan_get_domaindata(domain, entry);
   lan_data->active = false;
+  olsrv2_routing_domain_changed(domain, true);
 
   for (i=0; i<NHDP_MAXIMUM_DOMAINS; i++) {
     if (entry->_domaindata[i].active) {
index 6c48f63..4053c03 100644 (file)
@@ -577,7 +577,7 @@ _cb_messagetlvs_end(struct rfc5444_reader_tlvblock_context *context __attribute_
 
   list_for_each_element(nhdp_domain_get_list(), domain, _node) {
     if (_current.changed[domain->index]) {
-      olsrv2_routing_domain_changed(domain);
+      olsrv2_routing_domain_changed(domain, false);
     }
   }
 
index 925375c..e6b4d9d 100644 (file)
@@ -287,9 +287,11 @@ olsrv2_routing_get_parameters(struct nhdp_domain *domain) {
 /**
  * Mark a domain as changed to trigger a dijkstra run
  * @param domain NHDP domain, NULL for all domains
+ * @param autoupdate_ansn true to make sure ANSN changes
  */
 void
-olsrv2_routing_domain_changed(struct nhdp_domain *domain) {
+olsrv2_routing_domain_changed(struct nhdp_domain *domain, bool autoupdate_ansn) {
+  _update_ansn |= autoupdate_ansn;
   if (domain) {
     _domain_changed[domain->index] = true;
 
@@ -298,7 +300,7 @@ olsrv2_routing_domain_changed(struct nhdp_domain *domain) {
   }
 
   list_for_each_element(nhdp_domain_get_list(), domain, _node) {
-    olsrv2_routing_domain_changed(domain);
+    olsrv2_routing_domain_changed(domain, false);
   }
 }
 
index 13a43c9..4299d62 100644 (file)
@@ -192,7 +192,8 @@ EXPORT void olsrv2_routing_force_ansn_increment(uint16_t increment);
 EXPORT void olsrv2_routing_set_domain_parameter(struct nhdp_domain *domain,
     struct olsrv2_routing_domain *parameter);
 
-EXPORT void olsrv2_routing_domain_changed(struct nhdp_domain *domain);
+EXPORT void olsrv2_routing_domain_changed(
+    struct nhdp_domain *domain, bool autoupdate_ansn);
 EXPORT void olsrv2_routing_force_update(bool skip_wait);
 EXPORT void olsrv2_routing_trigger_update(void);
 
index 69c5703..88f0c3f 100644 (file)
@@ -238,7 +238,7 @@ olsrv2_tc_node_remove(struct olsrv2_tc_node *node) {
   }
 
   /* all domains might have changed */
-  olsrv2_routing_domain_changed(NULL);
+  olsrv2_routing_domain_changed(NULL, true);
 }
 
 /**
@@ -330,7 +330,7 @@ olsrv2_tc_edge_add(struct olsrv2_tc_node *src, struct netaddr *addr) {
 bool
 olsrv2_tc_edge_remove(struct olsrv2_tc_edge *edge) {
   /* all domains might have changed */
-  olsrv2_routing_domain_changed(NULL);
+  olsrv2_routing_domain_changed(NULL, true);
 
   return _remove_edge(edge, true);
 }
@@ -431,7 +431,7 @@ olsrv2_tc_endpoint_remove(
   oonf_class_free(&_tc_attached_class, net);
 
   /* all domains might have changed */
-  olsrv2_routing_domain_changed(NULL);
+  olsrv2_routing_domain_changed(NULL, true);
 }
 
 /**