libschc
picocoap.h
Go to the documentation of this file.
1 
12 #ifndef _COAP_H_
13 #define _COAP_H_
14 
15 #ifdef __cplusplus
16 extern "C" {
17 #endif
18 
19 
20 #include <stdint.h>
21 #include <stddef.h>
22 #include <stdint.h>
23 
24 
28 #define COAP_ACK_TIMEOUT 2
29 #define COAP_ACK_RANDOM_FACTOR 1.5
30 #define COAP_MAX_RETRANSMIT 4
31 #define COAP_NSTART 1
32 #define COAP_DEFAULT_LEISURE 5
33 #define COAP_PROBING_RATE 1
34 
35 #define COAP_MAX_TRANSMIT_SPAN 45
36 #define COAP_MAX_TRANSMIT_WAIT 93
37 #define COAP_MAX_LATENCY 100
38 #define COAP_PROCESSING_DELAY 2
39 #define COAP_MAX_RTT 202
40 #define COAP_EXCHANGE_LIFETIME 247
41 #define COAP_NON_LIFETIME 145
42 
43 // total number of CoAP options available
44 #define COAP_OPTIONS_LENGTH 16
45 
46 /*
47  * this struct and the corresponding names are added
48  * so we can check the fields in the SCHC header
49  */
51  uint16_t id;
52  char name[16];
53 };
54 
56  { 1, "if-match" },
57  { 3, "uri-host" },
58  { 4, "etag" },
59  { 5, "if-none-match" },
60  { 7, "uri-port" },
61  { 8, "location-path" },
62  { 11, "uri-path"} ,
63  { 12, "content-format" },
64  { 14, "max-age" },
65  { 15, "uri-query" },
66  { 17, "accept" },
67  { 20, "location-query" },
68  { 35, "proxy-uri" },
69  { 39, "proxy-scheme" },
70  { 60, "size1" },
71  { 258, "no-response"}
72 };
73 
80 typedef enum coap_error {
81  CE_NONE = 0,
91 } pcoap_error;
92 
98 typedef enum coap_version {
99  COAP_V1 = 1
100 } pcoap_version;
101 
107 typedef enum coap_type {
108  CT_CON = 0,
109  CT_NON = 1,
110  CT_ACK = 2,
111  CT_RST = 3
112 } pcoap_type;
113 
119 typedef enum pcoap_code {
120  /* CoAP method codes */
121  CC_EMPTY = 0,
122  CC_GET = 1,
123  CC_POST = 2,
124  CC_PUT = 3,
126  /* CoAP response codes */
129  CC_VALID = 67,
150 } pcoap_code;
151 
157 typedef enum pcoap_option_number {
160  CON_ETAG = 4,
173  CON_SIZE1 = 60,
176 
182 typedef struct pcoap_pdu {
183  uint8_t *buf;
184  size_t len;
185  size_t max;
186 } pcoap_pdu;
187 
193 typedef struct pcoap_option {
194  uint16_t num;
195  size_t len;
196  uint8_t *val;
197 } pcoap_option;
198 
204 typedef struct pcoap_payload {
205  size_t len;
206  uint8_t *val;
207 } pcoap_payload;
208 
209 // Finds the length of the CoAP header
210 // And consequently the length of the payload
211 uint8_t pcoap_get_coap_offset(pcoap_pdu *pdu);
212 
226 
227 //
228 // Getters
229 //
230 
239 static inline pcoap_version pcoap_get_version(pcoap_pdu *pdu) { return (pcoap_version) (pdu->buf[0] >> 6); }
240 
249 static inline pcoap_type pcoap_get_type(pcoap_pdu *pdu) { return (pcoap_type) ((pdu->buf[0] >> 4) & 0x03); }
250 
259 static inline uint8_t pcoap_get_tkl(pcoap_pdu *pdu) { return pdu->buf[0] & 0x0F; }
260 
269 static inline pcoap_code pcoap_get_code(pcoap_pdu *pdu) { return (pcoap_code) (pdu->buf[1]); }
270 
278 static inline uint8_t pcoap_get_code_class(pcoap_pdu *pdu) { return pcoap_get_code(pdu) >> 5; }
279 
287 static inline uint8_t pcoap_get_code_detail(pcoap_pdu *pdu) { return pcoap_get_code(pdu) & 0x1F; }
288 
296 static inline uint16_t pcoap_get_mid(pcoap_pdu *pdu) { return (pdu->buf[2] << 8) | pdu->buf[3]; }
297 
305 uint8_t pcoap_get_token(pcoap_pdu *pdu, uint8_t* ptr);
306 
317 
330 
339 
343 pcoap_error pcoap_decode_option(uint8_t *pkt_ptr, size_t pkt_len,
344  uint16_t *option_number, size_t *option_length, uint8_t **value);
345 
346 //
347 // Setters
348 //
349 
361 
372 
383 
394 
403 pcoap_error pcoap_set_mid(pcoap_pdu *pdu, uint16_t mid);
404 
413 pcoap_error pcoap_set_token(pcoap_pdu *pdu, uint8_t* token, uint8_t tkl);
414 
425 pcoap_error pcoap_add_option(pcoap_pdu *pdu, int32_t opt_num, uint8_t* value, uint16_t opt_len);
426 
435 pcoap_error pcoap_set_payload(pcoap_pdu *pdu, uint8_t *payload, size_t payload_len);
436 
445 static inline uint8_t pcoap_build_code(uint8_t _class, uint8_t detail) { return (_class << 5) | detail; }
446 
447 //
448 // Internal
449 //
450 
454 pcoap_error pcoap_adjust_option_deltas(uint8_t *opts, size_t *opts_len, size_t max_len, int32_t offset);
455 
459 int8_t pcoap_build_option_header(uint8_t *buf, size_t max_len, int32_t opt_delta, int32_t opt_len);
460 
464 int8_t pcoap_compute_option_header_len(int32_t opt_delta, int32_t opt_len);
465 
466 #ifdef __cplusplus
467 }
468 #endif
469 
470 #endif /*_COAP_H_*/
471 
pcoap_code
pcoap_code
Message Codes.
Definition: picocoap.h:119
CT_RST
Definition: picocoap.h:111
pcoap_error
enum coap_error pcoap_error
Status Codes.
pcoap_option_number
pcoap_option_number
Option Numbers.
Definition: picocoap.h:157
pcoap_get_code_detail
static uint8_t pcoap_get_code_detail(pcoap_pdu *pdu)
Get Message Code Detail.
Definition: picocoap.h:287
pcoap_payload::len
size_t len
Definition: picocoap.h:205
CE_TOO_MANY_OPTIONS
Definition: picocoap.h:86
CON_IF_NONE_MATCH
Definition: picocoap.h:161
coap_error
coap_error
Status Codes.
Definition: picocoap.h:80
CON_PROXY_URI
Definition: picocoap.h:171
pcoap_get_code
static pcoap_code pcoap_get_code(pcoap_pdu *pdu)
Get Message Code.
Definition: picocoap.h:269
pcoap_get_payload
pcoap_payload pcoap_get_payload(pcoap_pdu *pdu)
Get Option.
Definition: picocoap.c:270
CON_PROXY_SCHEME
Definition: picocoap.h:172
CE_END_OF_PACKET
Definition: picocoap.h:90
CC_PRECONDITION_FAILED
Definition: picocoap.h:141
pcoap_option_names::id
uint16_t id
Definition: picocoap.h:51
CC_DELETED
Definition: picocoap.h:128
CON_NO_RESPONSE
Definition: picocoap.h:174
pcoap_get_mid
static uint16_t pcoap_get_mid(pcoap_pdu *pdu)
Get Message ID.
Definition: picocoap.h:296
CON_ACCEPT
Definition: picocoap.h:169
CON_ETAG
Definition: picocoap.h:160
pcoap_get_token
uint8_t pcoap_get_token(pcoap_pdu *pdu, uint8_t *ptr)
Get Message Token.
Definition: picocoap.c:114
CON_URI_PORT
Definition: picocoap.h:163
pcoap_validate_pkt
pcoap_error pcoap_validate_pkt(pcoap_pdu *pdu)
Validate Packet.
Definition: picocoap.c:71
pcoap_set_payload
pcoap_error pcoap_set_payload(pcoap_pdu *pdu, uint8_t *payload, size_t payload_len)
Add Message Option.
Definition: picocoap.c:477
CC_GET
Definition: picocoap.h:122
CC_VALID
Definition: picocoap.h:129
pcoap_option
CoAP Option.
Definition: picocoap.h:193
CC_CREATED
Definition: picocoap.h:127
CC_GATEWAY_TIMEOUT
Definition: picocoap.h:148
pcoap_pdu::buf
uint8_t * buf
Definition: picocoap.h:183
pcoap_set_type
pcoap_error pcoap_set_type(pcoap_pdu *pdu, pcoap_type mtype)
Set Message Type.
Definition: picocoap.c:342
coap_options
static struct pcoap_option_names coap_options[COAP_OPTIONS_LENGTH]
Definition: picocoap.h:55
CE_FOUND_PAYLOAD_MARKER
Definition: picocoap.h:89
coap_version
coap_version
Protocol Versions.
Definition: picocoap.h:98
CON_IF_MATCH
Definition: picocoap.h:158
pcoap_set_version
pcoap_error pcoap_set_version(pcoap_pdu *pdu, pcoap_version ver)
Set Version.
Definition: picocoap.c:328
CON_URI_HOST
Definition: picocoap.h:159
CE_TOKEN_LENGTH_OUT_OF_RANGE
Definition: picocoap.h:84
pcoap_get_code_class
static uint8_t pcoap_get_code_class(pcoap_pdu *pdu)
Get Message Code Class.
Definition: picocoap.h:278
pcoap_pdu::len
size_t len
pointer to buffer
Definition: picocoap.h:184
pcoap_option::len
size_t len
size of buffer
Definition: picocoap.h:195
CC_CHANGED
Definition: picocoap.h:130
CC_BAD_OPTION
Definition: picocoap.h:135
CON_LOCATION_QUERY
Definition: picocoap.h:170
pcoap_set_token
pcoap_error pcoap_set_token(pcoap_pdu *pdu, uint8_t *token, uint8_t tkl)
Set Message Token.
Definition: picocoap.c:385
CT_CON
Definition: picocoap.h:108
CE_BAD_VERSION
Definition: picocoap.h:83
pcoap_get_type
static pcoap_type pcoap_get_type(pcoap_pdu *pdu)
Get Message Type.
Definition: picocoap.h:249
CT_ACK
Definition: picocoap.h:110
CE_NONE
Definition: picocoap.h:81
pcoap_get_coap_offset
uint8_t pcoap_get_coap_offset(pcoap_pdu *pdu)
Finds the length of the CoAP header.
Definition: picocoap.c:25
pcoap_decode_option
pcoap_error pcoap_decode_option(uint8_t *pkt_ptr, size_t pkt_len, uint16_t *option_number, size_t *option_length, uint8_t **value)
Internal Method.
Definition: picocoap.c:210
pcoap_option
struct pcoap_option pcoap_option
CoAP Option.
pcoap_set_mid
pcoap_error pcoap_set_mid(pcoap_pdu *pdu, uint16_t mid)
Set Message ID.
Definition: picocoap.c:370
CC_UNAUTHORIZED
Definition: picocoap.h:134
CON_URI_QUERY
Definition: picocoap.h:168
pcoap_option_names
Definition: picocoap.h:50
CON_URI_PATH
Definition: picocoap.h:165
CON_LOCATION_PATH
Definition: picocoap.h:164
CE_OUT_OF_ORDER_OPTIONS_LIST
Definition: picocoap.h:87
coap_type
coap_type
Message Types.
Definition: picocoap.h:107
CC_SERVICE_UNAVAILABLE
Definition: picocoap.h:147
CC_REQUEST_ENTITY_INCOMPLETE
Definition: picocoap.h:140
pcoap_build_option_header
int8_t pcoap_build_option_header(uint8_t *buf, size_t max_len, int32_t opt_delta, int32_t opt_len)
Internal Method.
Definition: picocoap.c:570
CE_INSUFFICIENT_BUFFER
Definition: picocoap.h:88
pcoap_get_tkl
static uint8_t pcoap_get_tkl(pcoap_pdu *pdu)
Get Token Length.
Definition: picocoap.h:259
pcoap_version
enum coap_version pcoap_version
Protocol Versions.
pcoap_payload::val
uint8_t * val
length of current message
Definition: picocoap.h:206
CC_PUT
Definition: picocoap.h:124
pcoap_init_pdu
pcoap_error pcoap_init_pdu(pcoap_pdu *pdu)
Initialize Packet.
Definition: picocoap.c:309
CC_NOT_ACCEPTABLE
Definition: picocoap.h:139
CC_NOT_FOUND
Definition: picocoap.h:137
COAP_V1
Definition: picocoap.h:99
CON_CONTENT_FORMAT
Definition: picocoap.h:166
COAP_OPTIONS_LENGTH
#define COAP_OPTIONS_LENGTH
Definition: picocoap.h:44
pcoap_get_option
pcoap_option pcoap_get_option(pcoap_pdu *pdu, pcoap_option *last)
Get Option.
Definition: picocoap.c:131
pcoap_pdu
struct pcoap_pdu pcoap_pdu
Packet Data Unit.
CC_PROXYING_NOT_SUPPORTED
Definition: picocoap.h:149
pcoap_option::num
uint16_t num
Definition: picocoap.h:194
CE_UNKNOWN_CODE
Definition: picocoap.h:85
CC_NOT_IMPLEMENTED
Definition: picocoap.h:145
pcoap_type
enum coap_type pcoap_type
Message Types.
CC_EMPTY
Definition: picocoap.h:121
pcoap_option::val
uint8_t * val
length of the value
Definition: picocoap.h:196
CC_METHOD_NOT_ALLOWED
Definition: picocoap.h:138
pcoap_compute_option_header_len
int8_t pcoap_compute_option_header_len(int32_t opt_delta, int32_t opt_len)
Internal Method.
Definition: picocoap.c:621
CON_SIZE1
Definition: picocoap.h:173
CON_MAX_AGE
Definition: picocoap.h:167
CC_REQUEST_ENTITY_TOO_LARGE
Definition: picocoap.h:142
pcoap_payload
CoAP Payload.
Definition: picocoap.h:204
pcoap_pdu
Packet Data Unit.
Definition: picocoap.h:182
pcoap_add_option
pcoap_error pcoap_add_option(pcoap_pdu *pdu, int32_t opt_num, uint8_t *value, uint16_t opt_len)
Add Message Option.
Definition: picocoap.c:415
CC_BAD_GATEWAY
Definition: picocoap.h:146
CC_BAD_REQUEST
Definition: picocoap.h:133
pcoap_pdu::max
size_t max
length of current message
Definition: picocoap.h:185
pcoap_get_version
static pcoap_version pcoap_get_version(pcoap_pdu *pdu)
Get Version.
Definition: picocoap.h:239
pcoap_option_names::name
char name[16]
Definition: picocoap.h:52
CC_POST
Definition: picocoap.h:123
CC_DELETE
Definition: picocoap.h:125
CE_INVALID_PACKET
Definition: picocoap.h:82
CC_CONTENT
Definition: picocoap.h:131
CC_INTERNAL_SERVER_ERROR
Definition: picocoap.h:144
CON_OBSERVE
Definition: picocoap.h:162
pcoap_set_code
pcoap_error pcoap_set_code(pcoap_pdu *pdu, pcoap_code code)
Set Message Code.
Definition: picocoap.c:356
pcoap_build_code
static uint8_t pcoap_build_code(uint8_t _class, uint8_t detail)
Build Message Code from Class and Detail.
Definition: picocoap.h:445
CC_CONTINUE
Definition: picocoap.h:132
CT_NON
Definition: picocoap.h:109
pcoap_get_option_by_num
pcoap_option pcoap_get_option_by_num(pcoap_pdu *pdu, pcoap_option_number num, uint8_t occ)
Get Option by Option Number.
Definition: picocoap.c:180
CC_UNSUPPORTED_CONTENT
Definition: picocoap.h:143
pcoap_payload
struct pcoap_payload pcoap_payload
CoAP Payload.
CC_FORBIDDEN
Definition: picocoap.h:136
pcoap_adjust_option_deltas
pcoap_error pcoap_adjust_option_deltas(uint8_t *opts, size_t *opts_len, size_t max_len, int32_t offset)
Internal Method.
Definition: picocoap.c:517