Add in some new .in files, but still keep original files in distribution
files.
Essentially, use coap@LIBCOAP_API_VERSION@ (or equivalent) instead of
coap2. so resultant files have the correct value.
coap_config.h.lwip.in: (new)
coap_config.h.riot.in: (new)
include/coap2/coap.h.windows.in: (new)
As per https://gcc.gnu.org/onlinedocs/cpp/Search-Path.html, many of the
coap2/ prefixes are not required for #include, so these have been removed.
Make sure that the test suite accesses the latest source version of
coap@LIBCOAP_API_VERSION@/coap.h by creating a tests/test_common.h.in that
makes the correct tests/test_common.h which is included in all of the test
suite files.
include/coap2/net.h:
src/net.c:
Update code using #587 as a base to fix potential issues.
Fixes CID 1502429
CMakeLists.txt:
cmake_coap_config.h.in:
Test for <net/if.h>
examples/coap-rd.c:
examples/coap-server.c:
man/coap-rd.txt.in:
man/coap-server.txt.in:
Add in -G option to support specifying interface to use for multicasting.
Otherwise, the interface allocated by the O/S is used depending on the
address (if any) bound to.
man/Makefile.am:
man/coap_context.txt.in:
Document the coap_join_mcast_group_intf() function.
src/coap_debug.c:
Make sure that coap_print_addr() returns a NULL terminated buffer.
This change renames `coap_join_mcast_group` to `coap_join_mcast_group_intf`
and adds an extra `const char *ifname` parameter to specify the interface
name.
A `coap_join_mcast_group` macro is defined to maintain backwards API
compatibility.
`coap_is_mcast` has been modified to recognize IPv6-mapped IPv4 multicast
addresses. Without this `coap_network_send` treats these addresses as
unicast which makes `semdmsg` fail with EINVAL.
Examples have been updated to use the new call.
The first block response is unicast, and the client requests the further blocks
using unicast. https://tools.ietf.org/html/rfc7959#section-2.8
However, the hash for the server lookup of incoming data is based on
coap_addr_tuple_t which includes the local address - which changes between
receipt of mcast and unicast requests. This causes 2 sessions to be set up,
and the subsequent request/responses are treated as individual block random
access causing mismatch of information by the client.
Fix is to hash only on the remote address (IP + port) and local port for
servers.
If the response code was set after calling coap_add_data_large_response(),
the continuing blocks were sent with code 0.00.
Now check following call to response handler that the correct code is held
within the lg_xmit information.
CoAP transaction id was formerly defined as a hash of the remote address and
message id of the CoAP PDU. It now only refers to, and is used as, the
message id.
Replace occurences of 'transaction id' with 'message id' to reflect naming in
RFC7252.
Correct the definition of coap_tid_t to what it actually represents.
Replace occurrences of coap_tid_t with coap_mid_t.
Replace uses of tid with mid
Remove unused function coap_find_transaction().
Remove the UNUSED and UNUSED_PARAM definitions and use a single definition
of COAP_UNUSED as defined in libcoap.h
Replace all UNUSED / UNUSED_PARAM usages with COAP_UNUSED.
Change some of the types of variables, and cast change sizes where known to
be safe.
There still are some C4116 warning and a couple of C4090 warning which are OK,
so disabled by a #pragma.
.github/workflows/main.yml:
Build all the cmake TLS variants.
CMakeLists.txt:
Add in missing file.
examples/tiny.c:
include/coap2/encode.h:
Move COAP_PSEUDOFP_ENCODE_8_4 functions from encode.h to tiny.c.
Fix COAP_PSEUDOFP_ENCODE_8_4_DOWN 'ls' ordering complaint.
man/examples-code-check.c:
Fix compile warning, allow 'Unused but set variables' in examples and set
-Werror when compling the examples.
examples/lwip/Makefile:
Remove compilation option -fpack-struct
Update coap_opt_filter_t to be a structure rather than a 16bit array that is
aliased with the real structure format.
Update code to use pointers where appropriate.
Result of a rebase confusion.
include/coap2/resource.h:
Remove duplicates that are also in coap_subscriber_internal.h.
libcoap-2.map:
libcoap-2.sym:
Remove the now internal only functions.
Create a new include/coap2/coap_resource_internal.h to hold all the information
not available to applications.
Makefile.am:
Include coap_resource_internal.h in EXTRA_DIST.
Remove functions no longer visible from CTAGS_IGNORE.
examples/coap-rd.c:
examples/contiki/server.c:
examples/etsi_iot_01.c:
tests/test_wellknown.c
Replace direct access to coap_resource_t variables with functions as
appropriate.
include/coap2/resource.h:
include/coap2/subscribe.h:
include/coap2/coap_resource_internal.h: (New)
include/coap2/coap_subscribe_internal.h:
Move coap_resource_t, coap_addr_t, non API #defines and non API functions from
resource.h into coap_resource_internal.h, coap_subscribe_internal.h and
subscribe.h.
Replace inline functions accessing coap_resource_t with actual function
definitions.
Add new functions coap_resource_release_userdata_handler() and
coap_attr_get_value().
include/coap2/block.h:
Use coap_resource_t typedef.
include/coap2/coap_forward_decls.h:
Include coap_resource_t and coap_addr_t typedefs. Also typedef coap_context_t
to get rid of #include circular requirements.
include/coap2/coap_internal.h:
win32/libcoap.vcxproj:
win32/libcoap.vcxproj.filters:
Include coap_resource_internal.h.
include/coap2/net.h:
Remove "typedef struct coap_context_t" and do this in coap_forward_decls.h.
src/resource.c:
Update with the replaced inline functions. Add in the new functions
coap_resource_release_userdata_handler() and coap_attr_get_value().
libcoap-2.map:
libcoap-2.sym:
Update with new function visibility.
man/Makefile.am:
man/coap_attribute.txt.in:
man/coap_observe.txt.in:
man/coap_resource.txt.in:
Update with the new coap_resource_t and coap_attr_t usage.
In handle_response() the ACK is sent before calling ctx->response_handler() so
if the response_handler() wants to send RST the server ignores it as the ACK
has already been received.
By updating coap_response_handler_t to return a value, this can be used to
send the ACK (return of COAP_RESPONSE_OK) or a RST (return of COAP_RESPONSE_FAIL)
after ctx->response_handler() is called.
include/coap2/net.h:
man/coap_handler.txt.in:
Create a new enum coap_response_t for use as the return value for
coap_response_handler_t.
Update coap_response_handler_t and associated documentation.
src/net.c:
Send CoAP ACK or RST depending on return value of ctx->response_handler().
examples/client.c:
Update message_handler() to use the new coap_response_handler_t return values
(coap_response_t).
This change removes the need for applications having to know about handling
requests for the next block etc. It also gives the application the ability
to pass a large body of data to be transmitted and be told when this body is
no longer required.
This logic is enabled in libcoap by setting COAP_BLOCK_USE_LIBCOAP using
coap_context_set_block_mode()
This change breaks down into 4 specific areas
1) Client doing a PUT/POST etc. of a large amount of data (BLOCK1).
coap_add_data_large_request() is used which provides a 'finished with data'
callback function as well as adding required options to the PDUs. This
function calls coap_add_data_large_internal().
Internal coap_handle_response_send_block() sends off the subsequent blocks
(using session->lg_xmit).
2) Server receiving PUT/POST etc. of a large amount of data (BLOCK1).
Internal coap_handle_request_get_block() acknowledges the appropriate blocks
(using session->lg_srcv) and either passes in the individual blocks or the body
depending on whether COAP_BLOCK_SINGLE_BODY is set or not using
coap_context_set_block_mode().
3) Server sending a large data response to GET / observe (BLOCK2)
coap_add_data_large_response() is used which provides a 'finished with data'
callback function. This function calls coap_add_data_large_internal() as well
as filling in the necessary options for each PDU.
Interal coap_handle_request_send_block() will then send the next requested block
(using session->lg_xmit).
4) Client receiving a large data response (BLOCK2)
coap_send_large() for the initial request sets this up.
Internal coap_handle_response_get_block() will then request the next block when
previous block received (using session->lg_crcv) and either passes the
individual blocks or the body depending on COAP_BLOCK_SINGLE_BODY being set in
coap_context_set_block_mode().
----
The following new internal functions have been added
coap_handle_request_get_block()
coap_handle_request_send_block()
coap_handle_response_get_block()
coap_handle_response_send_block()
coap_add_data_large_internal()
The following new functions have been added.
coap_add_data_large_request()
coap_add_data_large_response()
coap_context_set_block_mode()
coap_get_data_large()
coap_pdu_duplicate()
coap_send_large()
coap_session_init_token()
coap_session_new_token()
The coap_session_init_token() and coap_session_new_token() were added to make
the handling of unique tokens for each request/response easier.
https://datatracker.ietf.org/doc/html/draft-ietf-core-echo-request-tag-10#section-4
New files
include/coap2/coap_block_internal.h:
man/coap_block.txt.in:
New memory types
COAP_LG_XMIT
COAP_LG_SRCV
COAP_LG_CRCV
CoAP response codes in examples represented by non-human-readable magic
numbers. It makes code harder to read, understand, and maintain.
Magic numbers there where replaced by human-readable enums.
Signed-off-by: Eug Krashtan <eug.krashtan@gmail.com>
The use of the verify_peer_cert and require_peer_cert variables in the
coap_dtls_pki_t structure was giving inconsistent results across all the
TLS libraries. This primarily was down to the large numbers of options
available to control the TLS handshakes in OpenSSL compared to the limited
control available to mbedTLS port which followed later. require_peer_cert is
not easy to control in mbedTLS as it is an implicit configuration based on how
other, not always related, items were configured.
require_peer_cert was used by the server to control whether the client could
use anonymous certificates or not. This is now controlled by verify_peer_cert.
require_peer_cert variable has been replaced with check_common_ca, so that
the OpenSSL functionality can continue, but enable GnuTLS / mbedTLS to
produce the same results. This allows peers to mutually authenticate (because
the peer certs are signed by the same common CA) or not which was in effect
controlled by verify_peer_cert previously.
If check_common_ca is set, then allow_self_signed is ignored.
If is_rpk_not_cert is set, then all certificate validation is ignored.
In the examples, use of the -R option unsets check_common_ca, so disables
mutual authentication support by having a common CA. This was needed as
mbedTLS and GnuTLS only have a single trust store for CAs.
configure.ac:
Increase the number of mbed libraries to use when checking for mbedTLS.
examples/client.c:
examples/coap-rd.c:
examples/coap-server.c:
Add in -n (unset verify_peer_cert) option. In the case of coap-server and
coap-rd, make -n refer to verify_peer_cert.
Add in TLS library capabilites in usage().
Update usage() documentation as appropriate, with some changes to fit
everything into a 80 column output.
include/coap2/coap_dtls.h:
include/coap2/net.h:
Update with variable changes, and make the coap_dtls_pki_t parameter const for
the *_context_set_pki() functions.
man/coap-client.txt.in:
man/coap-rd.txt.in:
man/coap-server.txt.in:
Update documentation to reflect the examples option usage.
man/coap_context.txt.in:
man/coap_encryption.txt.in:
man/coap_session.txt.in:
Update with the new variable name and document as appropriate.
src/coap_gnutls.c
src/coap_mbedtls.c
src/coap_notls.c
src/coap_openssl.c
coap_tinydtls.c
Update to make variable usage consistent. Update logging from LOG_WARNING to
LOG_INFO where there is an override of a PKI check failure by one of the
coap_dtls_pki_t variables.
Timing window closed for TLS where the peer does not like a certificate, sends
fatal alert and closes connection. local then fails on writing the next
handshake - but now also reads in alert and reports on it.
src/coap_io.c:
Update logging from LOG_WARNING to LOG_INFO for EPIPE or ECONNRESET errors in
coap_socket_write().
src/net.c:
Handle the const coap_dtls_pki_t parameter in coap_context_set_pki() function.
1. since coap_add_option_later() has been removed, so remove
coap_add_option_later in lib-coap-2.(map,sym) and pdu.h
2. [PRNG] need include coap_prng.c into visual studio project too, since new
functions for generating pseudo numbers replace the old macro-based
approach.
3. [PRNG] need define coap_prng() coap_prng_init() coap_set_prng() for
windows too since these function are exported in lib-coap-2.(map,sym)
Make documentation more consistent across doxygen output.
Add in caching module.
Add in encoding/decoding module.
Add in application i/o internal module.
Move deprecated items out of respective modules.
As RFC7641 is now fully supported, these code segments should always be
compiled in and WITHOUT_OBSERVE wrappers are no longer required.
src/coap_session.c:
src/net.c:
src/resource.c:
Remove WITHOUT_OBSERVE wrappers.
include/coap2/async.h:
Correct definition for coap_async_state_t and remove references for
supporting observing as this is no longer supported.
Add code to better support the Proxy-Uri: and Proxy-Scheme: CoAP Options.
examples/client.c:
Make sure that the Proxy-Uri: option is added (if set) when clearing down an
observation (fixes#112).
Check that Proxy-Uri: option has a maximum data length of 1034 bytes.
Handle user defined Proxy-Scheme: option correctly.
Update -P option to include scheme to be used when connecting to the proxy.
examples/coap-server.c:
Add in hnd_proxy_uri() handler function. This has support for a direct or ongoing
proxy connection for the coap* protocols. The ongoing connection is set up as a
different CoAP session and is assocated with the incoming session for relaying
requests / responses.
Internal functions taken from client.c are used where appropriate.
Proxy support code has a SERVER_CAN_PROXY wrapper, so footprint can easily be
reduced if required.
New -P and -u options added to support ongoing connections.
include/coap2/net.h:
Add in tracking the proxy uri handler into coap_context_t.
include/coap2/resource.h:
Track whether a resource definition is for Proxy-Uri:/Proxy-Scheme:.
Define the coap_resource_proxy_uri_init() function for handling the Proxy-Uri:
option or Proxy-Scheme: option in an incoming request.
include/coap2/uri.h:
Add in COAP_URI_SCHEME_HTTP and COAP_URI_SCHEME_HTTPS as valid Proxy-Uri:
schemes.
Define the coap_split_proxy_uri() function (similar to coap_split_uri() but
supports the proxy extras. Both now use a common sub function internally.
libcoap-2.map:
libcoap-2.sym:
Expose the new coap_resource_proxy_uri_init() and coap_split_proxy_uri()
functions.
man/Makefile.am:
Handle coap_resource_get_userdata(3) now being over the 10 definition limit
in man/coap_resource.txt.in.
man/coap-client.txt.in:
Update documentation for the -P option.
man/coap-server.txt.in:
Document the new -P proxy option.
Document the new -u user option.
man/coap_resource.txt.in:
Include documentation for coap_resource_proxy_uri_init().
src/coap_debug.c:
Output the Proxy-Scheme: Option as text.
src/net.c:
Sanity check and handle COAP_OPTION_PROXY_URI and COAP_OPTION_PROXY_SCHEME
in handle_request().
src/resource.c:
Add in coap_resource_proxy_uri_init() function.
Handle the addition of a proxy uri handler in coap_add_resource().
src/uri.c:
Rename coap_split_uri() to coap_split_uri_sub() and add in extra proxy
handling support based on input parameters.
Create new coap_split_uri() and coap_split_proxy_uri() which call
coap_split_uri_sub() appropriately.
TODO:
Remove reference to Proxy support required
src/coap_gnutls.c:
Fix a double deallocate found during testing
src/coap_asn1.c: (New)
include/coap2/coap_asn1_internal.h: (New)
Created and common asn1 functions added in
Makefile.am:
include/coap2/coap_internal.h:
Reference the new files.
src/coap_gnutls.c:
src/coap_tinydtls.c:
Updated to use new common asn1 functions.
Support of COAP_PKI_KEY_PEM requires reading files which may not be supported
in libcoap running in a non Posix environment.
Remove RPK support when using PKI key type COAP_PKI_KEY_PEM. Update
coap-server and coap-client to read the optional .pem files into memory and
use PKI key type COAP_PKI_KEY_PEM_BUF instead.
Currently OpenSSL and MBedTLS do not support RFC7250. See
https://en.wikipedia.org/wiki/Comparison_of_TLS_implementations#Extensions
last column.
GnuTLS >= 3.6.6 required.
TinyDTLS update required.
New option is_rpk_not_cert added to PKI setup structure which is enabled
in coap-client and coap-server by the -M option and the use of a PUBLIC KEY
instead of a CERTIFICATE in the cert file. If file is EC PRIVATE KEY, then
it can be used for both the public and private key files.
man/coap-client.txt.in:
man/coap-server.txt.in:
Document -M option.
man/coap_encryption.txt.in:
man/coap-server.txt.in:
man/coap_context.txt.in:
Add in documentation for RPK.
examples/client.c:
examples/coap-server.c:
Add in support for is_rpk_not_cert and -M option.
Stop sending ::1 for SNI - use localhost instead.
include/coap2/coap_dtls.h:
Add in is_rpk_not_cert option.
include/coap2/str.h:
src/str.c:
libcoap-2.map:
libcoap-2.sym:
Add in coap_new_binary() and coap_delete_binary() functions.
src/coap_openssl.c:
Report RPK is not supported if invoked.
Check that all received data is used up for error recovery.
src/coap_mbedtls.c:
Report RPK is not supported if invoked.
Handle more MbedTLS generated errors.
Check that all received data is used up for error recovery.
src/coap_gnutls.c:
Add in support for RPK.
Add in sending Hello Verify if not cookie match in Client Hello
Check that all received data is used up for error recovery.
src/coap_tinydtls.c:
Add in support for RPK.
HOWTO.pkcs11:
Update for use with RPK.
Use .der file for '-C ca_file' definitions as later GnuTLS needs CA
to be trusted in HSM.
This updates the initial work done for adding in cache support
include/coap2/coap_cache.h: (new)
include/coap2/coap_cache_internal.h: (new)
src/coap_cache.c: (new)
New files to support cache support.
CMakeLists.txt:
Makefile.amMakefile.am:
Makefile.libcoap:
configure.ac:
examples/lwip/Makefile:
include/coap2/coap.h.in:
include/coap2/coap.h.windows:
win32/libcoap.vcxproj:
win32/libcoap.vcxproj.filters:
Add in the new files.
examples/client.c:
Fix valgrind reported memory leak.
examples/coap-server.c:
Add in new example_data resource that uses the new caching logic.
Update hnd_put() to use the new cache logic for BLOCK1 PUTs.
include/coap2/coap_forward_decls.h:
include/coap2/coap_internal.h:
include/coap2/coap_session.h:
include/coap2/net.h:
Add in new cache support.
libcoap-2.map:
libcoap-2.sym:
Include the new functions.
man/Makefile.am:
man/coap.txt.in:
man/coap_cache.txt.in: (new)
Update documentation.
src/coap_io.c:
Idle timeout cache entries.
src/coap_session.c:
Delete cache entry when session is deleted.
src/net.c:
Delete cache entries when context is freed off.
src/coap_gnutls.c:
src/coap_mbedtls.c:
src/coap_notls.c:
src/coap_openssl.c:
src/coap_tinydtls.c:
Add in SHA256 digest support.
Add in coap_new_binary() and coap_delete_binary() functions which operate
in the same way as coap_new_string() and coap_delete_string() but work on
coap_binary_t objects.
include/coap2/str.h:
src/str.c:
Add in the coap_new_binary(), coap_resize_binary() and coap_delete_binary()
functions.
configure.ac:
man/Makefile.am:
man/coap.txt.in:
man/coap_string.txt.in: (new)
Add in documentation for the coap_string functions.
libcoap-2.map:
libcoap-2.sym:
Update with new functions.
coap_config.h.contiki:
include/coap2/lwippools.h:
include/coap2/mem.h:
src/mem.c:
Add support for fixed memory allocations for Cacke-Key and Cache-Entry
include/coap2/pdu.h:
src/pdu.c:
tests/test_pdu.c:
Change parameter max_delta to max_opt to better reflect actual usage.
include/coap2/pdu.h:
src/pdu.c:
Remove unneeded COAP_OPT_LONG and COAP_OPT_END definitions.
Remove unused function coap_add_option_later().
src/pdu.c:
Update coap_pdu_parse_opt() to sanity check the valid lengths of all the
known options.
src/coap_io_lwip.c:
src/net.c:
Ignore packets < 4 bytes
Send back a RST for UDP/DTLS if malformed PDU.
src/option.c:
Clean up coap_option_filter_get() documentation.