pud: use the nmea present field in the wireformat
authorFerry Huberts <ferry.huberts@pelagic.nl>
Wed, 13 Nov 2013 14:26:51 +0000 (15:26 +0100)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Wed, 13 Nov 2013 14:26:51 +0000 (15:26 +0100)
It now communicates accurately which fields are present.

Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
CHANGELOG
lib/pud/Makefile.inc
lib/pud/src/gpsConversion.c
lib/pud/wireformat-java/resources/WireFormatConstants.java.h
lib/pud/wireformat-java/src/main/c/org_olsr_plugin_pud_PositionUpdate.c
lib/pud/wireformat-java/src/main/java/org/olsr/plugin/pud/PositionUpdate.java
lib/pud/wireformat/include/OlsrdPudWireFormat/wireFormat.h
lib/pud/wireformat/src/wireFormat.c

index ac92bca..ea2e0f3 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,9 @@
+Note: In this release the pud plugin was upgraded to version 2.0.0.
+      This is because of a breaking change in its wire format. If you have
+      deployed the pud plugin on your mesh then you should update all nodes
+      to the new pud plugin at the same time since there is no interoperability
+      between the old version and the new version.
+
 0.6.6.1 -------------------------------------------------------------------
 
 Henning Rogge (2):
index 23a8696..5fed938 100644 (file)
@@ -1,3 +1,3 @@
 OLSRD_PLUGIN = true
 PLUGIN_NAME  = olsrd_pud
