libcoap 4.3.5-develop-19cef11
coap_net.c File Reference

CoAP context functions. More...

#include "coap3/coap_libcoap_build.h"
#include "coap3/coap_mutex_internal.h"
#include <ctype.h>
#include <stdio.h>
+ Include dependency graph for coap_net.c:

Go to the source code of this file.

Macros

#define INET6_ADDRSTRLEN   40
 
#define min(a, b)   ((a) < (b) ? (a) : (b))
 
#define FRAC_BITS   6
 The number of bits for the fractional part of ACK_TIMEOUT and ACK_RANDOM_FACTOR. More...
 
#define MAX_BITS   8
 The maximum number of bits for fixed point integers that are used for retransmission time calculation. More...
 
#define Q(frac, fval)
 creates a Qx.frac from fval in coap_fixed_point_t More...
 
#define ACK_RANDOM_FACTOR    Q(FRAC_BITS, session->ack_random_factor)
 creates a Qx.FRAC_BITS from session's 'ack_random_factor' More...
 
#define ACK_TIMEOUT   Q(FRAC_BITS, session->ack_timeout)
 creates a Qx.FRAC_BITS from session's 'ack_timeout' More...
 
#define FP1   Q(FRAC_BITS, ((coap_fixed_point_t){1,0}))
 
#define SHR_FP(val, frac)   (((val) + (1 << ((frac) - 1))) >> (frac))
 

Functions

COAP_STATIC_INLINE coap_queue_tcoap_malloc_node (void)
 
COAP_STATIC_INLINE void coap_free_node (coap_queue_t *node)
 
unsigned int coap_adjust_basetime (coap_context_t *ctx, coap_tick_t now)
 Set sendqueue_basetime in the given context object ctx to now. More...
 
int coap_insert_node (coap_queue_t **queue, coap_queue_t *node)
 Adds node to given queue, ordered by variable t in node. More...
 
COAP_API int coap_delete_node (coap_queue_t *node)
 Destroys specified node. More...
 
int coap_delete_node_lkd (coap_queue_t *node)
 Destroys specified node. More...
 
void coap_delete_all (coap_queue_t *queue)
 Removes all items from given queue and frees the allocated storage. More...
 
coap_queue_tcoap_new_node (void)
 Creates a new node suitable for adding to the CoAP sendqueue. More...
 
coap_queue_tcoap_peek_next (coap_context_t *context)
 Returns the next pdu to send without removing from sendqeue. More...
 
coap_queue_tcoap_pop_next (coap_context_t *context)
 Returns the next pdu to send and removes it from the sendqeue. More...
 
COAP_API int coap_context_set_pki_root_cas (coap_context_t *ctx, const char *ca_file, const char *ca_dir)
 Set the context's default Root CA information for a client or server. More...
 
int coap_context_set_pki_root_cas_lkd (coap_context_t *ctx, const char *ca_file, const char *ca_dir)
 Set the context's default Root CA information for a client or server. More...
 
void coap_context_set_keepalive (coap_context_t *context, unsigned int seconds)
 Set the context keepalive timer for sessions. More...
 
int coap_context_set_cid_tuple_change (coap_context_t *context, uint8_t every)
 Set the Connection ID client tuple frequency change for testing CIDs. More...
 
void coap_context_set_max_token_size (coap_context_t *context, size_t max_token_size)
 Set the maximum token size (RFC8974). More...
 
void coap_context_set_max_idle_sessions (coap_context_t *context, unsigned int max_idle_sessions)
 Set the maximum idle sessions count. More...
 
unsigned int coap_context_get_max_idle_sessions (const coap_context_t *context)
 Get the maximum idle sessions count. More...
 
void coap_context_set_max_handshake_sessions (coap_context_t *context, unsigned int max_handshake_sessions)
 Set the maximum number of sessions in (D)TLS handshake value. More...
 
unsigned int coap_context_get_max_handshake_sessions (const coap_context_t *context)
 Get the session timeout value. More...
 
void coap_context_set_csm_timeout (coap_context_t *context, unsigned int csm_timeout)
 Set the CSM timeout value. More...
 
unsigned int coap_context_get_csm_timeout (const coap_context_t *context)
 Get the CSM timeout value. More...
 
void coap_context_set_csm_timeout_ms (coap_context_t *context, unsigned int csm_timeout_ms)
 Set the CSM timeout value. More...
 
unsigned int coap_context_get_csm_timeout_ms (const coap_context_t *context)
 Get the CSM timeout value. More...
 
void coap_context_set_csm_max_message_size (coap_context_t *context, uint32_t csm_max_message_size)
 Set the CSM max session size value. More...
 
uint32_t coap_context_get_csm_max_message_size (const coap_context_t *context)
 Get the CSM max session size value. More...
 
