1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2025-12-16 10:03:50 +01:00

114 Commits

Author SHA1 Message Date
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
d48eaf15aa nanocoap_server: use zero-copy network buffer for parsing request 2025-08-07 17:26:57 +02:00
Benjamin Valentin
6cb40183a0 nanocoap_sock: implement observe client 2025-04-03 13:23:07 +02:00
Fabian Hüßler
49243a5ef2 nanocoap/sock: move request header buffer to socket 2025-03-31 19:12:19 +02: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
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
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
Benjamin Valentin
9b25c033de nanocoap/sock: re-try if wrong block was received 2024-11-05 18:06:31 +01:00
Fabian Hüßler
95b46ee2a5 sys/net/application_layer/nanocoap: add nanocoap_sock_get_non 2024-09-10 16:43:44 +02:00
Benjamin Valentin
312a550f1a treewide: remove THREAD_CREATE_STACKTEST from thread creation 2024-07-29 11:45:58 +02:00
benpicco
78da4bc1c7
Merge pull request #20725 from fabian18/pr/nanocoap_sock_fix_ctx_release
nanocoap/sock: fix state handling for mismatching message ID in `nanocoap_sock_request_cb()`
2024-06-07 16:19:13 +00:00
Fabian Hüßler
5145b29b55 nanocoap/sock: fix context release 2024-06-06 11:24:41 +02:00
benpicco
251ea7f75a
Merge pull request #20687 from benpicco/nanocoap_fs
nanocoap_fs: add nanoCoAP as VFS backend (remote CoAP fs)
2024-05-29 15:00:24 +00:00
Benjamin Valentin
994211d955 nanocoap_sock: add nanocoap_sock_get_block() 2024-05-28 11:42:32 +02:00
benpicco
e62c25a015
Merge pull request #20690 from benpicco/nanocoap_get_blockwise_to_buf
nanocoap_sock: add nanocoap_get_blockwise_to_buf()
2024-05-27 16:53:44 +00:00
Fabian Hüßler
b6aa7a6ea5 nanocoap/sock: fix response token matching for piggybacked ACKs 2024-05-27 17:58:44 +02:00
Fabian Hüßler
afc9f9bf28 nanocoap/sock: nanocoap_sock_request_cb(): fix state handling 2024-05-27 17:58:44 +02:00
Fabian Hüßler
058ab2ce40 nanocoap/sock: nanocoap_sock_request_cb(): wait for response without cb 2024-05-27 17:58:16 +02:00
Fabian Hüßler
ec9a114f7a nanocoap/sock: stop retransmissions after empty ACK 2024-05-27 09:54:02 +02:00
Benjamin Valentin
c5cfecb311 nanocoap_sock: add nanocoap_get_blockwise_to_buf() 2024-05-23 16:11:52 +02:00
benpicco
3f41494e59
Merge pull request #20266 from benpicco/nanocoap_reply_separate
nanocoap_sock: implement separate response
2024-05-21 17:45:22 +00:00
Benjamin Valentin
dd458cb993 nanocoap_sock: use normal udp sock in nanocoap_server() 2024-05-21 19:27:57 +02:00
Benjamin Valentin
7e69c13630 nanocoap_sock: implement nanocoap_sock_send_separate() 2024-05-21 19:27:57 +02:00
Benjamin Valentin
330a6cfb91 nanocoap_sock: add local information to coap_request_ctx_t 2024-05-21 19:27:57 +02:00
Benjamin Valentin
13fd806f4f nanocoap_sock: add option to include token for block-wise 2024-04-10 12:36:53 +02:00
MrKevinWeiss
575ab684fe
sys/net/coap: cast in non-config define
If we try to set the compile-time config we need to always remember casting, instead, just cast in the places that are not exposed to users
2024-03-21 14:26:45 +01:00
Benjamin Valentin
408218f631 nanocoap_sock: support build with IPv4 2024-03-17 17:39:44 +01:00
Marian Buschsieweke
609ad44f39
Merge pull request #20245 from benpicco/nanocoap_sock-pathquery
nanocoap_sock: always use coap_opt_put_uri_pathquery()
2024-02-19 18:28:38 +00:00
Benjamin Valentin
a76feeb70e nanocoap_sock: improve debug output 2024-01-30 16:33:55 +01:00
Benjamin Valentin
a470c1cb44 nanocoap_sock: always use coap_opt_put_uri_pathquery() 2024-01-11 16:51:18 +01:00
Benjamin Valentin
7240f707a5 nanocoap_sock: implement FETCH methods 2024-01-09 12:40:10 +01:00
Frederik Haxel
64ba553d1f sys: Use size_t print format specifier
Co-authored-by: Marian Buschsieweke <marian.buschsieweke@posteo.net>
2023-12-21 12:02:19 +01:00
Benjamin Valentin
e2e5e03439 nanocoap_sock: use coap_get_code_raw() 2023-11-28 13:11:11 +01:00
Benjamin Valentin
a5cc48ad45 nanocoap_sock: use coap_get_code_raw() 2023-10-27 19:18:37 +02:00
Benjamin Valentin
661829f43f nanocoap: homogenize name of the module 2023-06-08 16:29:12 +02:00
Benjamin Valentin
82929ccea3 nanocoap_sock: remove nanocoap_get()
The function has been deprecated in favor of nanocoap_sock_get()
2023-05-05 15:17:34 +02:00
Benjamin Valentin
f6f5b13744 nanocoap_sock: don't use return buffer for request 2023-05-02 15:02:56 +02:00
bors[bot]
46af92d3a0
Merge #18620 #19296 #19504 #19506
18620: core: add core_mutex_debug to aid debugging deadlocks r=maribu a=maribu