-PLUGIN_VER   = 1.1.0
+PLUGIN_VER   = 2.0.0
index 15d2210..5aa9963 100644 (file)
@@ -46,8 +46,7 @@ unsigned int gpsFromOlsr(union olsr_message *olsrMessage,
        char speedString[PUD_TX_SPEED_DIGITS];
        char trackString[PUD_TX_TRACK_DIGITS];
        char hdopString[PUD_TX_HDOP_DIGITS];
-       uint8_t smask;
-       uint8_t flags;
+       uint32_t present;
        char gateway[2] = { '0', '\0' };
 
        char nodeIdTypeString[PUD_TX_NODEIDTYPE_DIGITS];
@@ -78,18 +77,16 @@ unsigned int gpsFromOlsr(union olsr_message *olsrMessage,
 
        validityTime = getValidityTime(&olsrGpsMessage->validityTime);
 
-       smask = getPositionUpdateSmask(olsrGpsMessage);
+       present = getPositionUpdatePresent(olsrGpsMessage);
 
-       flags = getPositionUpdateFlags(olsrGpsMessage);
-
-       if (flags & PUD_FLAGS_GATEWAY) {
+       if (present & PUD_PRESENT_GATEWAY) {
                gateway[0] = '1';
        }
 
        /* time is ALWAYS present so we can just use it */
        getPositionUpdateTime(olsrGpsMessage, time(NULL), &timeStruct);
 
-       if (likely(nmea_INFO_is_present_smask(smask, LAT))) {
+       if (likely(nmea_INFO_is_present(present, LAT))) {
                double latitude = getPositionUpdateLatitude(olsrGpsMessage);
 
                if (latitude >= 0) {
@@ -106,7 +103,7 @@ unsigned int gpsFromOlsr(union olsr_message *olsrMessage,
                latitudeString[0] = '\0';
        }
 
-       if (likely(nmea_INFO_is_present_smask(smask, LON))) {
+       if (likely(nmea_INFO_is_present(present, LON))) {
                double longitude = getPositionUpdateLongitude(olsrGpsMessage);
 
                if (longitude >= 0) {
@@ -123,25 +120,25 @@ unsigned int gpsFromOlsr(union olsr_message *olsrMessage,
                longitudeString[0] = '\0';
        }
 
-       if (likely(nmea_INFO_is_present_smask(smask, ELV))) {
+       if (likely(nmea_INFO_is_present(present, ELV))) {
                snprintf(&altitudeString[0], PUD_TX_ALTITUDE_DIGITS, "%ld", getPositionUpdateAltitude(olsrGpsMessage));
        } else {
                altitudeString[0] = '\0';
        }
 
-       if (likely(nmea_INFO_is_present_smask(smask, SPEED))) {
+       if (likely(nmea_INFO_is_present(present, SPEED))) {
                snprintf(&speedString[0], PUD_TX_SPEED_DIGITS, "%lu", getPositionUpdateSpeed(olsrGpsMessage));
        } else {
                speedString[0] = '\0';
        }
 
-       if (likely(nmea_INFO_is_present_smask(smask, TRACK))) {
+       if (likely(nmea_INFO_is_present(present, TRACK))) {
                snprintf(&trackString[0], PUD_TX_TRACK_DIGITS, "%lu", getPositionUpdateTrack(olsrGpsMessage));
        } else {
                trackString[0] = '\0';
        }
 
-       if (likely(nmea_INFO_is_present_smask(smask, HDOP))) {
+       if (likely(nmea_INFO_is_present(present, HDOP))) {
                snprintf(&hdopString[0], PUD_TX_HDOP_DIGITS, "%." PUD_TX_HDOP_DECIMALS "f",
                                nmea_meters2dop(getPositionUpdateHdop(olsrGpsMessage)));
        } else {
@@ -229,9 +226,7 @@ unsigned int gpsToOlsr(nmeaINFO *nmeaInfo, union olsr_message *olsrMessage,
 
        setPositionUpdateVersion(olsrGpsMessage, PUD_WIRE_FORMAT_VERSION);
        setValidityTime(&olsrGpsMessage->validityTime, validityTime);
-       setPositionUpdateSmask(olsrGpsMessage, nmeaInfo->smask);
-       setPositionUpdateFlags(olsrGpsMessage,
-                       getPositionUpdateFlags(olsrGpsMessage) & ~PUD_FLAGS_GATEWAY);
+       setPositionUpdatePresent(olsrGpsMessage, nmeaInfo->present & ~PUD_PRESENT_GATEWAY);
 
        /* utc is always present, we make sure of that elsewhere, so just use it */
        setPositionUpdateTime(olsrGpsMessage, nmeaInfo->utc.hour, nmeaInfo->utc.min,
index 3525381..66a441a 100644 (file)
@@ -14,8 +14,8 @@ public class WireFormatConstants {
 
        public static final int VERSION = PUD_WIRE_FORMAT_VERSION;
 
-       public static final int FLAGS_ID = PUD_FLAGS_ID;
-       public static final int FLAGS_GATEWAY = PUD_FLAGS_GATEWAY;
+       public static final int PRESENT_ID = PUD_PRESENT_ID;
+       public static final int PRESENT_GATEWAY = PUD_PRESENT_GATEWAY;
 
        public static final int TIME_BITS = PUD_TIME_BITS;
 
index a3cc0c0..df79d32 100644 (file)
@@ -81,42 +81,22 @@ JNIEXPORT jlong JNICALL Java_org_olsr_plugin_pud_PositionUpdate_getPositionUpdat
 
 /*
  * Class:     org_olsr_plugin_pud_PositionUpdate
- * Method:    getPositionUpdateSMask
- * Signature: ()I
+ * Method:    getPositionUpdatePresent
+ * Signature: ()L
  */
-JNIEXPORT jint JNICALL Java_org_olsr_plugin_pud_PositionUpdate_getPositionUpdateSMask
+JNIEXPORT jlong JNICALL Java_org_olsr_plugin_pud_PositionUpdate_getPositionUpdatePresent
   (JNIEnv * env, jobject this) {
        jobject dataObject;
        jboolean isCopy;
        UplinkMessage * uplinkMessage = getUplinkMessage(env, this, &dataObject,
                        &isCopy);
 
-       uint8_t smask = getPositionUpdateSmask(
-                       getPositionUpdateMessage(uplinkMessage));
-
-       releaseUplinkMessage(env, uplinkMessage, dataObject, isCopy, JNI_ABORT);
-
-       return (jint) smask;
-}
-
-/*
- * Class:     org_olsr_plugin_pud_PositionUpdate
- * Method:    getPositionUpdateFlags
- * Signature: ()I
- */
-JNIEXPORT jint JNICALL Java_org_olsr_plugin_pud_PositionUpdate_getPositionUpdateFlags
-(JNIEnv * env, jobject this) {
-       jobject dataObject;
-       jboolean isCopy;
-       UplinkMessage * uplinkMessage = getUplinkMessage(env, this, &dataObject,
-                       &isCopy);
-
-       uint8_t flags = getPositionUpdateFlags(
+       uint32_t present = getPositionUpdatePresent(
                        getPositionUpdateMessage(uplinkMessage));
 
        releaseUplinkMessage(env, uplinkMessage, dataObject, isCopy, JNI_ABORT);
 
-       return (jint) flags;
+       return (jlong) present;
 }
 
 /*
index e63b507..43696bf 100644 (file)
@@ -48,19 +48,14 @@ public class PositionUpdate extends UplinkMessage {
        public native int getPositionUpdateVersion();
 
        /**
-        * @return the validity time (in seconds) the position update message
+        * @return the validity time (in seconds) of the position update message
         */
        public native long getPositionUpdateValidityTime();
 
        /**
-        * @return the content mask the position update message
+        * @return the presence field of the position update message
         */
-       public native int getPositionUpdateSMask();
-
-       /**
-        * @return the content flags the position update message
-        */
-       public native int getPositionUpdateFlags();
+       public native long getPositionUpdatePresent();
 
        /*
         * GpsInfo
@@ -95,7 +90,7 @@ public class PositionUpdate extends UplinkMessage {
        public native long getPositionUpdateAltitude();
 
        /**
-        * @return the speed (in kph) of the the position update message
+        * @return the speed (in kph) of the position update message
         */
        public native long getPositionUpdateSpeed();
 
index efe96dd..39ebb66 100644 (file)
  */
 
 /** The version of the wire format */
-#define PUD_WIRE_FORMAT_VERSION                2
+#define PUD_WIRE_FORMAT_VERSION                3
 
 /*
  * Flags
  */
 
-/** Flags that the GPS information contains the nodeId */
-#define PUD_FLAGS_ID                           0x80
+/**
+ * Bitmask used in the GPS information present field to signal nodeId presence
+ */
+#define PUD_PRESENT_ID          0x80000000
 
-/** Flags that the GPS information is originating from a gateway */
-#define PUD_FLAGS_GATEWAY                      0x40
+/**
+ * Bitmask used in the GPS information present field to signal that it's
+ * originating from a gateway
+ */
+#define PUD_PRESENT_GATEWAY     0x40000000
 
 /*
  * Time
@@ -298,12 +303,11 @@ typedef struct _NodeInfo {
        unsigned char nodeId; /**< placeholder for variable length nodeId string */
 }__attribute__((__packed__)) NodeInfo;
 
-/** Complete format, 8+8+8+120+(8+variable) bits =  18+(1+variable) bytes*/
+/** Complete format, 8+8+32+120+(8+variable) bits =  21+(1+variable) bytes*/
 typedef struct _PudOlsrPositionUpdate {
        uint8_t version; /**< the version of the sentence */
        uint8_t validityTime; /**< the validity time of the sentence */
-       uint8_t smask; /**< mask signaling the contents of the sentence */
-       uint8_t flags; /**< mask signaling extra contents of the sentence */
+       uint32_t present; /**< mask signaling the contents of gpsInfo */
        GpsInfo gpsInfo; /**< the GPS information (MANDATORY) */
        NodeInfo nodeInfo; /**< placeholder for node information (OPTIONAL) */
 }__attribute__((__packed__)) PudOlsrPositionUpdate;
@@ -395,10 +399,8 @@ PudOlsrPositionUpdate * getOlsrMessagePayload(int ipVersion, union olsr_message
  */
 uint8_t getPositionUpdateVersion(PudOlsrPositionUpdate * olsrGpsMessage);
 void setPositionUpdateVersion(PudOlsrPositionUpdate * olsrGpsMessage, uint8_t version);
-uint8_t getPositionUpdateSmask(PudOlsrPositionUpdate * olsrGpsMessage);
-void setPositionUpdateSmask(PudOlsrPositionUpdate * olsrGpsMessage, uint8_t smask);
-uint8_t getPositionUpdateFlags(PudOlsrPositionUpdate * olsrGpsMessage);
-void setPositionUpdateFlags(PudOlsrPositionUpdate * olsrGpsMessage, uint8_t flags);
+uint32_t getPositionUpdatePresent(PudOlsrPositionUpdate * olsrGpsMessage);
+void setPositionUpdatePresent(PudOlsrPositionUpdate * olsrGpsMessage, uint32_t present);
 
 /*
  * GpsInfo
index 62b595b..d75a952 100644 (file)
@@ -257,55 +257,29 @@ void setPositionUpdateVersion(
 }
 
 /**
- Get the smask of the position update message
+ Get the presence field of the position update message
 
  @param olsrGpsMessage
  A pointer to the position update message
  @return
- The smask of the position update message
+ The presence field of the position update message
  */
-uint8_t getPositionUpdateSmask(
+uint32_t getPositionUpdatePresent(
                PudOlsrPositionUpdate * olsrGpsMessage) {
-       return olsrGpsMessage->smask;
+       return ntohl(olsrGpsMessage->present);
 }
 
 /**
- Set the smask of the position update message
+ Set the presence field of the position update message
 
  @param olsrGpsMessage
  A pointer to the position update message
- @param smask
- The smask of the position update message
+ @param present
+ The presence field of the position update message
  */
-void setPositionUpdateSmask(
-               PudOlsrPositionUpdate * olsrGpsMessage, uint8_t smask) {
-       olsrGpsMessage->smask = smask;
-}
-
-/**
- Get the flags of the position update message
-
- @param olsrGpsMessage
- A pointer to the position update message
- @return
- The flags of the position update message
- */
-uint8_t getPositionUpdateFlags(
-               PudOlsrPositionUpdate * olsrGpsMessage) {
-       return olsrGpsMessage->flags;
-}
-
-/**
- Set the flags of the position update message
-
- @param olsrGpsMessage
- A pointer to the position update message
- @param flags
- The flags of the position update message
- */
-void setPositionUpdateFlags(
-               PudOlsrPositionUpdate * olsrGpsMessage, uint8_t flags) {
-       olsrGpsMessage->flags = flags;
+void setPositionUpdatePresent(
+               PudOlsrPositionUpdate * olsrGpsMessage, uint32_t present) {
+       olsrGpsMessage->present = htonl(present);
 }
 
 /*
@@ -656,7 +630,7 @@ void setPositionUpdateHdop(PudOlsrPositionUpdate * olsrGpsMessage,
  */
 NodeIdType getPositionUpdateNodeIdType(int ipVersion,
                PudOlsrPositionUpdate * olsrGpsMessage) {
-       if (getPositionUpdateFlags(olsrGpsMessage) & PUD_FLAGS_ID) {
+       if (getPositionUpdatePresent(olsrGpsMessage) & PUD_PRESENT_ID) {
                return olsrGpsMessage->nodeInfo.nodeIdType;
        }
 
@@ -791,7 +765,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 to signal whether or not an ID is in the message.
presence field to signal whether or not an ID is in the message.
 
  @param ipVersion
  The IP version (AF_INET or AF_INET6)
@@ -862,8 +836,8 @@ size_t setPositionUpdateNodeInfo(int ipVersion,
                return 0;
        }
 
-       setPositionUpdateFlags(olsrGpsMessage,
-                       getPositionUpdateFlags(olsrGpsMessage) | PUD_FLAGS_ID);
+       setPositionUpdatePresent(olsrGpsMessage,
+                       getPositionUpdatePresent(olsrGpsMessage) | PUD_PRESENT_ID);
        return ((sizeof(NodeInfo)
                        - (sizeof(olsrGpsMessage->nodeInfo.nodeId) /* nodeId placeholder */))
                        + length);