1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2025-12-24 14:03:55 +01:00

795 Commits

Author SHA1 Message Date
Marian Buschsieweke
ebcb978c23
sys/net/CoRD: update use of deprecated nanocoap APIs 2025-11-10 17:28:43 +01:00
Marian Buschsieweke
4de5e9f413
sys/net/gcoap_dns: update use of deprecated nanocoap APIs 2025-11-10 17:28:43 +01:00
Marian Buschsieweke
9b18061719
sys/net/gcoap_forward_proxy: update users of deprecated nanocoap APIs 2025-11-10 17:28:43 +01:00
Marian Buschsieweke
5b3d111237
sys/net/gcoap: update users of deprecated nanocoap APIs 2025-11-10 17:28:43 +01:00
Marian Buschsieweke
5387c20dde
sys/net/nanocoap: Make APIs (more) transport agnostic
This changes the API of nanocoap with the goal to reduce the expose of
UDP specifics in the API. The plan is to eventually support transports
such as CoAP over TCP and CoAP over WebSocket directly in nanocoap
while sharing most of the code, as e.g. the CoAP Option processing
remains identical. Specifically, the plan is to unlock a transport with
modules and introduce overhead for dispatching to specific transport
only when multiple transports are actually in use.

Support for OSCORE directly in nanocoap is probably not sensible, as
the serialization is very much unlike the other transports. A unified
CoAP API for multiple transports including OSCORE is probably best
implemented on top. But when limited to the boring set of CoAP
transports, we probably can support them well with nanocoap with less
overhead.

Breaking API Changes:
=====================

- `coap_parse()` now returns `ssize_t` instead of `int`
    - This function is not really user facing, so the impact should
      be limited
    - This is useful for stream transports where the buffer may
      contain data of more than one packet. The return value contains
      the number of bytes actually consumed, which will match the
      buffer size for non-stream transports.

API Changes:
============

- `coap_pkt_t` now contains a `uint8_t *buf` pointer instead of a
  `coap_hdr_t *hdr` pointer to the beginning of the buffer
    - This will also work when the buffer is used by non-UDP
      transports
    - A deprecated `coap_udp_hdr_t *hdr` has been crammed into
      an unnamed `union` with `uint8_t *buf`. For architectures
      where pointers have the same memory layout regardless of type
      (e.g. all of the supported ones), this will make `hdr` an
      alias for `buf`.
    - The alias will only be provided if no transport besides UDP is
      used in nanocoap. So existing apps will continue to work, new
      apps that want to support other transports need to move to
      adapt.
- `coap_hdr_t` has been renamed to `coap_udp_hdr_t`
    - A deprecated alias was created for deprecation
- `coap_hdr*()` functions have been deprecated
    - Equivalent `coap_pkt*()` functions have been created that work
      on `coap_pkt_t *` instead of `coap_hdr_t *`
    - If non-UDP transports are used, the deprecated `coap_hdr*()`
      will probably not be exposed to avoid footguns.
- `coap_build_hdr()` has been renamed to `coap_build_udp_hdr()` and
  that works on an `uint8_t *` buffer with a given length, rather than
  on a `coap_hdr_t *` with a *figers crossed* length
    - a deprecated `coap_build_hdr()` function was added that calls
      to `coap_build_udp_hdr()` and has the same signature, so that
      users have time to update
