Add in limited caching for multiple clients requesting an Observe subscription
for the same upstream session resource so that only a single observation request
is sent upstream and any unsolicited response is sent back to all the
requesting clients.
This requires a change in the recently added handler registered to
coap_register_proxy_response_handler(), which no longer should no longer call
coap_proxy_forward_response(), but just return a PDU for forwarding on.
When initating a multicast request, multiple unicast responses can occur.
If the unicast response subsequently generates further traffic (in other words
a BLOCK1 or BLOCK2 transfer) to complete the request/response sequence, each
unicast transfer can behave differently.
Set up different coap_lg_crcv_t for each unicast response for the session.
Set up different coap_lg_xmit_t for each unicast request if doing large transmits.
Reference initial transmitted request PDU rather than maintaining copies of the
PDU in coap_lg_crcv_t or coap_lg_xmit_t.
If calculated timeout is 0 in coap_io_prepare_io_lkd(), then do not set overall
timeout to 0 so that when passed back to caller it does not get reset to the
caller's max defined timeout.
Updated some timeout check functions to update remaining timeout in a new
parameter and to return 1 if this parameter was updated, else 0. for simplicity.
It was also unsafe to set the initial max timeout value to -1 as coap_tick_t
can be int64_t.
const coap_pdu_t * parameters are passed into application (call-back handler)
code. If the application code then calls a libcoap API with a
const coap_pdu_t * parameter, it is not possible to increment the reference
counter so that multiple entities can reference the same PDU and an entity's
call to coap_delete_pdu() does not prematurely remove the PDU until all the
entities have finished.
This code allows the (const) PDU's reference counter to be incremented.
Allow re-establishment with upstream server when server restarts.
When upstream server re-connects, re-establish any (D)TLS sessions
and active observe subscriptions.
Supported by a new function coap_context_set_session_reconnect_time().
When a server cleanly closes down (calls coap_free_context()), when
a resource gets deleted, a 4.04 message is sent out (not when using
coap_persist(3)) for any active observe subscriptions. If a server knows it is
going to be restarted, then there is no need to send out a observe failed message.
When deleting a resource when normally running, it is correct to send out a 4.04
Not Found response as the resource has genuinely gone away. However, when the
server is cleaning shutting down, it is better to use 5.03 Service Unavailable to
indicate the situation may be temporary.
Add a common cleanup function to make sure all information is correctly
freed off.
Make sure that there is client session stickability to use the same proxy entry
when making new requests.
Load in the PKI trust store with a new function
coap_context_load_pki_trust_store()
By default, make the client and server applications do this unless
explicitely disabled.
This enables clients doing (D)TLS to not need to be provided with specific
certificates but can validate trust in the server provided certificates.
Note: A default trust store is not supported across all platform types or
some TLS libraries (version dependent).
Set up a coap_io_process() loop spread across multiple threads, each thread
repeatably calling coap_io_process() and so able to handle any input packets.
Note that the application handlers need to be thread-safe for application
level activity.
Add 2 new main functions
coap_io_process_loop()
coap_io_process_terminate_loop()
Add in 2 new sub functions
coap_io_process_configure_threads()
coap_io_process_remove_threads()
to set up the parallel threads.
Update example servers to include using coap_io_process_loop().
Support optional thread number logging by configuration to maintain
backwards logging format output if required.
New functions
coap_async_set_app_data2()
coap_cache_set_app_data2()
coap_context_set_app_data2()
coap_session_set_app_data2()
that, multi-thread safe, store an application data pointer and return the
previous data pointer (if any). There is an optional callback that will
be called when the respective storage object is released that can free
off as appropriate the data that was stored.
These replace the existing coap_*_set_app_data() functions and
coap_*_get_app_data() can be used to get the stored data pointer.
Tidy up naming to reduce confusion between supported proxy types.
Provides simpler proxy examples.
Fixes issue with COAP_PROXY_REVERSE_STRIP.
Support upstream server using AF_UNIX.
If the ACK (not empty) response gets lost, the repeated CON request will just
get the cached response without invoking further analysis.
This stops things like OSCORE reporting retry issues.
This functionality needs to be enabled by setting the COAP_BLOCK_CACHE_RESPONSE
bit when calling coap_context_set_block_mode(). If not enabled, then, for OSCORE
the response is sent as a separate response (empty ACK followed by CON response),
which is how code previous to this PR works.
If coap_context_set_keepalive() is set in the server, CoAP keepalive packets
will get sent for any CoAP session that is curently observing a resource.
If the keepalive times out, then the observation(s) are canceled and the
server session is deleted.
Add in a new function coap_io_get_fds() to get the lists of (internal
to libcoap) file descriptors that are in a read or write pending state,
as well as the timeout time for the next internal to libcoap activity
(e.g. packet retransmission).
Tag server returned data with a digest computed ETag option value so
requests with an ETag option can return 2.03 if there is a match.
The size of bytes hash that is computed for the ETag can be overwritten by
localy defining COAP_ETAG_MAX_BYTES to be a value between 1 and 8 bytes
inclusive. It is set to 4 by default.
Update stateless token to track 20 bits - the largest no of blocks
as per RFC7959.
Make output of data detail configurable for coap_show_pdu().
Add in new function coap_enable_pdu_data_output() to do this.
Add -x option to coap-client and coap-server to enable this dropping
of data detail.
by:
- Correcting Contiki-NG's value of COAP_DEFAULT_MAX_PDU_RX_SIZE
- Denying to create PDUs longer than COAP_DEFAULT_MAX_PDU_RX_SIZE
- Using the MTU setter, thereby not overriding stack-specific limits
- Using existing constants for L4-specific header sizes
./autogen.sh and ./configure no longer need to be run prior to running
make for Contiki, LwIP or RIOT from the appropriate examples sub-directory.
scripts/fix_version.sh now handles updating coap.h for the different
LIBCOAP_ and PACKAGE_ definitions.
Group together and document the run-time checks available for checking
the libcoap built-in functionality based on the ./cconfigure and / or
CMakeLists.txt options.
Create include/coap3/coap_defines.h file that contains a list of
COAP_ #defines created from the options defined when running ./configure
or cmake.
Add additional coap_*_is_supported() functions.
Tidy up the general proxy logic by moving common functionality
into libcoap.
New functions coap_proxy_forward_request(), coap_proxy_forward_response()
and coap_proxy_is_supported() added.
New --enable-proxy-code support added to configure.
New ENABLE_PROXY_CODE support added to CMakeLists.txt.
Support for common shared connection to next hop.
Support for round-robin balancing across multiple next hops.
Only support changing the client's source port if the DTLS library
has support / configured for CID.
Used when debugging server handling source address changes and CID
is in use.
Add in support for TinyDTLS (Client only) if TinyDTLS is patched
appropriately (not currently available on TinyDTLS main branch).
Add in new function coap_dtls_cid_is_supported().
'make distclean' removes header files built from the .in files, which
means that they are not available for different OS builds.
The same is true for CMakeLists.txt.
Remove the need for the .in files and update for libcoap revisions
by using a new script scripts/fix_version.sh created from
scripts/fix_version.sh.in.
CI has been updated to check revisions have been updated in the
appropriate places.
Do not remove libcoap-3.sym and libcoap-3.map when doing 'make distclean'
as they are git tracked files.
Support of RFC9146. Currently only Mbed TLS supported.
New function coap_context_set_cid_tuple_change() for a client to
force periodic source port changes to test out CID.
Configurable support for the client to use Connection-ID
assuming underlying DTLS library is configured for or supports it.
If a proxy reads in a packet via coap_read_endpoint, which then
invokes an ongoing proxy TCP connection, while waiting for the CSM
response of the new session, coap_read_endpoint would get invoked
again if there is any data to read on any of the listening endpoints..
With a Constrained Stack, the read in data is protected by mutex
m_read_enpoint - which is still locked when trying to wait for the
CSM.
As the code is either single threaded, or protected by global_lock
if multi-threaded, there is no need to maintain mutexes such as
m_read_endpoint. This PR removes these not needed mutexes.
Do not call coap_free_context() from within sigint handler.
Always call coap_io_process().
Use sys_arch_sem_wait() for timeouts while waiting for input.