Loading...
Searching...
No Matches
gcoap.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2015-2017 Ken Bannister. All rights reserved.
3 * SPDX-FileCopyrightText: 2017 Freie Universität Berlin
4 * SPDX-License-Identifier: LGPL-2.1-only
5 */
6
7#pragma once
8
395
396#include <stdint.h>
397
398#include "event/callback.h"
399#include "event/timeout.h"
400#include "net/sock/udp.h"
401#include "net/nanocoap.h"
402
403#if IS_USED(MODULE_GCOAP_DTLS)
404# include "net/sock/dtls.h"
405#endif
406#if IS_USED(MODULE_NANOCOAP_CACHE)
407# include "net/nanocoap/cache.h"
408#endif
409
410#ifdef __cplusplus
411extern "C" {
412#endif
413
423#ifndef CONFIG_GCOAP_PORT
424#define CONFIG_GCOAP_PORT (5683)
425#endif
429#ifndef CONFIG_GCOAPS_PORT
430#define CONFIG_GCOAPS_PORT (5684)
431#endif
432
436#ifndef CONFIG_GCOAP_DTLS_HANDSHAKE_TIMEOUT_MSEC
437#define CONFIG_GCOAP_DTLS_HANDSHAKE_TIMEOUT_MSEC (3 * MS_PER_SEC)
438#endif
439
445#ifndef CONFIG_GCOAP_DTLS_MINIMUM_AVAILABLE_SESSIONS
446#define CONFIG_GCOAP_DTLS_MINIMUM_AVAILABLE_SESSIONS (1)
447#endif
448
453#ifndef CONFIG_GCOAP_DTLS_MINIMUM_AVAILABLE_SESSIONS_TIMEOUT_MSEC
454#define CONFIG_GCOAP_DTLS_MINIMUM_AVAILABLE_SESSIONS_TIMEOUT_MSEC (15 * MS_PER_SEC)
455#endif
456
460#ifndef CONFIG_GCOAP_PDU_BUF_SIZE
461#define CONFIG_GCOAP_PDU_BUF_SIZE (128)
462#endif
463
467#ifndef CONFIG_GCOAP_REQ_WAITING_MAX
468#define CONFIG_GCOAP_REQ_WAITING_MAX (2)
469#endif
471
475#define GCOAP_TOKENLEN_MAX (8)
476
480#define GCOAP_HEADER_MAXLEN (sizeof(coap_udp_hdr_t) + GCOAP_TOKENLEN_MAX)
481
488#ifndef CONFIG_GCOAP_TOKENLEN
489#define CONFIG_GCOAP_TOKENLEN (2)
490#endif
491
495#define GCOAP_PAYLOAD_MARKER (0xFF)
496
503#ifndef CONFIG_GCOAP_NO_AUTO_INIT
504#define CONFIG_GCOAP_NO_AUTO_INIT 0
505#endif
506
511#define GCOAP_MEMO_UNUSED (0)
512#define GCOAP_MEMO_RETRANSMIT (1)
513#define GCOAP_MEMO_WAIT (2)
514#define GCOAP_MEMO_RESP (3)
515#define GCOAP_MEMO_TIMEOUT (4)
516#define GCOAP_MEMO_ERR (5)
517#define GCOAP_MEMO_RESP_TRUNC (6)
520
524#define GCOAP_SEND_LIMIT_NON (-1)
525
526#ifdef DOXYGEN
536#define CONFIG_GCOAP_NO_RETRANS_BACKOFF
537#endif
538
545#ifndef CONFIG_GCOAP_NON_TIMEOUT_MSEC
546#define CONFIG_GCOAP_NON_TIMEOUT_MSEC (5000U)
547#endif
548
557#ifndef CONFIG_GCOAP_OBS_CLIENTS_MAX
558#define CONFIG_GCOAP_OBS_CLIENTS_MAX (2)
559#endif
560
570#ifndef CONFIG_GCOAP_OBS_NOTIFIERS_MAX
571#define CONFIG_GCOAP_OBS_NOTIFIERS_MAX (2)
572#endif
573
582#ifndef CONFIG_GCOAP_OBS_REGISTRATIONS_MAX
583#define CONFIG_GCOAP_OBS_REGISTRATIONS_MAX (2)
584#endif
585
590#define GCOAP_OBS_MEMO_UNUSED (0)
591#define GCOAP_OBS_MEMO_IDLE (1)
592#define GCOAP_OBS_MEMO_PENDING (2)
594
615#ifndef CONFIG_GCOAP_OBS_VALUE_WIDTH
616#define CONFIG_GCOAP_OBS_VALUE_WIDTH (3)
617#endif
618
622#if (CONFIG_GCOAP_OBS_VALUE_WIDTH == 3)
623#define GCOAP_OBS_TICK_EXPONENT (0)
624#elif (CONFIG_GCOAP_OBS_VALUE_WIDTH == 2)
625#define GCOAP_OBS_TICK_EXPONENT (6)
626#elif (CONFIG_GCOAP_OBS_VALUE_WIDTH == 1)
627#define GCOAP_OBS_TICK_EXPONENT (14)
628#endif
629
634#define GCOAP_OBS_INIT_OK (0)
635#define GCOAP_OBS_INIT_ERR (-1)
636#define GCOAP_OBS_INIT_UNUSED (-2)
638
643#ifndef GCOAP_DTLS_EXTRA_STACKSIZE
644#if IS_USED(MODULE_GCOAP_DTLS)
645#define GCOAP_DTLS_EXTRA_STACKSIZE (THREAD_STACKSIZE_DEFAULT)
646#else
647#define GCOAP_DTLS_EXTRA_STACKSIZE (0)
648#endif
649#endif
650
654#if IS_USED(MODULE_GCOAP_FILESERVER)
655#include "vfs.h"
656#define GCOAP_VFS_EXTRA_STACKSIZE (VFS_DIR_BUFFER_SIZE + VFS_FILE_BUFFER_SIZE)
657#else
658#define GCOAP_VFS_EXTRA_STACKSIZE (0)
659#endif
660
661#ifndef GCOAP_STACK_SIZE
662#define GCOAP_STACK_SIZE (THREAD_STACKSIZE_DEFAULT + DEBUG_EXTRA_STACKSIZE \
663 + sizeof(coap_pkt_t) + GCOAP_DTLS_EXTRA_STACKSIZE \
664 + GCOAP_VFS_EXTRA_STACKSIZE)
665#endif
667
672#ifndef CONFIG_GCOAP_RESEND_BUFS_MAX
673#define CONFIG_GCOAP_RESEND_BUFS_MAX (1)
674#endif
675
681#define COAP_LINK_FLAG_INIT_RESLIST (1)
683
685
689typedef struct {
690 unsigned content_format;
691 size_t link_pos;
692 uint16_t flags;
695
707typedef ssize_t (*gcoap_link_encoder_t)(const coap_resource_t *resource, char *buf,
708 size_t maxlen, coap_link_encoder_ctx_t *context);
709
714#define GCOAP_RESOURCE_FOUND (0)
715#define GCOAP_RESOURCE_WRONG_METHOD (1)
716#define GCOAP_RESOURCE_NO_PATH (2)
717#define GCOAP_RESOURCE_ERROR (3)
719
724
738 const coap_resource_t **resource,
739 coap_pkt_t *pdu);
740
752
756typedef struct {
758 union {
759 sock_udp_t *udp;
760#if IS_USED(MODULE_GCOAP_DTLS) || defined(DOXYGEN)
761 sock_dtls_t *dtls;
762#endif
764#if IS_USED(MODULE_GCOAP_DTLS) || defined(DOXYGEN)
768#endif
770
802
807
814typedef void (*gcoap_resp_handler_t)(const gcoap_request_memo_t *memo,
815 coap_pkt_t* pdu,
816 const sock_udp_ep_t *remote);
817
821typedef struct {
822 uint8_t *pdu_buf;
823 size_t pdu_len;
825
854
867
878
895
909 const coap_resource_t *last_resource,
910 const char *uri_path);
911
938int gcoap_req_init_path_buffer(coap_pkt_t *pdu, uint8_t *buf, size_t len,
939 unsigned code, const char *path,
940 size_t path_len);
941
966static inline int gcoap_req_init(coap_pkt_t *pdu, uint8_t *buf, size_t len,
967 unsigned code, const char *path)
968{
969 return gcoap_req_init_path_buffer(pdu, buf, len, code, path,
970 (path) ? strlen(path) : 0U);
971}
972
985static inline ssize_t gcoap_request(coap_pkt_t *pdu, uint8_t *buf, size_t len,
986 unsigned code, char *path)
987{
988 if (gcoap_req_init(pdu, buf, len, code, path) == 0) {
989 if (IS_USED(MODULE_NANOCOAP_CACHE)) {
990 /* remove ETag option slack added for cache validation */
991 coap_opt_remove(pdu, COAP_OPT_ETAG);
992 }
994 }
995 return -1;
996}
997
1020ssize_t gcoap_req_send(const uint8_t *buf, size_t len,
1021 const sock_udp_ep_t *remote, const sock_udp_ep_t *local,
1022 gcoap_resp_handler_t resp_handler, void *context,
1023 gcoap_socket_type_t tl_type);
1024
1038int gcoap_resp_init(coap_pkt_t *pdu, uint8_t *buf, size_t len, unsigned code);
1039
1051static inline ssize_t gcoap_response(coap_pkt_t *pdu, uint8_t *buf,
1052 size_t len, unsigned code)
1053{
1054 return (gcoap_resp_init(pdu, buf, len, code) == 0)
1056 : -1;
1057}
1058
1077int gcoap_obs_init(coap_pkt_t *pdu, uint8_t *buf, size_t len,
1078 const coap_resource_t *resource);
1079
1093size_t gcoap_obs_send(const uint8_t *buf, size_t len,
1094 const coap_resource_t *resource);
1095
1124int gcoap_obs_req_forget(const sock_udp_ep_t *remote, const uint8_t *token,
1125 size_t tokenlen);
1126
1134uint8_t gcoap_op_state(void);
1135
1158int gcoap_get_resource_list(void *buf, size_t maxlen, uint8_t cf,
1159 gcoap_socket_type_t tl_type);
1160
1174ssize_t gcoap_encode_link(const coap_resource_t *resource, char *buf,
1175 size_t maxlen, coap_link_encoder_ctx_t *context);
1176
1177#if IS_USED(MODULE_GCOAP_DTLS) || defined(DOXYGEN)
1186#endif
1187
1196{
1197 if (memo->send_limit == GCOAP_SEND_LIMIT_NON) {
1198 return &memo->msg.hdr_buf[0];
1199 }
1200 else {
1201 return memo->msg.data.pdu_buf;
1202 }
1203}
1204
1215{
1216 gcoap_request_memo_t *evil_cast_is_evil = (gcoap_request_memo_t *)memo;
1217 return (coap_udp_hdr_t *)gcoap_request_memo_get_buf(evil_cast_is_evil);
1218}
1219
1220#ifdef __cplusplus
1221}
1222#endif
1223
Provides a callback-with-argument event type.
int16_t kernel_pid_t
Unique process identifier.
Definition sched.h:134
int gcoap_req_init_path_buffer(coap_pkt_t *pdu, uint8_t *buf, size_t len, unsigned code, const char *path, size_t path_len)
Initializes a CoAP request PDU on a buffer.
int gcoap_get_resource_list(void *buf, size_t maxlen, uint8_t cf, gcoap_socket_type_t tl_type)
Get the resource list, currently only CoRE Link Format (COAP_FORMAT_LINK) supported.
int gcoap_resp_init(coap_pkt_t *pdu, uint8_t *buf, size_t len, unsigned code)
Initializes a CoAP response packet on a buffer.
ssize_t(* gcoap_link_encoder_t)(const coap_resource_t *resource, char *buf, size_t maxlen, coap_link_encoder_ctx_t *context)
Handler function to write a resource link.
Definition gcoap.h:707
void gcoap_register_listener(gcoap_listener_t *listener)
Starts listening for resource paths.
static int gcoap_req_init(coap_pkt_t *pdu, uint8_t *buf, size_t len, unsigned code, const char *path)
Initializes a CoAP request PDU on a buffer.
Definition gcoap.h:966
#define GCOAP_TOKENLEN_MAX
Maximum length in bytes for a token.
Definition gcoap.h:475
gcoap_socket_type_t
CoAP socket types.
Definition gcoap.h:747
int gcoap_obs_init(coap_pkt_t *pdu, uint8_t *buf, size_t len, const coap_resource_t *resource)
Initializes a CoAP Observe notification packet on a buffer, for the observer registered for a resourc...
ssize_t gcoap_req_send(const uint8_t *buf, size_t len, const sock_udp_ep_t *remote, const sock_udp_ep_t *local, gcoap_resp_handler_t resp_handler, void *context, gcoap_socket_type_t tl_type)
Sends a buffer containing a CoAP request to the provided endpoint.
const coap_resource_t * gcoap_get_resource_by_path_iterator(const gcoap_listener_t **last_listener, const coap_resource_t *last_resource, const char *uri_path)
Iterate through all registered listeners and check for a resource, matching by uri_path.
#define GCOAP_HEADER_MAXLEN
Maximum length in bytes for a header, including the token.
Definition gcoap.h:480
sock_dtls_t * gcoap_get_sock_dtls(void)
Get the underlying DTLS socket of gcoap.
void(* gcoap_resp_handler_t)(const gcoap_request_memo_t *memo, coap_pkt_t *pdu, const sock_udp_ep_t *remote)
Handler function for a server response, including the state for the originating request.
Definition gcoap.h:814
#define GCOAP_SEND_LIMIT_NON
Value for send_limit in request memo when non-confirmable type.
Definition gcoap.h:524
static uint8_t * gcoap_request_memo_get_buf(gcoap_request_memo_t *memo)
Get the buffer from a gcoap_request_memo_t.
Definition gcoap.h:1195
ssize_t gcoap_encode_link(const coap_resource_t *resource, char *buf, size_t maxlen, coap_link_encoder_ctx_t *context)
Writes a resource in CoRE Link Format to a provided buffer.
struct gcoap_request_memo gcoap_request_memo_t
Forward declaration of the request memo type.
Definition gcoap.h:806
struct gcoap_listener gcoap_listener_t
Forward declaration of the gcoap listener state container.
Definition gcoap.h:723
size_t gcoap_obs_send(const uint8_t *buf, size_t len, const coap_resource_t *resource)
Sends a buffer containing a CoAP Observe notification to the observer registered for a resource.
int gcoap_obs_req_forget(const sock_udp_ep_t *remote, const uint8_t *token, size_t tokenlen)
Forgets (invalidates) an existing observe request.
static ssize_t gcoap_response(coap_pkt_t *pdu, uint8_t *buf, size_t len, unsigned code)
Writes a complete CoAP response PDU when there is no payload.
Definition gcoap.h:1051
static coap_udp_hdr_t * gcoap_request_memo_get_hdr(const gcoap_request_memo_t *memo)
Get the header of a request from a gcoap_request_memo_t.
Definition gcoap.h:1214
int(* gcoap_request_matcher_t)(gcoap_listener_t *listener, const coap_resource_t **resource, coap_pkt_t *pdu)
Handler function for the request matcher strategy.
Definition gcoap.h:737
kernel_pid_t gcoap_init(void)
Initializes the gcoap thread and device.
uint8_t gcoap_op_state(void)
Provides important operational statistics.
static ssize_t gcoap_request(coap_pkt_t *pdu, uint8_t *buf, size_t len, unsigned code, char *path)
Writes a complete CoAP request PDU when there is not a payload.
Definition gcoap.h:985
@ GCOAP_SOCKET_TYPE_UDP
Unencrypted UDP transport.
Definition gcoap.h:749
@ GCOAP_SOCKET_TYPE_UNDEF
undefined
Definition gcoap.h:748
@ GCOAP_SOCKET_TYPE_DTLS
DTLS-over-UDP transport.
Definition gcoap.h:750
#define CONFIG_NANOCOAP_CACHE_KEY_LENGTH
The length of the cache key in bytes.
Definition cache.h:44
#define COAP_OPT_FINISH_NONE
no special handling required
Definition nanocoap.h:178
ssize_t coap_opt_remove(coap_pkt_t *pkt, uint16_t optnum)
Removes an option previously added with function in the coap_opt_add_...() group.
ssize_t coap_opt_finish(coap_pkt_t *pkt, uint16_t flags)
Finalizes options as required and prepares for payload.
struct sock_udp sock_udp_t
forward declare for async
Definition types.h:136
struct sock_dtls sock_dtls_t
forward declare for async
Definition types.h:44
struct sock_dtls_session sock_dtls_session_t
Information about a created session.
Definition dtls.h:635
struct _sock_tl_ep sock_udp_ep_t
An end point for a UDP sock object.
Definition udp.h:292
int socket(int domain, int type, int protocol)
Create an endpoint for communication.
#define IS_USED(module)
Checks whether a module is being used or not.
Definition modules.h:67
nanocoap API
DTLS sock definitions.
UDP sock definitions.
CoAP PDU parsing context structure.
Definition nanocoap.h:226
Type for CoAP resource entry.
Definition nanocoap.h:324
Raw CoAP over UDP PDU header structure.
Definition nanocoap.h:186
Callback Event structure definition.
Definition callback.h:45
Timeout Event structure.
Definition timeout.h:46
A modular collection of resources for a server.
Definition gcoap.h:774
gcoap_link_encoder_t link_encoder
Writes a link for a resource.
Definition gcoap.h:787
struct gcoap_listener * next
Next listener in list.
Definition gcoap.h:788
size_t resources_len
Length of array.
Definition gcoap.h:776
gcoap_socket_type_t tl_type
Transport type for the listener.
Definition gcoap.h:786
const coap_resource_t * resources
First element in the array of resources.
Definition gcoap.h:775
gcoap_request_matcher_t request_matcher
Function that picks a suitable request handler from a request.
Definition gcoap.h:800
Memo for Observe registration and notifications.
Definition gcoap.h:858
unsigned token_len
Actual length of token attribute.
Definition gcoap.h:864
uint8_t token[GCOAP_TOKENLEN_MAX]
Client token for notifications.
Definition gcoap.h:862
gcoap_socket_t socket
Transport type to observer.
Definition gcoap.h:865
const coap_resource_t * resource
Entity being observed.
Definition gcoap.h:861
sock_udp_ep_t * notifier
Local endpoint to send notifications.
Definition gcoap.h:860
uint16_t last_msgid
Message ID of last notification.
Definition gcoap.h:863
sock_udp_ep_t * observer
Client endpoint; unused if null.
Definition gcoap.h:859
Memo to handle a response for a request.
Definition gcoap.h:829
void * context
ptr to user defined context data
Definition gcoap.h:841
gcoap_resp_handler_t resp_handler
Callback for the response.
Definition gcoap.h:840
event_callback_t resp_tmout_cb
Callback for response timeout.
Definition gcoap.h:843
unsigned state
State of this memo, a GCOAP_MEMO...
Definition gcoap.h:830
int send_limit
Remaining resends, 0 if none; GCOAP_SEND_LIMIT_NON if non-confirmable.
Definition gcoap.h:831
gcoap_resend_t data
Endpoint and PDU buffer, for resend.
Definition gcoap.h:836
uint8_t cache_key[CONFIG_NANOCOAP_CACHE_KEY_LENGTH]
Cache key for the request.
Definition gcoap.h:851
sock_udp_ep_t remote_ep
Remote endpoint.
Definition gcoap.h:839
union gcoap_request_memo::@376103145064361232062134223007277344126205344350 msg
Request message data; if confirmable, supports resending message.
gcoap_socket_t socket
Transport type to remote endpoint.
Definition gcoap.h:844
uint8_t hdr_buf[GCOAP_HEADER_MAXLEN]
Copy of PDU header, if no resends.
Definition gcoap.h:834
event_timeout_t resp_evt_tmout
Limits wait for response.
Definition gcoap.h:842
Extends request memo for resending a confirmable request.
Definition gcoap.h:821
uint8_t * pdu_buf
Buffer containing the PDU.
Definition gcoap.h:822
size_t pdu_len
Length of pdu_buf.
Definition gcoap.h:823
CoAP socket to handle multiple transport types.
Definition gcoap.h:756
gcoap_socket_type_t type
Type of stored socket.
Definition gcoap.h:757
sock_dtls_session_t ctx_dtls_session
Session object for the stored socket.
Definition gcoap.h:765
nanocoap-cache API
Provides functionality to trigger events after timeout.