/*
 * Copyright (c) 2016 Intel Corporation
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/**
 * @file
 *
 * @brief CoAP implementation for Zephyr.
 */

#ifndef __ZOAP_H__
#define __ZOAP_H__

#include <zephyr/types.h>
#include <stddef.h>
#include <stdbool.h>
#include <net/net_ip.h>

#include <misc/slist.h>

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @brief COAP library
 * @defgroup zoap COAP Library
 * @ingroup networking
 * @{
 */

/**
 * @deprecated This library is deprecated.
 */

/**
 * @brief Set of CoAP packet options we are aware of.
 *
 * Users may add options other than these to their packets, provided
 * they know how to format them correctly. The only restriction is
 * that all options must be added to a packet in numeric order.
 *
 * Refer to RFC 7252, section 12.2 for more information.
 */

/**
 * @deprecated This enum is deprecated.
 */
enum zoap_option_num {
	ZOAP_OPTION_IF_MATCH = 1,
	ZOAP_OPTION_URI_HOST = 3,
	ZOAP_OPTION_ETAG = 4,
	ZOAP_OPTION_IF_NONE_MATCH = 5,
	ZOAP_OPTION_OBSERVE = 6,
	ZOAP_OPTION_URI_PORT = 7,
	ZOAP_OPTION_LOCATION_PATH = 8,
	ZOAP_OPTION_URI_PATH = 11,
	ZOAP_OPTION_CONTENT_FORMAT = 12,
	ZOAP_OPTION_MAX_AGE = 14,
	ZOAP_OPTION_URI_QUERY = 15,
	ZOAP_OPTION_ACCEPT = 17,
	ZOAP_OPTION_LOCATION_QUERY = 20,
	ZOAP_OPTION_BLOCK2 = 23,
	ZOAP_OPTION_BLOCK1 = 27,
	ZOAP_OPTION_SIZE2 = 28,
	ZOAP_OPTION_PROXY_URI = 35,
	ZOAP_OPTION_PROXY_SCHEME = 39,
	ZOAP_OPTION_SIZE1 = 60,
};

/**
 * @brief Available request methods.
 *
 * To be used with zoap_header_set_code() when creating a request
 * or a response.
 */

/**
 * @deprecated This enum is deprecated.
 */
enum zoap_method {
	ZOAP_METHOD_GET = 1,
	ZOAP_METHOD_POST = 2,
	ZOAP_METHOD_PUT = 3,
	ZOAP_METHOD_DELETE = 4,
};


/**
 * @deprecated This macro is deprecated.
 */

#define ZOAP_REQUEST_MASK 0x07

/**
 * @brief CoAP packets may be of one of these types.
 */
/**
 * @deprecated This enum is deprecated.
 */
enum zoap_msgtype {
	/**
	 * Confirmable message.
	 *
	 * The packet is a request or response the destination end-point must
	 * acknowledge.
	 */
	ZOAP_TYPE_CON = 0,
	/**
	 * Non-confirmable message.
	 *
	 * The packet is a request or response that doesn't
	 * require acknowledgements.
	 */
	ZOAP_TYPE_NON_CON = 1,
	/**
	 * Acknowledge.
	 *
	 * Response to a confirmable message.
	 */
	ZOAP_TYPE_ACK = 2,
	/**
	 * Reset.
	 *
	 * Rejecting a packet for any reason is done by sending a message
	 * of this type.
	 */
	ZOAP_TYPE_RESET = 3
};

/**
 * @deprecated This macro is deprecated.
 */
#define zoap_make_response_code(clas, det) ((clas << 5) | (det))

/**
 * @brief Set of response codes available for a response packet.
 *
 * To be used with zoap_header_set_code() when creating a response.
 */
/**
 * @deprecated This enum is deprecated.
 */
enum zoap_response_code {
	ZOAP_RESPONSE_CODE_OK = zoap_make_response_code(2, 0),
	ZOAP_RESPONSE_CODE_CREATED = zoap_make_response_code(2, 1),
	ZOAP_RESPONSE_CODE_DELETED = zoap_make_response_code(2, 2),
	ZOAP_RESPONSE_CODE_VALID = zoap_make_response_code(2, 3),
	ZOAP_RESPONSE_CODE_CHANGED = zoap_make_response_code(2, 4),
	ZOAP_RESPONSE_CODE_CONTENT = zoap_make_response_code(2, 5),
	ZOAP_RESPONSE_CODE_CONTINUE = zoap_make_response_code(2, 31),
	ZOAP_RESPONSE_CODE_BAD_REQUEST = zoap_make_response_code(4, 0),
	ZOAP_RESPONSE_CODE_UNAUTHORIZED = zoap_make_response_code(4, 1),
	ZOAP_RESPONSE_CODE_BAD_OPTION = zoap_make_response_code(4, 2),
	ZOAP_RESPONSE_CODE_FORBIDDEN = zoap_make_response_code(4, 3),
	ZOAP_RESPONSE_CODE_NOT_FOUND = zoap_make_response_code(4, 4),
	ZOAP_RESPONSE_CODE_NOT_ALLOWED = zoap_make_response_code(4, 5),
	ZOAP_RESPONSE_CODE_NOT_ACCEPTABLE = zoap_make_response_code(4, 6),
	ZOAP_RESPONSE_CODE_INCOMPLETE = zoap_make_response_code(4, 8),
	ZOAP_RESPONSE_CODE_PRECONDITION_FAILED = zoap_make_response_code(4, 12),
	ZOAP_RESPONSE_CODE_REQUEST_TOO_LARGE = zoap_make_response_code(4, 13),
	ZOAP_RESPONSE_CODE_UNSUPPORTED_CONTENT_FORMAT = zoap_make_response_code(4, 15),
	ZOAP_RESPONSE_CODE_INTERNAL_ERROR = zoap_make_response_code(5, 0),
	ZOAP_RESPONSE_CODE_NOT_IMPLEMENTED = zoap_make_response_code(5, 1),
	ZOAP_RESPONSE_CODE_BAD_GATEWAY = zoap_make_response_code(5, 2),
	ZOAP_RESPONSE_CODE_SERVICE_UNAVAILABLE = zoap_make_response_code(5, 3),
	ZOAP_RESPONSE_CODE_GATEWAY_TIMEOUT = zoap_make_response_code(5, 4),
	ZOAP_RESPONSE_CODE_PROXYING_NOT_SUPPORTED = zoap_make_response_code(5, 5)
};

/**
 * @deprecated This macro is deprecated.
 */
#define ZOAP_CODE_EMPTY (0)

struct zoap_observer;
struct zoap_packet;
struct zoap_pending;
struct zoap_reply;
struct zoap_resource;

/**
 * @typedef zoap_method_t
 * @brief Type of the callback being called when a resource's method is
 * invoked by the remote entity.
 */
/**
 * @deprecated This callback is deprecated.
 */
typedef int (*zoap_method_t)(struct zoap_resource *resource,
			     struct zoap_packet *request,
			     const struct sockaddr *from);

/**
 * @typedef zoap_notify_t
 * @brief Type of the callback being called when a resource's has observers
 * to be informed when an update happens.
 */
/**
 * @deprecated This callback is deprecated.
 */
typedef void (*zoap_notify_t)(struct zoap_resource *resource,
			      struct zoap_observer *observer);

/**
 * @brief Description of CoAP resource.
 *
 * CoAP servers often want to register resources, so that clients can act on
 * them, by fetching their state or requesting updates to them.
 */
/**
 * @deprecated This struct is deprecated.
 */
struct zoap_resource {
	/** Which function to be called for each CoAP method */
	zoap_method_t get, post, put, del;
	zoap_notify_t notify;
	const char * const *path;
	void *user_data;
	sys_slist_t observers;
	int age;
};

/**
 * @brief Represents a remote device that is observing a local resource.
 */
/**
 * @deprecated This struct is deprecated.
 */
struct zoap_observer {
	sys_snode_t list;
	struct sockaddr addr;
	u8_t token[8];
	u8_t tkl;
};

/**
 * @brief Representation of a CoAP packet.
 */
/**
 * @deprecated This struct is deprecated.
 */
struct zoap_packet {
	struct net_pkt *pkt;
	u8_t *start; /* Start of the payload */
	u16_t total_size;
};

/**
 * @typedef zoap_reply_t
 * @brief Helper function to be called when a response matches the
 * a pending request.
 */
/**
 * @deprecated This callback is deprecated.
 */
typedef int (*zoap_reply_t)(const struct zoap_packet *response,
			    struct zoap_reply *reply,
			    const struct sockaddr *from);

/**
 * @brief Represents a request awaiting for an acknowledgment (ACK).
 */
/**
 * @deprecated This struct is deprecated.
 */
struct zoap_pending {
	struct net_pkt *pkt;
	struct sockaddr addr;
	s32_t timeout;
	u16_t id;
};

/**
 * @brief Represents the handler for the reply of a request, it is
 * also used when observing resources.
 */
/**
 * @deprecated This struct is deprecated.
 */
struct zoap_reply {
	zoap_reply_t reply;
	void *user_data;
	int age;
	u8_t token[8];
	u16_t id;
	u8_t tkl;
};

/**
 * @brief Indicates that the remote device referenced by @a addr, with
 * @a request, wants to observe a resource.
 *
 * @param observer Observer to be initialized
 * @param request Request on which the observer will be based
 * @param addr Address of the remote device
 */
/**
 * @deprecated This api is deprecated.
 */
void __deprecated zoap_observer_init(struct zoap_observer *observer,
				     const struct zoap_packet *request,
				     const struct sockaddr *addr);

/**
 * @brief After the observer is initialized, associate the observer
 * with an resource.
 *
 * @param resource Resource to add an observer
 * @param observer Observer to be added
 *
 * @return true if this is the first observer added to this resource.
 */
/**
 * @deprecated This api is deprecated.
 */
bool __deprecated zoap_register_observer(struct zoap_resource *resource,
					 struct zoap_observer *observer);

/**
 * @brief Remove this observer from the list of registered observers
 * of that resource.
 *
 * @param resource Resource in which to remove the observer
 * @param observer Observer to be removed
 */
/**
 * @deprecated This api is deprecated.
 */
void __deprecated zoap_remove_observer(struct zoap_resource *resource,
				       struct zoap_observer *observer);

/**
 * @brief Returns the observer that matches address @a addr.
 *
 * @param observers Pointer to the array of observers
 * @param len Size of the array of observers
 * @param addr Address of the endpoint observing a resource
 *
 * @return A pointer to a observer if a match is found, NULL
 * otherwise.
 */
/**
 * @deprecated This api is deprecated.
 */
struct zoap_observer * __deprecated zoap_find_observer_by_addr(
				struct zoap_observer *observers,
				size_t len,
				const struct sockaddr *addr);

/**
 * @brief Returns the next available observer representation.
 *
 * @param observers Pointer to the array of observers
 * @param len Size of the array of observers
 *
 * @return A pointer to a observer if there's an available observer,
 * NULL otherwise.
 */
/**
 * @deprecated This api is deprecated.
 */
struct zoap_observer * __deprecated zoap_observer_next_unused(
				struct zoap_observer *observers,
				size_t len);

/**
 * @brief Indicates that a reply is expected for @a request.
 *
 * @param reply Reply structure to be initialized
 * @param request Request from which @a reply will be based
 */
/**
 * @deprecated This api is deprecated.
 */
void __deprecated zoap_reply_init(struct zoap_reply *reply,
				  const struct zoap_packet *request);

/**
 * @brief Represents the value of a CoAP option.
 *
 * To be used with zoap_find_options().
 */
/**
 * @deprecated This struct is deprecated.
 */
struct zoap_option {
	u8_t *value;
	u16_t len;
};

/**
 * @brief Parses the CoAP packet in @a pkt, validating it and
 * initializing @a zpkt. @a pkt must remain valid while @a zpkt is used.
 *
 * @param zpkt Packet to be initialized from received @a pkt.
 * @param pkt Network Packet containing a CoAP packet, its @a data pointer is
 * positioned on the start of the CoAP packet.
 *
 * @return 0 in case of success or negative in case of error.
 */
/**
 * @deprecated This api is deprecated.
 */
int __deprecated zoap_packet_parse(struct zoap_packet *zpkt,
				   struct net_pkt *pkt);

/**
 * @brief Creates a new CoAP packet from a net_pkt. @a pkt must remain
 * valid while @a zpkt is used.
 *
 * @param zpkt New packet to be initialized using the storage from @a
 * pkt.
 * @param pkt Network Packet that will contain a CoAP packet
 *
 * @return 0 in case of success or negative in case of error.
 */
/**
 * @deprecated This api is deprecated.
 */
int __deprecated zoap_packet_init(struct zoap_packet *zpkt,
				  struct net_pkt *pkt);

/**
 * @brief Initialize a pending request with a request.
 *
 * The request's fields are copied into the pending struct, so @a
 * request doesn't have to live for as long as the pending struct
 * lives, but net_pkt needs to live for at least that long.
 *
 * @param pending Structure representing the waiting for a
 * confirmation message, initialized with data from @a request
 * @param request Message waiting for confirmation
 * @param addr Address to send the retransmission
 *
 * @return 0 in case of success or negative in case of error.
 */
/**
 * @deprecated This api is deprecated.
 */
int __deprecated zoap_pending_init(struct zoap_pending *pending,
				   const struct zoap_packet *request,
				   const struct sockaddr *addr);

/**
 * @brief Returns the next available pending struct, that can be used
 * to track the retransmission status of a request.
 *
 * @param pendings Pointer to the array of #zoap_pending structures
 * @param len Size of the array of #zoap_pending structures
 *
 * @return pointer to a free #zoap_pending structure, NULL in case
 * none could be found.
 */
/**
 * @deprecated This api is deprecated.
 */
struct zoap_pending * __deprecated zoap_pending_next_unused(
				struct zoap_pending *pendings,
				size_t len);

/**
 * @brief Returns the next available reply struct, so it can be used
 * to track replies and notifications received.
 *
 * @param replies Pointer to the array of #zoap_reply structures
 * @param len Size of the array of #zoap_reply structures
 *
 * @return pointer to a free #zoap_reply structure, NULL in case
 * none could be found.
 */
/**
 * @deprecated This api is deprecated.
 */
struct zoap_reply * __deprecated zoap_reply_next_unused(
				struct zoap_reply *replies, size_t len);

/**
 * @brief After a response is received, clear all pending
 * retransmissions related to that response.
 *
 * @param response The received response
 * @param pendings Pointer to the array of #zoap_reply structures
 * @param len Size of the array of #zoap_reply structures
 *
 * @return pointer to the associated #zoap_pending structure, NULL in
 * case none could be found.
 */
/**
 * @deprecated This api is deprecated.
 */
struct zoap_pending * __deprecated zoap_pending_received(
			const struct zoap_packet *response,
			struct zoap_pending *pendings, size_t len);

/**
 * @brief After a response is received, call zoap_reply_t handler
 * registered in #zoap_reply structure
 *
 * @param response A response received
 * @param from Address from which the response was received
 * @param replies Pointer to the array of #zoap_reply structures
 * @param len Size of the array of #zoap_reply structures
 *
 * @return Pointer to the reply matching the packet received, NULL if
 * none could be found.
 */
/**
 * @deprecated This api is deprecated.
 */
struct zoap_reply * __deprecated zoap_response_received(
			const struct zoap_packet *response,
			const struct sockaddr *from,
			struct zoap_reply *replies, size_t len);

/**
 * @brief Returns the next pending about to expire, pending->timeout
 * informs how many ms to next expiration.
 *
 * @param pendings Pointer to the array of #zoap_pending structures
 * @param len Size of the array of #zoap_pending structures
 *
 * @return The next #zoap_pending to expire, NULL if none is about to
 * expire.
 */
/**
 * @deprecated This api is deprecated.
 */
struct zoap_pending * __deprecated zoap_pending_next_to_expire(
				struct zoap_pending *pendings, size_t len);

/**
 * @brief After a request is sent, user may want to cycle the pending
 * retransmission so the timeout is updated.
 *
 * @param pending Pending representation to have its timeout updated
 *
 * @return false if this is the last retransmission.
 */
/**
 * @deprecated This api is deprecated.
 */
bool __deprecated zoap_pending_cycle(struct zoap_pending *pending);

/**
 * @brief Cancels the pending retransmission, so it again becomes
 * available.
 *
 * @param pending Pending representation to be canceled
 */
/**
 * @deprecated This api is deprecated.
 */
void __deprecated zoap_pending_clear(struct zoap_pending *pending);

/**
 * @brief Cancels awaiting for this reply, so it becomes available
 * again.
 *
 * @param reply The reply to be canceled
 */
/**
 * @deprecated This api is deprecated.
 */
void __deprecated zoap_reply_clear(struct zoap_reply *reply);

/**
 * @brief When a request is received, call the appropriate methods of
 * the matching resources.
 *
 * @param zpkt Packet received
 * @param resources Array of known resources
 * @param from Address from which the packet was received
 *
 * @return 0 in case of success or negative in case of error.
 */
/**
 * @deprecated This api is deprecated.
 */
int __deprecated zoap_handle_request(struct zoap_packet *zpkt,
				     struct zoap_resource *resources,
				     const struct sockaddr *from);

/**
 * @brief Indicates that this resource was updated and that the @a
 * notify callback should be called for every registered observer.
 *
 * @param resource Resource that was updated
 *
 * @return 0 in case of success or negative in case of error.
 */
/**
 * @deprecated This api is deprecated.
 */
int __deprecated zoap_resource_notify(struct zoap_resource *resource);

/**
 * @brief Returns if this request is enabling observing a resource.
 *
 * @param request Request to be checked
 *
 * @return True if the request is enabling observing a resource, False
 * otherwise
 */
/**
 * @deprecated This api is deprecated.
 */
bool __deprecated zoap_request_is_observe(const struct zoap_packet *request);

/**
 * @brief Returns a pointer to the start of the payload and its size
 *
 * It will insert the COAP_MARKER (0xFF), if its not set, and return the
 * available size for the payload.
 *
 * @param zpkt Packet to get (or insert) the payload
 * @param len Amount of space for the payload
 *
 * @return pointer to the start of the payload, NULL in case of error.
 */
/**
 * @deprecated This api is deprecated.
 */
u8_t * __deprecated zoap_packet_get_payload(struct zoap_packet *zpkt,
					    u16_t *len);

/**
 * @brief Sets how much space was used by the payload.
 *
 * Used for outgoing packets, after zoap_packet_get_payload(), to
 * update the internal representation with the amount of data that was
 * added to the packet.
 *
 * @param zpkt Packet to be updated
 * @param len Amount of data that was added to the payload
 *
 * @return 0 in case of success or negative in case of error.
 */
/**
 * @deprecated This api is deprecated.
 */
int __deprecated zoap_packet_set_used(struct zoap_packet *zpkt, u16_t len);

/**
 * @brief Adds an option to the packet.
 *
 * Note: options must be added in numeric order of their codes.
 *
 * @param zpkt Packet to be updated
 * @param code Option code to add to the packet, see #zoap_option_num
 * @param value Pointer to the value of the option, will be copied to the packet
 * @param len Size of the data to be added
 *
 * @return 0 in case of success or negative in case of error.
 */
/**
 * @deprecated This api is deprecated.
 */
int __deprecated zoap_add_option(struct zoap_packet *zpkt, u16_t code,
				 const void *value, u16_t len);

/**
 * @brief Converts an option to its integer representation.
 *
 * Assumes that the number is encoded in the network byte order in the
 * option.
 *
 * @param option Pointer to the option value, retrieved by
 * zoap_find_options()
 *
 * @return The integer representation of the option
 */
/**
 * @deprecated This api is deprecated.
 */
unsigned int __deprecated zoap_option_value_to_int(
					const struct zoap_option *option);

/**
 * @brief Adds an integer value option to the packet.
 *
 * The option must be added in numeric order of their codes, and the
 * least amount of bytes will be used to encode the value.
 *
 * @param zpkt Packet to be updated
 * @param code Option code to add to the packet, see #zoap_option_num
 * @param val Integer value to be added
 *
 * @return 0 in case of success or negative in case of error.
 */
/**
 * @deprecated This api is deprecated.
 */
int __deprecated zoap_add_option_int(struct zoap_packet *zpkt, u16_t code,
				     unsigned int val);

/**
 * @brief Return the values associated with the option of value @a
 * code.
 *
 * @param zpkt CoAP packet representation
 * @param code Option number to look for
 * @param options Array of #zoap_option where to store the value
 * of the options found
 * @param veclen Number of elements in the options array
 *
 * @return The number of options found in packet matching code,
 * negative on error.
 */
/**
 * @deprecated This api is deprecated.
 */
int __deprecated zoap_find_options(const struct zoap_packet *zpkt, u16_t code,
				   struct zoap_option *options, u16_t veclen);

/**
 * Represents the size of each block that will be transferred using
 * block-wise transfers [RFC7959]:
 *
 * Each entry maps directly to the value that is used in the wire.
 *
 * https://tools.ietf.org/html/rfc7959
 */
/**
 * @deprecated This enum is deprecated.
 */
enum zoap_block_size {
	ZOAP_BLOCK_16,
	ZOAP_BLOCK_32,
	ZOAP_BLOCK_64,
	ZOAP_BLOCK_128,
	ZOAP_BLOCK_256,
	ZOAP_BLOCK_512,
	ZOAP_BLOCK_1024,
};

/**
 * @brief Helper for converting the enumeration to the size expressed
 * in bytes.
 *
 * @param block_size The block size to be converted
 *
 * @return The size in bytes that the block_size represents
 */
/**
 * @deprecated This api is deprecated.
 */
static inline u16_t __deprecated zoap_block_size_to_bytes(
				enum zoap_block_size block_size)
{
	return (1 << (block_size + 4));
}

/**
 * @brief Represents the current state of a block-wise transaction.
 */
/**
 * @deprecated This struct is deprecated.
 */
struct zoap_block_context {
	size_t total_size;
	size_t current;
	enum zoap_block_size block_size;
};

/**
 * @brief Initializes the context of a block-wise transfer.
 *
 * @param ctx The context to be initialized
 * @param block_size The size of the block
 * @param total_size The total size of the transfer, if known
 *
 * @return 0 in case of success or negative in case of error.
 */
/**
 * @deprecated This api is deprecated.
 */
int __deprecated zoap_block_transfer_init(struct zoap_block_context *ctx,
					  enum zoap_block_size block_size,
					  size_t total_size);

/**
 * @brief Add BLOCK1 option to the packet.
 *
 * @param zpkt Packet to be updated
 * @param ctx Block context from which to retrieve the
 * information for the Block1 option
 *
 * @return 0 in case of success or negative in case of error.
 */
/**
 * @deprecated This api is deprecated.
 */
int __deprecated zoap_add_block1_option(struct zoap_packet *zpkt,
					struct zoap_block_context *ctx);

/**
 * @brief Add BLOCK2 option to the packet.
 *
 * @param zpkt Packet to be updated
 * @param ctx Block context from which to retrieve the
 * information for the Block2 option
 *
 * @return 0 in case of success or negative in case of error.
 */
/**
 * @deprecated This api is deprecated.
 */
int __deprecated zoap_add_block2_option(struct zoap_packet *zpkt,
					struct zoap_block_context *ctx);

/**
 * @brief Add SIZE1 option to the packet.
 *
 * @param zpkt Packet to be updated
 * @param ctx Block context from which to retrieve the
 * information for the Size1 option
 *
 * @return 0 in case of success or negative in case of error.
 */
/**
 * @deprecated This api is deprecated.
 */
int __deprecated zoap_add_size1_option(struct zoap_packet *zpkt,
				       struct zoap_block_context *ctx);

/**
 * @brief Add SIZE2 option to the packet.
 *
 * @param zpkt Packet to be updated
 * @param ctx Block context from which to retrieve the
 * information for the Size2 option
 *
 * @return 0 in case of success or negative in case of error.
 */
/**
 * @deprecated This api is deprecated.
 */
int __deprecated zoap_add_size2_option(struct zoap_packet *zpkt,
				       struct zoap_block_context *ctx);

/**
 * @brief Retrieves BLOCK{1,2} and SIZE{1,2} from @a zpkt and updates
 * @a ctx accordingly.
 *
 * @param zpkt Packet in which to look for block-wise transfers options
 * @param ctx Block context to be updated
 *
 * @return 0 in case of success or negative in case of error.
 */
/**
 * @deprecated This api is deprecated.
 */
int __deprecated zoap_update_from_block(const struct zoap_packet *zpkt,
					struct zoap_block_context *ctx);

/**
 * @brief Updates @a ctx so after this is called the current entry
 * indicates the correct offset in the body of data being
 * transferred.
 *
 * @param zpkt Packet in which to look for block-wise transfers options
 * @param ctx Block context to be updated
 *
 * @return The offset in the block-wise transfer, 0 if the transfer
 * has finished.
 */
/**
 * @deprecated This api is deprecated.
 */
size_t __deprecated zoap_next_block(const struct zoap_packet *zpkt,
				    struct zoap_block_context *ctx);

/**
 * @brief Returns the version present in a CoAP packet.
 *
 * @param zpkt CoAP packet representation
 *
 * @return the CoAP version in packet
 */
/**
 * @deprecated This api is deprecated.
 */
u8_t __deprecated zoap_header_get_version(const struct zoap_packet *zpkt);

/**
 * @brief Returns the type of the CoAP packet.
 *
 * @param zpkt CoAP packet representation
 *
 * @return the type of the packet
 */
/**
 * @deprecated This api is deprecated.
 */
u8_t __deprecated zoap_header_get_type(const struct zoap_packet *zpkt);

/**
 * @brief Returns the token (if any) in the CoAP packet.
 *
 * @param zpkt CoAP packet representation
 * @param len Where to store the length of the token
 *
 * @return pointer to the start of the token in the CoAP packet.
 */
/**
 * @deprecated This api is deprecated.
 */
const u8_t * __deprecated zoap_header_get_token(const struct zoap_packet *zpkt,
						u8_t *len);

/**
 * @brief Returns the code of the CoAP packet.
 *
 * @param zpkt CoAP packet representation
 *
 * @return the code present in the packet
 */
/**
 * @deprecated This api is deprecated.
 */
u8_t __deprecated zoap_header_get_code(const struct zoap_packet *zpkt);

/**
 * @brief Returns the message id associated with the CoAP packet.
 *
 * @param zpkt CoAP packet representation
 *
 * @return the message id present in the packet
 */
/**
 * @deprecated This api is deprecated.
 */
u16_t __deprecated zoap_header_get_id(const struct zoap_packet *zpkt);

/**
 * @brief Sets the version of the CoAP packet.
 *
 * @param zpkt CoAP packet representation
 * @param ver The CoAP version to set in the packet
 */
/**
 * @deprecated This api is deprecated.
 */
void __deprecated zoap_header_set_version(struct zoap_packet *zpkt, u8_t ver);

/**
 * @brief Sets the type of the CoAP packet.
 *
 * @param zpkt CoAP packet representation
 * @param type The packet type to set
 */
/**
 * @deprecated This api is deprecated.
 */
void __deprecated zoap_header_set_type(struct zoap_packet *zpkt, u8_t type);

/**
 * @brief Sets the token in the CoAP packet.
 *
 * @param zpkt CoAP packet representation
 * @param token Token to set in the packet, will be copied
 * @param tokenlen Size of the token to be set, 8 bytes maximum
 *
 * @return 0 in case of success or negative in case of error.
 */
/**
 * @deprecated This api is deprecated.
 */
int __deprecated zoap_header_set_token(struct zoap_packet *zpkt,
				       const u8_t *token,
				       u8_t tokenlen);

/**
 * @brief Sets the code present in the CoAP packet.
 *
 * @param zpkt CoAP packet representation
 * @param code The code set in the packet
 */
/**
 * @deprecated This api is deprecated.
 */
void __deprecated zoap_header_set_code(struct zoap_packet *zpkt, u8_t code);

/**
 * @brief Sets the message id present in the CoAP packet.
 *
 * @param zpkt CoAP packet representation
 * @param id The message id to set in the packet
 */
/**
 * @deprecated This api is deprecated.
 */
void __deprecated zoap_header_set_id(struct zoap_packet *zpkt, u16_t id);

/**
 * @brief Helper to generate message ids
 *
 * @return a new message id
 */
/**
 * @deprecated This api is deprecated.
 */
static inline u16_t __deprecated zoap_next_id(void)
{
	static u16_t message_id;

	return ++message_id;
}

/**
 * @brief Returns a randomly generated array of 8 bytes, that can be
 * used as a message's token.
 *
 * @return a 8-byte pseudo-random token.
 */
/**
 * @deprecated This api is deprecated.
 */
u8_t * __deprecated zoap_next_token(void);

/**
 * @}
 */

#ifdef __cplusplus
}
#endif

#endif /* __ZOAP_H__ */