void coap_context_set_session_timeout (coap_context_t *context, unsigned int session_timeout)
 Set the session timeout value. More...
 
unsigned int coap_context_get_session_timeout (const coap_context_t *context)
 Get the session timeout value. More...
 
int coap_context_get_coap_fd (const coap_context_t *context)
 Get the libcoap internal file descriptor for using in an application's select() or returned as an event in an application's epoll_wait() call. More...
 
int coap_epoll_is_supported (void)
 Determine whether epoll is supported or not. More...
 
int coap_threadsafe_is_supported (void)
 Determine whether libcoap is threadsafe or not. More...
 
int coap_ipv4_is_supported (void)
 Check whether IPv4 is available. More...
 
int coap_ipv6_is_supported (void)
 Check whether IPv6 is available. More...
 
int coap_client_is_supported (void)
 Check whether Client code is available. More...
 
int coap_server_is_supported (void)
 Check whether Server code is available. More...
 
int coap_af_unix_is_supported (void)
 Check whether socket type AF_UNIX is available. More...
 
void coap_context_set_app_data (coap_context_t *context, void *app_data)
 Stores data with the given context. More...
 
void * coap_context_get_app_data (const coap_context_t *context)
 Returns any application-specific data that has been stored with context using the function coap_context_set_app_data(). More...
 
coap_context_tcoap_new_context (const coap_address_t *listen_addr)
 Creates a new coap_context_t object that will hold the CoAP stack status. More...
 
void coap_set_app_data (coap_context_t *ctx, void *app_data)
 
void * coap_get_app_data (const coap_context_t *ctx)
 
COAP_API void coap_free_context (coap_context_t *context)
 CoAP stack context must be released with coap_free_context(). More...
 
void coap_free_context_lkd (coap_context_t *context)
 CoAP stack context must be released with coap_free_context_lkd(). More...
 
int coap_option_check_critical (coap_session_t *session, coap_pdu_t *pdu, coap_opt_filter_t *unknown)
 Verifies that pdu contains no unknown critical options. More...
 
COAP_API coap_mid_t coap_send_rst (coap_session_t *session, const coap_pdu_t *request)
 Sends an RST message with code 0 for the specified request to dst. More...
 
coap_mid_t coap_send_rst_lkd (coap_session_t *session, const coap_pdu_t *request)
 Sends an RST message with code 0 for the specified request to dst. More...
 
COAP_API coap_mid_t coap_send_ack (coap_session_t *session, const coap_pdu_t *request)
 Sends an ACK message with code 0 for the specified request to dst. More...
 
coap_mid_t coap_send_ack_lkd (coap_session_t *session, const coap_pdu_t *request)
 Sends an ACK message with code 0 for the specified request to dst. More...
 
ssize_t coap_session_send_pdu (coap_session_t *session, coap_pdu_t *pdu)
 Send a pdu according to the session's protocol. More...
 
static ssize_t coap_send_pdu (coap_session_t *session, coap_pdu_t *pdu, coap_queue_t *node)
 
COAP_API coap_mid_t coap_send_error (coap_session_t *session, const coap_pdu_t *request, coap_pdu_code_t code, coap_opt_filter_t *opts)
 Sends an error response with code code for request request to dst. More...
 
coap_mid_t coap_send_error_lkd (coap_session_t *session, const coap_pdu_t *request, coap_pdu_code_t code, coap_opt_filter_t *opts)
 Sends an error response with code code for request request to dst. More...
 
COAP_API coap_mid_t coap_send_message_type (coap_session_t *session, const coap_pdu_t *request, coap_pdu_type_t type)
 Helper function to create and send a message with type (usually ACK or RST). More...
 
coap_mid_t coap_send_message_type_lkd (coap_session_t *session, const coap_pdu_t *request, coap_pdu_type_t type)
 Helper function to create and send a message with type (usually ACK or RST). More...
 
unsigned int coap_calc_timeout (coap_session_t *session, unsigned char r)
 Calculates the initial timeout based on the session CoAP transmission parameters 'ack_timeout', 'ack_random_factor', and COAP_TICKS_PER_SECOND. More...
 
coap_mid_t coap_wait_ack (coap_context_t *context, coap_session_t *session, coap_queue_t *node)
 
int coap_client_delay_first (coap_session_t *session)
 Delay the sending of the first client request until some other negotiation has completed. More...
 
int coap_check_code_class (coap_session_t *session, coap_pdu_t *pdu)
 Check whether the pdu contains a valid code class. More...
 
COAP_API coap_mid_t coap_send (coap_session_t *session, coap_pdu_t *pdu)
 Sends a CoAP message to given peer. More...
 
coap_mid_t coap_send_lkd (coap_session_t *session, coap_pdu_t *pdu)
 Sends a CoAP message to given peer. More...
 
