Loading...
Searching...
No Matches
nanocoap_sock.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 2017 Kaspar Schleiser <kaspar@schleiser.de>
3 * 2018 Inria
4 * 2018 Freie Universität Berlin
5 *
6 * This file is subject to the terms and conditions of the GNU Lesser
7 * General Public License v2.1. See the file LICENSE in the top level
8 * directory for more details.
9 */
10
135#ifndef NET_NANOCOAP_SOCK_H
136#define NET_NANOCOAP_SOCK_H
137
138#include <stdint.h>
139#include <unistd.h>
140
141#include "random.h"
142#include "net/nanocoap.h"
143#include "net/sock/udp.h"
144#include "net/sock/util.h"
145#if IS_USED(MODULE_NANOCOAP_DTLS)
146#include "net/credman.h"
147#include "net/sock/dtls.h"
148#endif
149
150#ifdef __cplusplus
151extern "C" {
152#endif
153
158#ifndef CONFIG_NANOCOAP_SOCK_DTLS_TAG
159#define CONFIG_NANOCOAP_SOCK_DTLS_TAG (0xc0ab)
160#endif
161
166#ifndef CONFIG_NANOCOAP_SERVER_BUF_SIZE
167#define CONFIG_NANOCOAP_SERVER_BUF_SIZE ((1 << (CONFIG_NANOCOAP_BLOCKSIZE_DEFAULT + 3)) \
168 + CONFIG_NANOCOAP_URI_MAX + 16)
169#endif
170
174#ifndef CONFIG_NANOCOAP_SERVER_STACK_SIZE
175#define CONFIG_NANOCOAP_SERVER_STACK_SIZE THREAD_STACKSIZE_DEFAULT
176#endif
177
186#ifndef CONFIG_NANOCOAP_SOCK_BLOCK_TOKEN
187#define CONFIG_NANOCOAP_SOCK_BLOCK_TOKEN (0)
188#endif
189
197
201typedef struct {
203#if IS_USED(MODULE_NANOCOAP_DTLS) || defined(DOXYGEN)
209#endif
210 uint16_t msg_id;
212
216typedef struct {
218 const char *path;
219 uint32_t blknum;
221 uint8_t blksize;
223
227typedef struct {
229#if defined(MODULE_SOCK_AUX_LOCAL) || DOXYGEN
231#endif
232 uint8_t token[COAP_TOKEN_LENGTH_MAX];
233 uint8_t tkl;
234 uint8_t no_response;
236
251 coap_pkt_t *pkt, const coap_request_ctx_t *req);
252
271 unsigned code, unsigned type,
272 const void *payload, size_t len);
281static inline uint16_t nanocoap_sock_next_msg_id(nanocoap_sock_t *sock)
282{
283 return sock->msg_id++;
284}
285
298int nanocoap_server(sock_udp_ep_t *local, uint8_t *buf, size_t bufsize);
299
311
323 const sock_udp_ep_t *local,
324 const sock_udp_ep_t *remote)
325{
326#if IS_USED(MODULE_NANOCOAP_DTLS)
328#endif
329 sock->msg_id = random_uint32();
330
331 return sock_udp_create(&sock->udp, local, remote, 0);
332}
333
334#if IS_USED(MODULE_NANOCOAP_DTLS) || DOXYGEN
348 const sock_udp_ep_t *remote, credman_tag_t tag);
349#endif
350
360int nanocoap_sock_url_connect(const char *url, nanocoap_sock_t *sock);
361
367static inline void nanocoap_sock_close(nanocoap_sock_t *sock)
368{
369#if IS_USED(MODULE_NANOCOAP_DTLS)
370 if (sock->type == COAP_SOCKET_TYPE_DTLS) {
371 sock_dtls_session_destroy(&sock->dtls, &sock->dtls_session);
372 sock_dtls_close(&sock->dtls);
373 }
374#endif
375 sock_udp_close(&sock->udp);
376}
377
389ssize_t nanocoap_sock_get(nanocoap_sock_t *sock, const char *path, void *buf,
390 size_t len);
391
403ssize_t nanocoap_sock_get_non(nanocoap_sock_t *sock, const char *path,
404 void *response, size_t len_max);
405
419ssize_t nanocoap_sock_put(nanocoap_sock_t *sock, const char *path,
420 const void *request, size_t len,
421 void *response, size_t len_max);
422
438ssize_t nanocoap_sock_put_non(nanocoap_sock_t *sock, const char *path,
439 const void *request, size_t len,
440 void *response, size_t len_max);
441
454ssize_t nanocoap_sock_put_url(const char *url,
455 const void *request, size_t len,
456 void *response, size_t len_max);
457
471ssize_t nanocoap_sock_post(nanocoap_sock_t *sock, const char *path,
472 const void *request, size_t len,
473 void *response, size_t len_max);
474
490ssize_t nanocoap_sock_post_non(nanocoap_sock_t *sock, const char *path,
491 const void *request, size_t len,
492 void *response, size_t len_max);
493
506ssize_t nanocoap_sock_post_url(const char *url,
507 const void *request, size_t len,
508 void *response, size_t len_max);
509
524ssize_t nanocoap_sock_fetch(nanocoap_sock_t *sock, const char *path,
525 const void *request, size_t len,
526 void *response, size_t len_max);
527
544ssize_t nanocoap_sock_fetch_non(nanocoap_sock_t *sock, const char *path,
545 const void *request, size_t len,
546 void *response, size_t len_max);
547
561ssize_t nanocoap_sock_fetch_url(const char *url,
562 const void *request, size_t len,
563 void *response, size_t len_max);
564
574ssize_t nanocoap_sock_delete(nanocoap_sock_t *sock, const char *path);
575
584ssize_t nanocoap_sock_delete_url(const char *url);
585
603 coap_blksize_t blksize,
604 coap_blockwise_cb_t callback, void *arg);
605
621int nanocoap_sock_get_slice(nanocoap_sock_t *sock, const char *path,
622 coap_blksize_t blksize, size_t offset,
623 void *dst, size_t len);
624
642int nanocoap_get_blockwise_url(const char *url,
643 coap_blksize_t blksize,
644 coap_blockwise_cb_t callback, void *arg);
645
665ssize_t nanocoap_get_blockwise_url_to_buf(const char *url,
666 coap_blksize_t blksize,
667 void *buf, size_t len);
668
688ssize_t nanocoap_get_blockwise_to_buf(nanocoap_sock_t *sock, const char *path,
689 coap_blksize_t blksize,
690 void *buf, size_t len);
691
704ssize_t nanocoap_sock_request(nanocoap_sock_t *sock, coap_pkt_t *pkt, size_t len);
705
730 coap_request_cb_t cb, void *arg);
731
745ssize_t nanocoap_request(coap_pkt_t *pkt, const sock_udp_ep_t *local,
746 const sock_udp_ep_t *remote, size_t len);
747
761 nanocoap_sock_t *sock,
762 const char *url,
763 coap_method_t method,
764 coap_blksize_t blksize)
765{
766 ctx->sock = sock;
767 ctx->path = sock_urlpath(url);
768 ctx->blknum = 0;
769 ctx->method = method;
770 ctx->blksize = blksize;
771 return nanocoap_sock_url_connect(url, ctx->sock);
772}
773
795 const void *data, size_t len, bool more,
796 coap_request_cb_t cb, void *arg);
797#ifdef __cplusplus
798}
799#endif
800#endif /* NET_NANOCOAP_SOCK_H */
(D)TLS credentials management module definitions
int16_t kernel_pid_t
Unique process identifier.
Definition sched.h:139
coap_blksize_t
Coap block-wise-transfer size SZX.
Definition coap.h:618
coap_method_t
CoAP method codes used in request.
Definition coap.h:171
uint16_t credman_tag_t
Tag of the credential.
Definition credman.h:96
int(* coap_blockwise_cb_t)(void *arg, size_t offset, uint8_t *buf, size_t len, int more)
Coap blockwise request callback descriptor.
Definition nanocoap.h:287
int(* coap_request_cb_t)(void *arg, coap_pkt_t *pkt)
Coap request callback descriptor.
Definition nanocoap.h:299
ssize_t nanocoap_sock_put_non(nanocoap_sock_t *sock, const char *path, const void *request, size_t len, void *response, size_t len_max)
Simple non-confirmable PUT.
ssize_t nanocoap_sock_get_non(nanocoap_sock_t *sock, const char *path, void *response, size_t len_max)
Simple non-confirmable GET.
ssize_t nanocoap_sock_delete(nanocoap_sock_t *sock, const char *path)
Simple synchronous CoAP (confirmable) DELETE.
void nanocoap_server_prepare_separate(nanocoap_server_response_ctx_t *ctx, coap_pkt_t *pkt, const coap_request_ctx_t *req)
Prepare the context for a separate response.
ssize_t nanocoap_sock_put(nanocoap_sock_t *sock, const char *path, const void *request, size_t len, void *response, size_t len_max)
Simple synchronous CoAP (confirmable) PUT.
int nanocoap_sock_url_connect(const char *url, nanocoap_sock_t *sock)
Create a CoAP client socket by URL.
ssize_t nanocoap_sock_post_url(const char *url, const void *request, size_t len, void *response, size_t len_max)
Simple synchronous CoAP (confirmable) POST to URL.
ssize_t nanocoap_sock_delete_url(const char *url)
Simple synchronous CoAP (confirmable) DELETE for URL.
int nanocoap_sock_get_slice(nanocoap_sock_t *sock, const char *path, coap_blksize_t blksize, size_t offset, void *dst, size_t len)
Performs a blockwise coap get request to the specified url, store the response in a buffer.
ssize_t nanocoap_request(coap_pkt_t *pkt, const sock_udp_ep_t *local, const sock_udp_ep_t *remote, size_t len)
Simple synchronous CoAP request.
kernel_pid_t nanocoap_server_start(const sock_udp_ep_t *local)
Create and start the nanoCoAP server thread.
ssize_t nanocoap_sock_request(nanocoap_sock_t *sock, coap_pkt_t *pkt, size_t len)
Simple synchronous CoAP request.
ssize_t nanocoap_sock_fetch(nanocoap_sock_t *sock, const char *path, const void *request, size_t len, void *response, size_t len_max)
Simple synchronous CoAP (confirmable) FETCH (RFC 8132)
int nanocoap_sock_dtls_connect(nanocoap_sock_t *sock, sock_udp_ep_t *local, const sock_udp_ep_t *remote, credman_tag_t tag)
Create a DTLS secured CoAP client socket.
ssize_t nanocoap_sock_fetch_non(nanocoap_sock_t *sock, const char *path, const void *request, size_t len, void *response, size_t len_max)
Simple non-confirmable FETCH (RFC 8132)
ssize_t nanocoap_sock_fetch_url(const char *url, const void *request, size_t len, void *response, size_t len_max)
Simple synchronous CoAP (confirmable) FETCH to URL (RFC 8132)
static uint16_t nanocoap_sock_next_msg_id(nanocoap_sock_t *sock)
Get next consecutive message ID for use when building a new CoAP request.
ssize_t nanocoap_sock_post(nanocoap_sock_t *sock, const char *path, const void *request, size_t len, void *response, size_t len_max)
Simple synchronous CoAP (confirmable) POST.
int nanocoap_server(sock_udp_ep_t *local, uint8_t *buf, size_t bufsize)
Start a nanocoap server instance.
int nanocoap_sock_block_request(coap_block_request_t *ctx, const void *data, size_t len, bool more, coap_request_cb_t cb, void *arg)
Do a block-wise request, send a single block.
ssize_t nanocoap_sock_post_non(nanocoap_sock_t *sock, const char *path, const void *request, size_t len, void *response, size_t len_max)
Simple non-confirmable POST.
int nanocoap_server_send_separate(const nanocoap_server_response_ctx_t *ctx, unsigned code, unsigned type, const void *payload, size_t len)
Send a separate response to a CoAP request.
ssize_t nanocoap_sock_request_cb(nanocoap_sock_t *sock, coap_pkt_t *pkt, coap_request_cb_t cb, void *arg)
Simple synchronous CoAP request with callback.
static int nanocoap_block_request_connect_url(coap_block_request_t *ctx, nanocoap_sock_t *sock, const char *url, coap_method_t method, coap_blksize_t blksize)
Initialize block request context by URL and connect a socket.
ssize_t nanocoap_sock_get(nanocoap_sock_t *sock, const char *path, void *buf, size_t len)
Simple synchronous CoAP (confirmable) GET.
ssize_t nanocoap_get_blockwise_url_to_buf(const char *url, coap_blksize_t blksize, void *buf, size_t len)
Performs a blockwise coap get request to the specified url, store the response in a buffer.
int nanocoap_get_blockwise_url(const char *url, coap_blksize_t blksize, coap_blockwise_cb_t callback, void *arg)
Performs a blockwise coap get request to the specified url.
ssize_t nanocoap_sock_put_url(const char *url, const void *request, size_t len, void *response, size_t len_max)
Simple synchronous CoAP (confirmable) PUT to URL.
static int nanocoap_sock_connect(nanocoap_sock_t *sock, const sock_udp_ep_t *local, const sock_udp_ep_t *remote)
Create a CoAP client socket.
int nanocoap_sock_get_blockwise(nanocoap_sock_t *sock, const char *path, coap_blksize_t blksize, coap_blockwise_cb_t callback, void *arg)
Performs a blockwise coap get request on a socket.
nanocoap_socket_type_t
NanoCoAP socket types.
static void nanocoap_sock_close(nanocoap_sock_t *sock)
Close a CoAP client socket.
ssize_t nanocoap_get_blockwise_to_buf(nanocoap_sock_t *sock, const char *path, coap_blksize_t blksize, void *buf, size_t len)
Performs a blockwise CoAP GET request, store the response in a buffer.
@ COAP_SOCKET_TYPE_UDP
transport is plain UDP
@ COAP_SOCKET_TYPE_DTLS
transport is DTLS
int sock_udp_create(sock_udp_t *sock, const sock_udp_ep_t *local, const sock_udp_ep_t *remote, uint16_t flags)
Creates a new UDP sock object.
void sock_udp_close(sock_udp_t *sock)
Closes a UDP sock object.
const char * sock_urlpath(const char *url)
Returns a pointer to the path component in url.
uint32_t random_uint32(void)
generates a random number on [0,0xffffffff]-interval
nanocoap API
Common interface to the software PRNG.
DTLS sock definitions.
UDP sock definitions.
CoAP resource request handler context.
Definition nanocoap.h:338
Common IP-based transport layer end point.
Definition sock.h:215
Blockwise request helper struct.
nanocoap_sock_t * sock
socket used for the request
uint32_t blknum
current block number
const char * path
path on the server
coap_method_t method
request method (GET, POST, PUT)
uint8_t blksize
CoAP blocksize exponent
CoAP PDU parsing context structure.
Definition nanocoap.h:232
Context from CoAP request for separate response.
sock_udp_ep_t local
local from which to send response
uint8_t tkl
request token length
sock_udp_ep_t remote
remote to send response to
uint8_t no_response
no-response bitmap
NanoCoAP socket struct.
uint16_t msg_id
next CoAP message ID
sock_dtls_session_t dtls_session
Session object for the stored socket.
sock_dtls_t dtls
DTLS socket
sock_udp_t udp
UDP socket
nanocoap_socket_type_t type
Socket type (UDP, DTLS)
Information about remote client connected to the server.
Information about DTLS sock.
UDP sock type.
Definition sock_types.h:128
sock utility function definitions