pud: merge nodeIdType and nodeId parameters into nodeId parameter
authorFerry Huberts <ferry.huberts@pelagic.nl>
Tue, 1 Oct 2013 12:46:32 +0000 (14:46 +0200)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Tue, 1 Oct 2013 12:46:32 +0000 (14:46 +0200)
So that we can do an early validity check.

Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
lib/pud/olsrd.conf.sample
lib/pud/src/configuration.c
lib/pud/src/configuration.h
lib/pud/src/pudOlsrdPlugin.h

index 9f33b44..d77d750 100644 (file)
@@ -1,46 +1,47 @@
 LoadPlugin "<olsrd plugin library path>/olsrd_pud.so.1.1.0"
 {
-    # nodeIdType is used to indicate the type of the nodeId field and is a
-    #            number in the range 0-255, with the following meaning:
-    #
-    #        0 : MAC address of sending interface
-    #            (nodeId is not relevant)
-    #        1 : an MSISDN number with 15 digits
-    #        2 : a Tetra number with 17 digits
-    #        3 : a DNS name
-    #        4 : IPv4 address (OLSR main address) of the sending node
-    #            (nodeId is not relevant)
-    #        6 : IPv6 address (OLSR main address) of the sending node
-    #            (nodeId is not relevant)
-    #        7 : an AIS MMSI number with 9 digits
-    #        8 : a URN number with 8 digits
-    #      192 : a 7 digit number conforming to 'Nationaal Nummerplan
-    #            Brandweer Nederland'
-    #      193 : a 6 digit number conforming to 'Nationaal Nummerplan
-    #            Ambulancezorg Nederland'
-    #      194 : a 4 digit number in the range [1, 8191]
-    #
-    #      other numbers are reserved 
-    #
-    # Note: setting 4 or 6 is the same for olsrd: both mean 'use the main
-    #       IP address, which is either an IPv4 or an IPv6 address, depending
-    #       on the IP version under which olsrd is run.
-    #
-    # Default: 4 or 6, depending on the IP version olsrd is using
-    #
-    #PlParam     "nodeIdType"                   "4"
-
-    # nodeId is the node identification with the meaning as indicated by the
-    #        nodeIdType parameter. When not set AND the nodeIdType is 3 (DNS
-    #        name) then the hostname is used.
-    #
-    # Note: Both the nodeIdType and nodeId fields are transported over
-    #       OLSR, so care must be taken to keep the size of the nodeId
-    #       parameter down.
-    #
-    # Default: none
-    #
-    #PlParam     "nodeId"                       ""
+    # nodeId contains the node identification. It first describes the semantics
+    #        (meaning/code) of the identification and then specifies the node
+    #        identification itself.
+    #        For some codes the identification itself is not relevant and
+    #        therefore ignored (specified if so).
+    #
+    #        The format is "number,identification"
+    #
+    #        "Number" is a number in the range 0-255, with the following
+    #        meaning:
+    #           0 : MAC address of sending interface
+    #               (identification is not relevant)
+    #           1 : an MSISDN number with 15 digits
+    #           2 : a Tetra number with 17 digits
+    #           3 : a DNS name
+    #               (identification can be empty, in which case the hostname is
+    #                used)
+    #           4 : IPv4 address (OLSR main address) of the sending node
+    #               (identification is not relevant)
+    #           6 : IPv6 address (OLSR main address) of the sending node
+    #               (identification is not relevant)
+    #           7 : an AIS MMSI number with 9 digits
+    #           8 : a URN number with 8 digits
+    #         192 : a 7 digit number conforming to 'Nationaal Nummerplan
+    #               Brandweer Nederland'
+    #         193 : a 6 digit number conforming to 'Nationaal Nummerplan
+    #               Ambulancezorg Nederland'
+    #         194 : a 4 digit number in the range [1, 8191]
+    #
+    #         other numbers are reserved
+    #
+    # Note: setting "number" to 4 or 6 is the same for olsrd: both mean 'use
+    #       the main IP address, which is either an IPv4 or an IPv6 address,
+    #       depending on the IP version under which olsrd is run.
+    #
+    # Note: Both the number and the identification are transported over OLSR,
+    #       so care must be taken to keep the size of the identification down.
+    #
+    # Default: "4" (when olsrd is run under IPv4)
+    #          "6" (when olsrd is run under IPv6)
+    #
+    #PlParam     "nodeId"                       "4"
 
 
     #
index 854bd47..95db161 100644 (file)
@@ -9,6 +9,7 @@
 
 /* OLSR includes */
 #include <olsr_protocol.h>
+#include <olsr.h>
 
 /* System includes */
 #include <unistd.h>
@@ -16,6 +17,9 @@
 #include <OlsrdPudWireFormat/nodeIdConversion.h>
 #include <limits.h>
 
+/* forward declarations */
+static bool setupNodeIdBinaryAndValidate(NodeIdType nodeIdTypeNumber);
+
 /*
  * Note:
  * Setters must return true when an error is detected, false otherwise
@@ -36,9 +40,7 @@ NodeIdType getNodeIdTypeNumber(void) {
        return nodeIdType;
 }
 
-int setNodeIdType(const char *value, void *data __attribute__ ((unused)),
-               set_plugin_parameter_addon addon __attribute__ ((unused))) {
-       static const char * valueName = PUD_NODE_ID_TYPE_NAME;
+static int setNodeIdType(const char *value, const char * valueName) {
        unsigned long long nodeIdTypeNew;
 
        if (!readULL(valueName, value, &nodeIdTypeNew)) {
@@ -46,7 +48,7 @@ int setNodeIdType(const char *value, void *data __attribute__ ((unused)),
        }
 
        if (!isValidNodeIdType(nodeIdTypeNew)) {
-               pudError(false, "Value of parameter %s (%llu) is reserved", valueName,
+               pudError(false, "Value in parameter %s (%llu) is reserved", valueName,
                                nodeIdTypeNew);
                return true;
        }
@@ -110,23 +112,79 @@ nodeIdBinaryType * getNodeIdBinary(void) {
 
 int setNodeId(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) {
        size_t valueLength;
+       char * number;
+       char * identification;
 
        assert (value != NULL);
 
-       valueLength = strlen(value);
-       if (valueLength > (PUD_TX_NODEID_BUFFERSIZE - 1)) {
-               pudError(false, "Value of parameter %s is too long, maximum length is"
-                       " %u, current length is %lu", PUD_NODE_ID_NAME, (PUD_TX_NODEID_BUFFERSIZE - 1),
-                               (unsigned long) valueLength);
-               return true;
-       }
-
-       strcpy((char *) &nodeId[0], value);
-       nodeIdLength = valueLength;
-       nodeIdSet = true;
-       nodeIdBinary.set = false;
+  nodeId[0] = '\0';
+  nodeIdLength = 0;
+  nodeIdSet = false;
+  nodeIdBinary.set = false;
 
-       return false;
+       valueLength = strlen(value);
+  number = olsr_malloc(valueLength + 1, "setNodeId");
+  strcpy(number, value);
+
+  /* split "number,identification" */
+  identification = strchr(number, ',');
+  if (identification) {
+    *identification = '\0';
+    identification++;
+  }
+
+  /* parse number into nodeIdType (if present) */
+  valueLength = strlen(number);
+  if (valueLength && setNodeIdType(number, PUD_NODE_ID_NAME)) {
+    free(number);
+    return true;
+  }
+
+  /* copy identification into nodeId (if present) */
+  if (identification) {
+    valueLength = strlen(identification);
+    if (valueLength > (PUD_TX_NODEID_BUFFERSIZE - 1)) {
+      pudError(false, "Value in parameter %s is too long, maximum length is"
+        " %u, current length is %lu", PUD_NODE_ID_NAME, (PUD_TX_NODEID_BUFFERSIZE - 1),
+          (unsigned long) valueLength);
+      free(number);
+      return true;
+    }
+
+    if (valueLength) {
+      strcpy((char *) &nodeId[0], identification);
+      nodeIdLength = valueLength;
+      nodeIdSet = true;
+    }
+  }
+
+  free(number);
+
+  /* fill in automatic values */
+  if (!nodeIdSet) {
+    if (nodeIdType == PUD_NODEIDTYPE_DNS) {
+      memset(nodeId, 0, sizeof(nodeId));
+      errno = 0;
+      if (gethostname((char *)&nodeId[0], sizeof(nodeId) - 1) < 0) {
+        pudError(true, "Could not get the host name");
+        return true;
+      }
+
+      nodeIdLength = strlen((char *)nodeId);
+      nodeIdSet = true;
+    } else if ((nodeIdType != PUD_NODEIDTYPE_MAC) && (nodeIdType != PUD_NODEIDTYPE_IPV4)
+        && (nodeIdType != PUD_NODEIDTYPE_IPV6)) {
+      pudError(false, "No node ID set while one is required for nodeId type %u", nodeIdType);
+      return true;
+    }
+  }
+
+  if (!setupNodeIdBinaryAndValidate(nodeIdType)) {
+    pudError(false, "nodeId (type %u) is incorrectly configured", nodeIdType);
+    return true;
+  }
+
+  return false;
 }
 
 /*
@@ -1426,31 +1484,6 @@ unsigned int checkConfig(void) {
                retval = false;
        }
 
-       if (!nodeIdSet) {
-               if (nodeIdType == PUD_NODEIDTYPE_DNS) {
-                       char name[PUD_TX_NODEID_BUFFERSIZE];
-
-                       errno = 0;
-                       if (gethostname(&name[0], sizeof(name)) < 0) {
-                               pudError(true, "Could not get the host name");
-                               retval = false;
-                       } else {
-                               setNodeId(&name[0], NULL,
-                                               (set_plugin_parameter_addon) {.pc = NULL});
-                       }
-                       name[PUD_TX_NODEID_BUFFERSIZE - 1] = '\0';
-               } else if ((nodeIdType != PUD_NODEIDTYPE_MAC) && (nodeIdType
-                               != PUD_NODEIDTYPE_IPV4) && (nodeIdType != PUD_NODEIDTYPE_IPV6)) {
-                       pudError(false, "No node ID set while one is required for"
-                               " node type %u", nodeIdType);
-                       retval = false;
-               }
-       }
-
-       if (!setupNodeIdBinaryAndValidate(nodeIdType)) {
-               retval = false;
-       }
-
        if (updateIntervalMoving > updateIntervalStationary) {
                pudError(false,"The update interval for moving situations must not be"
                " larger than that for stationary situations");
index 45ae1c8..8fddc50 100644 (file)
  * Global Parameters
  */
 
-/** The name of the nodeIdType plugin parameter */
-#define PUD_NODE_ID_TYPE_NAME                                  "nodeIdType"
-
 /** The default value of the nodeIdType plugin parameter */
 #define PUD_NODE_ID_TYPE_DEFAULT                               PUD_NODEIDTYPE_IPV4
 
 NodeIdType getNodeIdTypeNumber(void);
-int setNodeIdType(const char *value, void *data,
-               set_plugin_parameter_addon addon);
 
 /** The name of the nodeId plugin parameter */
 #define PUD_NODE_ID_NAME                                               "nodeId"
index e746e17..ea4353e 100644 (file)
@@ -20,7 +20,6 @@
  */
 static const struct olsrd_plugin_parameters plugin_parameters[] = {
        /* ID */
-       {       .name = PUD_NODE_ID_TYPE_NAME, .set_plugin_parameter = &setNodeIdType, .data = NULL},
        {       .name = PUD_NODE_ID_NAME, .set_plugin_parameter = &setNodeId, .data = NULL},
 
        /* OLSR */