coap_mid_t coap_send_internal (coap_session_t *session, coap_pdu_t *pdu)
 Sends a CoAP message to given peer. More...
 
void coap_send_recv_terminate (void)
 Terminate any active coap_send_recv() sessions. More...
 
COAP_API int coap_send_recv (coap_session_t *session, coap_pdu_t *request_pdu, coap_pdu_t **response_pdu, uint32_t timeout_ms)
 
int coap_send_recv_lkd (coap_session_t *session, coap_pdu_t *request_pdu, coap_pdu_t **response_pdu, uint32_t timeout_ms)
 
coap_mid_t coap_retransmit (coap_context_t *context, coap_queue_t *node)
 Handles retransmissions of confirmable messages. More...
 
static int coap_handle_dgram_for_proto (coap_context_t *ctx, coap_session_t *session, coap_packet_t *packet)
 
static void coap_write_session (coap_context_t *ctx, coap_session_t *session, coap_tick_t now)
 
void coap_read_session (coap_context_t *ctx, coap_session_t *session, coap_tick_t now)
 
COAP_API void coap_io_do_io (coap_context_t *ctx, coap_tick_t now)
 Processes any outstanding read, write, accept or connect I/O as indicated in the coap_socket_t structures (COAP_SOCKET_CAN_xxx set) embedded in endpoints or sessions associated with ctx. More...
 
void coap_io_do_io_lkd (coap_context_t *ctx, coap_tick_t now)
 Processes any outstanding read, write, accept or connect I/O as indicated in the coap_socket_t structures (COAP_SOCKET_CAN_xxx set) embedded in endpoints or sessions associated with ctx. More...
 
COAP_API void coap_io_do_epoll (coap_context_t *ctx, struct epoll_event *events, size_t nevents)
 Process all the epoll events. More...
 
void coap_io_do_epoll_lkd (coap_context_t *ctx, struct epoll_event *events, size_t nevents)
 Process all the epoll events. More...
 
int coap_handle_dgram (coap_context_t *ctx, coap_session_t *session, uint8_t *msg, size_t msg_len)
 Parses and interprets a CoAP datagram with context ctx. More...
 
int coap_remove_from_queue (coap_queue_t **queue, coap_session_t *session, coap_mid_t id, coap_queue_t **node)
 This function removes the element with given id from the list given list. More...
 
void coap_cancel_session_messages (coap_context_t *context, coap_session_t *session, coap_nack_reason_t reason)
 Cancels all outstanding messages for session session. More...
 
void coap_cancel_all_messages (coap_context_t *context, coap_session_t *session, coap_bin_const_t *token)
 Cancels all outstanding messages for session session that have the specified token. More...
 
coap_pdu_tcoap_new_error_response (const coap_pdu_t *request, coap_pdu_code_t code, coap_opt_filter_t *opts)
 Creates a new ACK PDU with specified error code. More...
 
static int coap_cancel (coap_context_t *context, const coap_queue_t *sent)
 This function cancels outstanding messages for the session and token specified in sent. More...
 
static void handle_signaling (coap_context_t *context, coap_session_t *session, coap_pdu_t *pdu)
 
static int check_token_size (coap_session_t *session, const coap_pdu_t *pdu)
 
void coap_dispatch (coap_context_t *context, coap_session_t *session, coap_pdu_t *pdu)
 Dispatches the PDUs from the receive queue in given context. More...
 
static const char * coap_event_name (coap_event_t event)
 
COAP_API int coap_handle_event (coap_context_t *context, coap_event_t event, coap_session_t *session)
 Invokes the event handler of context for the given event and data. More...
 
int coap_handle_event_lkd (coap_context_t *context, coap_event_t event, coap_session_t *session)
 Invokes the event handler of context for the given event and data. More...
 
COAP_API int coap_can_exit (coap_context_t *context)
 Returns 1 if there are no messages to send or to dispatch in the context's queues. More...
 
int coap_can_exit_lkd (coap_context_t *context)
 Returns 1 if there are no messages to send or to dispatch in the context's queues. More...
 
void coap_startup (void)
 
void coap_cleanup (void)
 
void coap_register_response_handler (coap_context_t *context, coap_response_handler_t handler)
 Registers a new message handler that is called whenever a response is received. More...
 
void coap_register_nack_handler (coap_context_t *context, coap_nack_handler_t handler)
 Registers a new message handler that is called whenever a confirmable message (request or response) is dropped after all retries have been exhausted, or a rst message was received, or a network or TLS level event was received that indicates delivering the message is not possible. More...
 
void coap_register_ping_handler (coap_context_t *context, coap_ping_handler_t handler)
 Registers a new message handler that is called whenever a CoAP Ping message is received. More...
 
void coap_register_pong_handler (coap_context_t *context, coap_pong_handler_t handler)
 Registers a new message handler that is called whenever a CoAP Pong message is received. More...
 