### Contribution description

Adding `USEMODULE += core_mutex_debug` to your `Makefile` results in
on log messages such as

    [mutex] waiting for thread 1 (pc = 0x800024d)

being added whenever `mutex_lock()` blocks. This makes tracing down
deadlocks easier.

### Testing procedure

Run e.g.

```sh
USEMODULE=core_mutex_debug BOARD=nucleo-f767zi make -C tests/mutex_cancel flash test
```

which should provide output such as

```
Welcome to pyterm!
Type '/exit' to exit.
READY
s
[mutex] waiting for thread 1 (pc = 0x8000f35)
START
main(): This is RIOT! (Version: 2022.10-devel-841-g5cc02-core/mutex/debug)
Test Application for mutex_cancel / mutex_lock_cancelable
=========================================================

Test without cancellation: OK
Test early cancellation: OK
Verify no side effects on subsequent calls: [mutex] waiting for thread 1 (pc = 0x800024d)
OK
Test late cancellation: [mutex] waiting for thread 1 (pc = 0x0)
OK
TEST PASSED
```

```sh
$ arm-none-eabi-addr2line -a 0x800024d -e tests/mutex_cancel/bin/nucleo-f767zi/tests_mutex_cancel.elf 
0x0800024d
/home/maribu/Repos/software/RIOT/tests/mutex_cancel/main.c:51
```

### Issues/PRs references

Depends on and includes https://github.com/RIOT-OS/RIOT/pull/18619

19296: nanocoap: allow to define CoAP resources as XFA r=maribu a=benpicco



19504: cpu/cc26xx_cc13xx: Fix bogus array-bound warning r=maribu a=maribu

### Contribution description

GCC 12 create a bogus array out of bounds warning as it assumes that because there is special handling for `uart == 0` and `uart == 1`, `uart` can indeed be `1`. There is an `assert(uart < UART_NUMOF)` above that would blow up prior to any out of bounds access.

In any case, optimizing out the special handling of `uart == 1` for when `UART_NUMOF == 1` likely improves the generated code and fixes the warning.

    /home/maribu/Repos/software/RIOT/cc2650/cpu/cc26xx_cc13xx/periph/uart.c:88:8: error: array subscript 1 is above array bounds of 'uart_isr_ctx_t[1]' [-Werror=array-bounds]
       88 |     ctx[uart].rx_cb = rx_cb;
          |     ~~~^~~~~~
    /home/maribu/Repos/software/RIOT/cc2650/cpu/cc26xx_cc13xx/periph/uart.c:52:23: note: while referencing 'ctx'
       52 | static uart_isr_ctx_t ctx[UART_NUMOF];
          |                       ^~~
    /home/maribu/Repos/software/RIOT/cc2650/cpu/cc26xx_cc13xx/periph/uart.c:89:8: error: array subscript 1 is above array bounds of 'uart_isr_ctx_t[1]' [-Werror=array-bounds]
       89 |     ctx[uart].arg = arg;
          |     ~~~^~~~~~
    /home/maribu/Repos/software/RIOT/cc2650/cpu/cc26xx_cc13xx/periph/uart.c:52:23: note: while referencing 'ctx'
       52 | static uart_isr_ctx_t ctx[UART_NUMOF];
          |                       ^~~

### Testing procedure

The actual change is a pretty obvious one-liner, so that code review and a green CI should be sufficient. If not, running any UART example app without regression should do.

### Issues/PRs references

None

19506: tools/openocd: Fix handling of OPENOCD_CMD_RESET_HALT r=maribu a=maribu

### Contribution description

The OPENOCD_CMD_RESET_HALT was not longer correctly passed to the script. This fixes the issue.

### Testing procedure

Flashing of e.g. the `cc2650-launchpad` with upstream OpenOCD should work again.

### Issues/PRs references

The change was added to https://github.com/RIOT-OS/RIOT/pull/19050 after testing the PR and before merging. I'm not sure if the fix never worked because of this, or if behavior of `target-export-variables` or GNU Make changed.

