PUD: add getNodeIdType function
[olsrd.git] / lib / pud / src / nodeIdConversion.c
index 64163a5..d6b1cef 100644 (file)
@@ -139,32 +139,45 @@ static char *getNodeIdNumberFromOlsr(PudOlsrWireFormat * olsrGpsMessage,
 }
 
 /**
 }
 
 /**
- Convert the node information of an OLSR message to the node information for
- internal use and set it up in the given buffers.
+ Convert the nodeId of an OLSR message into a string.
 
 
+ @param ipVersion
+ The ip version, either AF_INET or AF_INET6
  @param olsrMessage
  A pointer to the OLSR message. Used to be able to retrieve the IP address of
  the sender.
  @param olsrMessage
  A pointer to the OLSR message. Used to be able to retrieve the IP address of
  the sender.
- @param olsrGpsMessage
- A pointer to the GPS message in the OLSR message
  @param nodeId
  @param nodeId
- A pointer a variable in which to store the pointer to the buffer in which the
- nodeId string representation can be found
+ A pointer to a variable in which to store the pointer to the buffer in which
+ the nodeId string representation is written (the buffer needs to be at least
+ PUD_TX_NODEIDTYPE_DIGITS + 1 bytes). Not written to when nodeIdBuffer or
+ nodeId is NULL or when nodeIdBufferSize is zero. Can point to nodeIdBuffer
+ or straight into the olsrMessage
  @param nodeIdBuffer
  A pointer to the buffer in which the nodeId string representation can be
  @param nodeIdBuffer
  A pointer to the buffer in which the nodeId string representation can be
- written
+ written. Not written to when nodeIdBuffer or nodeId is NULL or when
+ nodeIdBufferSize is zero.
  @param nodeIdBufferSize
  @param nodeIdBufferSize
- The size of the nodeIdBuffer
- @param nodeIdTypeString
- A pointer to the buffer in which the nodeIdType string representation can be
- written
+ The size of the nodeIdBuffer. When zero then nodeIdBuffer and nodeId are not
+ written to.
  */
  */
