Add API to control Hello, TC and Aggregation settings from plugins to overwrite confi...
authorHenning Rogge <henning.rogge@fkie.fraunhofer.de>
Fri, 22 Sep 2017 06:59:40 +0000 (08:59 +0200)
committerHenning Rogge <henning.rogge@fkie.fraunhofer.de>
Fri, 22 Sep 2017 06:59:40 +0000 (08:59 +0200)
src-plugins/nhdp/nhdp/nhdp.c
src-plugins/nhdp/nhdp/nhdp_interfaces.c
src-plugins/nhdp/nhdp/nhdp_interfaces.h
src-plugins/olsrv2/olsrv2/olsrv2.c
src-plugins/olsrv2/olsrv2/olsrv2.h
src-plugins/subsystems/oonf_rfc5444.c
src-plugins/subsystems/oonf_rfc5444.h

index e0fe320..d692a80 100644 (file)
@@ -122,7 +122,7 @@ static struct cfg_schema_entry _interface_entries[] = {
   CFG_MAP_ACL_V46(nhdp_interface, ifaddr_filter, "ifaddr_filter",
       "-127.0.0.0/8\0-::1\0" ACL_DEFAULT_ACCEPT,
       "Filter for ip interface addresses that should be included in HELLO messages"),
-  CFG_MAP_CLOCK_MIN(nhdp_interface, h_hold_time, "hello_validity", "20.0",
+  CFG_MAP_CLOCK_MIN(nhdp_interface, validity_time, "hello_validity", "20.0",
     "Validity time for NHDP Hello Messages", 100),
   CFG_MAP_CLOCK_MIN(nhdp_interface, refresh_interval, "hello_interval", "2.0",
     "Time interval between two NHDP Hello Messages", 100),
@@ -193,9 +193,9 @@ static struct oonf_rfc5444_protocol *_protocol;
 static struct netaddr _originator_v4, _originator_v6;
 
 /* logging sources for NHDP subsystem */
-enum oonf_log_source LOG_NHDP;
-enum oonf_log_source LOG_NHDP_R;
-enum oonf_log_source LOG_NHDP_W;
+static enum oonf_log_source LOG_NHDP;
+static enum oonf_log_source LOG_NHDP_R;
+static enum oonf_log_source LOG_NHDP_W;
 
 /**
  * Initialize additional logging sources for NHDP
index ac13f6f..fa74ade 100644 (file)
@@ -323,16 +323,28 @@ nhdp_interface_remove(struct nhdp_interface *interf) {
  */
 void
 nhdp_interface_apply_settings(struct nhdp_interface *interf) {
+  uint64_t itime, vtime;
   /* parse ip address list again and apply ACL */
   _cb_interface_event(&interf->rfc5444_if, false);
 
+  /* calculate interval and validity time */
+  itime = interf->overwrite_hello_interval;
+  if (!itime) {
+    itime = interf->refresh_interval;
+  }
+  vtime = interf->overwrite_hello_validity;
+  if (!vtime) {
+    vtime = interf->validity_time;
+  }
+
   /* reset hello generation frequency */
-  oonf_timer_set(&interf->_hello_timer, interf->refresh_interval);
+  oonf_timer_set(&interf->_hello_timer, itime);
 
-  /* just copy hold time for now */
-  interf->l_hold_time = interf->h_hold_time;
-  interf->n_hold_time = interf->l_hold_time;
-  interf->i_hold_time = interf->n_hold_time;
+  /* just copy validity_time for now */
+  interf->h_hold_time = vtime;
+  interf->l_hold_time = vtime;
+  interf->n_hold_time = vtime;
+  interf->i_hold_time = vtime;
 }
 
 /**
@@ -353,6 +365,42 @@ nhdp_interface_get_address_tree(void) {
   return &_ifaddr_tree;
 }
 
+/**
+ * Set or reset the hello interval of a NHDP interface.
+ * This will overwrite the configured value
+ * @param interf NHDP interface
+ * @param interval hello interval, 0 to reset to configured value
+ * @return last hello interval, 0 if configuration was used
+ */
+uint64_t
+nhdp_interface_set_hello_interval(
+    struct nhdp_interface *interf, uint64_t interval) {
+  uint64_t old;
+
+  old = interf->overwrite_hello_interval;
+  interf->overwrite_hello_interval = interval;
+
+  nhdp_interface_apply_settings(interf);
+  return old;
+}
+
+/**
+ * Set or reset the hello validity time of a NHDP interface.
+ * This will overwrite the configured value
+ * @param interf NHDP interface
+ * @param interval hello validity, 0 to reset to configured value
+ * @return last hello validity time, 0 if configuration was used
+ */
+uint64_t nhdp_set_hello_validity(
+    struct nhdp_interface *interf, uint64_t interval) {
+  uint64_t old;
+
+  old = interf->overwrite_hello_validity;
+  interf->overwrite_hello_validity = interval;
+
+  nhdp_interface_apply_settings(interf);
+  return old;
+}
 
 /**
  * Add a nhdp interface address to an interface
index 28f83d0..d967070 100644 (file)
@@ -81,6 +81,9 @@ struct nhdp_interface {
   /*! interval between two hellos sent through this interface */
   uint64_t refresh_interval;
 
+  /*! interval until a hello is considered lost */
+  uint64_t validity_time;
+
   /*! See RFC 6130, 5.3.2 and 5.4.1 */
   uint64_t h_hold_time;
 
@@ -93,6 +96,12 @@ struct nhdp_interface {
   /*! See RFC 6130, 5.3.2 and 5.4.1 */
   uint64_t i_hold_time;
 
+  /*! variables to store hello interval overwritten by a plugin */
+  uint64_t overwrite_hello_interval;
+
+  /*! variables to store hello validity overwritten by a plugin */
+  uint64_t overwrite_hello_validity;
+
   /*! ACL for interface addresses that should be included into HELLOs */
   struct netaddr_acl ifaddr_filter;
 
@@ -185,6 +194,11 @@ EXPORT void nhdp_interface_update_status(struct nhdp_interface *);
 EXPORT struct avl_tree *nhdp_interface_get_tree(void);
 EXPORT struct avl_tree *nhdp_interface_get_address_tree(void);
 
+EXPORT uint64_t nhdp_interface_set_hello_interval(
+    struct nhdp_interface *interf, uint64_t new_interval);
+EXPORT uint64_t nhdp_set_hello_validity(
+    struct nhdp_interface *interf, uint64_t new_interval);
+
 /**
  * @param name interface name
  * @return nhdp interface, NULL if not found
index 7777eb6..3b0ef44 100644 (file)
@@ -267,11 +267,15 @@ static struct oonf_rfc5444_protocol *_protocol;
 
 static bool _generate_tcs = true;
 
+/* TC settings overwrite */
+static uint64_t _overwrite_tc_interval;
+static uint64_t _overwrite_tc_validity;
+
 /* Additional logging sources */
-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;
+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;
 
 /**
  * Initialize additional logging sources for NHDP
@@ -354,6 +358,9 @@ _cleanup(void) {
  */
 uint64_t
 olsrv2_get_tc_interval(void) {
+  if (_overwrite_tc_interval) {
+    return _overwrite_tc_interval;
+  }
   return _olsrv2_config.tc_interval;
 }
 
@@ -362,6 +369,9 @@ olsrv2_get_tc_interval(void) {
  */
 uint64_t
 olsrv2_get_tc_validity(void) {
+  if (_overwrite_tc_validity) {
+    return _overwrite_tc_validity;
+  }
   return _olsrv2_config.tc_validity;
 }
 
@@ -535,14 +545,38 @@ olsrv2_mpr_shall_forwarding(struct rfc5444_reader_tlvblock_context *context,
  */
 void
 olsrv2_generate_tcs(bool generate) {
+  uint64_t interval;
+
+  interval = _overwrite_tc_interval;
+  if (!interval) {
+    interval = _olsrv2_config.tc_interval;
+  }
   if (generate && !oonf_timer_is_active(&_tc_timer)) {
-    oonf_timer_set(&_tc_timer, _olsrv2_config.tc_interval);
+    oonf_timer_set(&_tc_timer, interval);
   }
   else if (!generate && oonf_timer_is_active(&_tc_timer)) {
     oonf_timer_stop(&_tc_timer);
   }
 }
 
+uint64_t
+olsrv2_set_tc_interval(uint64_t interval) {
+  uint64_t old;
+
+  old = _overwrite_tc_interval;
+  _overwrite_tc_interval = interval;
+  return old;
+}
+
+uint64_t
+olsrv2_set_tc_validity(uint64_t interval) {
+  uint64_t old;
+
+  old = _overwrite_tc_validity;
+  _overwrite_tc_validity = interval;
+  return old;
+}
+
 /**
  * Schema entry validator for an attached network.
  * See CFG_VALIDATE_ACL_*() macros.
@@ -900,7 +934,7 @@ _cb_cfg_olsrv2_changed(void) {
   }
 
   /* set tc timer interval */
-  if (_generate_tcs) {
+  if (_generate_tcs && _overwrite_tc_interval == 0) {
     oonf_timer_set(&_tc_timer, _olsrv2_config.tc_interval);
   }
 
index 3b63aed..c343a13 100644 (file)
@@ -93,6 +93,9 @@ EXPORT void olsrv2_generate_tcs(bool);
 EXPORT int olsrv2_validate_lan(const struct cfg_schema_entry *entry,
     const char *section_name, const char *value, struct autobuf *out);
 
+EXPORT uint64_t olsrv2_set_tc_interval(uint64_t new_interval);
+EXPORT uint64_t olsrv2_set_tc_validity(uint64_t new_interval);
+
 /**
  * @return validity time of former originator IDs
  */
index 0f8b7bb..86024ad 100644 (file)
@@ -289,7 +289,7 @@ DECLARE_OONF_PLUGIN(_oonf_rfc5444_subsystem);
 static bool _block_output = false;
 
 /* additional logging targets */
-enum oonf_log_source LOG_RFC5444_R, LOG_RFC5444_W;
+static enum oonf_log_source LOG_RFC5444_R, LOG_RFC5444_W;
 
 /**
  * Initialize RFC5444 handling system
@@ -804,6 +804,24 @@ oonf_rfc5444_reconfigure_interface(struct oonf_rfc5444_interface *interf,
   }
 }
 
+/**
+ * Set/Reset value to overwrite the configured aggregation
+ * interval of a RFC5444 interface
+ * @param interf RFC5444 interface
+ * @param aggregation new aggregation interval, 0 to reset to
+ *   configured value
+ * @return old aggregation interval, 0 if configured value was used
+ */
+uint64_t
+oonf_rfc5444_interface_set_aggregation(
+    struct oonf_rfc5444_interface *interf, uint64_t aggregation) {
+  uint64_t old;
+
+  old = interf->overwrite_aggregation_interval;
+  interf->overwrite_aggregation_interval = aggregation;
+  return old;
+}
+
 /**
  * Add an unicast target to a rfc5444 interface
  * @param interf pointer to interface instance
@@ -1234,9 +1252,15 @@ _cb_forward_message(
 static void
 _cb_msggen_notifier(struct rfc5444_writer_target *rfc5444target) {
   struct oonf_rfc5444_target *target;
+  uint64_t interval;
 
   target = container_of(rfc5444target, struct oonf_rfc5444_target, rfc5444_target);
   if (!oonf_timer_is_active(&target->_aggregation)) {
+    interval = target->interface->overwrite_aggregation_interval;
+    if (!interval) {
+      interval = target->interface->aggregation_interval;
+    }
+
     /* activate aggregation timer */
     oonf_timer_start(&target->_aggregation, target->interface->aggregation_interval);
   }
index a242b0a..24f9f88 100644 (file)
@@ -199,6 +199,12 @@ struct oonf_rfc5444_interface {
   /*! interval the multiplexer will wait until it generates a packet */
   uint64_t aggregation_interval;
 
+  /*!
+   * value to overwrite configured aggregation interval,
+   * 0 to use configured value
+   */
+  uint64_t overwrite_aggregation_interval;
+
   /*! number of users of this interface */
   int _refcount;
 };
@@ -276,6 +282,9 @@ EXPORT void oonf_rfc5444_send_target_data(struct oonf_rfc5444_target *target,
 EXPORT void oonf_rfc5444_send_interface_data(struct oonf_rfc5444_interface *interf,
     const struct netaddr *dst, const void *ptr, size_t len);
 
+EXPORT uint64_t oonf_rfc5444_interface_set_aggregation(
+    struct oonf_rfc5444_interface *interf, uint64_t aggregation);
+
 EXPORT const union netaddr_socket *oonf_rfc5444_interface_get_local_socket(
     struct oonf_rfc5444_interface *rfc5444_if, int af_type);
 EXPORT const union netaddr_socket *oonf_rfc5444_target_get_local_socket(