libcoap 4.3.5-develop-7be2515
Loading...
Searching...
No Matches
coap_session_internal.h
Go to the documentation of this file.
1/*
2 * coap_session_internal.h -- Structures, Enums & Functions that are not
3 * exposed to application programming
4 *
5 * Copyright (C) 2010-2026 Olaf Bergmann <bergmann@tzi.org>
6 *
7 * SPDX-License-Identifier: BSD-2-Clause
8 *
9 * This file is part of the CoAP library libcoap. Please see README for terms
10 * of use.
11 */
12
18#ifndef COAP_SESSION_INTERNAL_H_
19#define COAP_SESSION_INTERNAL_H_
20
21#include "coap_ws_internal.h"
22
23#ifdef __cplusplus
24extern "C" {
25#endif
26
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
30
47
56
65
75 unsigned ref;
76 size_t tls_overhead;
77 size_t mtu;
78 size_t csm_rcv_mtu;
80 UT_hash_handle hh;
82#if COAP_CLIENT_SUPPORT
83 coap_address_t local_reconnect;
84#endif /* COAP_CLIENT_SUPPORT */
85 int ifindex;
86#if COAP_SERVER_SUPPORT
87 unsigned ref_subscriptions;
88 unsigned ref_proxy_subs;
89#endif /* COAP_SERVER_SUPPORT */
92#if COAP_SERVER_SUPPORT
93 coap_endpoint_t *endpoint;
94#endif /* COAP_SERVER_SUPPORT */
96 void *tls;
97 uint16_t tx_mid;
99 uint8_t con_active;
106#if COAP_CLIENT_SUPPORT
107 coap_lg_crcv_t *lg_crcv;
108#endif /* COAP_CLIENT_SUPPORT */
109#if COAP_SERVER_SUPPORT
110 coap_lg_srcv_t *lg_srcv;
111#endif /* COAP_SERVER_SUPPORT */
115 uint8_t read_header[8];
154 void *app_data;
160 uint16_t max_retransmit;
162 uint16_t nstart;
166 uint32_t probing_rate;
168#if COAP_Q_BLOCK_SUPPORT
169 uint16_t max_payloads;
171 uint16_t non_max_retransmit;
173 coap_fixed_point_t non_timeout;
175 coap_fixed_point_t non_receive_timeout;
178 coap_fixed_point_t non_probing_wait_base;
181 coap_fixed_point_t non_partial_timeout;
184#endif /* COAP_Q_BLOCK_SUPPORT */
185 unsigned int dtls_timeout_count;
188 uint32_t tx_rtag;
189 uint32_t block_mode;
192#if COAP_CLIENT_SUPPORT
193 uint8_t doing_first;
194#endif /* COAP_CLIENT_SUPPORT */
199 uint8_t csm_not_seen;
200#if COAP_OSCORE_SUPPORT
201 uint8_t oscore_encryption;
202 COAP_OSCORE_B_2_STEP b_2_step;
203 oscore_recipient_ctx_t *recipient_ctx;
205 oscore_association_t *associations;
207 uint64_t oscore_r2;
208#endif /* COAP_OSCORE_SUPPORT */
209#if COAP_WS_SUPPORT
210 coap_ws_state_t *ws;
211 coap_str_const_t *ws_host;
212#endif /* COAP_WS_SUPPORT */
213#if COAP_OSCORE_SUPPORT
214 uint8_t doing_b_1_2;
215#endif /* COAP_OSCORE_SUPPORT */
216 volatile uint8_t max_token_checked;
218 uint8_t is_dtls13;
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;
224 uint8_t retry_count;
225 coap_tick_t doing_first_timeout;
226 coap_pdu_t *doing_first_pdu;
227#endif /* COAP_CLIENT_SUPPORT */
230 uint32_t max_token_size;
231 uint64_t tx_token;
240#if COAP_SERVER_SUPPORT
241 coap_bin_const_t *client_cid;
242 coap_pdu_t *cached_pdu;
243 coap_digest_t cached_pdu_cksum;
244#endif /* COAP_SERVER_SUPPORT */
245#if COAP_CLIENT_SUPPORT
246 coap_pdu_t *resp_pdu;
247 coap_bin_const_t *req_token;
248#endif /* COAP_CLIENT_SUPPORT */
249#if COAP_PROXY_SUPPORT
250 coap_proxy_entry_t *proxy_entry;
251 coap_proxy_server_list_t *server_list;
252#endif /* COAP_PROXY_SUPPORT */
253};
254
255#if COAP_SERVER_SUPPORT
260struct coap_endpoint_t {
261 struct coap_endpoint_t *next;
262 coap_context_t *context;
263 coap_proto_t proto;
264 uint16_t default_mtu;
265 coap_socket_t sock;
267 coap_address_t bind_addr;
268 coap_session_t *sessions;
270 void *app_data;
272};
273#endif /* COAP_SERVER_SUPPORT */
274
277
279 uint32_t u2);
280
283
285 uint32_t u2);
286
288 uint32_t u2);
289
291
293
295
296
303
310
321 coap_nack_reason_t reason);
322
332
344 const coap_bin_const_t *psk_hint);
345
357 const coap_bin_const_t *psk_key);
358
370 const coap_bin_const_t *psk_identity);
371
372#if COAP_SERVER_SUPPORT
382coap_session_t *coap_new_server_session(coap_context_t *ctx,
383 coap_endpoint_t *ep,
384 void *extra);
385#endif /* COAP_SERVER_SUPPORT */
386
396
406
424int coap_session_set_type_client_lkd(coap_session_t *session, int report_changed);
425
443
454
466ssize_t coap_session_send_pdu(coap_session_t *session, coap_pdu_t *pdu);
467
469 coap_queue_t *node);
470
471#if COAP_SERVER_SUPPORT
481coap_session_t *coap_endpoint_get_session(coap_endpoint_t *endpoint,
482 const coap_packet_t *packet, coap_tick_t now);
483
498coap_endpoint_t *coap_new_endpoint_lkd(coap_context_t *context, const coap_address_t *listen_addr,
499 coap_proto_t proto);
500
508void coap_free_endpoint_lkd(coap_endpoint_t *endpoint);
509
510#endif /* COAP_SERVER_SUPPORT */
511
518size_t coap_session_max_pdu_rcv_size(const coap_session_t *session);
519
529size_t coap_session_max_pdu_size_lkd(const coap_session_t *session);
530
561 const coap_address_t *local_if,
562 const coap_address_t *server,
563 coap_proto_t proto,
564 void *app_data,
566 coap_str_const_t *ws_host
567 );
568
601 const coap_address_t *local_if,
602 const coap_address_t *server,
603 coap_proto_t proto,
604 coap_dtls_pki_t *setup_data,
605 void *app_data,
607 coap_str_const_t *ws_host
608 );
609
630 const coap_address_t *local_if,
631 const coap_address_t *server,
632 coap_proto_t proto,
633 const char *identity,
634 const uint8_t *key,
635 unsigned key_len
636 );
637
670 const coap_address_t *local_if,
671 const coap_address_t *server,
672 coap_proto_t proto,
673 coap_dtls_cpsk_t *setup_data,
674 void *app_data,
676 coap_str_const_t *ws_host
677 );
678
686
699 coap_tick_t now);
700
710
729void *coap_session_set_app_data2_lkd(coap_session_t *session, void *data,
731
752
753void coap_session_free(coap_session_t *session);
755
757
759
760void coap_handle_nack(coap_session_t *session,
761 coap_pdu_t *sent,
762 const coap_nack_reason_t reason,
763 const coap_mid_t mid);
764
771
778
779#define COAP_SESSION_REF(s) ((s)->ref
780
781/* RFC7252 */
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)
788/* RFC9177 */
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)
798
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) \
819 / 1000000)
820
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) \
832 / 1000000)
833
834#define COAP_MAX_TRANSMIT_WAIT_TICKS(s) \
835 (COAP_MAX_TRANSMIT_WAIT(s) * COAP_TICKS_PER_SECOND)
836
843#define COAP_PROCESSING_DELAY(s) \
844 (((s)->ack_timeout.integer_part * 1000 + (s)->ack_timeout.fractional_part + \
845 500) / 1000)
846
853#define COAP_MAX_RTT(s) \
854 ((2 * COAP_DEFAULT_MAX_LATENCY) + COAP_PROCESSING_DELAY(s))
855
862#define COAP_EXCHANGE_LIFETIME(s) \
863 (COAP_MAX_TRANSMIT_SPAN(s) + (2 * COAP_DEFAULT_MAX_LATENCY) + \
864 COAP_PROCESSING_DELAY(s))
865
872#define COAP_NON_LIFETIME(s) \
873 (COAP_MAX_TRANSMIT_SPAN(s) + COAP_DEFAULT_MAX_LATENCY)
874
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)
884
893#define COAP_NON_PROBING_WAIT(s) \
894 coap_add_fixed_fixed(COAP_NON_PROBING_WAIT_BASE(s), \
895 COAP_NON_TIMEOUT_RANDOM(s))
896
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)
900
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)
910
917#define COAP_NON_TIMEOUT_RANDOM(s) \
918 coap_get_non_timeout_random(s)
919
922#define SESSIONS_ADD(e, obj) \
923 HASH_ADD(hh, (e), addr_hash, sizeof((obj)->addr_hash), (obj))
924
925#define SESSIONS_DELETE(e, obj) \
926 HASH_DELETE(hh, (e), (obj))
927
928#define SESSIONS_ITER(e, el, rtmp) \
929 HASH_ITER(hh, (e), el, rtmp)
930
931#define SESSIONS_ITER_SAFE(e, el, rtmp) \
932 for ((el) = (e); (el) && ((rtmp) = (el)->hh.next, 1); (el) = (rtmp))
933
934#define SESSIONS_FIND(e, k, res) { \
935 HASH_FIND(hh, (e), &(k), sizeof(k), (res)); \
936 }
937
938#ifdef __cplusplus
939}
940#endif
941
942#endif /* COAP_SESSION_INTERNAL_H_ */
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
coap_nack_reason_t
Definition coap_io.h:64
Internal CoAP WebSockets support.
uint64_t coap_tick_t
This data type represents internal timer ticks with COAP_TICKS_PER_SECOND resolution.
Definition coap_time.h:149
coap_response_t
Definition coap_net.h:51
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.
Definition coap_pdu.h:266
coap_proto_t
CoAP protocol types Note: coap_layers_coap[] needs updating if extended.
Definition coap_pdu.h:316
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)
Definition coap_net.c:2503
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.
Definition coap_net.c:1122
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_OSCORE_B_2_STEP
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_OSCORE_B_2_NONE
@ COAP_OSCORE_B_2_STEP_3
@ COAP_OSCORE_B_2_STEP_1
@ COAP_OSCORE_B_2_STEP_4
@ COAP_OSCORE_B_2_STEP_5
@ COAP_OSCORE_B_2_STEP_2
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.
uint16_t lport
local port
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.
Definition coap_str.h:65
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.
Definition coap_dtls.h:414
The structure used for defining the PKI setup data to be used.
Definition coap_dtls.h:316
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.
structure for CoAP PDUs
Queue entry.
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.
Definition coap_str.h:47
WebSockets session state.