libcoap  4.3.0
pdu.h
Go to the documentation of this file.
1 /*
2  * pdu.h -- CoAP message structure
3  *
4  * Copyright (C) 2010-2014 Olaf Bergmann <bergmann@tzi.org>
5  *
6  * SPDX-License-Identifier: BSD-2-Clause
7  *
8  * This file is part of the CoAP library libcoap. Please see README for terms
9  * of use.
10  */
11 
17 #ifndef COAP_PDU_H_
18 #define COAP_PDU_H_
19 
20 #include "uri.h"
21 #include "option.h"
22 
23 #ifdef WITH_LWIP
24 #include <lwip/pbuf.h>
25 #endif
26 
27 #include <stdint.h>
28 
35 #define COAP_DEFAULT_PORT 5683 /* CoAP default UDP/TCP port */
36 #define COAPS_DEFAULT_PORT 5684 /* CoAP default UDP/TCP port for secure transmission */
37 #define COAP_DEFAULT_MAX_AGE 60 /* default maximum object lifetime in seconds */
38 #ifndef COAP_DEFAULT_MTU
39 #define COAP_DEFAULT_MTU 1152
40 #endif /* COAP_DEFAULT_MTU */
41 
42 #ifndef COAP_DEFAULT_HOP_LIMIT
43 #define COAP_DEFAULT_HOP_LIMIT 16
44 #endif /* COAP_DEFAULT_HOP_LIMIT */
45 
46 #define COAP_DEFAULT_SCHEME "coap" /* the default scheme for CoAP URIs */
47 
49 #define COAP_DEFAULT_URI_WELLKNOWN ".well-known/core"
50 
51 /* CoAP message types */
52 
56 typedef enum coap_pdu_type_t {
57  COAP_MESSAGE_CON, /* 0 confirmable message (requires ACK/RST) */
58  COAP_MESSAGE_NON, /* 1 non-confirmable message (one-shot message) */
59  COAP_MESSAGE_ACK, /* 2 used to acknowledge confirmable messages */
60  COAP_MESSAGE_RST /* 3 indicates error in received messages */
62 
66 typedef enum coap_request_t {
71  COAP_REQUEST_FETCH, /* 5 RFC 8132 */
72  COAP_REQUEST_PATCH, /* 6 RFC 8132 */
73  COAP_REQUEST_IPATCH, /* 7 RFC 8132 */
75 
76 /*
77  * CoAP option numbers (be sure to update coap_option_check_critical() and
78  * coap_add_option() when adding options
79  */
80 
81 /*
82  * The C, U, and N flags indicate the properties
83  * Critical, Unsafe, and NoCacheKey, respectively.
84  * If U is set, then N has no meaning as per
85  * https://tools.ietf.org/html/rfc7252#section-5.10
86  * and is set to a -.
87  *
88  * Separately, R is for the options that can be repeated
89  *
90  * The least significant byte of the option is set as followed
91  * as per https://tools.ietf.org/html/rfc7252#section-5.4.6
92  *
93  * 0 1 2 3 4 5 6 7
94  * --+---+---+---+---+---+---+---+
95  * | NoCacheKey| U | C |
96  * --+---+---+---+---+---+---+---+
97  *
98  * https://tools.ietf.org/html/rfc8613#section-4 goes on to define E, I and U
99  * properties Encrypted and Integrity Protected, Integrity Protected Only, and
100  * Unprotected respectively. Integrity Protected Only is not currently used.
101  *
102  * An Option is tagged with CUNREIU with any of the letters replaced with _ if
103  * not set, or - for N if U is set (see above) for aiding understanding of the
104  * Option.
105  */
106 
107 #define COAP_OPTION_IF_MATCH 1 /* C__RE__, opaque, 0-8 B, RFC7252 */
108 #define COAP_OPTION_URI_HOST 3 /* CU-___U, String, 1-255 B, RFC7252 */
109 #define COAP_OPTION_ETAG 4 /* ___RE__, opaque, 1-8 B, RFC7252 */
110 #define COAP_OPTION_IF_NONE_MATCH 5 /* C___E__, empty, 0 B, RFC7252 */
111 #define COAP_OPTION_OBSERVE 6 /* _U-_E_U, empty/uint,0/0-3 B, RFC7641 */
112 #define COAP_OPTION_URI_PORT 7 /* CU-___U, uint, 0-2 B, RFC7252 */
113 #define COAP_OPTION_LOCATION_PATH 8 /* ___RE__, String, 0-255 B, RFC7252 */
114 #define COAP_OPTION_OSCORE 9 /* C_____U, *, 0-255 B, RFC8613 */
115 #define COAP_OPTION_URI_PATH 11 /* CU-RE__, String, 0-255 B, RFC7252 */
116 #define COAP_OPTION_CONTENT_FORMAT 12 /* ____E__, uint, 0-2 B, RFC7252 */
117 #define COAP_OPTION_CONTENT_TYPE COAP_OPTION_CONTENT_FORMAT
118 /* COAP_OPTION_MAXAGE default 60 seconds if not set */
119 #define COAP_OPTION_MAXAGE 14 /* _U-_E_U, uint, 0-4 B, RFC7252 */
120 #define COAP_OPTION_URI_QUERY 15 /* CU-RE__, String, 1-255 B, RFC7252 */
121 #define COAP_OPTION_HOP_LIMIT 16 /* ______U, uint, 1 B, RFC8768 */
122 #define COAP_OPTION_ACCEPT 17 /* C___E__, uint, 0-2 B, RFC7252 */
123 #define COAP_OPTION_LOCATION_QUERY 20 /* ___RE__, String, 0-255 B, RFC7252 */
124 #define COAP_OPTION_BLOCK2 23 /* CU-_E_U, uint, 0-3 B, RFC7959 */
125 #define COAP_OPTION_BLOCK1 27 /* CU-_E_U, uint, 0-3 B, RFC7959 */
126 #define COAP_OPTION_SIZE2 28 /* __N_E_U, uint, 0-4 B, RFC7959 */
127 #define COAP_OPTION_PROXY_URI 35 /* CU-___U, String, 1-1034 B, RFC7252 */
128 #define COAP_OPTION_PROXY_SCHEME 39 /* CU-___U, String, 1-255 B, RFC7252 */
129 #define COAP_OPTION_SIZE1 60 /* __N_E_U, uint, 0-4 B, RFC7252 */
130 #define COAP_OPTION_NORESPONSE 258 /* _U-_E_U, uint, 0-1 B, RFC7967 */
131 
132 #define COAP_MAX_OPT 65535
134 /* CoAP result codes (HTTP-Code / 100 * 40 + HTTP-Code % 100) */
135 
136 /* As of draft-ietf-core-coap-04, response codes are encoded to base
137  * 32, i.e. the three upper bits determine the response class while
138  * the remaining five fine-grained information specific to that class.
139  */
140 #define COAP_RESPONSE_CODE(N) (((N)/100 << 5) | (N)%100)
141 
142 /* Determines the class of response code C */
143 #define COAP_RESPONSE_CLASS(C) (((C) >> 5) & 0xFF)
144 
145 #ifndef SHORT_ERROR_RESPONSE
156 const char *coap_response_phrase(unsigned char code);
157 
158 #define COAP_ERROR_PHRASE_LENGTH 32
160 #else
161 #define coap_response_phrase(x) ((char *)NULL)
162 
163 #define COAP_ERROR_PHRASE_LENGTH 0
164 #endif /* SHORT_ERROR_RESPONSE */
165 
166 #define COAP_SIGNALING_CODE(N) (((N)/100 << 5) | (N)%100)
167 
175 
176 /* Applies to COAP_SIGNALING_CSM */
177 #define COAP_SIGNALING_OPTION_MAX_MESSAGE_SIZE 2
178 #define COAP_SIGNALING_OPTION_BLOCK_WISE_TRANSFER 4
179 /* Applies to COAP_SIGNALING_PING / COAP_SIGNALING_PONG */
180 #define COAP_SIGNALING_OPTION_CUSTODY 2
181 /* Applies to COAP_SIGNALING_RELEASE */
182 #define COAP_SIGNALING_OPTION_ALTERNATIVE_ADDRESS 2
183 #define COAP_SIGNALING_OPTION_HOLD_OFF 4
184 /* Applies to COAP_SIGNALING_ABORT */
185 #define COAP_SIGNALING_OPTION_BAD_CSM_OPTION 2
186 
187 /* CoAP media type encoding */
188 
189 #define COAP_MEDIATYPE_TEXT_PLAIN 0 /* text/plain (UTF-8) */
190 #define COAP_MEDIATYPE_APPLICATION_LINK_FORMAT 40 /* application/link-format */
191 #define COAP_MEDIATYPE_APPLICATION_XML 41 /* application/xml */
192 #define COAP_MEDIATYPE_APPLICATION_OCTET_STREAM 42 /* application/octet-stream */
193 #define COAP_MEDIATYPE_APPLICATION_RDF_XML 43 /* application/rdf+xml */
194 #define COAP_MEDIATYPE_APPLICATION_EXI 47 /* application/exi */
195 #define COAP_MEDIATYPE_APPLICATION_JSON 50 /* application/json */
196 #define COAP_MEDIATYPE_APPLICATION_CBOR 60 /* application/cbor */
197 #define COAP_MEDIATYPE_APPLICATION_CWT 61 /* application/cwt, RFC 8392 */
198 
199 /* Content formats from RFC 8152 */
200 #define COAP_MEDIATYPE_APPLICATION_COSE_SIGN 98 /* application/cose; cose-type="cose-sign" */
201 #define COAP_MEDIATYPE_APPLICATION_COSE_SIGN1 18 /* application/cose; cose-type="cose-sign1" */
202 #define COAP_MEDIATYPE_APPLICATION_COSE_ENCRYPT 96 /* application/cose; cose-type="cose-encrypt" */
203 #define COAP_MEDIATYPE_APPLICATION_COSE_ENCRYPT0 16 /* application/cose; cose-type="cose-encrypt0" */
204 #define COAP_MEDIATYPE_APPLICATION_COSE_MAC 97 /* application/cose; cose-type="cose-mac" */
205 #define COAP_MEDIATYPE_APPLICATION_COSE_MAC0 17 /* application/cose; cose-type="cose-mac0" */
206 
207 #define COAP_MEDIATYPE_APPLICATION_COSE_KEY 101 /* application/cose-key */
208 #define COAP_MEDIATYPE_APPLICATION_COSE_KEY_SET 102 /* application/cose-key-set */
209 
210 /* Content formats from RFC 8428 */
211 #define COAP_MEDIATYPE_APPLICATION_SENML_JSON 110 /* application/senml+json */
212 #define COAP_MEDIATYPE_APPLICATION_SENSML_JSON 111 /* application/sensml+json */
213 #define COAP_MEDIATYPE_APPLICATION_SENML_CBOR 112 /* application/senml+cbor */
214 #define COAP_MEDIATYPE_APPLICATION_SENSML_CBOR 113 /* application/sensml+cbor */
215 #define COAP_MEDIATYPE_APPLICATION_SENML_EXI 114 /* application/senml-exi */
216 #define COAP_MEDIATYPE_APPLICATION_SENSML_EXI 115 /* application/sensml-exi */
217 #define COAP_MEDIATYPE_APPLICATION_SENML_XML 310 /* application/senml+xml */
218 #define COAP_MEDIATYPE_APPLICATION_SENSML_XML 311 /* application/sensml+xml */
219 
220 /* Content formats from RFC 8782 */
221 #define COAP_MEDIATYPE_APPLICATION_DOTS_CBOR 271 /* application/dots+cbor */
222 
223 /* Note that identifiers for registered media types are in the range 0-65535. We
224  * use an unallocated type here and hope for the best. */
225 #define COAP_MEDIATYPE_ANY 0xff /* any media type */
226 
231 typedef int coap_mid_t;
232 
234 #define COAP_INVALID_MID -1
235 
240 #define COAP_INVALID_TID COAP_INVALID_MID
241 
249 COAP_DEPRECATED typedef struct {
250  uint16_t key; /* the option key (no delta coding) */
251  unsigned int length;
252 } coap_option;
253 
254 #define COAP_OPTION_KEY(option) (option).key
255 #define COAP_OPTION_LENGTH(option) (option).length
256 #define COAP_OPTION_DATA(option) ((unsigned char *)&(option) + sizeof(coap_option))
257 
258 #ifdef WITH_LWIP
274 coap_pdu_t * coap_pdu_from_pbuf(struct pbuf *pbuf);
275 #endif
276 
280 typedef enum coap_proto_t {
287 
291 typedef enum coap_pdu_code_t {
293 
301 
330 
337 
353  coap_mid_t mid, size_t size);
354 
366  coap_session_t *session);
367 
376 void coap_delete_pdu(coap_pdu_t *pdu);
377 
391 coap_pdu_t *
392 coap_pdu_duplicate(const coap_pdu_t *old_pdu,
393  coap_session_t *session,
394  size_t token_length,
395  const uint8_t *token,
396  coap_opt_filter_t *drop_options);
397 
411 int coap_add_token(coap_pdu_t *pdu,
412  size_t len,
413  const uint8_t *data);
414 
436 size_t coap_add_option(coap_pdu_t *pdu,
437  coap_option_num_t number,
438  size_t len,
439  const uint8_t *data);
440 
452 int coap_add_data(coap_pdu_t *pdu,
453  size_t len,
454  const uint8_t *data);
455 
468 uint8_t *coap_add_data_after(coap_pdu_t *pdu, size_t len);
469 
482 int coap_get_data(const coap_pdu_t *pdu,
483  size_t *len,
484  const uint8_t **data);
485 
503 int coap_get_data_large(const coap_pdu_t *pdu,
504  size_t *len,
505  const uint8_t **data,
506  size_t *offset,
507  size_t *total);
508 
517 
525 
534 
542 
551 
560 
568 void coap_pdu_set_mid(coap_pdu_t *pdu, coap_mid_t mid);
569 
572 #endif /* COAP_PDU_H_ */
coap_pdu_t * coap_pdu_duplicate(const coap_pdu_t *old_pdu, coap_session_t *session, size_t token_length, const uint8_t *token, coap_opt_filter_t *drop_options)
Duplicate an existing PDU.
Definition: pdu.c:155
coap_pdu_code_t coap_pdu_get_code(const coap_pdu_t *pdu)
Gets the PDU code associated with pdu.
Definition: pdu.c:1206
void coap_delete_pdu(coap_pdu_t *pdu)
Dispose of an CoAP PDU and frees associated storage.
Definition: pdu.c:142
void coap_pdu_set_code(coap_pdu_t *pdu, coap_pdu_code_t code)
Sets the PDU code in the pdu.
Definition: pdu.c:1211
int coap_mid_t
coap_mid_t is used to store the CoAP Message ID of a CoAP PDU.
Definition: pdu.h:231
coap_request_t
CoAP PDU Request methods.
Definition: pdu.h:66
#define COAP_RESPONSE_CODE(N)
Definition: pdu.h:140
#define COAP_SIGNALING_CODE(N)
Definition: pdu.h:166
coap_proto_t
CoAP protocol types.
Definition: pdu.h:280
coap_pdu_code_t
Set of codes available for a PDU.
Definition: pdu.h:291
coap_pdu_t * coap_new_pdu(coap_pdu_type_t type, coap_pdu_code_t code, coap_session_t *session)
Creates a new CoAP PDU.
Definition: pdu.c:132
coap_pdu_type_t
CoAP PDU message type definitions.
Definition: pdu.h:56
int coap_add_token(coap_pdu_t *pdu, size_t len, const uint8_t *data)
Adds token of length len to pdu.
Definition: pdu.c:258
void coap_pdu_set_type(coap_pdu_t *pdu, coap_pdu_type_t type)
Sets the PDU type in the pdu.
Definition: pdu.c:1220
size_t coap_add_option(coap_pdu_t *pdu, coap_option_num_t number, size_t len, const uint8_t *data)
Adds option of given number to pdu that is passed as first parameter.
Definition: pdu.c:543
coap_pdu_signaling_proto_t
Definition: pdu.h:168
uint8_t * coap_add_data_after(coap_pdu_t *pdu, size_t len)
Adds given data to the pdu that is passed as first parameter but does not copy it.
Definition: pdu.c:636
coap_pdu_type_t coap_pdu_get_type(const coap_pdu_t *pdu)
Gets the PDU type associated with pdu.
Definition: pdu.c:1216
int coap_get_data(const coap_pdu_t *pdu, size_t *len, const uint8_t **data)
Retrieves the length and data pointer of specified PDU.
Definition: pdu.c:654
void coap_pdu_set_mid(coap_pdu_t *pdu, coap_mid_t mid)
Sets the message id in the pdu.
Definition: pdu.c:1237
int coap_get_data_large(const coap_pdu_t *pdu, size_t *len, const uint8_t **data, size_t *offset, size_t *total)
Retrieves the data from a PDU, with support for large bodies of data that spans multiple PDUs.
Definition: pdu.c:662
const char * coap_response_phrase(unsigned char code)
Returns a human-readable response phrase for the specified CoAP response code.
Definition: pdu.c:729
coap_mid_t coap_pdu_get_mid(const coap_pdu_t *pdu)
Gets the message id associated with pdu.
Definition: pdu.c:1233
coap_pdu_t * coap_pdu_init(coap_pdu_type_t type, coap_pdu_code_t code, coap_mid_t mid, size_t size)
Creates a new CoAP PDU with at least enough storage space for the given size maximum message size.
Definition: pdu.c:87
int coap_add_data(coap_pdu_t *pdu, size_t len, const uint8_t *data)
Adds given data to the pdu that is passed as first parameter.
Definition: pdu.c:624
coap_bin_const_t coap_pdu_get_token(const coap_pdu_t *pdu)
Gets the token associated with pdu.
Definition: pdu.c:1225
@ COAP_REQUEST_PUT
Definition: pdu.h:69
@ COAP_REQUEST_DELETE
Definition: pdu.h:70
@ COAP_REQUEST_GET
Definition: pdu.h:67
@ COAP_REQUEST_FETCH
Definition: pdu.h:71
@ COAP_REQUEST_PATCH
Definition: pdu.h:72
@ COAP_REQUEST_IPATCH
Definition: pdu.h:73
@ COAP_REQUEST_POST
Definition: pdu.h:68
@ COAP_PROTO_DTLS
Definition: pdu.h:283
@ COAP_PROTO_UDP
Definition: pdu.h:282
@ COAP_PROTO_NONE
Definition: pdu.h:281
@ COAP_PROTO_TLS
Definition: pdu.h:285
@ COAP_PROTO_TCP
Definition: pdu.h:284
@ COAP_RESPONSE_CODE_OK
Definition: pdu.h:302
@ COAP_RESPONSE_CODE_INTERNAL_ERROR
Definition: pdu.h:323
@ COAP_RESPONSE_CODE_HOP_LIMIT_REACHED
Definition: pdu.h:329
@ COAP_SIGNALING_CODE_ABORT
Definition: pdu.h:335
@ COAP_RESPONSE_CODE_PRECONDITION_FAILED
Definition: pdu.h:318
@ COAP_RESPONSE_CODE_NOT_ALLOWED
Definition: pdu.h:314
@ COAP_RESPONSE_CODE_CHANGED
Definition: pdu.h:306
@ COAP_REQUEST_CODE_PUT
Definition: pdu.h:296
@ COAP_REQUEST_CODE_POST
Definition: pdu.h:295
@ COAP_RESPONSE_CODE_NOT_ACCEPTABLE
Definition: pdu.h:315
@ COAP_SIGNALING_CODE_CSM
Definition: pdu.h:331
@ COAP_REQUEST_CODE_PATCH
Definition: pdu.h:299
@ COAP_RESPONSE_CODE_PROXYING_NOT_SUPPORTED
Definition: pdu.h:328
@ COAP_RESPONSE_CODE_BAD_REQUEST
Definition: pdu.h:309
@ COAP_SIGNALING_CODE_PING
Definition: pdu.h:332
@ COAP_RESPONSE_CODE_INCOMPLETE
Definition: pdu.h:316
@ COAP_REQUEST_CODE_DELETE
Definition: pdu.h:297
@ COAP_SIGNALING_CODE_PONG
Definition: pdu.h:333
@ COAP_RESPONSE_CODE_NOT_IMPLEMENTED
Definition: pdu.h:324
@ COAP_RESPONSE_CODE_NOT_FOUND
Definition: pdu.h:313
@ COAP_RESPONSE_CODE_BAD_GATEWAY
Definition: pdu.h:325
@ COAP_RESPONSE_CODE_BAD_OPTION
Definition: pdu.h:311
@ COAP_RESPONSE_CODE_REQUEST_TOO_LARGE
Definition: pdu.h:319
@ COAP_RESPONSE_CODE_TOO_MANY_REQUESTS
Definition: pdu.h:322
@ COAP_RESPONSE_CODE_CONFLICT
Definition: pdu.h:317
@ COAP_RESPONSE_CODE_DELETED
Definition: pdu.h:304
@ COAP_RESPONSE_CODE_UNAUTHORIZED
Definition: pdu.h:310
@ COAP_RESPONSE_CODE_CREATED
Definition: pdu.h:303
@ COAP_EMPTY_CODE
Definition: pdu.h:292
@ COAP_RESPONSE_CODE_CONTENT
Definition: pdu.h:307
@ COAP_RESPONSE_CODE_UNPROCESSABLE
Definition: pdu.h:321
@ COAP_RESPONSE_CODE_CONTINUE
Definition: pdu.h:308
@ COAP_RESPONSE_CODE_VALID
Definition: pdu.h:305
@ COAP_RESPONSE_CODE_UNSUPPORTED_CONTENT_FORMAT
Definition: pdu.h:320
@ COAP_REQUEST_CODE_GET
Definition: pdu.h:294
@ COAP_SIGNALING_CODE_RELEASE
Definition: pdu.h:334
@ COAP_REQUEST_CODE_FETCH
Definition: pdu.h:298
@ COAP_RESPONSE_CODE_GATEWAY_TIMEOUT
Definition: pdu.h:327
@ COAP_REQUEST_CODE_IPATCH
Definition: pdu.h:300
@ COAP_RESPONSE_CODE_SERVICE_UNAVAILABLE
Definition: pdu.h:326
@ COAP_RESPONSE_CODE_FORBIDDEN
Definition: pdu.h:312
@ COAP_MESSAGE_NON
Definition: pdu.h:58
@ COAP_MESSAGE_ACK
Definition: pdu.h:59
@ COAP_MESSAGE_CON
Definition: pdu.h:57
@ COAP_MESSAGE_RST
Definition: pdu.h:60
@ COAP_SIGNALING_RELEASE
Definition: pdu.h:172
@ COAP_SIGNALING_CSM
Definition: pdu.h:169
@ COAP_SIGNALING_PONG
Definition: pdu.h:171
@ COAP_SIGNALING_PING
Definition: pdu.h:170
@ COAP_SIGNALING_ABORT
Definition: pdu.h:173
#define COAP_DEPRECATED
Definition: libcoap.h:48
Helpers for handling options in CoAP PDUs.
uint16_t coap_option_num_t
Definition: option.h:20
CoAP binary data definition with const data.
Definition: str.h:58
unsigned int length
Definition: pdu.h:251
uint16_t key
Definition: pdu.h:250
structure for CoAP PDUs token, if any, follows the fixed size header, then options until payload mark...
Abstraction of virtual session that can be attached to coap_context_t (client) or coap_endpoint_t (se...