PUD: we need to transmit IPv4/IPv6 status in the uplink
[olsrd.git] / lib / pud / src / wireFormat.h
1 #ifndef _PUD_WIREFORMAT_H_
2 #define _PUD_WIREFORMAT_H_
3
4 /* OLSRD includes */
5 #include "olsr_protocol.h"
6
7 /* System includes */
8 #include <stdint.h>
9 #include <time.h>
10 #include <net/if.h>
11
12 #include "olsr_protocol.h"
13
14 /** The size of the buffer in which the OLSR message is assembled */
15 #define TX_BUFFER_SIZE_FOR_OLSR 512
16
17 /*
18  * Version
19  */
20
21 /** The version of the wire format */
22 #define PUD_WIRE_FORMAT_VERSION         0
23
24 /*
25  * Flags
26  * We use the smask of nmeaINFO and the flags below on top of that
27  */
28
29 /** Flags that the GPS information contains the nodeId */
30 #define PUD_FLAGS_ID                            0x80
31
32 /*
33  * Time
34  */
35
36 /** The number of bits for the time field */
37 #define PUD_TIME_BITS                           17
38
39 /*
40  * Latitude
41  */
42
43 /** The number of bits for the latitude field */
44 #define PUD_LATITUDE_BITS                       28
45
46 /** The maximum size of the string representation of the latitude
47  * sign [0,90] [0,59] dot [0,59] [0,999] */
48 #define PUD_TX_LATITUDE_DIGITS          (1 + 2 + 2 + 1 + 2 + 3)
49
50 /** The number of decimals of the latitude in the transmit sentence */
51 #define PUD_TX_LATITUDE_DECIMALS        "5"
52
53 /*
54  * Longitude
55  */
56
57 /** The number of bits for the longitude field */
58 #define PUD_LONGITUDE_BITS                      27
59
60 /** The maximum size of the string representation of the longitude
61  * sign [0,180] [0,59] dot [0,59] [0,999] */
62 #define PUD_TX_LONGITUDE_DIGITS         (1 + 3 + 2 + 1 + 2 + 3)
63
64 /** The number of decimals of the longitude in the transmit sentence */
65 #define PUD_TX_LONGITUDE_DECIMALS       "5"
66
67 /*
68  * Altitude
69  */
70
71 /** The number of bits for the altitude field */
72 #define PUD_ALTITUDE_BITS                       16
73
74 /** The minimum altitude */
75 #define PUD_ALTITUDE_MIN                        (-400)
76
77 /** The maximum altitude */
78 #define PUD_ALTITUDE_MAX        (((1 << PUD_ALTITUDE_BITS) - 1) + PUD_ALTITUDE_MIN)
79
80 /** The maximum size of the string representation of the altitude */
81 #define PUD_TX_ALTITUDE_DIGITS          6
82
83 /*
84  * Speed
85  */
86
87 /** The number of bits for the speed field */
88 #define PUD_SPEED_BITS                          12
89
90 /** The maximum speed value */
91 #define PUD_SPEED_MAX                           ((1 << PUD_SPEED_BITS) - 1)
92
93 /** The maximum size of the string representation of the speed */
94 #define PUD_TX_SPEED_DIGITS                     4
95
96 /*
97  * Track
98  */
99
100 /** The number of bits for the track angle field */
101 #define PUD_TRACK_BITS                          9
102
103 /** The maximum size of the string representation of the track angle */
104 #define PUD_TX_TRACK_DIGITS                     3
105
106 /*
107  * HDOP
108  */
109
110 /** The number of bits for the HDOP field */
111 #define PUD_HDOP_BITS                           11
112
113 /** The HDOP resolution (in m) */
114 #define PUD_HDOP_RESOLUTION                     (0.1)
115
116 /** The maximum HDOP value (in m) */
117 #define PUD_HDOP_MAX            (((1 << PUD_HDOP_BITS) - 1) * PUD_HDOP_RESOLUTION)
118
119 /** The maximum size of the string representation of the HDOP */
120 #define PUD_TX_HDOP_DIGITS                      5
121
122 /** The number of decimals of the HDOP in the transmit sentence */
123 #define PUD_TX_HDOP_DECIMALS            "3"
124
125 /*
126  * Node ID Type
127  */
128
129 /** nodeIdType legal values */
130 typedef enum _NodeIdType {
131         /** MAC address, 48 bits, 6 bytes */
132         PUD_NODEIDTYPE_MAC = 0,
133
134         /** MSISDN number, 15 digits, 50 bits, 7 bytes */
135         PUD_NODEIDTYPE_MSISDN = 1,
136
137         /** TETRA number, 17 digits, 57 bits, 8 bytes */
138         PUD_NODEIDTYPE_TETRA = 2,
139
140         /** DNS name, variable length */
141         PUD_NODEIDTYPE_DNS = 3,
142
143         /** IPv4 address, 32 bits, 4 bytes */
144         PUD_NODEIDTYPE_IPV4 = 4,
145
146         /** IPv6 address, 128 bits, 16 bytes */
147         PUD_NODEIDTYPE_IPV6 = 6,
148
149         /** Brandweer number, 7 digits, 24 bits, 3 bytes */
150         PUD_NODEIDTYPE_192 = 192,
151
152         /** Ambulance number, 6 digits, 20 bits, 3 bytes */
153         PUD_NODEIDTYPE_193 = 193,
154
155         /** Number in the range [1, 8191], 4 digits, 13 bits, 2 bytes */
156         PUD_NODEIDTYPE_194 = 194
157 } NodeIdType;
158
159 /** the number of nodeId bytes for PUD_NODEIDTYPE_MAC */
160 #define PUD_NODEIDTYPE_MAC_BYTES                IFHWADDRLEN
161
162 /** the number of nodeId bytes for PUD_NODEIDTYPE_MSISDN */
163 #define PUD_NODEIDTYPE_MSISDN_BYTES             7
164
165 /** the number of nodeId bytes for PUD_NODEIDTYPE_TETRA */
166 #define PUD_NODEIDTYPE_TETRA_BYTES              8
167
168 /** the number of nodeId bytes for PUD_NODEIDTYPE_192 */
169 #define PUD_NODEIDTYPE_192_BYTES                3
170
171 /** the number of nodeId bytes for PUD_NODEIDTYPE_193 */
172 #define PUD_NODEIDTYPE_193_BYTES                3
173
174 /** the number of nodeId bytes for PUD_NODEIDTYPE_194 */
175 #define PUD_NODEIDTYPE_194_BYTES                2
176
177 /** the number of nodeId bytes for PUD_NODEIDTYPE_IPV4 */
178 #define PUD_NODEIDTYPE_IPV4_BYTES               sizeof(struct in_addr)
179
180 /** the number of nodeId bytes for PUD_NODEIDTYPE_IPV6 */
181 #define PUD_NODEIDTYPE_IPV6_BYTES               sizeof(struct in6_addr)
182
183 /** The maximum size of the string representation of the nodeIdType */
184 #define PUD_TX_NODEIDTYPE_DIGITS        3
185
186 /*
187  * Node ID
188  */
189
190 /** The maximum size of the string representation of the nodeId */
191 #define PUD_TX_NODEID_BUFFERSIZE        1023
192
193 /*
194  * Wire Format Structures
195  */
196
197 /** Sub-format GPS information, 120 bits = 15 bytes */
198 typedef struct _GpsInfo {
199                 uint32_t time :PUD_TIME_BITS; /**< the number of seconds since midnight, ALWAYS present */
200                 uint32_t lat :PUD_LATITUDE_BITS; /**< latitude */
201                 uint32_t lon :PUD_LONGITUDE_BITS; /**< longitude */
202                 uint32_t alt :PUD_ALTITUDE_BITS; /**< altitude */
203                 uint32_t speed :PUD_SPEED_BITS; /**< speed */
204                 uint32_t track :PUD_TRACK_BITS; /**< track angle */
205                 uint32_t hdop :PUD_HDOP_BITS; /**< HDOP */
206 }__attribute__((__packed__)) GpsInfo;
207
208 /** Sub-format Node information, 8 + variable bits = 1 + variable bytes */
209 typedef struct _NodeInfo {
210                 uint8_t nodeIdType; /**< the nodeIdType */
211                 unsigned char nodeId; /**< placeholder for variable length nodeId string */
212 }__attribute__((__packed__)) NodeInfo;
213
214 /** Complete format, 8+8+8+120+(8+variable) bits =  18+(1+variable) bytes*/
215 typedef struct _PudOlsrWireFormat {
216                 uint8_t version; /**< the version of the sentence */
217                 uint8_t validityTime; /**< the validity time of the sentence */
218                 uint8_t smask; /**< mask signaling the contents of the sentence */
219                 GpsInfo gpsInfo; /**< the GPS information (MANDATORY) */
220                 NodeInfo nodeInfo; /**< placeholder for node information (OPTIONAL) */
221 }__attribute__((__packed__)) PudOlsrWireFormat;
222
223 /** The size of the wire format, minus the size of the node information */
224 #define PUD_OLSRWIREFORMATSIZE (sizeof(PudOlsrWireFormat) - sizeof(NodeInfo))
225
226 /*
227  * Uplink
228  */
229
230 /** the type of the uplink position update message */
231 typedef enum _UplinkMessageType {
232         POSITION = 0
233 } UplinkMessageType;
234
235 /** TLV structure for uplink messages */
236 typedef struct _UplinkWireFormat {
237                 uint8_t type; /**< stores a UplinkMessageType */
238                 uint16_t length; /**< the length of the payload in txBuffer */
239                 uint8_t ipv6:1; /**< clear when IPv4, set when IPv6 */
240                 uint8_t pad:7; /**< padding to align to 4 bytes */
241                 union _msg {
242                         union olsr_message olsrMessage; /**< the olsr message */
243                         unsigned char txBuffer[TX_BUFFER_SIZE_FOR_OLSR]; /**< payload */
244                 } msg;
245 }__attribute__((__packed__)) UplinkWireFormat;
246
247 /* ************************************************************************
248  * FUNCTIONS
249  * ************************************************************************ */
250
251 /*
252  * OLSR header
253  */
254
255 union olsr_ip_addr * getOlsrMessageOriginator(int ipVersion,
256                 union olsr_message * olsrMessage);
257
258 unsigned short getOlsrMessageSize(int ipVersion,
259                 union olsr_message * olsrMessage);
260
261 PudOlsrWireFormat * getOlsrMessagePayload(int ipVersion,
262                 union olsr_message * olsrMessage);
263
264 /*
265  * PudOlsrWireFormat
266  */
267
268 unsigned char getValidityTimeForOlsr(unsigned long long validityTime);
269 unsigned long getValidityTimeFromOlsr(unsigned char internal);
270
271 /*
272  * GpsInfo
273  */
274
275 unsigned long getTimeForOlsr(int hour, int min, int sec);
276 void getTimeFromOlsr(uint32_t olsrTime, struct tm *nowStruct);
277
278 unsigned long getLatitudeForOlsr(double infoLat);
279 double getLatitudeFromOlsr(uint32_t olsrLat);
280
281 unsigned long getLongitudeForOlsr(double infoLon);
282 double getLongitudeFromOlsr(uint32_t olsrLon);
283
284 long getAltitudeForOlsr(double infoElv);
285 long getAltitudeFromOlsr(uint32_t olsrAlt);
286
287 long getSpeedForOlsr(double infoSpeed);
288 unsigned long getSpeedFromOlsr(uint32_t olsrSpeed);
289
290 long getTrackForOlsr(double infoTrack);
291 unsigned long getTrackFromOlsr(uint32_t olsrTrack);
292
293 long getHdopForOlsr(double infoHdop);
294 double getHdopFromOlsr(uint32_t olsrHdop);
295
296 /*
297  * NodeInfo
298  */
299
300 NodeIdType getNodeIdType(int ipVersion, union olsr_message * olsrMessage);
301
302 void getNodeIdPointers(int ipVersion, union olsr_message * olsrMessage,
303                 unsigned char ** buffer, unsigned int * bufferSize);
304
305 #endif /* _PUD_WIREFORMAT_H_ */