2025-11-10 17:28:41 +01:00
Benjamin Valentin
48273ef736 net/hosts: add module for static hostname definitions 2025-09-11 19:16:03 +02:00
crasbe
7c44b06e5c
Merge pull request #21652 from benpicco/nanocoap_server/buf
nanocoap_server: use zero-copy network buffer for parsing request
2025-09-04 14:43:05 +00:00
Marian Buschsieweke
c0cc617c7f
Merge pull request #21633 from crasbe/pr/sntp
sys/net/sntp: migrate from xtimer to ztimer
2025-08-21 16:23:56 +00:00
crasbe
8ab9956ae5 sys/net/sntp: migrate from xtimer to ztimer 2025-08-21 14:27:28 +02:00
Benjamin Valentin
ec00a16c57 nanocoap: ensure pkt->hdr equals rbuf in coap_build_reply() 2025-08-07 17:27:39 +02:00
Benjamin Valentin
d48eaf15aa nanocoap_server: use zero-copy network buffer for parsing request 2025-08-07 17:26:57 +02:00
benpicco
4f9f755f99
Merge pull request #20197 from benpicco/coap_iterate_uri_query
nanocoap: add coap_iterate_uri_query()
2025-07-24 11:35:51 +00:00
Benjamin Valentin
824d3ea71d nanocoap: add coap_iterate_uri_query() 2025-07-24 13:18:06 +02:00
Carl Seifert
5e353a3967 net/unicoap: add documentation 2025-07-08 22:41:45 +02:00
Carl Seifert
63980bcf02 net/unicoap: add header for private API 2025-07-07 17:27:40 +02:00
Carl Seifert
d184a1af0f net/unicoap: implement option accessors 2025-07-07 17:27:39 +02:00
Carl Seifert
f666e1aa04 net/unicoap: implement RFC 7252 PDU framing 2025-07-07 17:27:39 +02:00
Carl Seifert
70350216ba net/unicoap: add base config 2025-07-07 17:27:39 +02:00
Carl Seifert
12c7e07839 net/unicoap: add CoAP constants 2025-07-07 17:27:39 +02:00
Carl Seifert
501822f560 net/unicoap: driver modules for CoAP transports 2025-07-07 17:27:39 +02:00
Carl Seifert
6b9e5433e6 net/unicoap: add module basics 2025-07-07 17:27:39 +02:00
Marian Buschsieweke
cac44edec7
tree-wide: replace multiple empty lines with one
For each C source/header `$file`: `sed -e '/^$/N;/^\n$/D' -i $file`.
2025-05-21 22:51:04 +02:00
KSKNico
e6b17fa5cb sys: replace header guards with #pragma once 2025-05-16 19:40:06 +02:00
Marian Buschsieweke
c1aee234ee
Merge pull request #21357 from maribu/tree-wide/dox-fixes
tree wide: various doc fixes
2025-04-05 17:57:43 +00:00
Marian Buschsieweke
1ff982a664
tree wide: various doc fixes
This fixes a batch of incorrect Doxygen comments that building with
LLVM/clang and `-Wdocumentation` uncovered.
2025-04-04 11:44:53 +02:00
Benjamin Valentin
6cb40183a0 nanocoap_sock: implement observe client 2025-04-03 13:23:07 +02:00
fabian18
9e55e5611f
Merge pull request #21270 from fabian18/pr/nanocoap_static_buffers
nanocoap: avoid non `static` buffers of configurable size
2025-03-31 22:46:38 +00:00
Fabian Hüßler
49243a5ef2 nanocoap/sock: move request header buffer to socket 2025-03-31 19:12:19 +02:00
Fabian Hüßler
7e4afa4436 nanocoap: supply response buffer for nanocoap_link_format_get 2025-03-31 19:12:19 +02:00
Benjamin Valentin
7a5cd93bf7 sys/net/telnet: align API with stdio API 2025-03-13 09:58:48 +01:00
Marian Buschsieweke
da0218323b
sys/net/nanocoap: improve coap_build_reply
- The responsibility for handling matching CoAP No-Response Options
  has been split:
    - `coap_build_reply()` only needs to report this and return
      `-ECANCLED`
    - `coap_handle_req()` does generate the empty ACK is needed.
  ==> As a result, writing CoAP request handlers correctly becomes a
      lost easier. Correct error handling to be present is now
      sufficient for correct handling of No-Response options.
  ==> This change is backward compatible with existing code.
- The API doc has been cleaned up and straightened

Co-authored-by: mguetschow <mikolai.guetschow@tu-dresden.de>
2025-03-12 08:56:20 +01:00
Marian Buschsieweke
be27eafc4f
sys/net/nanocoap: fix API inconsistency
For in-band signalling that a content format is not valid / present,
the magic number `COAP_FORMAT_NONE` was introduced and the type
`uint16_t` was used. Some APIs however used different in-band signalling
values and types:

- coap_reply_simple(): No signal available, `unsigned int`
- coap_build_reply_header(): negative values, `int`
    (Using `int` would prevent using larger content format numbers on
    8-bit and 16-bit archs, where `int` and `int16_t` have the same
    range.)

This changes the behavior to consistently use `COAP_FORMAT_NONE` as
"no content format" signal and `uint16_t` as type.
2025-02-24 12:05:35 +01:00
Marian Buschsieweke
546b87a2e8
sys/net/nanocoap: fix dereferencing a null pointer
`coap_request_ctx_get_local()` may return `NULL` depending on module
selection. If it does, we cannot pass `NULL` to
`sock_udp_ep_is_multicast()`.

This changes the code assume the request is not received via multicast
when module `sock_aux_local` is not in use.

When the user binds the CoAP server to multiple endpoints (as needed
for using multicast), it is required that `sock_aux_local` is in use
anyway, as otherwise the server may not respond using the endpoint it
received the request on. (That in turn would render the client unable to
correlate the response to the request.)
2025-02-19 11:05:46 +01:00
Mikolai Gütschow
ca5fe72bf8
treewide: fix example references in docs
adapt to folder structure from #21135
2025-02-14 19:14:22 +01:00
mguetschow
57993ef263
Merge pull request #21159 from Vjorald/cord-doc
sys/cord/doc.txt: Update additional references to RFC 9176
2025-01-29 14:57:08 +00:00
Vjorald
d2658e21d0 sys/cord/doc: Update additional references to RFC 9176 2025-01-29 15:14:03 +01:00
Marian Buschsieweke
9fa2661621
sys/net/nanocoap: align request handling with spec
- Do not reply with a reset message to a reset or an ACK message
- Reply with a reset message when not able to process a CON/NON message
  (not even a suitable error reply)
