PUD: the downlink port is in network byte order
[olsrd.git] / lib / pud / wireformat / include / OlsrdPudWireFormat / wireFormat.h
index 2e0108e..f7eba96 100644 (file)
  */
 
 /** The version of the wire format */
-#define PUD_WIRE_FORMAT_VERSION                0
+#define PUD_WIRE_FORMAT_VERSION                1
 
 /*
  * Flags
- * We use the smask of nmeaINFO and the flags below on top of that
  */
 
 /** Flags that the GPS information contains the nodeId */
 #define PUD_FLAGS_ID                           0x80
 
+/** Flags that the GPS information is originating from a gateway */
+#define PUD_FLAGS_GATEWAY                      0x40
+
 /*
  * Time
  */
@@ -143,6 +145,12 @@ typedef enum _NodeIdType {
        /** IPv6 address, 128 bits, 16 bytes */
        PUD_NODEIDTYPE_IPV6 = 6,
 
+       /** AIS MMSI number, 9 digits, 30 bits, 4 bytes */
+       PUD_NODEIDTYPE_MMSI = 7,
+
+       /** URN number, 24 bits, 3 bytes */
+       PUD_NODEIDTYPE_URN = 8,
+
        /** Brandweer number, 7 digits, 24 bits, 3 bytes */
        PUD_NODEIDTYPE_192 = 192,
 
@@ -162,6 +170,12 @@ typedef enum _NodeIdType {
 /** the number of nodeId bytes for PUD_NODEIDTYPE_TETRA */
 #define PUD_NODEIDTYPE_TETRA_BYTES             8
 
+/** the number of nodeId bytes for PUD_NODEIDTYPE_MMSI */
+#define PUD_NODEIDTYPE_MMSI_BYTES              4
+
+/** the number of nodeId bytes for PUD_NODEIDTYPE_URN */
+#define PUD_NODEIDTYPE_URN_BYTES               3
+
 /** the number of nodeId bytes for PUD_NODEIDTYPE_192 */
 #define PUD_NODEIDTYPE_192_BYTES               3
 
@@ -213,6 +227,7 @@ 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 */
        GpsInfo gpsInfo; /**< the GPS information (MANDATORY) */
        NodeInfo nodeInfo; /**< placeholder for node information (OPTIONAL) */
 }__attribute__((__packed__)) PudOlsrPositionUpdate;
@@ -234,7 +249,7 @@ typedef enum _UplinkMessageType {
 typedef struct _UplinkClusterLeader {
        uint8_t version; /**< the version of the message */
        uint8_t validityTime; /**< the validity time of the sentence */
-       uint16_t downlinkPort; /**< the UDP port on which downlink messages are expected */
+       uint16_t downlinkPort; /**< the UDP port on which downlink messages are expected (in network byte order) */
        union _leader {
                struct _v4 {
                        struct in_addr originator;
@@ -271,6 +286,12 @@ typedef struct _UplinkMessage {
  * FUNCTIONS
  * ************************************************************************ */
 
+/*
+ * NodeIdType
+ */
+
+bool isValidNodeIdType(unsigned long long nodeIdType);
+
 /*
  * Validity Time
  */
@@ -392,6 +413,26 @@ static inline void setUplinkMessagePadding(UplinkHeader * uplinkHeader,
  * OLSR header
  */
 
+
+/**
+ Determine the size of an OLSR message
+
+ @param ipVersion
+ The IP version
+ @param olsrMessage
+ A pointer to the OLSR message
+ @return
+ The size of the OLSR message
+ */
+static inline unsigned short getOlsrMessageSize(int ipVersion,
+               union olsr_message * olsrMessage) {
+       if (ipVersion == AF_INET) {
+               return ntohs(olsrMessage->v4.olsr_msgsize);
+       }
+
+       return ntohs(olsrMessage->v6.olsr_msgsize);
+}
+
 /**
  Get the originator of an OLSR message
 
@@ -486,6 +527,32 @@ static inline void setPositionUpdateSmask(
        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
+ */
+static inline 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
+ */
+static inline void setPositionUpdateFlags(
+               PudOlsrPositionUpdate * olsrGpsMessage, uint8_t flags) {
+       olsrGpsMessage->flags = flags;
+}
+
 /*
  * GpsInfo
  */
@@ -795,7 +862,7 @@ unsigned long long val, unsigned long long min, unsigned long long max,
  */
 static inline NodeIdType getPositionUpdateNodeIdType(int ipVersion,
                PudOlsrPositionUpdate * olsrGpsMessage) {
-       if (getPositionUpdateSmask(olsrGpsMessage) & PUD_FLAGS_ID) {
+       if (getPositionUpdateFlags(olsrGpsMessage) & PUD_FLAGS_ID) {
                return olsrGpsMessage->nodeInfo.nodeIdType;
        }
 
@@ -879,7 +946,7 @@ static inline void setClusterLeaderVersion(
  @param clusterLeaderMessage
  A pointer to the cluster leader message
  @return
- The downlink port of the cluster leader message
+ The downlink port of the cluster leader message (in network byte order)
  */
 static inline uint16_t getClusterLeaderDownlinkPort(
                UplinkClusterLeader * clusterLeaderMessage) {
@@ -892,7 +959,7 @@ static inline uint16_t getClusterLeaderDownlinkPort(
  @param clusterLeaderMessage
  A pointer to the cluster leader message
  @param port
- The downlink port of the cluster leader message
+ The downlink port of the cluster leader message (in network byte order)
  */
 static inline void setClusterLeaderDownlinkPort(
                UplinkClusterLeader * clusterLeaderMessage, uint16_t port) {