-void getNodeInfoFromOlsr(const union olsr_message *olsrMessage,
-               PudOlsrWireFormat *olsrGpsMessage, char *nodeIdBuffer,
-               unsigned int nodeIdBufferSize, const char **nodeId,
-               char *nodeIdTypeString) {
+void getNodeIdStringFromOlsr(int ipVersion, union olsr_message *olsrMessage,
+               const char **nodeId, char *nodeIdBuffer, unsigned int nodeIdBufferSize) {
+       PudOlsrWireFormat *olsrGpsMessage;
        int chars;
 
        int chars;
 
+       if (unlikely(!nodeIdBuffer || (nodeIdBufferSize == 0) || !nodeId)) {
+               return;
+       }
+
+       assert (nodeIdBufferSize >= (PUD_TX_NODEID_BUFFERSIZE + 1));
+
+       /* determine the originator of the message */
+       if (ipVersion == AF_INET) {
+               olsrGpsMessage = (PudOlsrWireFormat *) &olsrMessage->v4.message;
+       } else {
+               olsrGpsMessage = (PudOlsrWireFormat *) &olsrMessage->v6.message;
+       }
+
        if (olsrGpsMessage->smask & PUD_FLAGS_ID) {
                switch (olsrGpsMessage->nodeInfo.nodeIdType) {
                        case PUD_NODEIDTYPE_MAC: /* hardware address */
        if (olsrGpsMessage->smask & PUD_FLAGS_ID) {
                switch (olsrGpsMessage->nodeInfo.nodeIdType) {
                        case PUD_NODEIDTYPE_MAC: /* hardware address */
@@ -219,21 +232,12 @@ void getNodeInfoFromOlsr(const union olsr_message *olsrMessage,
                                                "Reception of unsupported %s %u, using %u",
                                                PUD_NODE_ID_TYPE_NAME,
                                                olsrGpsMessage->nodeInfo.nodeIdType,
                                                "Reception of unsupported %s %u, using %u",
                                                PUD_NODE_ID_TYPE_NAME,
                                                olsrGpsMessage->nodeInfo.nodeIdType,
-                                               ((olsr_cnf->ip_version == AF_INET) ? PUD_NODEIDTYPE_IPV4
+                                               ((ipVersion == AF_INET) ? PUD_NODEIDTYPE_IPV4
                                                                : PUD_NODEIDTYPE_IPV6));
                                olsrGpsMessage->smask &= ~PUD_FLAGS_ID;
                                goto noId;
                }
 
                                                                : PUD_NODEIDTYPE_IPV6));
                                olsrGpsMessage->smask &= ~PUD_FLAGS_ID;
                                goto noId;
                }
 
-               /* nodeIdType */
-               chars = snprintf(nodeIdTypeString, PUD_TX_NODEIDTYPE_DIGITS + 1, "%u",
-                               olsrGpsMessage->nodeInfo.nodeIdType);
-               if (likely(chars < PUD_TX_NODEIDTYPE_DIGITS)) {
-                       nodeIdTypeString[chars] = '\0';
-               } else {
-                       nodeIdTypeString[PUD_TX_NODEIDTYPE_DIGITS] = '\0';
-               }
-
                return;
        }
 
                return;
        }
 
@@ -241,24 +245,50 @@ void getNodeInfoFromOlsr(const union olsr_message *olsrMessage,
        noId: {
                const void * addr;
 
        noId: {
                const void * addr;
 
-               /* nodeIdType */
-               chars = snprintf(&nodeIdTypeString[0], PUD_TX_NODEIDTYPE_DIGITS + 1,
-                               "%u", ((olsr_cnf->ip_version == AF_INET) ? PUD_NODEIDTYPE_IPV4
-                               : PUD_NODEIDTYPE_IPV6));
-               if (likely(chars < PUD_TX_NODEIDTYPE_DIGITS)) {
-                       nodeIdTypeString[chars] = '\0';
-               } else {
-                       nodeIdTypeString[PUD_TX_NODEIDTYPE_DIGITS] = '\0';
-               }
-
-               if (olsr_cnf->ip_version == AF_INET) {
+               if (ipVersion == AF_INET) {
                        addr = (const void *) &olsrMessage->v4.originator;
                } else {
                        addr = (const void *) &olsrMessage->v6.originator;
                }
 
                        addr = (const void *) &olsrMessage->v4.originator;
                } else {
                        addr = (const void *) &olsrMessage->v6.originator;
                }
 
-               *nodeId = inet_ntop(olsr_cnf->ip_version, addr, nodeIdBuffer,
-                               nodeIdBufferSize);
+               *nodeId = inet_ntop(ipVersion, addr, nodeIdBuffer, nodeIdBufferSize);
+       }
+
+       return;
+}
+
+/**
+ Convert the nodeIdType of an OLSR message into a string.
+
+ @param ipVersion
+ The ip version, either AF_INET or AF_INET6
+ @param olsrMessage
+ A pointer to the OLSR message. Used to be able to retrieve the IP address of
+ the sender.
+ @param nodeIdTypeBuffer
+ A pointer to the buffer in which the nodeIdType string representation is
+ written (the buffer needs to be at least PUD_TX_NODEIDTYPE_DIGITS + 1 bytes).
+ When NULL then the nodeIdType string is not written.
+ @param nodeIdTypeBufferSize
+ The size of the nodeIdTypeBuffer
+ */
+void getNodeTypeStringFromOlsr(int ipVersion, union olsr_message * olsrMessage,
+               char * nodeIdTypeBuffer, int nodeIdTypeBufferSize) {
+       int chars;
+
+       if (unlikely(!nodeIdTypeBuffer || (nodeIdTypeBufferSize == 0))) {
+               return;
+       }
+
+       assert(nodeIdTypeBufferSize >= (PUD_TX_NODEIDTYPE_DIGITS + 1));
+
+       /* message has NO nodeId information */
+       chars = snprintf(&nodeIdTypeBuffer[0], nodeIdTypeBufferSize, "%u",
+                       getNodeIdType(ipVersion, olsrMessage));
+       if (likely(chars < nodeIdTypeBufferSize)) {
+               nodeIdTypeBuffer[chars] = '\0';
+       } else {
+               nodeIdTypeBuffer[nodeIdTypeBufferSize] = '\0';
        }
 
        return;
        }
 
        return;