Skip to content

Commit

Permalink
Do not use heapless on public API.
Browse files Browse the repository at this point in the history
It's better to not use heapless on the public API.

- It can get major bumps from time to time (for example v0.8 was just relased), and upgrading it is a breaking change of embedded-nal-async, which we should try to avoid.
- It allows users to use any version of heapless, or something else entirely.
  • Loading branch information
Dirbaio committed Nov 8, 2023
1 parent 404aceb commit 1c8f924
Show file tree
Hide file tree
Showing 6 changed files with 29 additions and 21 deletions.
3 changes: 1 addition & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -23,5 +23,4 @@ ip_in_core = []

[dependencies]
nb = "1"
no-std-net = { version = "0.6", optional = true }
heapless = "^0.7"
no-std-net = { version = "0.6", optional = true }
1 change: 0 additions & 1 deletion embedded-nal-async/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,5 @@ ip_in_core = []

[dependencies]
no-std-net = "0.6"
heapless = "^0.7"
embedded-nal = { version = "0.7.0", path = "../" }
embedded-io-async = { version = "0.6.0" }
24 changes: 18 additions & 6 deletions embedded-nal-async/src/dns.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
use crate::IpAddr;
use embedded_nal::AddrType;
use heapless::String;

/// This trait is an extension trait for [`TcpStack`] and [`UdpStack`] for dns
/// resolutions. It does not handle every DNS record type, but is meant as an
Expand All @@ -24,13 +23,22 @@ pub trait Dns {
addr_type: AddrType,
) -> Result<IpAddr, Self::Error>;

/// Resolve the hostname of a host, given its ip address
/// Resolve the hostname of a host, given its ip address.
///
/// The hostname is stored at the beginning of `result`, the length is returned.
///
/// If the buffer is too small to hold the domain name, an error should be returned.
///
/// **Note**: A fully qualified domain name (FQDN), has a maximum length of
/// 255 bytes [`rfc1035`]
/// 255 bytes according to [`rfc1035`]. Therefore, you can pass a 255-byte long
/// buffer to guarantee it'll always be large enough.
///
/// [`rfc1035`]: https://tools.ietf.org/html/rfc1035
async fn get_host_by_address(&self, addr: IpAddr) -> Result<String<256>, Self::Error>;
async fn get_host_by_address(
&self,
addr: IpAddr,
result: &mut [u8],
) -> Result<usize, Self::Error>;
}

impl<T: Dns> Dns for &T {
Expand All @@ -44,7 +52,11 @@ impl<T: Dns> Dns for &T {
T::get_host_by_name(self, host, addr_type).await
}

async fn get_host_by_address(&self, addr: IpAddr) -> Result<String<256>, Self::Error> {
T::get_host_by_address(self, addr).await
async fn get_host_by_address(
&self,
addr: IpAddr,
result: &mut [u8],
) -> Result<usize, Self::Error> {
T::get_host_by_address(self, addr, result).await
}
}
3 changes: 0 additions & 3 deletions embedded-nal-async/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,6 @@

mod dns;
mod stack;
// Needed by embedded-nal trait implementers who build get_host_by_address results, or by trait
// users who pass the results on.
pub use heapless;

#[cfg(feature = "ip_in_core")]
pub use core::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6};
Expand Down
16 changes: 10 additions & 6 deletions src/dns.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
use crate::IpAddr;
use heapless::String;

/// This is the host address type to be returned by `gethostbyname`.
///
Expand Down Expand Up @@ -37,13 +36,18 @@ pub trait Dns {
addr_type: AddrType,
) -> nb::Result<IpAddr, Self::Error>;

/// Resolve the hostname of a host, given its ip address
/// Resolve the hostname of a host, given its ip address.
///
/// The hostname is stored at the beginning of `result`, the length is returned.
///
/// If the buffer is too small to hold the domain name, an error should be returned.
///
/// **Note**: A fully qualified domain name (FQDN), has a maximum length of
/// 255 bytes [`rfc1035`]
/// 255 bytes according to [`rfc1035`]. Therefore, you can pass a 255-byte long
/// buffer to guarantee it'll always be large enough.
///
/// [`rfc1035`]: https://tools.ietf.org/html/rfc1035
fn get_host_by_address(&mut self, addr: IpAddr) -> nb::Result<String<256>, Self::Error>;
fn get_host_by_address(&self, addr: IpAddr, result: &mut [u8]) -> Result<usize, Self::Error>;
}

impl<T: Dns> Dns for &mut T {
Expand All @@ -57,7 +61,7 @@ impl<T: Dns> Dns for &mut T {
T::get_host_by_name(self, hostname, addr_type)
}

fn get_host_by_address(&mut self, addr: IpAddr) -> nb::Result<String<256>, Self::Error> {
T::get_host_by_address(self, addr)
fn get_host_by_address(&self, addr: IpAddr, result: &mut [u8]) -> Result<usize, Self::Error> {
T::get_host_by_address(self, addr, result)
}
}
3 changes: 0 additions & 3 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,6 @@ mod dns;
mod stack;

pub use nb;
// Needed by embedded-nal trait implementers who build get_host_by_address results, or by trait
// users who pass the results on.
pub use heapless;

#[cfg(not(any(feature = "ip_in_core", feature = "no-std-net")))]
compile_error!("You must select the ip_in_core feature or the no-std-net feature");
Expand Down

0 comments on commit 1c8f924

Please sign in to comment.