18#ifndef COAP_SESSION_INTERNAL_H_
19#define COAP_SESSION_INTERNAL_H_
27#define COAP_DEFAULT_SESSION_TIMEOUT 300
28#define COAP_PARTIAL_SESSION_TIMEOUT_TICKS (30 * COAP_TICKS_PER_SECOND)
29#define COAP_DEFAULT_MAX_HANDSHAKE_SESSIONS 100
82#if COAP_CLIENT_SUPPORT
86#if COAP_SERVER_SUPPORT
87 unsigned ref_subscriptions;
88 unsigned ref_proxy_subs;
92#if COAP_SERVER_SUPPORT
106#if COAP_CLIENT_SUPPORT
109#if COAP_SERVER_SUPPORT
168#if COAP_Q_BLOCK_SUPPORT
169 uint16_t max_payloads;
171 uint16_t non_max_retransmit;
192#if COAP_CLIENT_SUPPORT
200#if COAP_OSCORE_SUPPORT
201 uint8_t oscore_encryption;
213#if COAP_OSCORE_SUPPORT
219#if COAP_CLIENT_SUPPORT
220 uint8_t negotiated_cid;
221 uint8_t doing_send_recv;
222 uint8_t session_failed;
223 uint8_t client_initiated;
240#if COAP_SERVER_SUPPORT
243 coap_digest_t cached_pdu_cksum;
245#if COAP_CLIENT_SUPPORT
249#if COAP_PROXY_SUPPORT
255#if COAP_SERVER_SUPPORT
264 uint16_t default_mtu;
372#if COAP_SERVER_SUPPORT
471#if COAP_SERVER_SUPPORT
633 const char *identity,
779#define COAP_SESSION_REF(s) ((s)->ref
782#define COAP_ACK_TIMEOUT(s) ((s)->ack_timeout)
783#define COAP_ACK_RANDOM_FACTOR(s) ((s)->ack_random_factor)
784#define COAP_MAX_RETRANSMIT(s) ((s)->max_retransmit)
785#define COAP_NSTART(s) ((s)->nstart)
786#define COAP_DEFAULT_LEISURE(s) ((s)->default_leisure)
787#define COAP_PROBING_RATE(s) ((s)->probing_rate)
789#define COAP_MAX_PAYLOADS(s) ((s)->max_payloads)
790#define COAP_NON_MAX_RETRANSMIT(s) ((s)->non_max_retransmit)
791#define COAP_NON_TIMEOUT(s) ((s)->non_timeout)
792#define COAP_NON_TIMEOUT_TICKS(s) \
793 (COAP_NON_TIMEOUT(s).integer_part * COAP_TICKS_PER_SECOND + \
794 COAP_NON_TIMEOUT(s).fractional_part * COAP_TICKS_PER_SECOND / 1000)
795#define COAP_NON_RECEIVE_TIMEOUT(s) ((s)->non_receive_timeout)
796#define COAP_NON_PROBING_WAIT_BASE(s) ((s)->non_probing_wait_base)
797#define COAP_NON_PARTIAL_TIMEOUT(s) ((s)->non_partial_timeout)
805#define COAP_DEFAULT_LEISURE_TICKS(s) \
806 (COAP_DEFAULT_LEISURE(s).integer_part * COAP_TICKS_PER_SECOND + \
807 COAP_DEFAULT_LEISURE(s).fractional_part * COAP_TICKS_PER_SECOND / 1000)
814#define COAP_MAX_TRANSMIT_SPAN(s) \
815 (((s)->ack_timeout.integer_part * 1000 + (s)->ack_timeout.fractional_part) * \
816 ((1 << ((s)->max_retransmit)) -1) * \
817 ((s)->ack_random_factor.integer_part * 1000 + \
818 (s)->ack_random_factor.fractional_part) \
827#define COAP_MAX_TRANSMIT_WAIT(s) \
828 (((s)->ack_timeout.integer_part * 1000 + (s)->ack_timeout.fractional_part) * \
829 ((1 << ((s)->max_retransmit + 1)) -1) * \
830 ((s)->ack_random_factor.integer_part * 1000 + \
831 (s)->ack_random_factor.fractional_part) \
834#define COAP_MAX_TRANSMIT_WAIT_TICKS(s) \
835 (COAP_MAX_TRANSMIT_WAIT(s) * COAP_TICKS_PER_SECOND)
843#define COAP_PROCESSING_DELAY(s) \
844 (((s)->ack_timeout.integer_part * 1000 + (s)->ack_timeout.fractional_part + \
853#define COAP_MAX_RTT(s) \
854 ((2 * COAP_DEFAULT_MAX_LATENCY) + COAP_PROCESSING_DELAY(s))
862#define COAP_EXCHANGE_LIFETIME(s) \
863 (COAP_MAX_TRANSMIT_SPAN(s) + (2 * COAP_DEFAULT_MAX_LATENCY) + \
864 COAP_PROCESSING_DELAY(s))
872#define COAP_NON_LIFETIME(s) \
873 (COAP_MAX_TRANSMIT_SPAN(s) + COAP_DEFAULT_MAX_LATENCY)
881#define COAP_NON_RECEIVE_TIMEOUT_TICKS(s) ( \
882 COAP_NON_RECEIVE_TIMEOUT(s).integer_part * COAP_TICKS_PER_SECOND + \
883 COAP_NON_RECEIVE_TIMEOUT(s).fractional_part * COAP_TICKS_PER_SECOND / 1000)
893#define COAP_NON_PROBING_WAIT(s) \
894 coap_add_fixed_fixed(COAP_NON_PROBING_WAIT_BASE(s), \
895 COAP_NON_TIMEOUT_RANDOM(s))
897#define COAP_NON_PROBING_WAIT_TICKS(s) \
898 (COAP_NON_PROBING_WAIT(s).integer_part * COAP_TICKS_PER_SECOND + \
899 COAP_NON_PROBING_WAIT(s).fractional_part * COAP_TICKS_PER_SECOND / 1000)
907#define COAP_NON_PARTIAL_TIMEOUT_TICKS(s) \
908 (COAP_NON_PARTIAL_TIMEOUT(s).integer_part * COAP_TICKS_PER_SECOND + \
909 COAP_NON_PARTIAL_TIMEOUT(s).fractional_part * COAP_TICKS_PER_SECOND / 1000)
917#define COAP_NON_TIMEOUT_RANDOM(s) \
918 coap_get_non_timeout_random(s)
922#define SESSIONS_ADD(e, obj) \
923 HASH_ADD(hh, (e), addr_hash, sizeof((obj)->addr_hash), (obj))
925#define SESSIONS_DELETE(e, obj) \
926 HASH_DELETE(hh, (e), (obj))
928#define SESSIONS_ITER(e, el, rtmp) \
929 HASH_ITER(hh, (e), el, rtmp)
931#define SESSIONS_ITER_SAFE(e, el, rtmp) \
932 for ((el) = (e); (el) && ((rtmp) = (el)->hh.next, 1); (el) = (rtmp))
934#define SESSIONS_FIND(e, k, res) { \
935 HASH_FIND(hh, (e), &(k), sizeof(k), (res)); \
struct coap_lg_crcv_t coap_lg_crcv_t
struct coap_endpoint_t coap_endpoint_t
struct coap_proxy_entry_t coap_proxy_entry_t
Proxy information.
struct coap_lg_srcv_t coap_lg_srcv_t
Internal CoAP WebSockets support.
uint64_t coap_tick_t
This data type represents internal timer ticks with COAP_TICKS_PER_SECOND resolution.
coap_session_t * coap_session_new_dtls_session(coap_session_t *session, coap_tick_t now)
Create a new DTLS session for the session.
int coap_mid_t
coap_mid_t is used to store the CoAP Message ID of a CoAP PDU.
coap_proto_t
CoAP protocol types Note: coap_layers_coap[] needs updating if extended.
coap_session_t * coap_new_client_session_pki3_lkd(coap_context_t *ctx, const coap_address_t *local_if, const coap_address_t *server, coap_proto_t proto, coap_dtls_pki_t *setup_data, void *app_data, coap_app_data_free_callback_t callback, coap_str_const_t *ws_host)
Creates a new client session to the designated server, with PKI credentials along with app_data infor...
void coap_connect_session(coap_session_t *session, coap_tick_t now)
void coap_session_reestablished(coap_session_t *session)
Session has been re-connected to server.
ssize_t coap_session_delay_pdu(coap_session_t *session, coap_pdu_t *pdu, coap_queue_t *node)
int coap_session_refresh_psk_hint(coap_session_t *session, const coap_bin_const_t *psk_hint)
Refresh the session's current Identity Hint (PSK).
void coap_session_send_csm(coap_session_t *session)
Notify session transport has just connected and CSM exchange can now start.
coap_fixed_point_t coap_add_fixed_uint(coap_fixed_point_t fp1, uint32_t u2)
void coap_handle_nack(coap_session_t *session, coap_pdu_t *sent, const coap_nack_reason_t reason, const coap_mid_t mid)
size_t coap_session_max_pdu_rcv_size(const coap_session_t *session)
Get maximum acceptable receive PDU size.
coap_fixed_point_t coap_sub_fixed_uint(coap_fixed_point_t fp1, uint32_t u2)
int coap_session_set_type_server_lkd(coap_session_t *session)
Set the session type to server.
coap_session_t * coap_new_client_session_psk_lkd(coap_context_t *ctx, const coap_address_t *local_if, const coap_address_t *server, coap_proto_t proto, const char *identity, const uint8_t *key, unsigned key_len)
Creates a new client session to the designated server with PSK credentials.
coap_ext_token_check_t
coap_ext_token_check_t values
void coap_read_session(coap_context_t *ctx, coap_session_t *session, coap_tick_t now)
coap_session_t * coap_new_client_session_psk3_lkd(coap_context_t *ctx, const coap_address_t *local_if, const coap_address_t *server, coap_proto_t proto, coap_dtls_cpsk_t *setup_data, void *app_data, coap_app_data_free_callback_t callback, coap_str_const_t *ws_host)
Creates a new client session to the designated server, with PSK credentials along with app_data infor...
int coap_session_reconnect(coap_session_t *session)
Close the current session (if not already closed) and reconnect to server (client session only).
void coap_session_server_keepalive_failed(coap_session_t *session)
Clear down a session following a keepalive failure.
void * coap_endpoint_set_app_data_lkd(coap_endpoint_t *endpoint, void *data, coap_app_data_free_callback_t callback)
Stores data with the given endpoint, returning the previously stored value or NULL.
void coap_session_establish(coap_session_t *session)
Layer function interface for layer below session accept/connect being established.
coap_fixed_point_t coap_add_fixed_fixed(coap_fixed_point_t fp1, coap_fixed_point_t fp2)
coap_tick_t coap_get_non_timeout_random_ticks(coap_session_t *session)
int coap_session_refresh_psk_key(coap_session_t *session, const coap_bin_const_t *psk_key)
Refresh the session's current pre-shared key (PSK).
void coap_session_connected(coap_session_t *session)
Notify session that it has just connected or reconnected.
void coap_session_failed(coap_session_t *session)
Session has failed due to a socket error.
coap_fixed_point_t coap_multi_fixed_fixed(coap_fixed_point_t fp1, coap_fixed_point_t fp2)
ssize_t coap_session_send_pdu(coap_session_t *session, coap_pdu_t *pdu)
Send a pdu according to the session's protocol.
size_t coap_session_max_pdu_size_lkd(const coap_session_t *session)
Get maximum acceptable PDU size.
coap_mid_t coap_session_send_ping_lkd(coap_session_t *session)
Send a ping message for the session.
coap_fixed_point_t coap_div_fixed_uint(coap_fixed_point_t fp1, uint32_t u2)
void coap_session_free(coap_session_t *session)
void coap_session_mfree(coap_session_t *session)
void coap_session_release_lkd(coap_session_t *session)
Decrement reference counter on a session.
int coap_session_refresh_psk_identity(coap_session_t *session, const coap_bin_const_t *psk_identity)
Refresh the session's current pre-shared identity (PSK).
coap_session_t * coap_new_client_session3_lkd(coap_context_t *ctx, const coap_address_t *local_if, const coap_address_t *server, coap_proto_t proto, void *app_data, coap_app_data_free_callback_t callback, coap_str_const_t *ws_host)
Creates a new client session to the designated server, with PSK credentials along with app_data infor...
int coap_session_set_type_client_lkd(coap_session_t *session, int report_changed)
Set the session type to client.
coap_fixed_point_t coap_get_non_timeout_random(coap_session_t *session)
coap_session_t * coap_session_reference_lkd(coap_session_t *session)
Increment reference counter on a session.
void * coap_session_set_app_data2_lkd(coap_session_t *session, void *data, coap_app_data_free_callback_t callback)
Stores data with the given session, returning the previously stored value or NULL.
coap_fixed_point_t coap_multi_fixed_uint(coap_fixed_point_t fp1, uint32_t u2)
void coap_session_disconnected_lkd(coap_session_t *session, coap_nack_reason_t reason)
Notify session that it has failed.
@ COAP_EXT_T_NOT_CHECKED
Not checked.
@ COAP_EXT_T_CHECKING
Token size check request sent.
@ COAP_EXT_T_CHECKED
Token size valid.
coap_session_type_t
coap_session_type_t values
coap_session_state_t
coap_session_state_t values
void(* coap_app_data_free_callback_t)(void *data)
Callback to free off the app data when the entry is being deleted / freed off.
Only used for servers for hashing incoming packets.
coap_address_t remote
remote address and port
coap_proto_t proto
CoAP protocol.
Multi-purpose address abstraction.
CoAP binary data definition with const data.
The CoAP stack's global state is stored in a coap_context_t object.
The structure used for defining the Client PSK setup data to be used.
The structure used for defining the PKI setup data to be used.
Abstraction of a fixed point number that can be used where necessary instead of a float.
Structure to hold large body (many blocks) transmission information.
Abstraction of virtual session that can be attached to coap_context_t (client) or coap_endpoint_t (se...
coap_lg_xmit_t * lg_xmit
list of large transmissions
volatile uint8_t max_token_checked
Check for max token size coap_ext_token_check_t.
uint8_t csm_not_seen
Set if timeout waiting for CSM.
unsigned int dtls_timeout_count
dtls setup retry counter
coap_bin_const_t * psk_key
If client, this field contains the current pre-shared key for server; When this field is NULL,...
uint32_t block_mode
Zero or more COAP_BLOCK_ or'd options.
coap_app_data_free_callback_t app_cb
call-back to release app_data
uint8_t delay_recursive
Set if in coap_client_delay_first()
coap_socket_t sock
socket object for the session, if any
coap_pdu_t * partial_pdu
incomplete incoming pdu
uint32_t max_token_size
Largest token size supported RFC8974.
uint16_t nstart
maximum concurrent confirmable xmits (default 1)
coap_bin_const_t * psk_identity
If client, this field contains the current identity for server; When this field is NULL,...
coap_session_state_t state
current state of relationship with peer
uint8_t csm_bert_rem_support
CSM TCP BERT blocks supported (remote)
uint64_t tx_token
Next token number to use.
coap_mid_t remote_test_mid
mid used for checking remote support
uint8_t read_header[8]
storage space for header of incoming message header
uint8_t csm_bert_loc_support
CSM TCP BERT blocks supported (local)
coap_addr_tuple_t addr_info
remote/local address info
coap_proto_t proto
protocol used
uint16_t tx_mid
the last message id that was used in this session
uint8_t is_dtls13
Set if session is DTLS1.3.
unsigned ref
reference count from queues
size_t csm_rcv_mtu
CSM mtu (rcv)
coap_response_t last_con_handler_res
The result of calling the response handler of the last CON.
coap_bin_const_t * psk_hint
If client, this field contains the server provided identity hint.
coap_bin_const_t * last_token
coap_dtls_cpsk_t cpsk_setup_data
client provided PSK initial setup data
size_t mtu
path or CSM mtu (xmt)
uint8_t no_observe_cancel
Set if do not cancel observe on session close.
size_t partial_read
if > 0 indicates number of bytes already read for an incoming message
int dtls_event
Tracking any (D)TLS events on this session.
void * tls
security parameters
uint16_t max_retransmit
maximum re-transmit count (default 4)
uint8_t csm_block_supported
CSM TCP blocks supported.
coap_fixed_point_t ack_random_factor
ack random factor backoff (default 1.5)
uint8_t proxy_session
Set if this is an ongoing proxy session.
uint8_t con_active
Active CON request sent.
coap_queue_t * delayqueue
list of delayed messages waiting to be sent
size_t tls_overhead
overhead of TLS layer
void * app_data
application-specific data
uint32_t tx_rtag
Next Request-Tag number to use.
coap_mid_t last_ping_mid
the last keepalive message id that was used in this session
coap_fixed_point_t ack_timeout
timeout waiting for ack (default 2.0 secs)
coap_fixed_point_t default_leisure
Mcast leisure time (default 5.0 secs)
coap_mid_t last_con_mid
The last CON mid that has been been processed.
coap_session_type_t type
client or server side socket
uint32_t probing_rate
Max transfer wait when remote is not respoding (default 1 byte/sec)
coap_mid_t last_ack_mid
The last ACK mid that has been been processed.
coap_context_t * context
session's context
size_t partial_write
if > 0 indicates number of bytes already written from the pdu at the head of sendqueue
coap_addr_hash_t addr_hash
Address hash for server incoming packets.
int ifindex
interface index
coap_bin_const_t * echo
last token used to make a request
CoAP string data definition with const data.
WebSockets session state.