embedded-nal-minimal-coapserver 0.3.1

A minimal CoAP server implementation built on embedded-nal
Documentation
[![Build Status](https://gitlab.com/chrysn/embedded-nal-minimal-coapserver/badges/master/pipeline.svg)](https://gitlab.com/chrysn/embedded-nal-minimal-coapserver/commits/master)
![Maintenance](https://img.shields.io/badge/maintenance-experimental-blue.svg)

# embedded-nal-minimal-coapserver

A minimal CoAP server implementation built on [embedded_nal].

Usage and operation
-------------------

Until the project has matured further, see [the example] for usage. The general steps are:

[the example]: https://gitlab.com/chrysn/coap-message-demos/-/blob/master/examples/std_embedded_nal_minicoapserver.rs

* Get a network stack with a UDP server socket that implments [embedded_nal::UdpServer]

* Create a CoAP handler that implements [coap_handler::Handler]; the
  [coap_handler::implementations] module contains some building blocks
  (including some to combine handlers for individual resources into a handler that picks
  sub-handlers from the URI path).

* Whenever there is indication that a request might have come in, call [poll] with the stack,
  the socket and the handler. This will accept the data from the socket, decode the CoAP
  message, pass it to the handler, and send back the response.

  It returns successful if a message was processed (or something came in that could be
  ignored), propagates out errors from the socket, and returns [WouldBlock]embedded_nal::nb::Error::WouldBlock if it
  turms out the socket was *not* ready.

  By applying the belowmentioned constraints and exercising some of the liberties designed into
  CoAP, the server does not need to hold any state of its own.

Caveats
-------

* The server does not perform any amplification mitigation (and the handler can't for lack of
  remote information); use this only in environments where this is acceptable (e.g. in closed
  networks).

* The server does not perform any message deduplication. All handler functions must therefore
  be idempotent.

* The response logic is implemented using [nb]embedded_nal::nb and does not attempt to store responses for
  later invocations. If a request comes in and the response can't be sent right away, it is
  discarded.

* Being based on embedded-nal, it binds to the any-address but leaves the network stack to
  choose the sending address; this leads to subtle bugs when runnign on a system with multiple
  IP addresses.

* Messages are created with as little copying as [embedded_nal] permits. For writable messages,
  that means that they need to be written to in ascending CoAP option number. This is in
  accordance with the implemented [coap_message::MinimalWritableMessage] and
  [coap_message::MutableWritableMessage] traits.

  That restriction enables this crate to not only be `no_std`, but to not require `alloc`
  either.

Roadmap
-------

The goal of this server is to become a component that can be used easily to bring CoAP
connectivity to embedded devices at the bare minimum, while still being practically usable.

This means that the amplification mitigation topic will need to be addressed, and that security
backing must be catered for (probably by referring to an OSCORE/EDHOC mix-in).

Other than that, this implementation's plan is to stay simple and utilize the optimizations
CoAP offers, even if this means limiting the application (eg. to immediate responses, and to
idempotent handlers).

License: MIT OR Apache-2.0