2025-01-24 22:42:47 +01:00
Marian Buschsieweke
feeb68470f
sys/net/nanocoap: implement observe
This adds the new `nanocoap_server_observe` module that implements the
server side of the CoAP Observe option. It does require cooperation
from the resource handler to work, though.

Co-Authored-By: mguetschow <mikolai.guetschow@tu-dresden.de>
Co-authored-by: benpicco <benpicco@googlemail.com>
2025-01-23 14:25:39 +01:00
Marian Buschsieweke
1c7ba9e055
sys/net/nanocoap: improve separate response handling
This allows sending a separate response with CoAP Options and adds a
helper to detect duplicate requests, so that resource handlers can
repeat their empty ACK on duplicates.
2025-01-23 14:25:02 +01:00
Marian Buschsieweke
590ca5d7ff
sys/net/gcoap: get rid of API abuse
Calling `coap_get_token()` and `coap_get_token_length()` on an
(mostly) uninitialized `coap_pkt_t` did work so far due to
implementation details matching the expectations, but this is not
backed up by any API contract.

This fixes the API abuse by introducing and using a new API that does
read a token and token length from a CoAP over UDP packet out of a
buffer. This now provides the behavior expected by the caller and
commits to it via API contract.

Co-authored-by: mguetschow <mikolai.guetschow@tu-dresden.de>
Co-authored-by: benpicco <benpicco@googlemail.com>
2025-01-10 21:31:08 +01:00
Benjamin Valentin
5869554d7a sys/net/nanocoap: flush stale responses before sending request 2025-01-06 10:40:30 +01:00
Marian Buschsieweke
ab116ec71c
sys/net/nanocoap: Fix sending bogus separate responses
When module `nanocoap_server_separate` is not used, the functions to
send separate responses are still provided, just in a broken version:
They will send the separate replies from a different endpoint than the
request was received at (even on machines with only one IP address, as
also the source port is randomized).

This changes the behavior to only provide the functions for separate
response when the do work, so that others will detect an invalid
configuration at compile time rather than at run time.

The documentation is duly updated.
2024-12-13 08:40:43 +01:00
Marian Buschsieweke
c7af4b25a6
sys/net/nanocoap: fix invalid RST messages
An RST message has no token, so don't reply with a token when sending
RST.

This also adds unit tests to ensure this this exact bug does not sneak
back in.
2024-12-12 14:28:28 +01:00
Marian Buschsieweke
7a738d0e0b
sys/net/nanocoap: fix buffer overflow in separate response handling
When RFC 8974 support (module `nanocoap_token_ext`) is in use, the
request token may be longer than the buffer in the separate response
context is large. This adds a check to not overflow the buffer.

Sadly, this is an API change: Preparing the separate response context
can actually fail, so we need to report this with a return value.

The example application has been adapted to only proceed if the separate
reply context could have been prepared, and rather directly emit a
reset message if the token exceeds the static buffer.

Co-authored-by: benpicco <benpicco@googlemail.com>
2024-12-12 14:28:28 +01:00
Marian Buschsieweke
cec85cfc88
Merge pull request #20945 from maribu/sys/net/gcoap/replace-super-insane-hack-with-less-insane-hack
sys/net/gcoap: reduce insanity of hack
2024-11-08 20:03:37 +00:00
Marian Buschsieweke
d10ab413a0
Merge pull request #20952 from benpicco/nanocoap-block_robust
nanocoap/sock: re-try if wrong block was received
2024-11-05 17:24:17 +00:00
Benjamin Valentin
9b25c033de nanocoap/sock: re-try if wrong block was received 2024-11-05 18:06:31 +01:00
Marian Buschsieweke
c70075b073
Merge pull request #20950 from maribu/sys/net/nanocoap/coap_get_response_hdr_len
sys/net/nanocoap: add and use coap_get_response_hdr_len()
2024-11-05 13:09:51 +00:00
Marian Buschsieweke
68beb52f14
sys/net/nanocoap: add and use coap_get_response_hdr_len()
Before, handlers writing blockwise transfer assumed that the response
header length will match the request header length. This is true for
UDP, but not for TCP: The CoAP over TCP header contains a Len field,
that gets extended for larger messages. Since the reply often is indeed
larger than the request, this is indeed often the case for CoAP over
TCP.

Note: Right now, no CoAP over TCP implementation is upstream. However,
      getting rid of incorrect assumptions now will make life easier
      later on.
2024-11-05 10:46:02 +01:00
Marian Buschsieweke
2c93dc9c3b
sys/net/nanocoap: fix coap_build_reply_header()
In case no payload is added, `coap_build_reply_header()` would return
`sizeof(coap_hdr_t) + token_length` regardless of the actual header
length returned by `coap_build_hdr()`. These can be different if
RFC 8974 extended tokens are enabled (module `nanocoap_token_ext`
used): If an extended token length field is used, its size is not
considered.

Co-authored-by: benpicco <benpicco@googlemail.com>
2024-11-04 21:18:07 +01:00