• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*******************************************************************************
2  * Copyright (c) 2009, 2018 IBM Corp.
3  *
4  * All rights reserved. This program and the accompanying materials
5  * are made available under the terms of the Eclipse Public License v1.0
6  * and Eclipse Distribution License v1.0 which accompany this distribution.
7  *
8  * The Eclipse Public License is available at
9  *    http://www.eclipse.org/legal/epl-v10.html
10  * and the Eclipse Distribution License is available at
11  *   http://www.eclipse.org/org/documents/edl-v10.php.
12  *
13  * Contributors:
14  *    Ian Craggs - initial API and implementation and/or initial documentation
15  *    Ian Craggs, Allan Stockdill-Mander - SSL updates
16  *    Ian Craggs - MQTT 3.1.1 support
17  *    Ian Craggs - big endian Linux reversed definition
18  *    Ian Craggs - MQTT 5.0 support
19  *******************************************************************************/
20 
21 #if !defined(MQTTPACKET_H)
22 #define MQTTPACKET_H
23 
24 #include "Socket.h"
25 #if defined(OPENSSL) || defined(MBEDTLS)
26 #include "SSLSocket.h"
27 #endif
28 #include "LinkedList.h"
29 #include "Clients.h"
30 
31 #if !defined (__LITEOS__)
32 typedef unsigned int bool;
33 #endif
34 
35 typedef void* (*pf)(int, unsigned char, char*, size_t);
36 
37 #include "MQTTProperties.h"
38 #include "MQTTReasonCodes.h"
39 
40 enum errors
41 {
42 	MQTTPACKET_BAD = -4,
43 	MQTTPACKET_BUFFER_TOO_SHORT = -2,
44 	MQTTPACKET_READ_ERROR = -1,
45 	MQTTPACKET_READ_COMPLETE
46 };
47 
48 
49 enum msgTypes
50 {
51 	CONNECT = 1, CONNACK, PUBLISH, PUBACK, PUBREC, PUBREL,
52 	PUBCOMP, SUBSCRIBE, SUBACK, UNSUBSCRIBE, UNSUBACK,
53 	PINGREQ, PINGRESP, DISCONNECT, AUTH
54 };
55 
56 #if defined(__linux__)
57 #include <endian.h>
58 #if __BYTE_ORDER == __BIG_ENDIAN
59 	#define REVERSED 1
60 #endif
61 #endif
62 
63 /**
64  * Bitfields for the MQTT header byte.
65  */
66 typedef union
67 {
68 	/*unsigned*/ char byte;	/**< the whole byte */
69 #if defined(REVERSED)
70 	struct
71 	{
72 		unsigned int type : 4;	/**< message type nibble */
73 		bool dup : 1;			/**< DUP flag bit */
74 		unsigned int qos : 2;	/**< QoS value, 0, 1 or 2 */
75 		bool retain : 1;		/**< retained flag bit */
76 	} bits;
77 #else
78 	struct
79 	{
80 		bool retain : 1;		/**< retained flag bit */
81 		unsigned int qos : 2;	/**< QoS value, 0, 1 or 2 */
82 		bool dup : 1;			/**< DUP flag bit */
83 		unsigned int type : 4;	/**< message type nibble */
84 	} bits;
85 #endif
86 } Header;
87 
88 
89 /**
90  * Data for a connect packet.
91  */
92 typedef struct
93 {
94 	Header header;	/**< MQTT header byte */
95 	union
96 	{
97 		unsigned char all;	/**< all connect flags */
98 #if defined(REVERSED)
99 		struct
100 		{
101 			bool username : 1;			/**< 3.1 user name */
102 			bool password : 1; 			/**< 3.1 password */
103 			bool willRetain : 1;		/**< will retain setting */
104 			unsigned int willQoS : 2;	/**< will QoS value */
105 			bool will : 1;			/**< will flag */
106 			bool cleanstart : 1;	/**< cleansession flag */
107 			int : 1;	/**< unused */
108 		} bits;
109 #else
110 		struct
111 		{
112 			int : 1;	/**< unused */
113 			bool cleanstart : 1;	/**< cleansession flag */
114 			bool will : 1;			/**< will flag */
115 			unsigned int willQoS : 2;	/**< will QoS value */
116 			bool willRetain : 1;		/**< will retain setting */
117 			bool password : 1; 			/**< 3.1 password */
118 			bool username : 1;			/**< 3.1 user name */
119 		} bits;
120 #endif
121 	} flags;	/**< connect flags byte */
122 
123 	char *Protocol, /**< MQTT protocol name */
124 		*clientID,	/**< string client id */
125         *willTopic,	/**< will topic */
126         *willMsg;	/**< will payload */
127 
128 	int keepAliveTimer;		/**< keepalive timeout value in seconds */
129 	unsigned char version;	/**< MQTT version number */
130 } Connect;
131 
132 
133 /**
134  * Data for a connack packet.
135  */
136 typedef struct
137 {
138 	Header header; /**< MQTT header byte */
139 	union
140 	{
141 		unsigned char all;	/**< all connack flags */
142 #if defined(REVERSED)
143 		struct
144 		{
145 			unsigned int reserved : 7;	/**< message type nibble */
146 			bool sessionPresent : 1;    /**< was a session found on the server? */
147 		} bits;
148 #else
149 		struct
150 		{
151 			bool sessionPresent : 1;    /**< was a session found on the server? */
152 			unsigned int reserved : 7;	/**< message type nibble */
153 		} bits;
154 #endif
155 	} flags;	 /**< connack flags byte */
156 	unsigned char rc; /**< connack reason code */
157 	unsigned int MQTTVersion;  /**< the version of MQTT */
158 	MQTTProperties properties; /**< MQTT 5.0 properties.  Not used for MQTT < 5.0 */
159 } Connack;
160 
161 
162 /**
163  * Data for a packet with header only.
164  */
165 typedef struct
166 {
167 	Header header;	/**< MQTT header byte */
168 } MQTTPacket;
169 
170 
171 /**
172  * Data for a suback packet.
173  */
174 typedef struct
175 {
176 	Header header;	/**< MQTT header byte */
177 	int msgId;		/**< MQTT message id */
178 	int MQTTVersion;  /**< the version of MQTT */
179 	MQTTProperties properties; /**< MQTT 5.0 properties.  Not used for MQTT < 5.0 */
180 	List* qoss;		/**< list of granted QoSs (MQTT 3/4) / reason codes (MQTT 5) */
181 } Suback;
182 
183 
184 /**
185  * Data for an MQTT V5 unsuback packet.
186  */
187 typedef struct
188 {
189 	Header header;	/**< MQTT header byte */
190 	int msgId;		/**< MQTT message id */
191 	int MQTTVersion;  /**< the version of MQTT */
192 	MQTTProperties properties; /**< MQTT 5.0 properties.  Not used for MQTT < 5.0 */
193 	List* reasonCodes;	/**< list of reason codes */
194 } Unsuback;
195 
196 
197 /**
198  * Data for a publish packet.
199  */
200 typedef struct
201 {
202 	Header header;	/**< MQTT header byte */
203 	char* topic;	/**< topic string */
204 	int topiclen;
205 	int msgId;		/**< MQTT message id */
206 	char* payload;	/**< binary payload, length delimited */
207 	int payloadlen;	/**< payload length */
208 	int MQTTVersion;  /**< the version of MQTT */
209 	MQTTProperties properties; /**< MQTT 5.0 properties.  Not used for MQTT < 5.0 */
210 } Publish;
211 
212 
213 /**
214  * Data for one of the ack packets.
215  */
216 typedef struct
217 {
218 	Header header;	/**< MQTT header byte */
219 	int msgId;		/**< MQTT message id */
220 	unsigned char rc; /**< MQTT 5 reason code */
221 	int MQTTVersion;  /**< the version of MQTT */
222 	MQTTProperties properties; /**< MQTT 5.0 properties.  Not used for MQTT < 5.0 */
223 } Ack;
224 
225 typedef Ack Puback;
226 typedef Ack Pubrec;
227 typedef Ack Pubrel;
228 typedef Ack Pubcomp;
229 
230 int MQTTPacket_encode(char* buf, size_t length);
231 int MQTTPacket_decode(networkHandles* net, size_t* value);
232 int readInt(char** pptr);
233 char* readUTF(char** pptr, char* enddata);
234 unsigned char readChar(char** pptr);
235 void writeChar(char** pptr, char c);
236 void writeInt(char** pptr, int anInt);
237 void writeUTF(char** pptr, const char* string);
238 void writeData(char** pptr, const void* data, int datalen);
239 
240 const char* MQTTPacket_name(int ptype);
241 
242 void* MQTTPacket_Factory(int MQTTVersion, networkHandles* net, int* error);
243 int MQTTPacket_send(networkHandles* net, Header header, char* buffer, size_t buflen, int free, int MQTTVersion);
244 int MQTTPacket_sends(networkHandles* net, Header header, int count, char** buffers, size_t* buflens, int* frees, int MQTTVersion);
245 
246 void* MQTTPacket_header_only(int MQTTVersion, unsigned char aHeader, char* data, size_t datalen);
247 int MQTTPacket_send_disconnect(Clients* client, enum MQTTReasonCodes reason, MQTTProperties* props);
248 
249 void* MQTTPacket_publish(int MQTTVersion, unsigned char aHeader, char* data, size_t datalen);
250 void MQTTPacket_freePublish(Publish* pack);
251 int MQTTPacket_send_publish(Publish* pack, int dup, int qos, int retained, networkHandles* net, const char* clientID);
252 int MQTTPacket_send_puback(int msgid, networkHandles* net, const char* clientID);
253 void* MQTTPacket_ack(int MQTTVersion, unsigned char aHeader, char* data, size_t datalen);
254 
255 void MQTTPacket_freeAck(Ack* pack);
256 void MQTTPacket_freeSuback(Suback* pack);
257 void MQTTPacket_freeUnsuback(Unsuback* pack);
258 int MQTTPacket_send_pubrec(int msgid, networkHandles* net, const char* clientID);
259 int MQTTPacket_send_pubrel(int msgid, int dup, networkHandles* net, const char* clientID);
260 int MQTTPacket_send_pubcomp(int msgid, networkHandles* net, const char* clientID);
261 
262 void MQTTPacket_free_packet(MQTTPacket* pack);
263 
264 void writeInt4(char** pptr, int anInt);
265 int readInt4(char** pptr);
266 void writeMQTTLenString(char** pptr, MQTTLenString lenstring);
267 int MQTTLenStringRead(MQTTLenString* lenstring, char** pptr, char* enddata);
268 int MQTTPacket_VBIlen(int rem_len);
269 int MQTTPacket_decodeBuf(char* buf, unsigned int* value);
270 
271 #include "MQTTPacketOut.h"
272 
273 #endif /* MQTTPACKET_H */
274