Cleanup error handling of mandatory olsrv2_lan parameters
authorHenning Rogge <henning.rogge@fkie.fraunhofer.de>
Mon, 26 Feb 2018 08:23:44 +0000 (09:23 +0100)
committerHenning Rogge <henning.rogge@fkie.fraunhofer.de>
Mon, 26 Feb 2018 08:23:44 +0000 (09:23 +0100)
src-api/config/cfg_schema.c
src-plugins/olsrv2/lan_import/lan_import.c

index a9c2ec1..712c7e5 100644 (file)
@@ -313,36 +313,29 @@ cfg_schema_validate(struct cfg_db *db, bool cleanup, bool ignore_unknown_section
     /* check for missing values */
     for (i = 0; i < schema_section->entry_count; i++) {
       schema_entry = &schema_section->entries[i];
-      if (strarray_is_empty_c(&schema_entry->def)) {
+      if (section && strarray_is_empty_c(&schema_entry->def)) {
         /* found a mandatory schema entry */
 
         warning = true;
-        if (section) {
-          named = cfg_db_get_unnamed_section(section);
-          if (named) {
-            /* entry not in unnamed section */
-            warning = cfg_db_get_entry(named, schema_entry->key.entry) == NULL;
-            if (named->name && warning) {
-              /* no mandatory value in unnamed section, check named sections */
-              warning = false;
-
-              avl_for_each_element(&section->names, named, node) {
-                if (named->name != NULL && cfg_db_get_entry(named, schema_entry->key.entry) == NULL) {
-                  /* found a named section without mandatory entry */
-                  warning = true;
-                  break;
-                }
-              }
-            }
-          }
-          else {
-            /* no unnamed section */
-            warning = true;
-          }
+        named = cfg_db_get_unnamed_section(section);
+        if (named) {
+          /* entry not in unnamed section */
+          warning = cfg_db_get_entry(named, schema_entry->key.entry) == NULL;
         }
         if (warning) {
-          cfg_append_printable_line(
-            out, "Missing mandatory entry of type '%s' and key '%s'", schema_section->type, schema_entry->key.entry);
+          /* no mandatory value in unnamed section, check named sections */
+          warning = false;
+
+          avl_for_each_element(&section->names, named, node) {
+            if (named->name != NULL && cfg_db_get_entry(named, schema_entry->key.entry) == NULL) {
+              /* found a named section without mandatory entry */
+              warning = true;
+              cfg_append_printable_line(
+                out, "Missing mandatory entry of type '%s', name '%s' and key '%s'",
+                schema_section->type, named->name, schema_entry->key.entry);
+              break;
+            }
+          }
         }
         error |= warning;
       }
index 3572bd3..98c8a37 100644 (file)
@@ -139,6 +139,7 @@ static void _cb_rt_event(const struct os_route *, bool);
 
 static void _cb_metric_aging(struct oonf_timer_instance *entry);
 
+static void _cb_cfg_interface_changed(void);
 static void _cb_cfg_changed(void);
 
 /* plugin declaration */
@@ -164,6 +165,12 @@ static struct cfg_schema_entry _import_entries[] = {
     "Double the routing metric value every time interval, 0 to disable"),
 };
 
+static struct cfg_schema_section _interface_section = {
+  CFG_OSIF_SCHEMA_INTERFACE_SECTION_INIT,
+
+  .cb_delta_handler = _cb_cfg_interface_changed,
+};
+
 static struct cfg_schema_section _import_section = {
   .type = OONF_LAN_IMPORT_SUBSYSTEM,
 
@@ -177,6 +184,8 @@ static struct cfg_schema_section _import_section = {
 
   .entries = _import_entries,
   .entry_count = ARRAYSIZE(_import_entries),
+
+  .next_section = &_interface_section,
 };
 
 static const char *_dependencies[] = {
@@ -312,7 +321,6 @@ _is_allowed_to_import(const struct os_route *route) {
 
   interf = os_interface_get_data_by_ifindex(route->p.if_index);
   if (interf != NULL && interf->flags.mesh) {
-    /* don't import routes from mesh interface */
     return false;
   }
   return true;
@@ -356,6 +364,11 @@ _cb_rt_event(const struct os_route *route, bool set) {
     return;
   }
 
+  /* get interface name for route */
+  if (route->p.if_index) {
+    if_indextoname(route->p.if_index, ifname);
+  }
+
   avl_for_each_element(&_import_tree, import, _node) {
     OONF_DEBUG(LOG_LAN_IMPORT, "Check for import: %s", import->name);
 
@@ -391,7 +404,10 @@ _cb_rt_event(const struct os_route *route, bool set) {
 
     /* check interface name */
     if (import->ifname[0]) {
-      if_indextoname(route->p.if_index, ifname);
+      if (route->p.if_index == 0) {
+        OONF_DEBUG(LOG_LAN_IMPORT, "Route has no interface");
+        continue;
+      }
       if (strcmp(import->ifname, ifname) != 0) {
         OONF_DEBUG(LOG_LAN_IMPORT, "Bad interface");
         continue;
@@ -536,6 +552,26 @@ _cb_metric_aging(struct oonf_timer_instance *entry) {
   }
 }
 
+/**
+ * interface section changed
+ */
+static void
+_cb_cfg_interface_changed(void) {
+  struct _import_entry *import;
+
+  if (_interface_section.pre || !_interface_section.post) {
+    /* only check for new sections */
+    return;
+  }
+
+  avl_for_each_element(&_import_tree, import, _node) {
+    if (import->ifname[0] && strcmp(import->ifname, _interface_section.section_name) == 0) {
+      OONF_WARN(LOG_LAN_IMPORT, "Mesh interface %s cannot be used for LAN IMPORT",
+                _interface_section.section_name);
+    }
+  }
+}
+
 /**
  * Configuration changed
  */
@@ -543,6 +579,13 @@ static void
 _cb_cfg_changed(void) {
   struct _import_entry *import;
 
+  if (_import_section.post && !_import_section.pre) {
+    if (nhdp_interface_get(_import_section.section_name)) {
+      OONF_WARN(LOG_LAN_IMPORT, "Mesh interface %s cannot be used for LAN IMPORT",
+                _import_section.section_name);
+    }
+  }
+
   /* get existing modifier */
   import = _get_import(_import_section.section_name);
   if (!import) {