COAP_API void coap_register_option (coap_context_t *ctx, uint16_t type)
 Registers the option type type with the given context object ctx. More...
 
void coap_register_option_lkd (coap_context_t *ctx, uint16_t type)
 Registers the option type type with the given context object ctx. More...
 

Variables

static unsigned int s_csm_timeout = 30
 
static int send_recv_terminate = 0
 
int coap_started = 0
 

Detailed Description

CoAP context functions.

Definition in file coap_net.c.

Macro Definition Documentation

◆ ACK_RANDOM_FACTOR

#define ACK_RANDOM_FACTOR    Q(FRAC_BITS, session->ack_random_factor)

creates a Qx.FRAC_BITS from session's 'ack_random_factor'

Definition at line 97 of file coap_net.c.

◆ ACK_TIMEOUT

#define ACK_TIMEOUT   Q(FRAC_BITS, session->ack_timeout)

creates a Qx.FRAC_BITS from session's 'ack_timeout'

Definition at line 101 of file coap_net.c.

◆ FP1

#define FP1   Q(FRAC_BITS, ((coap_fixed_point_t){1,0}))

◆ FRAC_BITS

#define FRAC_BITS   6

The number of bits for the fractional part of ACK_TIMEOUT and ACK_RANDOM_FACTOR.

Must be less or equal 8.

Definition at line 80 of file coap_net.c.

◆ INET6_ADDRSTRLEN

#define INET6_ADDRSTRLEN   40

Definition at line 69 of file coap_net.c.

◆ MAX_BITS

#define MAX_BITS   8

The maximum number of bits for fixed point integers that are used for retransmission time calculation.

Currently this must be 8.

Definition at line 86 of file coap_net.c.

◆ min

#define min (   a,
 
)    ((a) < (b) ? (a) : (b))

Definition at line 73 of file coap_net.c.

◆ Q

#define Q (   frac,
  fval 
)
Value:
((uint16_t)(((1 << (frac)) * fval.integer_part) + \
((1 << (frac)) * fval.fractional_part + 500)/1000))

creates a Qx.frac from fval in coap_fixed_point_t

Definition at line 93 of file coap_net.c.

◆ SHR_FP

#define SHR_FP (   val,
  frac 
)    (((val) + (1 << ((frac) - 1))) >> (frac))

Function Documentation

◆ check_token_size()

static int check_token_size ( coap_session_t session,
const coap_pdu_t pdu 
)
static

Definition at line 3986 of file coap_net.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ coap_cancel()

static int coap_cancel ( coap_context_t context,
const coap_queue_t sent 
)
static

This function cancels outstanding messages for the session and token specified in sent.

Any observation relationship for sent->session and the token are removed. Calling this function is required when receiving an RST message (usually in response to a notification) or a GET request with the Observe option set to 1.

This function returns 0 when the token is unknown with this peer, or a value greater than zero otherwise.

Definition at line 3007 of file coap_net.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ coap_cleanup()

void coap_cleanup ( void  )

Definition at line 4662 of file coap_net.c.

+ Here is the call graph for this function:

◆ coap_event_name()

static const char * coap_event_name ( coap_event_t  event)
static

Definition at line 4419 of file coap_net.c.

+ Here is the caller graph for this function:

◆ coap_free_node()

COAP_STATIC_INLINE void coap_free_node ( coap_queue_t node)

Definition at line 111 of file coap_net.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ coap_handle_dgram_for_proto()

static int coap_handle_dgram_for_proto ( coap_context_t ctx,
coap_session_t session,
coap_packet_t packet 
)
static

Definition at line 2156 of file coap_net.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ coap_malloc_node()

COAP_STATIC_INLINE coap_queue_t * coap_malloc_node ( void  )

Definition at line 106 of file coap_net.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ coap_send_pdu()

static ssize_t coap_send_pdu ( coap_session_t session,
coap_pdu_t pdu,
coap_queue_t node 
)
static

Definition at line 1014 of file coap_net.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ coap_startup()

void coap_startup ( void  )

Definition at line 4616 of file coap_net.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ coap_write_session()

static void coap_write_session ( coap_context_t ctx,
coap_session_t session,
coap_tick_t  now 
)
static

Definition at line 2197 of file coap_net.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ handle_signaling()

static void handle_signaling ( coap_context_t context,
coap_session_t session,
coap_pdu_t pdu 
)
static

Definition at line 3913 of file coap_net.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

Variable Documentation

◆ coap_started

int coap_started = 0

Definition at line 4606 of file coap_net.c.

◆ s_csm_timeout

unsigned int s_csm_timeout = 30
static

Definition at line 503 of file coap_net.c.

◆ send_recv_terminate

int send_recv_terminate = 0
static

Definition at line 1908 of file coap_net.c.