Loading...
Searching...
No Matches
gcoap.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2015-2017 Ken Bannister. All rights reserved.
3 * 2017 Freie Universität Berlin
4 *
5 * This file is subject to the terms and conditions of the GNU Lesser
6 * General Public License v2.1. See the file LICENSE in the top level
7 * directory for more details.
8 */
9
397#ifndef NET_GCOAP_H
398#define NET_GCOAP_H
399
400#include <stdint.h>
401
402#include "event/callback.h"
403#include "event/timeout.h"
404#include "net/ipv6/addr.h"
405#include "net/sock/udp.h"
406#if IS_USED(MODULE_GCOAP_DTLS)
407#include "net/sock/dtls.h"
408#endif
409#include "net/nanocoap.h"
410#include "net/nanocoap/cache.h"
411#include "timex.h"
412
413#ifdef __cplusplus
414extern "C" {
415#endif
416
426#ifndef CONFIG_GCOAP_PORT
427#define CONFIG_GCOAP_PORT (5683)
428#endif
432#ifndef CONFIG_GCOAPS_PORT
433#define CONFIG_GCOAPS_PORT (5684)
434#endif
435
439#ifndef CONFIG_GCOAP_DTLS_HANDSHAKE_TIMEOUT_MSEC
440#define CONFIG_GCOAP_DTLS_HANDSHAKE_TIMEOUT_MSEC (3 * MS_PER_SEC)
441#endif
442
448#ifndef CONFIG_GCOAP_DTLS_MINIMUM_AVAILABLE_SESSIONS
449#define CONFIG_GCOAP_DTLS_MINIMUM_AVAILABLE_SESSIONS (1)
450#endif
451
456#ifndef CONFIG_GCOAP_DTLS_MINIMUM_AVAILABLE_SESSIONS_TIMEOUT_MSEC
457#define CONFIG_GCOAP_DTLS_MINIMUM_AVAILABLE_SESSIONS_TIMEOUT_MSEC (15 * MS_PER_SEC)
458#endif
459
463#ifndef CONFIG_GCOAP_PDU_BUF_SIZE
464#define CONFIG_GCOAP_PDU_BUF_SIZE (128)
465#endif
466
470#ifndef CONFIG_GCOAP_REQ_WAITING_MAX
471#define CONFIG_GCOAP_REQ_WAITING_MAX (2)
472#endif
478#define GCOAP_TOKENLEN_MAX (8)
479
483#define GCOAP_HEADER_MAXLEN (sizeof(coap_hdr_t) + GCOAP_TOKENLEN_MAX)
484
491#ifndef CONFIG_GCOAP_TOKENLEN
492#define CONFIG_GCOAP_TOKENLEN (2)
493#endif
494
498#define GCOAP_PAYLOAD_MARKER (0xFF)
499
506#ifndef CONFIG_GCOAP_NO_AUTO_INIT
507#define CONFIG_GCOAP_NO_AUTO_INIT 0
508#endif
509
514#define GCOAP_MEMO_UNUSED (0)
515#define GCOAP_MEMO_RETRANSMIT (1)
516#define GCOAP_MEMO_WAIT (2)
517#define GCOAP_MEMO_RESP (3)
518#define GCOAP_MEMO_TIMEOUT (4)
519#define GCOAP_MEMO_ERR (5)
520#define GCOAP_MEMO_RESP_TRUNC (6)
527#define GCOAP_SEND_LIMIT_NON (-1)
528
529#ifdef DOXYGEN
539#define CONFIG_GCOAP_NO_RETRANS_BACKOFF
540#endif
541
548#ifndef CONFIG_GCOAP_NON_TIMEOUT_MSEC
549#define CONFIG_GCOAP_NON_TIMEOUT_MSEC (5000U)
550#endif
551
556#ifndef CONFIG_GCOAP_OBS_CLIENTS_MAX
557#define CONFIG_GCOAP_OBS_CLIENTS_MAX (2)
558#endif
559
564#ifndef CONFIG_GCOAP_OBS_REGISTRATIONS_MAX
565#define CONFIG_GCOAP_OBS_REGISTRATIONS_MAX (2)
566#endif
567
572#define GCOAP_OBS_MEMO_UNUSED (0)
573#define GCOAP_OBS_MEMO_IDLE (1)
574#define GCOAP_OBS_MEMO_PENDING (2)
597#ifndef CONFIG_GCOAP_OBS_VALUE_WIDTH
598#define CONFIG_GCOAP_OBS_VALUE_WIDTH (3)
599#endif
600
604#if (CONFIG_GCOAP_OBS_VALUE_WIDTH == 3)
605#define GCOAP_OBS_TICK_EXPONENT (0)
606#elif (CONFIG_GCOAP_OBS_VALUE_WIDTH == 2)
607#define GCOAP_OBS_TICK_EXPONENT (6)
608#elif (CONFIG_GCOAP_OBS_VALUE_WIDTH == 1)
609#define GCOAP_OBS_TICK_EXPONENT (14)
610#endif
611
616#define GCOAP_OBS_INIT_OK (0)
617#define GCOAP_OBS_INIT_ERR (-1)
618#define GCOAP_OBS_INIT_UNUSED (-2)
625#ifndef GCOAP_STACK_SIZE
626#if IS_USED(MODULE_GCOAP_DTLS)
627#define GCOAP_DTLS_EXTRA_STACKSIZE (THREAD_STACKSIZE_DEFAULT)
628#else
629#define GCOAP_DTLS_EXTRA_STACKSIZE (0)
630#endif
631
635#if IS_USED(MODULE_GCOAP_FILESERVER)
636#include "vfs.h"
637#define GCOAP_VFS_EXTRA_STACKSIZE (VFS_DIR_BUFFER_SIZE + VFS_FILE_BUFFER_SIZE)
638#else
639#define GCOAP_VFS_EXTRA_STACKSIZE (0)
640#endif
641
642#define GCOAP_STACK_SIZE (THREAD_STACKSIZE_DEFAULT + DEBUG_EXTRA_STACKSIZE \
643 + sizeof(coap_pkt_t) + GCOAP_DTLS_EXTRA_STACKSIZE \
644 + GCOAP_VFS_EXTRA_STACKSIZE)
645#endif
652#ifndef CONFIG_GCOAP_RESEND_BUFS_MAX
653#define CONFIG_GCOAP_RESEND_BUFS_MAX (1)
654#endif
655
661#define COAP_LINK_FLAG_INIT_RESLIST (1)
669typedef struct {
670 unsigned content_format;
671 size_t link_pos;
672 uint16_t flags;
675
687typedef ssize_t (*gcoap_link_encoder_t)(const coap_resource_t *resource, char *buf,
688 size_t maxlen, coap_link_encoder_ctx_t *context);
689
694#define GCOAP_RESOURCE_FOUND (0)
695#define GCOAP_RESOURCE_WRONG_METHOD (1)
696#define GCOAP_RESOURCE_NO_PATH (2)
697#define GCOAP_RESOURCE_ERROR (3)
704
718 const coap_resource_t **resource,
719 coap_pkt_t *pdu);
720
732
736typedef struct {
738 union {
739 sock_udp_t *udp;
740#if IS_USED(MODULE_GCOAP_DTLS) || defined(DOXYGEN)
741 sock_dtls_t *dtls;
742#endif
744#if IS_USED(MODULE_GCOAP_DTLS) || defined(DOXYGEN)
748#endif
750
782
787
794typedef void (*gcoap_resp_handler_t)(const gcoap_request_memo_t *memo,
795 coap_pkt_t* pdu,
796 const sock_udp_ep_t *remote);
797
801typedef struct {
802 uint8_t *pdu_buf;
803 size_t pdu_len;
805
834
846
857
874
901int gcoap_req_init_path_buffer(coap_pkt_t *pdu, uint8_t *buf, size_t len,
902 unsigned code, const char *path,
903 size_t path_len);
904
929static inline int gcoap_req_init(coap_pkt_t *pdu, uint8_t *buf, size_t len,
930 unsigned code, const char *path)
931{
932 return gcoap_req_init_path_buffer(pdu, buf, len, code, path,
933 (path) ? strlen(path) : 0U);
934}
935
948static inline ssize_t gcoap_request(coap_pkt_t *pdu, uint8_t *buf, size_t len,
949 unsigned code, char *path)
950{
951 if (gcoap_req_init(pdu, buf, len, code, path) == 0) {
952 if (IS_USED(MODULE_NANOCOAP_CACHE)) {
953 /* remove ETag option slack added for cache validation */
954 coap_opt_remove(pdu, COAP_OPT_ETAG);
955 }
957 }
958 return -1;
959}
960
982ssize_t gcoap_req_send(const uint8_t *buf, size_t len,
983 const sock_udp_ep_t *remote,
984 gcoap_resp_handler_t resp_handler, void *context,
985 gcoap_socket_type_t tl_type);
986
1007static inline ssize_t gcoap_req_send_tl(const uint8_t *buf, size_t len,
1008 const sock_udp_ep_t *remote,
1009 gcoap_resp_handler_t resp_handler, void *context,
1010 gcoap_socket_type_t tl_type)
1011{
1012 return gcoap_req_send(buf, len, remote, resp_handler, context, tl_type);
1013}
1014
1028int gcoap_resp_init(coap_pkt_t *pdu, uint8_t *buf, size_t len, unsigned code);
1029
1041static inline ssize_t gcoap_response(coap_pkt_t *pdu, uint8_t *buf,
1042 size_t len, unsigned code)
1043{
1044 return (gcoap_resp_init(pdu, buf, len, code) == 0)
1046 : -1;
1047}
1048
1064int gcoap_obs_init(coap_pkt_t *pdu, uint8_t *buf, size_t len,
1065 const coap_resource_t *resource);
1066
1080size_t gcoap_obs_send(const uint8_t *buf, size_t len,
1081 const coap_resource_t *resource);
1082
1111int gcoap_obs_req_forget(const sock_udp_ep_t *remote, const uint8_t *token,
1112 size_t tokenlen);
1113
1121uint8_t gcoap_op_state(void);
1122
1145int gcoap_get_resource_list(void *buf, size_t maxlen, uint8_t cf,
1146 gcoap_socket_type_t tl_type);
1147
1161ssize_t gcoap_encode_link(const coap_resource_t *resource, char *buf,
1162 size_t maxlen, coap_link_encoder_ctx_t *context);
1163
1164#if IS_USED(MODULE_GCOAP_DTLS) || defined(DOXYGEN)
1173#endif
1174
1183{
1184 if (memo->send_limit == GCOAP_SEND_LIMIT_NON) {
1185 return (coap_hdr_t *)&memo->msg.hdr_buf[0];
1186 }
1187 else {
1188 return (coap_hdr_t *)memo->msg.data.pdu_buf;
1189 }
1190}
1191
1192#ifdef __cplusplus
1193}
1194#endif
1195
1196#endif /* NET_GCOAP_H */
Provides a callback-with-argument event type.
Provides functionality to trigger events after timeout.
int16_t kernel_pid_t
Unique process identifier.
Definition sched.h:139
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:687
void gcoap_register_listener(gcoap_listener_t *listener)
Starts listening for resource paths.
static coap_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:1182
static ssize_t gcoap_req_send_tl(const uint8_t *buf, size_t len, const sock_udp_ep_t *remote, 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.
Definition gcoap.h:1007
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:929
#define GCOAP_TOKENLEN_MAX
Maximum length in bytes for a token.
Definition gcoap.h:478
gcoap_socket_type_t
CoAP socket types.
Definition gcoap.h:727
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...
#define GCOAP_HEADER_MAXLEN
Maximum length in bytes for a header, including the token.
Definition gcoap.h:483
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:794
#define GCOAP_SEND_LIMIT_NON
Value for send_limit in request memo when non-confirmable type.
Definition gcoap.h:527
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.
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:1041
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:717
kernel_pid_t gcoap_init(void)
Initializes the gcoap thread and device.
uint8_t gcoap_op_state(void)
Provides important operational statistics.
ssize_t gcoap_req_send(const uint8_t *buf, size_t len, const sock_udp_ep_t *remote, 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.
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:948
@ GCOAP_SOCKET_TYPE_UDP
Unencrypted UDP transport.
Definition gcoap.h:729
@ GCOAP_SOCKET_TYPE_UNDEF
undefined
Definition gcoap.h:728
@ GCOAP_SOCKET_TYPE_DTLS
DTLS-over-UDP transport.
Definition gcoap.h:730
#define CONFIG_NANOCOAP_CACHE_KEY_LENGTH
The length of the cache key in bytes.
Definition cache.h:48
#define COAP_OPT_FINISH_NONE
no special handling required
Definition nanocoap.h:193
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.
int socket(int domain, int type, int protocol)
Create an endpoint for communication.
Definitions for IPv6 addresses.
#define IS_USED(module)
Checks whether a module is being used or not.
Definition modules.h:71
nanocoap-cache API
nanocoap API
DTLS sock definitions.
UDP sock definitions.
Common IP-based transport layer end point.
Definition sock.h:215
Raw CoAP PDU header structure.
Definition nanocoap.h:201
CoAP PDU parsing context structure.
Definition nanocoap.h:232
Type for CoAP resource entry.
Definition nanocoap.h:311
Callback Event structure definition.
Definition callback.h:48
Timeout Event structure.
Definition timeout.h:50
A modular collection of resources for a server.
Definition gcoap.h:754
gcoap_link_encoder_t link_encoder
Writes a link for a resource.
Definition gcoap.h:767
struct gcoap_listener * next
Next listener in list.
Definition gcoap.h:768
size_t resources_len
Length of array.
Definition gcoap.h:756
gcoap_socket_type_t tl_type
Transport type for the listener.
Definition gcoap.h:766
const coap_resource_t * resources
First element in the array of resources.
Definition gcoap.h:755
gcoap_request_matcher_t request_matcher
Function that picks a suitable request handler from a request.
Definition gcoap.h:780
Memo for Observe registration and notifications.
Definition gcoap.h:838
unsigned token_len
Actual length of token attribute.
Definition gcoap.h:843
gcoap_socket_t socket
Transport type to observer.
Definition gcoap.h:844
const coap_resource_t * resource
Entity being observed.
Definition gcoap.h:840
uint16_t last_msgid
Message ID of last notification.
Definition gcoap.h:842
sock_udp_ep_t * observer
Client endpoint; unused if null.
Definition gcoap.h:839
Memo to handle a response for a request.
Definition gcoap.h:809
void * context
ptr to user defined context data
Definition gcoap.h:821
gcoap_resp_handler_t resp_handler
Callback for the response.
Definition gcoap.h:820
event_callback_t resp_tmout_cb
Callback for response timeout.
Definition gcoap.h:823
unsigned state
State of this memo, a GCOAP_MEMO...
Definition gcoap.h:810
int send_limit
Remaining resends, 0 if none; GCOAP_SEND_LIMIT_NON if non-confirmable.
Definition gcoap.h:811
gcoap_resend_t data
Endpoint and PDU buffer, for resend.
Definition gcoap.h:816
uint8_t cache_key[CONFIG_NANOCOAP_CACHE_KEY_LENGTH]
Cache key for the request.
Definition gcoap.h:831
sock_udp_ep_t remote_ep
Remote endpoint.
Definition gcoap.h:819
gcoap_socket_t socket
Transport type to remote endpoint.
Definition gcoap.h:824
uint8_t hdr_buf[GCOAP_HEADER_MAXLEN]
Copy of PDU header, if no resends.
Definition gcoap.h:814
event_timeout_t resp_evt_tmout
Limits wait for response.
Definition gcoap.h:822
union gcoap_request_memo::@358 msg
Request message data; if confirmable, supports resending message.
Extends request memo for resending a confirmable request.
Definition gcoap.h:801
uint8_t * pdu_buf
Buffer containing the PDU.
Definition gcoap.h:802
size_t pdu_len
Length of pdu_buf.
Definition gcoap.h:803
CoAP socket to handle multiple transport types.
Definition gcoap.h:736
gcoap_socket_type_t type
Type of stored socket.
Definition gcoap.h:737
sock_dtls_session_t ctx_dtls_session
Session object for the stored socket.
Definition gcoap.h:745
Information about remote client connected to the server.
Information about DTLS sock.
UDP sock type.
Definition sock_types.h:128
Utility library for comparing and computing timestamps.