libcoap 4.3.4
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-2023 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_internal.h"
22#include "coap_io_internal.h"
23#include "coap_ws_internal.h"
24
25#define COAP_DEFAULT_SESSION_TIMEOUT 300
26#define COAP_PARTIAL_SESSION_TIMEOUT_TICKS (30 * COAP_TICKS_PER_SECOND)
27#define COAP_DEFAULT_MAX_HANDSHAKE_SESSIONS 100
28
42 uint16_t lport;
44};
45
46typedef enum {
54
63
73 unsigned ref;
74 size_t tls_overhead;
75 size_t mtu;
76 size_t csm_rcv_mtu;
78 UT_hash_handle hh;
80 int ifindex;
83#if COAP_SERVER_SUPPORT
85#endif /* COAP_SERVER_SUPPORT */
87 void *tls;
88 uint16_t tx_mid;
90 uint8_t con_active;
97#if COAP_CLIENT_SUPPORT
99#endif /* COAP_CLIENT_SUPPORT */
100#if COAP_SERVER_SUPPORT
102#endif /* COAP_SERVER_SUPPORT */
106 uint8_t read_header[8];
145 void *app;
150 uint16_t max_retransmit;
152 uint16_t nstart;
156 uint32_t probing_rate;
158#if COAP_Q_BLOCK_SUPPORT
159 uint16_t max_payloads;
161 uint16_t non_max_retransmit;
163 coap_fixed_point_t non_timeout;
165 coap_fixed_point_t non_receive_timeout;
168 coap_fixed_point_t non_probing_wait_base;
171 coap_fixed_point_t non_partial_timeout;
174#endif /* COAP_Q_BLOCK_SUPPORT */
175 unsigned int dtls_timeout_count;
178 uint32_t tx_rtag;
181 uint8_t block_mode;
182 uint8_t doing_first;
187#if COAP_OSCORE_SUPPORT
188 uint8_t oscore_encryption;
189 COAP_OSCORE_B_2_STEP b_2_step;
190 oscore_recipient_ctx_t *recipient_ctx;
192 oscore_association_t *associations;
194 uint64_t oscore_r2;
195#endif /* COAP_OSCORE_SUPPORT */
196#if COAP_WS_SUPPORT
197 coap_ws_state_t *ws;
198 coap_str_const_t *ws_host;
199#endif /* COAP_WS_SUPPORT */
200 volatile uint8_t max_token_checked;
204 uint32_t max_token_size;
205 uint64_t tx_token;
212};
213
214#if COAP_SERVER_SUPPORT
223 uint16_t default_mtu;
228};
229#endif /* COAP_SERVER_SUPPORT */
230
233
235 uint32_t u2);
236
239
241 uint32_t u2);
242
244 uint32_t u2);
245
247
249
251
252
259
266
278 const coap_bin_const_t *psk_hint);
279
291 const coap_bin_const_t *psk_key);
292
304 const coap_bin_const_t *psk_identity);
305
306#if COAP_SERVER_SUPPORT
316 coap_context_t *ctx,
318);
319#endif /* COAP_SERVER_SUPPORT */
320
330
342ssize_t coap_session_send_pdu(coap_session_t *session, coap_pdu_t *pdu);
343
345 coap_queue_t *node);
346
347#if COAP_SERVER_SUPPORT
358 const coap_packet_t *packet, coap_tick_t now);
359#endif /* COAP_SERVER_SUPPORT */
360
367size_t coap_session_max_pdu_rcv_size(const coap_session_t *session);
368
381 coap_tick_t now);
382
383void coap_session_free(coap_session_t *session);
385
386#define COAP_SESSION_REF(s) ((s)->ref
387
388/* RFC7252 */
389#define COAP_ACK_TIMEOUT(s) ((s)->ack_timeout)
390#define COAP_ACK_RANDOM_FACTOR(s) ((s)->ack_random_factor)
391#define COAP_MAX_RETRANSMIT(s) ((s)->max_retransmit)
392#define COAP_NSTART(s) ((s)->nstart)
393#define COAP_DEFAULT_LEISURE(s) ((s)->default_leisure)
394#define COAP_PROBING_RATE(s) ((s)->probing_rate)
395/* RFC9177 */
396#define COAP_MAX_PAYLOADS(s) ((s)->max_payloads)
397#define COAP_NON_MAX_RETRANSMIT(s) ((s)->non_max_retransmit)
398#define COAP_NON_TIMEOUT(s) ((s)->non_timeout)
399#define COAP_NON_TIMEOUT_TICKS(s) \
400 (COAP_NON_TIMEOUT(s).integer_part * COAP_TICKS_PER_SECOND + \
401 COAP_NON_TIMEOUT(s).fractional_part * COAP_TICKS_PER_SECOND / 1000)
402#define COAP_NON_RECEIVE_TIMEOUT(s) ((s)->non_receive_timeout)
403#define COAP_NON_PROBING_WAIT_BASE(s) ((s)->non_probing_wait_base)
404#define COAP_NON_PARTIAL_TIMEOUT(s) ((s)->non_partial_timeout)
405
412#define COAP_DEFAULT_LEISURE_TICKS(s) \
413 (COAP_DEFAULT_LEISURE(s).integer_part * COAP_TICKS_PER_SECOND + \
414 COAP_DEFAULT_LEISURE(s).fractional_part * COAP_TICKS_PER_SECOND / 1000)
421#define COAP_MAX_TRANSMIT_SPAN(s) \
422 (((s)->ack_timeout.integer_part * 1000 + (s)->ack_timeout.fractional_part) * \
423 ((1 << ((s)->max_retransmit)) -1) * \
424 ((s)->ack_random_factor.integer_part * 1000 + \
425 (s)->ack_random_factor.fractional_part) \
426 / 1000000)
427
434#define COAP_MAX_TRANSMIT_WAIT(s) \
435 (((s)->ack_timeout.integer_part * 1000 + (s)->ack_timeout.fractional_part) * \
436 ((1 << ((s)->max_retransmit + 1)) -1) * \
437 ((s)->ack_random_factor.integer_part * 1000 + \
438 (s)->ack_random_factor.fractional_part) \
439 / 1000000)
440
441#define COAP_MAX_TRANSMIT_WAIT_TICKS(s) \
442 (COAP_MAX_TRANSMIT_WAIT(s) * COAP_TICKS_PER_SECOND)
443
450#define COAP_PROCESSING_DELAY(s) \
451 (((s)->ack_timeout.integer_part * 1000 + (s)->ack_timeout.fractional_part + \
452 500) / 1000)
453
460#define COAP_MAX_RTT(s) \
461 ((2 * COAP_DEFAULT_MAX_LATENCY) + COAP_PROCESSING_DELAY(s))
462
469#define COAP_EXCHANGE_LIFETIME(s) \
470 (COAP_MAX_TRANSMIT_SPAN(s) + (2 * COAP_DEFAULT_MAX_LATENCY) + \
471 COAP_PROCESSING_DELAY(s))
472
479#define COAP_NON_LIFETIME(s) \
480 (COAP_MAX_TRANSMIT_SPAN(s) + COAP_DEFAULT_MAX_LATENCY)
481
488#define COAP_NON_RECEIVE_TIMEOUT_TICKS(s) ( \
489 COAP_NON_RECEIVE_TIMEOUT(s).integer_part * COAP_TICKS_PER_SECOND + \
490 COAP_NON_RECEIVE_TIMEOUT(s).fractional_part * COAP_TICKS_PER_SECOND / 1000)
491
500#define COAP_NON_PROBING_WAIT(s) \
501 coap_add_fixed_fixed(COAP_NON_PROBING_WAIT_BASE(s), \
502 COAP_NON_TIMEOUT_RANDOM(s))
503
504#define COAP_NON_PROBING_WAIT_TICKS(s) \
505 (COAP_NON_PROBING_WAIT(s).integer_part * COAP_TICKS_PER_SECOND + \
506 COAP_NON_PROBING_WAIT(s).fractional_part * COAP_TICKS_PER_SECOND / 1000)
507
514#define COAP_NON_PARTIAL_TIMEOUT_TICKS(s) \
515 (COAP_NON_PARTIAL_TIMEOUT(s).integer_part * COAP_TICKS_PER_SECOND + \
516 COAP_NON_PARTIAL_TIMEOUT(s).fractional_part * COAP_TICKS_PER_SECOND / 1000)
517
524#define COAP_NON_TIMEOUT_RANDOM(s) \
525 coap_get_non_timeout_random(s)
526
529#define SESSIONS_ADD(e, obj) \
530 HASH_ADD(hh, (e), addr_hash, sizeof((obj)->addr_hash), (obj))
531
532#define SESSIONS_DELETE(e, obj) \
533 HASH_DELETE(hh, (e), (obj))
534
535#define SESSIONS_ITER(e, el, rtmp) \
536 HASH_ITER(hh, (e), el, rtmp)
537
538#define SESSIONS_ITER_SAFE(e, el, rtmp) \
539 for ((el) = (e); (el) && ((rtmp) = (el)->hh.next, 1); (el) = (rtmp))
540
541#define SESSIONS_FIND(e, k, res) { \
542 HASH_FIND(hh, (e), &(k), sizeof(k), (res)); \
543 }
544
545#endif /* COAP_SESSION_INTERNAL_H_ */
Pulls together all the internal only header files.
Internal network I/O functions.
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:144
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:255
coap_proto_t
CoAP protocol types.
Definition: coap_pdu.h:304
coap_session_t * coap_new_server_session(coap_context_t *ctx, coap_endpoint_t *ep)
Creates a new server session for the specified endpoint.
ssize_t coap_session_delay_pdu(coap_session_t *session, coap_pdu_t *pdu, coap_queue_t *node)
Definition: coap_session.c:650
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.
Definition: coap_session.c:691
coap_fixed_point_t coap_add_fixed_uint(coap_fixed_point_t fp1, uint32_t u2)
Definition: coap_session.c:60
size_t coap_session_max_pdu_rcv_size(const coap_session_t *session)
Get maximum acceptable receive PDU size.
Definition: coap_session.c:598
coap_fixed_point_t coap_sub_fixed_uint(coap_fixed_point_t fp1, uint32_t u2)
Definition: coap_session.c:68
coap_session_t * coap_endpoint_get_session(coap_endpoint_t *endpoint, const coap_packet_t *packet, coap_tick_t now)
Lookup the server session for the packet received on an endpoint, or create a new one.
coap_ext_token_check_t
coap_ext_token_check_t values
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)
Definition: coap_session.c:50
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.
Definition: coap_session.c:759
coap_fixed_point_t coap_multi_fixed_fixed(coap_fixed_point_t fp1, coap_fixed_point_t fp2)
Definition: coap_session.c:30
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:784
coap_fixed_point_t coap_div_fixed_uint(coap_fixed_point_t fp1, uint32_t u2)
Definition: coap_session.c:76
void coap_session_free(coap_session_t *session)
Definition: coap_session.c:545
void coap_session_mfree(coap_session_t *session)
Definition: coap_session.c:464
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_fixed_point_t coap_get_non_timeout_random(coap_session_t *session)
COAP_OSCORE_B_2_STEP
coap_fixed_point_t coap_multi_fixed_uint(coap_fixed_point_t fp1, uint32_t u2)
Definition: coap_session.c:40
@ 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
Definition: coap_session.h:43
coap_session_state_t
coap_session_state_t values
Definition: coap_session.h:54
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.
Definition: coap_address.h:109
CoAP binary data definition with const data.
Definition: coap_str.h:64
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:378
Abstraction of virtual endpoint that can be attached to coap_context_t.
coap_context_t * context
endpoint's context
uint16_t default_mtu
default mtu for this interface
coap_session_t * sessions
hash table or list of active sessions
struct coap_endpoint_t * next
coap_address_t bind_addr
local interface address
coap_socket_t sock
socket object for the interface, if any
coap_proto_t proto
protocol used on this interface
Abstraction of a fixed point number that can be used where necessary instead of a float.
Definition: coap_session.h:30
Structure to hold large body (many blocks) client receive information.
Structure to hold large body (many blocks) server receive information.
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.
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,...
coap_endpoint_t * endpoint
session's endpoint
uint8_t doing_first
Set if doing client's first request.
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.
uint8_t block_mode
Zero or more COAP_BLOCK_ or'd options.
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
unsigned ref
reference count from queues
size_t csm_rcv_mtu
CSM mtu (rcv)
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)
uint16_t remote_test_mid
mid used for checking remote support
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
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_lg_srcv_t * lg_srcv
Server list of expected large receives.
coap_lg_crcv_t * lg_crcv
Client list of expected large receives.
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:46
WebSockets session state.