pud: add MIP OID nodeId type
authorFerry Huberts <ferry.huberts@pelagic.nl>
Thu, 3 Oct 2013 10:11:48 +0000 (12:11 +0200)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Thu, 3 Oct 2013 12:39:52 +0000 (14:39 +0200)
Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
lib/pud/olsrd.conf.sample
lib/pud/src/configuration.c
lib/pud/wireformat-java/resources/WireFormatConstants.java.h
lib/pud/wireformat/include/OlsrdPudWireFormat/nodeIdConversion.h
lib/pud/wireformat/include/OlsrdPudWireFormat/wireFormat.h
lib/pud/wireformat/src/nodeIdConversion.c
lib/pud/wireformat/src/wireFormat.c

index 26e8f57..ebf59fb 100644 (file)
@@ -24,6 +24,10 @@ LoadPlugin "<olsrd plugin library path>/olsrd_pud.so.1.1.0"
     #           7 : an AIS MMSI number with 9 digits
     #           8 : a URN number (a plain 24 bits number) with 8 digits. See
     #               http://www.dtic.mil/cjcs_directives/cdata/unlimit/3156_01.pdf
+    #           9 : a MIP OID number with 20 digits. See
+    #               http://www.mip-site.org/publicsite (IR Annex D – DMWG,
+    #               20081211, Edition 3.7, Annex D Key Management for the MIP
+    #               Data Model, (MIR Annex D - Key Management-JC3IEDM-3.0.9.pdf)
     #         192 : a 7 digit number conforming to 'Nationaal Nummerplan
     #               Brandweer Nederland'
     #         193 : a 6 digit number conforming to 'Nationaal Nummerplan