Co-authored-by: Marian Buschsieweke <marian.buschsieweke@ovgu.de>
Co-authored-by: Benjamin Valentin <benjamin.valentin@bht-berlin.de>
Co-authored-by: Benjamin Valentin <benjamin.valentin@ml-pa.com>
2023-04-25 15:46:11 +00:00
Benjamin Valentin
9495dc4e2e nanocoap_server: add nanocoap_server_auto_init 2023-03-22 14:43:19 +01:00
bors[bot]
1a5cc2acbb
Merge #19365 #19366 #19367
19365: bootloaders: fix bootloader button logic r=benpicco a=dylad

### Contribution description

In lastest master, the `BTN_BOOTLOADER_INVERTED` logic doesn't work as expected.
This PR fixes the underlying logic by replacing the `BTN_BOOTLOADER_INVERTED` macro definition by a runtime function.
In fact the current code:
```
#ifndef BTN_BOOTLOADER_INVERTED
#if (BTN0_MODE == GPIO_IN_PD)
#define BTN_BOOTLOADER_INVERTED false
#else
#define BTN_BOOTLOADER_INVERTED true
#endif
#endif
```
cannot work because both `BTN0_MODE` and `GPIO_IN_PD` are not known by the precompiler as they are enum values defined at cpu level.
Thus, replaces it by a runtime function in our bootloader applications.
I've also add `GPIO_OD_PU` along side `GPIO_IN_PU` and add a new define (which can be override at board level or app level) in case an external pullup is used.

### Testing procedure
Flash the riotboot_dfu bootloader:
`make BOARD=saml21-xpro -C bootloaders/riotboot_dfu flash`
Then, flash any test app:
`PROGRAMMER=dfu-util USEMODULE=usbus_dfu make BOARD=saml21-xpro -C tests/shell riotboot/flash-slot0`

With master, the application will not start.
With this PR, the application will start after flashing.

### Issues/PRs references
Fixes #19364 


19366: nanocoap_sock: don't include token in empty ACK response r=benpicco a=benpicco



19367: cord: bump reference from draft to rfc r=benpicco a=bergzand

### Contribution description

The draft is an RFC, this bumps the "see also" in the docs to the rfc.

### Testing procedure

Check that the correct RFC is linked in the docs.

### Issues/PRs references

None


Co-authored-by: Dylan Laduranty <dylan.laduranty@mesotic.com>
Co-authored-by: Benjamin Valentin <benjamin.valentin@ml-pa.com>
Co-authored-by: Koen Zandberg <koen@bergzand.net>
2023-03-08 12:23:24 +00:00
Benjamin Valentin
d6e05dae7f nanocoap_sock: don't include token in empty ACK response 2023-03-08 11:38:09 +01:00
Benjamin Valentin
ad8dd8d061 nanocoap_sock: ensure response address is the same as request address 2023-03-07 16:58:17 +01:00
Benjamin Valentin
5134b5c7d5 nanocoap_sock: make use of sock_dtls_establish_session() 2023-02-08 15:57:28 +01:00
Benjamin Valentin
d041a5fb1a nanocoap_sock: store message ID in nanocoap_sock_t 2023-01-20 01:50:10 +01:00
Benjamin Valentin
d660e3ebbd nanocoap_sock: implement DTLS socket 2023-01-13 00:17:32 +01:00
Benjamin Valentin
ad5b27df8e nanocoap_sock: make nanocoap_sock_t a proper struct 2023-01-13 00:08:55 +01:00
bors[bot]
53176f7b9e
Merge #18134 #18738 #18939 #19118
18134: nanocoap_link_format: add helper function to parse Link Format r=kaspar030 a=benpicco



18738: nanocoap_sock: implement nanocoap_sock_delete() r=maribu a=benpicco



18939: gnrc_ipv6_nib: clean up _resolve_addr() r=maribu a=benpicco



19118: sys/ztimer: ztimer_mock: guard ztimer_ondemand static functions r=kaspar030 a=kaspar030



Co-authored-by: Benjamin Valentin <benpicco@beuth-hochschule.de>
Co-authored-by: Benjamin Valentin <benjamin.valentin@ml-pa.com>
Co-authored-by: Benjamin Valentin <benjamin.valentin@bht-berlin.de>
Co-authored-by: Kaspar Schleiser <kaspar@schleiser.de>
2023-01-10 11:25:32 +00:00
bors[bot]
6cf2116ae8
Merge #18773
18773: nanocoap_sock: fix handling empty ACKs with separate response r=maribu a=benpicco



Co-authored-by: Benjamin Valentin <benjamin.valentin@ml-pa.com>
Co-authored-by: Benjamin Valentin <benjamin.valentin@bht-berlin.de>
2023-01-06 01:07:57 +00:00