Zephyr Project API  3.2.0
A Scalable Open Source RTOS
coap.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2018 Intel Corporation
3 * Copyright (c) 2021 Nordic Semiconductor
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7
14#ifndef ZEPHYR_INCLUDE_NET_COAP_H_
15#define ZEPHYR_INCLUDE_NET_COAP_H_
16
24#include <zephyr/types.h>
25#include <stddef.h>
26#include <stdbool.h>
27#include <zephyr/net/net_ip.h>
28
29#include <zephyr/sys/slist.h>
30
31#ifdef __cplusplus
32extern "C" {
33#endif
34
64};
65
79};
80
81#define COAP_REQUEST_MASK 0x07
82
83#define COAP_VERSION_1 1U
84
117
118#define coap_make_response_code(class, det) ((class << 5) | (det))
119
156
157#define COAP_CODE_EMPTY (0)
158
159#define COAP_TOKEN_MAX_LEN 8UL
160
167 COAP_CONTENT_FORMAT_TEXT_PLAIN = 0, /* charset=urf-8 */
176};
177
178/* block option helper */
179#define GET_BLOCK_NUM(v) ((v) >> 4)
180#define GET_BLOCK_SIZE(v) (((v) & 0x7))
181#define GET_MORE(v) (!!((v) & 0x08))
182
183struct coap_observer;
184struct coap_packet;
185struct coap_pending;
186struct coap_reply;
187struct coap_resource;
188
194typedef int (*coap_method_t)(struct coap_resource *resource,
195 struct coap_packet *request,
196 struct sockaddr *addr, socklen_t addr_len);
197
203typedef void (*coap_notify_t)(struct coap_resource *resource,
204 struct coap_observer *observer);
205
216 const char * const *path;
219 int age;
220};
221
230};
231
236 uint8_t *data; /* User allocated buffer */
237 uint16_t offset; /* CoAP lib maintains offset while adding data */
238 uint16_t max_len; /* Max CoAP packet data length */
239 uint8_t hdr_len; /* CoAP header length */
240 uint16_t opt_len; /* Total options length (delta + len + value) */
241 uint16_t delta; /* Used for delta calculation in CoAP packet */
242#if defined(CONFIG_COAP_KEEP_USER_DATA)
243 void *user_data; /* Application specific user data */
244#endif
245};
246
249#if defined(CONFIG_COAP_EXTENDED_OPTIONS_LEN)
251 uint8_t value[CONFIG_COAP_EXTENDED_OPTIONS_LEN_VALUE];
252#else
255#endif
256};
257
263typedef int (*coap_reply_t)(const struct coap_packet *response,
264 struct coap_reply *reply,
265 const struct sockaddr *from);
266
278};
279
287 int age;
291};
292
301
310
321
330
339
350 uint16_t *len);
351
369 struct coap_option *options, uint8_t opt_num);
370
387 uint8_t ver, uint8_t type, uint8_t token_len,
388 const uint8_t *token, uint8_t code, uint16_t id);
389
405int coap_ack_init(struct coap_packet *cpkt, const struct coap_packet *req,
406 uint8_t *data, uint16_t max_len, uint8_t code);
407
415
422
436int coap_find_options(const struct coap_packet *cpkt, uint16_t code,
437 struct coap_option *options, uint16_t veclen);
438
455 const uint8_t *value, uint16_t len);
456
468unsigned int coap_option_value_to_int(const struct coap_option *option);
469
483 unsigned int val);
484
493
503int coap_packet_append_payload(struct coap_packet *cpkt, const uint8_t *payload,
504 uint16_t payload_len);
505
523 struct coap_resource *resources,
524 struct coap_option *options,
525 uint8_t opt_num,
526 struct sockaddr *addr, socklen_t addr_len);
527
544};
545
555 enum coap_block_size block_size)
556{
557 return (1 << (block_size + 4));
558}
559
565 size_t current;
567};
568
579 enum coap_block_size block_size,
580 size_t total_size);
581
592 struct coap_block_context *ctx);
593
604 struct coap_block_context *ctx);
605
616 struct coap_block_context *ctx);
617
628 struct coap_block_context *ctx);
629
639int coap_get_option_int(const struct coap_packet *cpkt, uint16_t code);
640
650int coap_update_from_block(const struct coap_packet *cpkt,
651 struct coap_block_context *ctx);
652
666 struct coap_block_context *ctx,
667 enum coap_option_num option);
668
680size_t coap_next_block(const struct coap_packet *cpkt,
681 struct coap_block_context *ctx);
682
691void coap_observer_init(struct coap_observer *observer,
692 const struct coap_packet *request,
693 const struct sockaddr *addr);
694
705 struct coap_observer *observer);
706
715 struct coap_observer *observer);
716
728 struct coap_observer *observers, size_t len,
729 const struct sockaddr *addr);
730
741 struct coap_observer *observers, size_t len);
742
749void coap_reply_init(struct coap_reply *reply,
750 const struct coap_packet *request);
751
767int coap_pending_init(struct coap_pending *pending,
768 const struct coap_packet *request,
769 const struct sockaddr *addr,
770 uint8_t retries);
771
783 struct coap_pending *pendings, size_t len);
784
796 struct coap_reply *replies, size_t len);
797
812 const struct coap_packet *response,
813 struct coap_pending *pendings, size_t len);
814
828 const struct coap_packet *response,
829 const struct sockaddr *from,
830 struct coap_reply *replies, size_t len);
831
843 struct coap_pending *pendings, size_t len);
844
853bool coap_pending_cycle(struct coap_pending *pending);
854
861void coap_pending_clear(struct coap_pending *pending);
862
870void coap_pendings_clear(struct coap_pending *pendings, size_t len);
871
878void coap_reply_clear(struct coap_reply *reply);
879
886void coap_replies_clear(struct coap_reply *replies, size_t len);
887
897
906bool coap_request_is_observe(const struct coap_packet *request);
907
908#ifdef __cplusplus
909}
910#endif
911
916#endif /* ZEPHYR_INCLUDE_NET_COAP_H_ */
void coap_pending_clear(struct coap_pending *pending)
Cancels the pending retransmission, so it again becomes available.
size_t coap_next_block(const struct coap_packet *cpkt, struct coap_block_context *ctx)
Updates ctx so after this is called the current entry indicates the correct offset in the body of dat...
coap_response_code
Set of response codes available for a response packet.
Definition: coap.h:125
int coap_get_option_int(const struct coap_packet *cpkt, uint16_t code)
Get the integer representation of a CoAP option.
int coap_packet_append_payload_marker(struct coap_packet *cpkt)
Append payload marker to CoAP packet.
struct coap_observer * coap_observer_next_unused(struct coap_observer *observers, size_t len)
Returns the next available observer representation.
int coap_packet_parse(struct coap_packet *cpkt, uint8_t *data, uint16_t len, struct coap_option *options, uint8_t opt_num)
Parses the CoAP packet in data, validating it and initializing cpkt. data must remain valid while cpk...
const uint8_t * coap_packet_get_payload(const struct coap_packet *cpkt, uint16_t *len)
Returns the data pointer and length of the CoAP packet.
int coap_packet_append_option(struct coap_packet *cpkt, uint16_t code, const uint8_t *value, uint16_t len)
Appends an option to the packet.
bool coap_pending_cycle(struct coap_pending *pending)
After a request is sent, user may want to cycle the pending retransmission so the timeout is updated.
unsigned int coap_option_value_to_int(const struct coap_option *option)
Converts an option to its integer representation.
int coap_append_block2_option(struct coap_packet *cpkt, struct coap_block_context *ctx)
Append BLOCK2 option to the packet.
void coap_reply_clear(struct coap_reply *reply)
Cancels awaiting for this reply, so it becomes available again. User responsibility to free the memor...
int coap_update_from_block(const struct coap_packet *cpkt, struct coap_block_context *ctx)
Retrieves BLOCK{1,2} and SIZE{1,2} from cpkt and updates ctx accordingly.
coap_msgtype
CoAP packets may be of one of these types.
Definition: coap.h:88
bool coap_register_observer(struct coap_resource *resource, struct coap_observer *observer)
After the observer is initialized, associate the observer with an resource.
void coap_observer_init(struct coap_observer *observer, const struct coap_packet *request, const struct sockaddr *addr)
Indicates that the remote device referenced by addr, with request, wants to observe a resource.
struct coap_reply * coap_response_received(const struct coap_packet *response, const struct sockaddr *from, struct coap_reply *replies, size_t len)
After a response is received, call coap_reply_t handler registered in coap_reply structure.
int coap_append_size1_option(struct coap_packet *cpkt, struct coap_block_context *ctx)
Append SIZE1 option to the packet.
struct coap_observer * coap_find_observer_by_addr(struct coap_observer *observers, size_t len, const struct sockaddr *addr)
Returns the observer that matches address addr.
bool coap_request_is_observe(const struct coap_packet *request)
Returns if this request is enabling observing a resource.
int(* coap_reply_t)(const struct coap_packet *response, struct coap_reply *reply, const struct sockaddr *from)
Helper function to be called when a response matches the a pending request.
Definition: coap.h:263
int coap_next_block_for_option(const struct coap_packet *cpkt, struct coap_block_context *ctx, enum coap_option_num option)
Updates ctx according to option set in cpkt so after this is called the current entry indicates the c...
int coap_append_block1_option(struct coap_packet *cpkt, struct coap_block_context *ctx)
Append BLOCK1 option to the packet.
int coap_block_transfer_init(struct coap_block_context *ctx, enum coap_block_size block_size, size_t total_size)
Initializes the context of a block-wise transfer.
uint16_t coap_header_get_id(const struct coap_packet *cpkt)
Returns the message id associated with the CoAP packet.
#define coap_make_response_code(class, det)
Definition: coap.h:118
struct coap_reply * coap_reply_next_unused(struct coap_reply *replies, size_t len)
Returns the next available reply struct, so it can be used to track replies and notifications receive...
uint8_t * coap_next_token(void)
Returns a randomly generated array of 8 bytes, that can be used as a message's token.
void coap_remove_observer(struct coap_resource *resource, struct coap_observer *observer)
Remove this observer from the list of registered observers of that resource.
uint8_t coap_header_get_token(const struct coap_packet *cpkt, uint8_t *token)
Returns the token (if any) in the CoAP packet.
coap_method
Available request methods.
Definition: coap.h:71
int coap_append_option_int(struct coap_packet *cpkt, uint16_t code, unsigned int val)
Appends an integer value option to the packet.
void coap_pendings_clear(struct coap_pending *pendings, size_t len)
Cancels all pending retransmissions, so they become available again.
coap_block_size
Definition: coap.h:536
int(* coap_method_t)(struct coap_resource *resource, struct coap_packet *request, struct sockaddr *addr, socklen_t addr_len)
Type of the callback being called when a resource's method is invoked by the remote entity.
Definition: coap.h:194
coap_option_num
Set of CoAP packet options we are aware of.
Definition: coap.h:44
struct coap_pending * coap_pending_next_unused(struct coap_pending *pendings, size_t len)
Returns the next available pending struct, that can be used to track the retransmission status of a r...
int coap_handle_request(struct coap_packet *cpkt, struct coap_resource *resources, struct coap_option *options, uint8_t opt_num, struct sockaddr *addr, socklen_t addr_len)
When a request is received, call the appropriate methods of the matching resources.
int coap_packet_init(struct coap_packet *cpkt, uint8_t *data, uint16_t max_len, uint8_t ver, uint8_t type, uint8_t token_len, const uint8_t *token, uint8_t code, uint16_t id)
Creates a new CoAP Packet from input data.
coap_content_format
Set of Content-Format option values for CoAP.
Definition: coap.h:166
struct coap_pending * coap_pending_received(const struct coap_packet *response, struct coap_pending *pendings, size_t len)
After a response is received, returns if there is any matching pending request exits....
struct coap_pending * coap_pending_next_to_expire(struct coap_pending *pendings, size_t len)
Returns the next pending about to expire, pending->timeout informs how many ms to next expiration.
int coap_pending_init(struct coap_pending *pending, const struct coap_packet *request, const struct sockaddr *addr, uint8_t retries)
Initialize a pending request with a request.
void(* coap_notify_t)(struct coap_resource *resource, struct coap_observer *observer)
Type of the callback being called when a resource's has observers to be informed when an update happe...
Definition: coap.h:203
void coap_reply_init(struct coap_reply *reply, const struct coap_packet *request)
Indicates that a reply is expected for request.
int coap_resource_notify(struct coap_resource *resource)
Indicates that this resource was updated and that the notify callback should be called for every regi...
int coap_packet_append_payload(struct coap_packet *cpkt, const uint8_t *payload, uint16_t payload_len)
Append payload to CoAP packet.
void coap_replies_clear(struct coap_reply *replies, size_t len)
Cancels all replies, so they become available again.
uint16_t coap_next_id(void)
Helper to generate message ids.
uint8_t coap_header_get_code(const struct coap_packet *cpkt)
Returns the code of the CoAP packet.
int coap_ack_init(struct coap_packet *cpkt, const struct coap_packet *req, uint8_t *data, uint16_t max_len, uint8_t code)
Create a new CoAP Acknowledgment message for given request.
uint8_t coap_header_get_type(const struct coap_packet *cpkt)
Returns the type of the CoAP packet.
int coap_find_options(const struct coap_packet *cpkt, uint16_t code, struct coap_option *options, uint16_t veclen)
Return the values associated with the option of value code.
int coap_append_size2_option(struct coap_packet *cpkt, struct coap_block_context *ctx)
Append SIZE2 option to the packet.
uint8_t coap_header_get_version(const struct coap_packet *cpkt)
Returns the version present in a CoAP packet.
static uint16_t coap_block_size_to_bytes(enum coap_block_size block_size)
Helper for converting the enumeration to the size expressed in bytes.
Definition: coap.h:554
@ COAP_RESPONSE_CODE_OK
Definition: coap.h:126
@ COAP_RESPONSE_CODE_INTERNAL_ERROR
Definition: coap.h:148
@ COAP_RESPONSE_CODE_PRECONDITION_FAILED
Definition: coap.h:142
@ COAP_RESPONSE_CODE_NOT_ALLOWED
Definition: coap.h:138
@ COAP_RESPONSE_CODE_CHANGED
Definition: coap.h:130
@ COAP_RESPONSE_CODE_NOT_ACCEPTABLE
Definition: coap.h:139
@ COAP_RESPONSE_CODE_UNPROCESSABLE_ENTITY
Definition: coap.h:146
@ COAP_RESPONSE_CODE_PROXYING_NOT_SUPPORTED
Definition: coap.h:153
@ COAP_RESPONSE_CODE_BAD_REQUEST
Definition: coap.h:133
@ COAP_RESPONSE_CODE_INCOMPLETE
Definition: coap.h:140
@ COAP_RESPONSE_CODE_NOT_IMPLEMENTED
Definition: coap.h:149
@ COAP_RESPONSE_CODE_NOT_FOUND
Definition: coap.h:137
@ COAP_RESPONSE_CODE_BAD_GATEWAY
Definition: coap.h:150
@ COAP_RESPONSE_CODE_BAD_OPTION
Definition: coap.h:135
@ COAP_RESPONSE_CODE_REQUEST_TOO_LARGE
Definition: coap.h:143
@ COAP_RESPONSE_CODE_TOO_MANY_REQUESTS
Definition: coap.h:147
@ COAP_RESPONSE_CODE_CONFLICT
Definition: coap.h:141
@ COAP_RESPONSE_CODE_DELETED
Definition: coap.h:128
@ COAP_RESPONSE_CODE_UNAUTHORIZED
Definition: coap.h:134
@ COAP_RESPONSE_CODE_CREATED
Definition: coap.h:127
@ COAP_RESPONSE_CODE_CONTENT
Definition: coap.h:131
@ COAP_RESPONSE_CODE_CONTINUE
Definition: coap.h:132
@ COAP_RESPONSE_CODE_VALID
Definition: coap.h:129
@ COAP_RESPONSE_CODE_UNSUPPORTED_CONTENT_FORMAT
Definition: coap.h:144
@ COAP_RESPONSE_CODE_GATEWAY_TIMEOUT
Definition: coap.h:152
@ COAP_RESPONSE_CODE_SERVICE_UNAVAILABLE
Definition: coap.h:151
@ COAP_RESPONSE_CODE_FORBIDDEN
Definition: coap.h:136
@ COAP_TYPE_RESET
Definition: coap.h:115
@ COAP_TYPE_NON_CON
Definition: coap.h:102
@ COAP_TYPE_CON
Definition: coap.h:95
@ COAP_TYPE_ACK
Definition: coap.h:108
@ COAP_METHOD_GET
Definition: coap.h:72
@ COAP_METHOD_IPATCH
Definition: coap.h:78
@ COAP_METHOD_PUT
Definition: coap.h:74
@ COAP_METHOD_POST
Definition: coap.h:73
@ COAP_METHOD_PATCH
Definition: coap.h:77
@ COAP_METHOD_DELETE
Definition: coap.h:75
@ COAP_METHOD_FETCH
Definition: coap.h:76
@ COAP_BLOCK_128
Definition: coap.h:540
@ COAP_BLOCK_32
Definition: coap.h:538
@ COAP_BLOCK_1024
Definition: coap.h:543
@ COAP_BLOCK_64
Definition: coap.h:539
@ COAP_BLOCK_16
Definition: coap.h:537
@ COAP_BLOCK_256
Definition: coap.h:541
@ COAP_BLOCK_512
Definition: coap.h:542
@ COAP_OPTION_OBSERVE
Definition: coap.h:49
@ COAP_OPTION_IF_NONE_MATCH
Definition: coap.h:48
@ COAP_OPTION_ETAG
Definition: coap.h:47
@ COAP_OPTION_SIZE2
Definition: coap.h:60
@ COAP_OPTION_PROXY_SCHEME
Definition: coap.h:62
@ COAP_OPTION_URI_PORT
Definition: coap.h:50
@ COAP_OPTION_URI_HOST
Definition: coap.h:46
@ COAP_OPTION_BLOCK2
Definition: coap.h:58
@ COAP_OPTION_IF_MATCH
Definition: coap.h:45
@ COAP_OPTION_SIZE1
Definition: coap.h:63
@ COAP_OPTION_BLOCK1
Definition: coap.h:59
@ COAP_OPTION_URI_PATH
Definition: coap.h:52
@ COAP_OPTION_MAX_AGE
Definition: coap.h:54
@ COAP_OPTION_CONTENT_FORMAT
Definition: coap.h:53
@ COAP_OPTION_LOCATION_QUERY
Definition: coap.h:57
@ COAP_OPTION_URI_QUERY
Definition: coap.h:55
@ COAP_OPTION_PROXY_URI
Definition: coap.h:61
@ COAP_OPTION_LOCATION_PATH
Definition: coap.h:51
@ COAP_OPTION_ACCEPT
Definition: coap.h:56
@ COAP_CONTENT_FORMAT_APP_JSON_PATCH_JSON
Definition: coap.h:173
@ COAP_CONTENT_FORMAT_APP_LINK_FORMAT
Definition: coap.h:168
@ COAP_CONTENT_FORMAT_APP_MERGE_PATCH_JSON
Definition: coap.h:174
@ COAP_CONTENT_FORMAT_APP_EXI
Definition: coap.h:171
@ COAP_CONTENT_FORMAT_APP_CBOR
Definition: coap.h:175
@ COAP_CONTENT_FORMAT_APP_OCTET_STREAM
Definition: coap.h:170
@ COAP_CONTENT_FORMAT_APP_JSON
Definition: coap.h:172
@ COAP_CONTENT_FORMAT_APP_XML
Definition: coap.h:169
@ COAP_CONTENT_FORMAT_TEXT_PLAIN
Definition: coap.h:167
size_t socklen_t
Definition: net_ip.h:167
IPv6 and IPv4 definitions.
Single-linked list implementation.
struct _slist sys_slist_t
Definition: slist.h:40
struct _snode sys_snode_t
Definition: slist.h:33
__UINT32_TYPE__ uint32_t
Definition: stdint.h:90
__UINT8_TYPE__ uint8_t
Definition: stdint.h:88
__UINT16_TYPE__ uint16_t
Definition: stdint.h:89
Represents the current state of a block-wise transaction.
Definition: coap.h:563
size_t total_size
Definition: coap.h:564
enum coap_block_size block_size
Definition: coap.h:566
size_t current
Definition: coap.h:565
Represents a remote device that is observing a local resource.
Definition: coap.h:225
sys_snode_t list
Definition: coap.h:226
uint8_t token[8]
Definition: coap.h:228
uint8_t tkl
Definition: coap.h:229
struct sockaddr addr
Definition: coap.h:227
Definition: coap.h:247
uint8_t len
Definition: coap.h:253
uint16_t delta
Definition: coap.h:248
uint8_t value[12]
Definition: coap.h:254
Representation of a CoAP Packet.
Definition: coap.h:235
uint16_t offset
Definition: coap.h:237
uint16_t max_len
Definition: coap.h:238
uint8_t * data
Definition: coap.h:236
uint16_t delta
Definition: coap.h:241
uint8_t hdr_len
Definition: coap.h:239
uint16_t opt_len
Definition: coap.h:240
Represents a request awaiting for an acknowledgment (ACK).
Definition: coap.h:270
uint8_t * data
Definition: coap.h:275
uint16_t len
Definition: coap.h:276
uint32_t t0
Definition: coap.h:272
uint8_t retries
Definition: coap.h:277
uint16_t id
Definition: coap.h:274
uint32_t timeout
Definition: coap.h:273
struct sockaddr addr
Definition: coap.h:271
Represents the handler for the reply of a request, it is also used when observing resources.
Definition: coap.h:284
uint8_t tkl
Definition: coap.h:290
uint8_t token[8]
Definition: coap.h:289
coap_reply_t reply
Definition: coap.h:285
uint16_t id
Definition: coap.h:288
void * user_data
Definition: coap.h:286
int age
Definition: coap.h:287
Description of CoAP resource.
Definition: coap.h:212
coap_method_t post
Definition: coap.h:214
void * user_data
Definition: coap.h:217
coap_method_t put
Definition: coap.h:214
coap_notify_t notify
Definition: coap.h:215
sys_slist_t observers
Definition: coap.h:218
coap_method_t fetch
Definition: coap.h:214
coap_method_t ipatch
Definition: coap.h:214
coap_method_t del
Definition: coap.h:214
coap_method_t patch
Definition: coap.h:214
const char *const * path
Definition: coap.h:216
int age
Definition: coap.h:219
coap_method_t get
Definition: coap.h:214
Definition: net_ip.h:344
static fdata_t data[2]
Definition: test_fifo_contexts.c:15
static const intptr_t user_data[5]
Definition: main.c:588