Merge branch 'release-0.6.6'
[olsrd.git] / lib / pud / wireformat / include / OlsrdPudWireFormat / wireFormat.h
1 #ifndef _PUD_WIREFORMAT_H_
2 #define _PUD_WIREFORMAT_H_
3
4 #include "olsr_types.h"
5 #include "olsr_protocol.h"
6
7 #include <stddef.h>
8 #include <stdbool.h>
9 #include <stdint.h>
10 #include <netinet/in.h>
11 #include <sys/socket.h>
12 #include <math.h>
13 #include <string.h>
14 #include <assert.h>
15 #include <OlsrdPudWireFormat/compiler.h>
16
17 /*
18  * Version
19  */
20
21 /** The version of the wire format */
22 #define PUD_WIRE_FORMAT_VERSION         2
23
24 /*
25  * Flags
26  */
27
28 /** Flags that the GPS information contains the nodeId */
29 #define PUD_FLAGS_ID                            0x80
30
31 /** Flags that the GPS information is originating from a gateway */
32 #define PUD_FLAGS_GATEWAY                       0x40
33
34 /*
35  * Time
36  */
37
38 /** The number of bits for the time field */
39 #define PUD_TIME_BITS                           17
40
41 /*
42  * Latitude
43  */
44
45 /** The number of bits for the latitude field */
46 #define PUD_LATITUDE_BITS                       28
47
48 /** The maximum size of the string representation of the latitude
49  * sign [0,90] [0,59] dot [0,59] [0,999] (including \0) */
50 #define PUD_TX_LATITUDE_DIGITS          (1 + 2 + 2 + 1 + 2 + 3 + 1)
51
52 /** The number of decimals of the latitude in the transmit sentence */
53 #define PUD_TX_LATITUDE_DECIMALS        "5"
54
55 /*
56  * Longitude
57  */
58
59 /** The number of bits for the longitude field */
60 #define PUD_LONGITUDE_BITS                      27
61
62 /** The maximum size of the string representation of the longitude
63  * sign [0,180] [0,59] dot [0,59] [0,999] (including \0) */
64 #define PUD_TX_LONGITUDE_DIGITS         (1 + 3 + 2 + 1 + 2 + 3 + 1)
65
66 /** The number of decimals of the longitude in the transmit sentence */
67 #define PUD_TX_LONGITUDE_DECIMALS       "5"
68
69 /*
70  * Altitude
71  */
72
73 /** The number of bits for the altitude field */
74 #define PUD_ALTITUDE_BITS                       16
75
76 /** The minimum altitude */
77 #define PUD_ALTITUDE_MIN                        (-400)
78
79 /** The maximum altitude */
80 #define PUD_ALTITUDE_MAX        (((1 << PUD_ALTITUDE_BITS) - 1) + PUD_ALTITUDE_MIN)
81
82 /** The maximum size of the string representation of the altitude (including \0) */
83 #define PUD_TX_ALTITUDE_DIGITS          (6 + 1)
84
85 /*
86  * Speed
87  */
88
89 /** The number of bits for the speed field */
90 #define PUD_SPEED_BITS                          12
91
92 /** The maximum speed value */
93 #define PUD_SPEED_MAX                           ((1 << PUD_SPEED_BITS) - 1)
94
95 /** The maximum size of the string representation of the speed (including \0) */
96 #define PUD_TX_SPEED_DIGITS                     (4 + 1)
97
98 /*
99  * Track
100  */
101
102 /** The number of bits for the track angle field */
103 #define PUD_TRACK_BITS                          9
104
105 /** The maximum size of the string representation of the track angle (including \0) */
106 #define PUD_TX_TRACK_DIGITS                     (3 + 1)
107
108 /*
109  * HDOP
110  */
111
112 /** The number of bits for the HDOP field */
113 #define PUD_HDOP_BITS                           11
114
115 /** The HDOP resolution (in m) */
116 #define PUD_HDOP_RESOLUTION                     (0.1)
117
118 /** The maximum HDOP value (in m) */
119 #define PUD_HDOP_MAX            (((1 << PUD_HDOP_BITS) - 1) * PUD_HDOP_RESOLUTION)
120
121 /** The maximum size of the string representation of the HDOP (including \0) */
122 #define PUD_TX_HDOP_DIGITS                      (5 + 1)
123
124 /** The number of decimals of the HDOP in the transmit sentence */
125 #define PUD_TX_HDOP_DECIMALS            "3"
126
127 /*
128  * Node ID Type
129  */
130
131 /** nodeIdType legal values */
132 typedef enum _NodeIdType {
133         /** the first id of the globally unique node type IDs */
134         PUD_NODEIDTYPE_GLOBAL_FIRST = 0,
135
136         /** MAC address, 48 bits, 6 bytes */
137         PUD_NODEIDTYPE_MAC = 0,
138
139         /** MSISDN number, 15 digits, 50 bits, 7 bytes */
140         PUD_NODEIDTYPE_MSISDN = 1,
141
142         /** TETRA number, 17 digits, 57 bits, 8 bytes */
143         PUD_NODEIDTYPE_TETRA = 2,
144
145         /** DNS name, variable length */
146         PUD_NODEIDTYPE_DNS = 3,
147
148         /** IPv4 address, 32 bits, 4 bytes */
149         PUD_NODEIDTYPE_IPV4 = 4,
150
151         /** UUID, 32 hexadecimal digits, 128 bits, 16 bytes */
152         PUD_NODEIDTYPE_UUID = 5,
153
154         /** IPv6 address, 128 bits, 16 bytes */
155         PUD_NODEIDTYPE_IPV6 = 6,
156
157         /** AIS MMSI number, 9 digits, 30 bits, 4 bytes */
158         PUD_NODEIDTYPE_MMSI = 7,
159
160         /** URN number, 24 bits, 3 bytes */
161         PUD_NODEIDTYPE_URN = 8,
162
163         /** MIP OID number, 67 bits, 9 bytes */
164         PUD_NODEIDTYPE_MIP = 9,
165
166         /** the last id of the globally unique node type IDs */
167         PUD_NODEIDTYPE_GLOBAL_LAST = PUD_NODEIDTYPE_MIP,
168
169         /** the first id of the locally unique node type IDs */
170         PUD_NODEIDTYPE_LOCAL_FIRST = 192,
171
172         /** Brandweer number, 7 digits, 24 bits, 3 bytes */
173         PUD_NODEIDTYPE_192 = 192,
174
175         /** Ambulance number, 6 digits, 20 bits, 3 bytes */
176         PUD_NODEIDTYPE_193 = 193,
177
178         /** Number in the range [1, 8191], 4 digits, 13 bits, 2 bytes */
179         PUD_NODEIDTYPE_194 = 194,
180
181         /** the last id of the locally unique node type IDs */
182         PUD_NODEIDTYPE_LOCAL_LAST = PUD_NODEIDTYPE_194
183 } NodeIdType;
184
185 /** the number of nodeId bytes for PUD_NODEIDTYPE_MAC (IFHWADDRLEN) */
186 #define PUD_NODEIDTYPE_MAC_BYTES                6
187
188 /** the number of nodeId bytes for PUD_NODEIDTYPE_MSISDN */
189 #define PUD_NODEIDTYPE_MSISDN_BYTES             7
190 #define PUD_NODEIDTYPE_MSISDN_MIN               0LLU
191 #define PUD_NODEIDTYPE_MSISDN_MAX               999999999999999LLU
192
193 /** the number of nodeId bytes for PUD_NODEIDTYPE_TETRA */
194 #define PUD_NODEIDTYPE_TETRA_BYTES              8
195 #define PUD_NODEIDTYPE_TETRA_MIN                0LLU
196 #define PUD_NODEIDTYPE_TETRA_MAX                99999999999999999LLU
197
198 /** the number of nodeId bytes for PUD_NODEIDTYPE_UUID */
199 #define PUD_NODEIDTYPE_UUID_BYTES   16
200 #define PUD_NODEIDTYPE_UUID_BYTES1  8
201 #define PUD_NODEIDTYPE_UUID_BYTES2  (PUD_NODEIDTYPE_UUID_BYTES - PUD_NODEIDTYPE_UUID_BYTES1)
202 #define PUD_NODEIDTYPE_UUID_CHARS   32
203 #define PUD_NODEIDTYPE_UUID_CHARS1  16
204 #define PUD_NODEIDTYPE_UUID_CHARS2  (PUD_NODEIDTYPE_UUID_CHARS - PUD_NODEIDTYPE_UUID_CHARS1)
205 #define PUD_NODEIDTYPE_UUID_MIN1    0LLU
206 #define PUD_NODEIDTYPE_UUID_MAX1    0xFFFFFFFFFFFFFFFFLLU
207 #define PUD_NODEIDTYPE_UUID_MIN2    0LLU
208 #define PUD_NODEIDTYPE_UUID_MAX2    0xFFFFFFFFFFFFFFFFLLU
209
210 /** the number of nodeId bytes for PUD_NODEIDTYPE_MMSI */
211 #define PUD_NODEIDTYPE_MMSI_BYTES               4
212 #define PUD_NODEIDTYPE_MMSI_MIN                 0LLU
213 #define PUD_NODEIDTYPE_MMSI_MAX                 999999999LLU
214
215 /** the number of nodeId bytes for PUD_NODEIDTYPE_URN */
216 #define PUD_NODEIDTYPE_URN_BYTES                3
217 #define PUD_NODEIDTYPE_URN_MIN                  0LLU
218 #define PUD_NODEIDTYPE_URN_MAX                  16777215LLU
219
220 /** the number of nodeId bytes for PUD_NODEIDTYPE_MIP */
221 #define PUD_NODEIDTYPE_MIP_BYTES    9
222 #define PUD_NODEIDTYPE_MIP_BYTES1   1
223 #define PUD_NODEIDTYPE_MIP_BYTES2   (PUD_NODEIDTYPE_MIP_BYTES - PUD_NODEIDTYPE_MIP_BYTES1)
224 #define PUD_NODEIDTYPE_MIP_CHARS    20
225 #define PUD_NODEIDTYPE_MIP_CHARS1   1
226 #define PUD_NODEIDTYPE_MIP_CHARS2   (PUD_NODEIDTYPE_MIP_CHARS - PUD_NODEIDTYPE_MIP_CHARS1)
227 #define PUD_NODEIDTYPE_MIP_MIN1     0LLU
228 #define PUD_NODEIDTYPE_MIP_MAX1     9LLU
229 #define PUD_NODEIDTYPE_MIP_MIN2     0LLU
230 #define PUD_NODEIDTYPE_MIP_MAX2     9999999999999999999LLU
231
232 /** the number of nodeId bytes for PUD_NODEIDTYPE_192 */
233 #define PUD_NODEIDTYPE_192_BYTES                3
234 #define PUD_NODEIDTYPE_192_MIN                  0LLU
235 #define PUD_NODEIDTYPE_192_MAX                  9999999LLU
236
237 /** the number of nodeId bytes for PUD_NODEIDTYPE_193 */
238 #define PUD_NODEIDTYPE_193_BYTES                3
239 #define PUD_NODEIDTYPE_193_MIN                  0LLU
240 #define PUD_NODEIDTYPE_193_MAX                  999999LLU
241
242 /** the number of nodeId bytes for PUD_NODEIDTYPE_194 */
243 #define PUD_NODEIDTYPE_194_BYTES                2
244 #define PUD_NODEIDTYPE_194_MIN                  1LLU
245 #define PUD_NODEIDTYPE_194_MAX                  8191LLU
246
247 /** the number of nodeId bytes for PUD_NODEIDTYPE_IPV4 (sizeof(struct in_addr)) */
248 #define PUD_NODEIDTYPE_IPV4_BYTES               4
249
250 /** the number of nodeId bytes for PUD_NODEIDTYPE_IPV6 (sizeof(struct in6_addr)) */
251 #define PUD_NODEIDTYPE_IPV6_BYTES               16
252
253 /** The maximum size of the string representation of the nodeIdType (including \0) */
254 #define PUD_TX_NODEIDTYPE_DIGITS                (3 + 1)
255
256 /*
257  * Node ID
258  */
259
260 /** The maximum size of the string representation of the nodeId (including \0) */
261 #define PUD_TX_NODEID_BUFFERSIZE                1024
262
263 /**
264  The type that is used to store the nodeId as a binary representation along
265  with its length and setup status
266  */
267 typedef struct _nodeIdBinaryType {
268                 bool set;
269                 size_t length;
270                 union _buffer {
271                                 unsigned char mac[PUD_NODEIDTYPE_MAC_BYTES];
272                                 union olsr_ip_addr ip;
273                                 unsigned long long longValue;
274                                 unsigned char stringValue[PUD_TX_NODEID_BUFFERSIZE];
275                                 unsigned char uuid[PUD_NODEIDTYPE_UUID_BYTES];
276                                 unsigned char mip[PUD_NODEIDTYPE_MIP_BYTES];
277                 } buffer;
278 } nodeIdBinaryType;
279
280 /*
281  * Wire Format Structures
282  */
283
284 /** Sub-format GPS information, 120 bits = 15 bytes */
285 typedef struct _GpsInfo {
286         uint32_t time :PUD_TIME_BITS; /**< the number of seconds since midnight, ALWAYS present */
287         uint32_t lat :PUD_LATITUDE_BITS; /**< latitude */
288         uint32_t lon :PUD_LONGITUDE_BITS; /**< longitude */
289         uint32_t alt :PUD_ALTITUDE_BITS; /**< altitude */
290         uint32_t speed :PUD_SPEED_BITS; /**< speed */
291         uint32_t track :PUD_TRACK_BITS; /**< track angle */
292         uint32_t hdop :PUD_HDOP_BITS; /**< HDOP */
293 }__attribute__((__packed__)) GpsInfo;
294
295 /** Sub-format Node information, 8 + variable bits = 1 + variable bytes */
296 typedef struct _NodeInfo {
297         uint8_t nodeIdType; /**< the nodeIdType */
298         unsigned char nodeId; /**< placeholder for variable length nodeId string */
299 }__attribute__((__packed__)) NodeInfo;
300
301 /** Complete format, 8+8+8+120+(8+variable) bits =  18+(1+variable) bytes*/
302 typedef struct _PudOlsrPositionUpdate {
303         uint8_t version; /**< the version of the sentence */
304         uint8_t validityTime; /**< the validity time of the sentence */
305         uint8_t smask; /**< mask signaling the contents of the sentence */
306         uint8_t flags; /**< mask signaling extra contents of the sentence */
307         GpsInfo gpsInfo; /**< the GPS information (MANDATORY) */
308         NodeInfo nodeInfo; /**< placeholder for node information (OPTIONAL) */
309 }__attribute__((__packed__)) PudOlsrPositionUpdate;
310
311 /** The size of the wire format, minus the size of the node information */
312 #define PUD_OLSRWIREFORMATSIZE (sizeof(PudOlsrPositionUpdate) - sizeof(NodeInfo))
313
314 /*
315  * Uplink
316  */
317
318 /** the types of the uplink messages */
319 typedef enum _UplinkMessageType {
320         POSITION = 0,
321         CLUSTERLEADER = 1
322 } UplinkMessageType;
323
324 /** cluster leader message, 10 bytes (IPv4), 34 bytes (IPv6) */
325 typedef struct _UplinkClusterLeader {
326         uint8_t version; /**< the version of the message */
327         uint8_t validityTime; /**< the validity time of the sentence */
328         union _leader {
329                 struct _v4 {
330                         struct in_addr originator;
331                         struct in_addr clusterLeader;
332                 } v4;
333                 struct _v6 {
334                         struct in6_addr originator;
335                         struct in6_addr clusterLeader;
336                 } v6;
337         } leader;
338 }__attribute__((__packed__)) UplinkClusterLeader;
339
340 /** TLV header for uplink messages, 4 bytes */
341 typedef struct _UplinkHeader {
342         uint8_t type; /**< stores a UplinkMessageType */
343         uint16_t length; /**< the length of the payload in txBuffer */
344         uint8_t ipv6 :1; /**< clear when IPv4, set when IPv6 */
345         uint8_t pad :7; /**< padding to align to 4 bytes */
346 }__attribute__((__packed__)) UplinkHeader;
347
348 /** uplink message */
349 typedef struct _UplinkMessage {
350         UplinkHeader header; /**< the uplink TLV header */
351         union _msg {
352                 /** an olsr message (position update) */
353                 union olsr_message olsrMessage;
354
355                 /** a cluster leader message */
356                 UplinkClusterLeader clusterLeader;
357         } msg;
358 }__attribute__((__packed__)) UplinkMessage;
359
360 /* ************************************************************************
361  * FUNCTIONS
362  * ************************************************************************ */
363
364 /*
365  * NodeIdType
366  */
367 bool isValidNodeIdType(unsigned long long nodeIdType);
368
369 /*
370  * Validity Time
371  */
372 unsigned long getValidityTime(uint8_t * validityTimeField);
373 void setValidityTime(uint8_t * validityTimeField, unsigned long long validityTime);
374
375 /*
376  * UplinkHeader
377  */
378 uint8_t getUplinkMessageType(UplinkHeader * uplinkHeader);
379 void setUplinkMessageType(UplinkHeader * uplinkHeader, uint8_t type);
380 uint16_t getUplinkMessageLength(UplinkHeader * uplinkHeader);
381 void setUplinkMessageLength(UplinkHeader * uplinkHeader, uint16_t length);
382 bool getUplinkMessageIPv6(UplinkHeader * uplinkHeader);
383 void setUplinkMessageIPv6(UplinkHeader * uplinkHeader, bool ipv6);
384 void setUplinkMessagePadding(UplinkHeader * uplinkHeader, uint8_t pad);
385
386 /*
387  * OLSR header
388  */
389 unsigned short getOlsrMessageSize(int ipVersion, union olsr_message * olsrMessage);
390 union olsr_ip_addr * getOlsrMessageOriginator(int ipVersion, union olsr_message * olsrMessage);
391 PudOlsrPositionUpdate * getOlsrMessagePayload(int ipVersion, union olsr_message * olsrMessage);
392
393 /*
394  * PudOlsrPositionUpdate
395  */
396 uint8_t getPositionUpdateVersion(PudOlsrPositionUpdate * olsrGpsMessage);
397 void setPositionUpdateVersion(PudOlsrPositionUpdate * olsrGpsMessage, uint8_t version);
398 uint8_t getPositionUpdateSmask(PudOlsrPositionUpdate * olsrGpsMessage);
399 void setPositionUpdateSmask(PudOlsrPositionUpdate * olsrGpsMessage, uint8_t smask);
400 uint8_t getPositionUpdateFlags(PudOlsrPositionUpdate * olsrGpsMessage);
401 void setPositionUpdateFlags(PudOlsrPositionUpdate * olsrGpsMessage, uint8_t flags);
402
403 /*
404  * GpsInfo
405  */
406 void getPositionUpdateTime(PudOlsrPositionUpdate * olsrGpsMessage, time_t baseDate, struct tm *nowStruct);
407 void setPositionUpdateTime(PudOlsrPositionUpdate * olsrGpsMessage, int hour, int min, int sec);
408 double getPositionUpdateLatitude(PudOlsrPositionUpdate * olsrGpsMessage);
409 void setPositionUpdateLatitude(PudOlsrPositionUpdate * olsrGpsMessage, double latitude);
410 double getPositionUpdateLongitude(PudOlsrPositionUpdate * olsrGpsMessage);
411 void setPositionUpdateLongitude(PudOlsrPositionUpdate * olsrGpsMessage, double longitude);
412 long getPositionUpdateAltitude(PudOlsrPositionUpdate * olsrGpsMessage);
413 void setPositionUpdateAltitude(PudOlsrPositionUpdate * olsrGpsMessage, double altitude);
414 unsigned long getPositionUpdateSpeed(PudOlsrPositionUpdate * olsrGpsMessage);
415 void setPositionUpdateSpeed(PudOlsrPositionUpdate * olsrGpsMessage, double speed);
416 unsigned long getPositionUpdateTrack(PudOlsrPositionUpdate * olsrGpsMessage);
417 void setPositionUpdateTrack(PudOlsrPositionUpdate * olsrGpsMessage, double track);
418 double getPositionUpdateHdop(PudOlsrPositionUpdate * olsrGpsMessage);
419 void setPositionUpdateHdop(PudOlsrPositionUpdate * olsrGpsMessage, double hdop);
420
421 /*
422  * NodeInfo
423  */
424 NodeIdType getPositionUpdateNodeIdType(int ipVersion, PudOlsrPositionUpdate * olsrGpsMessage);
425 void setPositionUpdateNodeIdType(PudOlsrPositionUpdate * olsrGpsMessage, NodeIdType nodeIdType);
426
427 void getPositionUpdateNodeId(int ipVersion, union olsr_message * olsrMessage, unsigned char ** nodeId,
428                 unsigned int * nodeIdSize);
429 void setPositionUpdateNodeId(PudOlsrPositionUpdate * olsrGpsMessage, unsigned char * nodeId, unsigned int nodeIdSize,
430                 bool padWithNullByte);
431
432 size_t setPositionUpdateNodeInfo(int ipVersion, PudOlsrPositionUpdate * olsrGpsMessage, unsigned int olsrMessageSize,
433                 NodeIdType nodeIdType, unsigned char * nodeId, size_t nodeIdLength);
434
435 /*
436  * UplinkClusterLeader
437  */
438 uint8_t getClusterLeaderVersion(UplinkClusterLeader * clusterLeaderMessage);
439 void setClusterLeaderVersion(UplinkClusterLeader * clusterLeaderMessage, uint8_t version);
440 union olsr_ip_addr * getClusterLeaderOriginator(int ipVersion, UplinkClusterLeader * clusterLeaderMessage);
441 union olsr_ip_addr * getClusterLeaderClusterLeader(int ipVersion, UplinkClusterLeader * clusterLeaderMessage);
442
443 #endif /* _PUD_WIREFORMAT_H_ */