blob: dc5d008c1b74c2c9f0d8840357efbd84ea571ec4 [file] [log] [blame]
/** @file
* @brief CoAP client API
*
* An API for applications to do CoAP requests
*/
/*
* Copyright (c) 2023 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ZEPHYR_INCLUDE_NET_COAP_CLIENT_H_
#define ZEPHYR_INCLUDE_NET_COAP_CLIENT_H_
/**
* @brief CoAP client API
* @defgroup coap_client CoAP client API
* @ingroup networking
* @{
*/
#include <zephyr/net/coap.h>
#define MAX_COAP_MSG_LEN (CONFIG_COAP_CLIENT_MESSAGE_HEADER_SIZE + \
CONFIG_COAP_CLIENT_MESSAGE_SIZE)
/**
* @typedef coap_client_response_cb_t
* @brief Callback for CoAP request.
*
* This callback is called for responses to CoAP client requests.
* It is used to indicate errors, response codes from server or to deliver payload.
* Blockwise transfers cause this callback to be called sequentially with increasing payload offset
* and only partial content in buffer pointed by payload parameter.
*
* @param result_code Result code of the response. Negative if there was a failure in send.
* @ref coap_response_code for positive.
* @param offset Payload offset from the beginning of a blockwise transfer.
* @param payload Buffer containing the payload from the response. NULL for empty payload.
* @param len Size of the payload.
* @param last_block Indicates the last block of the response.
* @param user_data User provided context.
*/
typedef void (*coap_client_response_cb_t)(int16_t result_code,
size_t offset, const uint8_t *payload, size_t len,
bool last_block, void *user_data);
/**
* @brief Representation of a CoAP client request.
*/
struct coap_client_request {
enum coap_method method; /**< Method of the request */
bool confirmable; /**< CoAP Confirmable/Non-confirmable message */
const char *path; /**< Path of the requested resource */
enum coap_content_format fmt; /**< Content format to be used */
uint8_t *payload; /**< User allocated buffer for send request */
size_t len; /**< Length of the payload */
coap_client_response_cb_t cb; /**< Callback when response received */
struct coap_client_option *options; /**< Extra options to be added to request */
uint8_t num_options; /**< Number of extra options */
void *user_data; /**< User provided context */
};
/**
* @brief Representation of extra options for the CoAP client request
*/
struct coap_client_option {
uint16_t code;
#if defined(CONFIG_COAP_EXTENDED_OPTIONS_LEN)
uint16_t len;
uint8_t value[CONFIG_COAP_EXTENDED_OPTIONS_LEN_VALUE];
#else
uint8_t len;
uint8_t value[12];
#endif
};
/** @cond INTERNAL_HIDDEN */
struct coap_client {
int fd;
struct sockaddr address;
socklen_t socklen;
uint8_t send_buf[MAX_COAP_MSG_LEN];
uint8_t recv_buf[MAX_COAP_MSG_LEN];
uint8_t request_token[COAP_TOKEN_MAX_LEN];
int request_tkl;
int offset;
int retry_count;
struct coap_block_context recv_blk_ctx;
struct coap_block_context send_blk_ctx;
struct coap_pending pending;
struct coap_client_request *coap_request;
struct coap_packet request;
k_tid_t tid;
struct k_thread thread;
struct k_sem coap_client_recv_sem;
atomic_t coap_client_recv_active;
K_THREAD_STACK_MEMBER(coap_thread_stack, CONFIG_COAP_CLIENT_STACK_SIZE);
};
/** @endcond */
/**
* @brief Initialize the CoAP client.
*
* @param[in] client Client instance.
* @param[in] info Name for the receiving thread of the client. Setting this NULL will result as
* default name of "coap_client".
*
* @return int Zero on success, otherwise a negative error code.
*/
int coap_client_init(struct coap_client *client, const char *info);
/**
* @brief Send CoAP request
*
* Operation is handled asynchronously using a background thread.
* If the socket isn't connected to a destination address, user must provide a destination address,
* otherwise the address should be set as NULL.
* Once the callback is called with last block set as true, socket can be closed or
* used for another query.
*
* @param client Client instance.
* @param sock Open socket file descriptor.
* @param addr the destination address of the request.
* @param req CoAP request structure
* @param retries How many times to retry or -1 to use default.
* @return zero when operation started successfully or negative error code otherwise.
*/
int coap_client_req(struct coap_client *client, int sock, const struct sockaddr *addr,
struct coap_client_request *req, int retries);
/**
* @}
*/
#endif /* ZEPHYR_INCLUDE_NET_COAP_CLIENT_H_ */