index 95db161..3cb89a5 100644 (file)
@@ -224,19 +224,95 @@ static bool intSetupNodeIdBinaryMAC(void) {
  - false on failure
  */
 static bool intSetupNodeIdBinaryLongLong(unsigned long long min,
-               unsigned long long max, unsigned int bytes) {
-       unsigned long long longValue = 0;
-       if (!readULL(PUD_NODE_ID_NAME, (char *) getNodeId(NULL), &longValue)) {
-               return false;
-       }
+    unsigned long long max, unsigned int bytes) {
+  unsigned long long longValue = 0;
+  if (!readULL(PUD_NODE_ID_NAME, (char *) getNodeId(NULL), &longValue)) {
+    return false;
+  }
 
-       if ((longValue < min) || (longValue > max)) {
-               pudError(false, "%s value %llu is out of range [%llu,%llu]",
-                               PUD_NODE_ID_NAME, longValue, min, max);
-               return false;
+  if ((longValue < min) || (longValue > max)) {
+    pudError(false, "%s value %llu is out of range [%llu,%llu]",
+        PUD_NODE_ID_NAME, longValue, min, max);
+    return false;
+  }
+
+  return setupNodeIdBinaryLongLong(&nodeIdBinary, longValue, bytes);
+}
+
+/**
+ Validate whether the configured nodeId is valid w.r.t. the configured
+ nodeIdType, for types that fit in a double unsigned long long (128 bits) with
+ a certain split that defined by chars1
+
+ @param chars1
+ the number of characters of the first part
+ @param min1
+ the minimum value of the first part
+ @param max1
+ the maximum value of the first part
+ @param bytes1
+ the number of bytes of the first part in the buffer
+ @param min2
+ the minimum value of the second part
+ @param max2
+ the maximum value of the second part
+ @param bytes2
+ the number of bytes of the second part in the buffer
+
+ @return
+ - true when ok
+ - false on failure
+ */
+static bool intSetupNodeIdBinaryDoubleLongLong(
+    unsigned int chars1,
+    unsigned long long min1, unsigned long long max1,
+    unsigned int bytes1,
+               unsigned long long min2, unsigned long long max2,
+               unsigned int bytes2) {
+       unsigned long long longValue1 = 0;
+       unsigned long long longValue2 = 0;
+
+       unsigned char * node_id = getNodeId(NULL);
+       size_t node_id_len = strlen((char *)node_id);
+
+       assert(chars1 > 0);
+       assert(bytes1 > 0);
+       assert(bytes2 > 0);
+
+  /* part 1 */
+       if (node_id_len > 0) {
+    unsigned char first[chars1 + 1];
+
+    memcpy(first, node_id, chars1);
+    first[chars1] = '\0';
+
+    if (!readULL(PUD_NODE_ID_NAME, (char *)first, &longValue1)) {
+      return false;
+    }
+
+    if ((longValue1 < min1) || (longValue1 > max1)) {
+      pudError(false, "First %u character(s) of %s value %llu are out of range [%llu,%llu]",
+          chars1, PUD_NODE_ID_NAME, longValue1, min1, max1);
+      return false;
+    }
        }
 
-       return setupNodeIdBinaryLongLong(&nodeIdBinary, longValue, bytes);
+  /* part 2 */
+       if (node_id_len > chars1) {
+    if (!readULL(PUD_NODE_ID_NAME, (char *)&node_id[chars1], &longValue2)) {
+      return false;
+    }
+
+    if ((longValue2 < min2) || (longValue2 > max2)) {
+      pudError(false, "Last %u character(s) of %s value %llu are out of range [%llu,%llu]",
+          (unsigned int)(node_id_len - chars1), PUD_NODE_ID_NAME, longValue2, min2, max2);
+      return false;
+    }
+  }
+
+       return setupNodeIdBinaryDoubleLongLong(&nodeIdBinary,
+           longValue1, (unsigned char *)&nodeIdBinary.buffer.mip[0], bytes1,
+           longValue2, (unsigned char *)&nodeIdBinary.buffer.mip[bytes1], bytes2);
 }
 
 /**
@@ -323,6 +399,14 @@ static bool setupNodeIdBinaryAndValidate(NodeIdType nodeIdTypeNumber) {
                        return intSetupNodeIdBinaryLongLong(PUD_NODEIDTYPE_URN_MIN,
                                PUD_NODEIDTYPE_URN_MAX, PUD_NODEIDTYPE_URN_BYTES);
 
+               case PUD_NODEIDTYPE_MIP: /* a MIP OID number */
+                       return intSetupNodeIdBinaryDoubleLongLong(
+                           PUD_NODEIDTYPE_MIP_CHARS1,
+                           PUD_NODEIDTYPE_MIP_MIN1, PUD_NODEIDTYPE_MIP_MAX1,
+                           PUD_NODEIDTYPE_MIP_BYTES1,
+                           PUD_NODEIDTYPE_MIP_MIN2, PUD_NODEIDTYPE_MIP_MAX2,
+                           PUD_NODEIDTYPE_MIP_BYTES - PUD_NODEIDTYPE_MIP_BYTES1);
+
                case PUD_NODEIDTYPE_192:
                        return intSetupNodeIdBinaryLongLong(PUD_NODEIDTYPE_192_MIN,
                                PUD_NODEIDTYPE_192_MAX, PUD_NODEIDTYPE_192_BYTES);
index 903cd3c..5ea8525 100644 (file)
@@ -50,6 +50,12 @@ public class WireFormatConstants {
        public static final int NODEIDTYPE_TETRA_BYTES = PUD_NODEIDTYPE_TETRA_BYTES;
        public static final int NODEIDTYPE_MMSI_BYTES = PUD_NODEIDTYPE_MMSI_BYTES;
        public static final int NODEIDTYPE_URN_BYTES = PUD_NODEIDTYPE_URN_BYTES;
+       public static final int NODEIDTYPE_MIP_BYTES  = PUD_NODEIDTYPE_MIP_BYTES;
+       public static final int NODEIDTYPE_MIP_BYTES1 = PUD_NODEIDTYPE_MIP_BYTES1;
+       public static final int NODEIDTYPE_MIP_BYTES2 = PUD_NODEIDTYPE_MIP_BYTES2;
+       public static final int NODEIDTYPE_MIP_CHARS  = PUD_NODEIDTYPE_MIP_CHARS;
+       public static final int NODEIDTYPE_MIP_CHARS1 = PUD_NODEIDTYPE_MIP_CHARS1;
+       public static final int NODEIDTYPE_MIP_CHARS2 = PUD_NODEIDTYPE_MIP_CHARS2;
        public static final int NODEIDTYPE_192_BYTES = PUD_NODEIDTYPE_192_BYTES;
        public static final int NODEIDTYPE_193_BYTES = PUD_NODEIDTYPE_193_BYTES;
        public static final int NODEIDTYPE_194_BYTES = PUD_NODEIDTYPE_194_BYTES;
index 4b59ff4..103e6ef 100644 (file)
@@ -16,6 +16,10 @@ bool setupNodeIdBinaryMAC(nodeIdBinaryType * nodeIdBinary, unsigned char * mac);
 bool setupNodeIdBinaryLongLong(nodeIdBinaryType * nodeIdBinary,
                unsigned long long longValue, size_t bytes);
 
+bool setupNodeIdBinaryDoubleLongLong(nodeIdBinaryType * nodeIdBinary,
+    unsigned long long value1, unsigned char * dst1, size_t bytes1,
+    unsigned long long value2, unsigned char * dst2, size_t bytes2);
+
 bool setupNodeIdBinaryString(nodeIdBinaryType * nodeIdBinary, char * nodeId,
                size_t nodeIdLength);
 
index 86167bf..378e51a 100644 (file)
@@ -160,8 +160,11 @@ typedef enum _NodeIdType {
        /** URN number, 24 bits, 3 bytes */
        PUD_NODEIDTYPE_URN = 8,
 
+       /** MIP OID number, 67 bits, 9 bytes */
+       PUD_NODEIDTYPE_MIP = 9,
+
        /** the last id of the globally unique node type IDs */
-       PUD_NODEIDTYPE_GLOBAL_LAST = PUD_NODEIDTYPE_URN,
+       PUD_NODEIDTYPE_GLOBAL_LAST = PUD_NODEIDTYPE_MIP,
 
        /** the first id of the locally unique node type IDs */
        PUD_NODEIDTYPE_LOCAL_FIRST = 192,
@@ -202,6 +205,18 @@ typedef enum _NodeIdType {
 #define PUD_NODEIDTYPE_URN_MIN                 0LLU
 #define PUD_NODEIDTYPE_URN_MAX                 16777215LLU
 
+/** the number of nodeId bytes for PUD_NODEIDTYPE_MIP */
+#define PUD_NODEIDTYPE_MIP_BYTES    9
+#define PUD_NODEIDTYPE_MIP_BYTES1   1
+#define PUD_NODEIDTYPE_MIP_BYTES2   (PUD_NODEIDTYPE_MIP_BYTES - PUD_NODEIDTYPE_MIP_BYTES1)
+#define PUD_NODEIDTYPE_MIP_CHARS    20
+#define PUD_NODEIDTYPE_MIP_CHARS1   1
+#define PUD_NODEIDTYPE_MIP_CHARS2   (PUD_NODEIDTYPE_MIP_CHARS - PUD_NODEIDTYPE_MIP_CHARS1)
+#define PUD_NODEIDTYPE_MIP_MIN1     0LLU
+#define PUD_NODEIDTYPE_MIP_MAX1     9LLU
+#define PUD_NODEIDTYPE_MIP_MIN2     0LLU
+#define PUD_NODEIDTYPE_MIP_MAX2     9999999999999999999LLU
+
 /** the number of nodeId bytes for PUD_NODEIDTYPE_192 */
 #define PUD_NODEIDTYPE_192_BYTES               3
 #define PUD_NODEIDTYPE_192_MIN                 0LLU
@@ -245,6 +260,7 @@ typedef struct _nodeIdBinaryType {
                                union olsr_ip_addr ip;
                                unsigned long long longValue;
                                unsigned char stringValue[PUD_TX_NODEID_BUFFERSIZE];
+                               unsigned char mip[PUD_NODEIDTYPE_MIP_BYTES];
                } buffer;
 } nodeIdBinaryType;
 
index b7e6d33..6a17c92 100644 (file)
@@ -140,6 +140,19 @@ void getNodeIdStringFromOlsr(int ipVersion, union olsr_message *olsrMessage,
                                nodeIdStrBuffer, nodeIdStrBufferSize);
                break;
 
+       case PUD_NODEIDTYPE_MIP: /* a MIP OID number */
+         *nodeIdStr = getNodeIdNumberFromOlsr(
+             &nodeId[0],
+             PUD_NODEIDTYPE_MIP_BYTES1,
+             &nodeIdStrBuffer[0],
+             PUD_NODEIDTYPE_MIP_CHARS1 + 1);
+         getNodeIdNumberFromOlsr(
+             &nodeId[PUD_NODEIDTYPE_MIP_BYTES1],
+             nodeIdSize - PUD_NODEIDTYPE_MIP_BYTES1,
+             &nodeIdStrBuffer[PUD_NODEIDTYPE_MIP_CHARS1],
+             nodeIdStrBufferSize - PUD_NODEIDTYPE_MIP_CHARS1);
+         break;
+
        case PUD_NODEIDTYPE_IPV4: /* IPv4 address */
        case PUD_NODEIDTYPE_IPV6: /* IPv6 address */
        default: /* unsupported */
@@ -205,6 +218,56 @@ bool setupNodeIdBinaryLongLong(nodeIdBinaryType * nodeIdBinary,
 }
 
 /**
+ Convert two given unsigned long longs to the binary/wireformat representation
+ of them.
+
+ @param nodeIdBinary
+ a pointer to the buffer in which to store the binary/wireformat representation
+ @param value1
+ the first value to convert (in machine byte-order)
+ @param dst1
+ A pointer where to store the conversion of value1
+ @param bytes1
+ the number of bytes used by value1
+ @param value2
+ the second value to convert (in machine byte-order)
+ @param dst2
+ A pointer where to store the conversion of value2
+ @param bytes2
+ the number of bytes used by value2
+
+ @return
+ - true when ok
+ - false on failure
+ */
+bool setupNodeIdBinaryDoubleLongLong(nodeIdBinaryType * nodeIdBinary,
+    unsigned long long value1, unsigned char * dst1, size_t bytes1,
+    unsigned long long value2, unsigned char * dst2, size_t bytes2) {
+       unsigned long long longValue1 = value1;
+       unsigned long long longValue2 = value2;
+       int i1 = bytes1 - 1;
+       int i2 = bytes2 - 1;
+
+       while (i1 >= 0) {
+               dst1[i1] = longValue1 & 0xff;
+               longValue1 >>= 8;
+               i1--;
+       }
+       assert(longValue1 == 0);
+
+       while (i2 >= 0) {
+               dst2[i2] = longValue2 & 0xff;
+               longValue2 >>= 8;
+               i2--;
+       }
+       assert(longValue2 == 0);
+
+       nodeIdBinary->length = bytes1 + bytes2;
+       nodeIdBinary->set = true;
+       return true;
+}
+
+/**
  Convert a given string to the binary/wireformat representation of it.
 
  @param nodeIdBinary
index 0145df6..96cc534 100644 (file)
@@ -735,6 +735,10 @@ void getPositionUpdateNodeId(int ipVersion, union olsr_message * olsrMessage,
                *nodeIdSize = PUD_NODEIDTYPE_URN_BYTES;
                break;
 
+       case PUD_NODEIDTYPE_MIP: /* a MIP OID number */
+               *nodeIdSize = PUD_NODEIDTYPE_MIP_BYTES;
+               break;
+
        case PUD_NODEIDTYPE_192:
                *nodeIdSize = PUD_NODEIDTYPE_192_BYTES;
                break;
@@ -787,7 +791,7 @@ void setPositionUpdateNodeId(
 /**
  Convert the node information to the node information for an OLSR message and
  put it in the PUD message in the OLSR message. Also updates the PUD message
- smask.
+ smask to signal whether or not an ID is in the message.
 
  @param ipVersion
  The IP version (AF_INET or AF_INET6)
@@ -818,6 +822,7 @@ size_t setPositionUpdateNodeInfo(int ipVersion,
        case PUD_NODEIDTYPE_TETRA: /* a Tetra number */
        case PUD_NODEIDTYPE_MMSI: /* an AIS MMSI number */
        case PUD_NODEIDTYPE_URN: /* a URN number */
+       case PUD_NODEIDTYPE_MIP: /* a MIP OID number */
        case PUD_NODEIDTYPE_192:
        case PUD_NODEIDTYPE_193:
        case PUD_NODEIDTYPE_194: