Skip to content

Commit

Permalink
Support for the ESP-IDF framework
Browse files Browse the repository at this point in the history
Smoke tested on esp32c3 dev board.  I've also tested a similar patch
backported to v0.4.9 with much greater functionality including tokio +
mio with other patches I've been working on and it's fully working.

Closes #379
  • Loading branch information
jasta committed Jul 15, 2023
1 parent 9ce984d commit e5a4d26
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 18 deletions.
16 changes: 12 additions & 4 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -270,13 +270,16 @@ impl Type {
pub const DCCP: Type = Type(sys::SOCK_DCCP);

/// Type corresponding to `SOCK_SEQPACKET`.
#[cfg(feature = "all")]
#[cfg_attr(docsrs, doc(cfg(feature = "all")))]
#[cfg(all(feature = "all", not(target_os = "espidf")))]
#[cfg_attr(docsrs, doc(cfg(all(feature = "all", not(target_os = "espidf")))))]
pub const SEQPACKET: Type = Type(sys::SOCK_SEQPACKET);

/// Type corresponding to `SOCK_RAW`.
#[cfg(all(feature = "all", not(target_os = "redox")))]
#[cfg_attr(docsrs, doc(cfg(all(feature = "all", not(target_os = "redox")))))]
#[cfg(all(feature = "all", not(any(target_os = "redox", target_os = "espidf"))))]
#[cfg_attr(
docsrs,
doc(cfg(all(feature = "all", not(any(target_os = "redox", target_os = "espidf")))))
)]
pub const RAW: Type = Type(sys::SOCK_RAW);
}

Expand Down Expand Up @@ -374,6 +377,7 @@ impl RecvFlags {
///
/// On Unix this corresponds to the `MSG_TRUNC` flag.
/// On Windows this corresponds to the `WSAEMSGSIZE` error code.
#[cfg(not(target_os = "espidf"))]
pub const fn is_truncated(self) -> bool {
self.0 & sys::MSG_TRUNC != 0
}
Expand Down Expand Up @@ -428,6 +432,7 @@ pub struct TcpKeepalive {
target_os = "redox",
target_os = "solaris",
target_os = "nto",
target_os = "espidf",
)))]
interval: Option<Duration>,
#[cfg(not(any(
Expand All @@ -436,6 +441,7 @@ pub struct TcpKeepalive {
target_os = "solaris",
target_os = "windows",
target_os = "nto",
target_os = "espidf",
)))]
retries: Option<u32>,
}
Expand All @@ -450,6 +456,7 @@ impl TcpKeepalive {
target_os = "redox",
target_os = "solaris",
target_os = "nto",
target_os = "espidf",
)))]
interval: None,
#[cfg(not(any(
Expand All @@ -458,6 +465,7 @@ impl TcpKeepalive {
target_os = "solaris",
target_os = "windows",
target_os = "nto",
target_os = "espidf",
)))]
retries: None,
}
Expand Down
23 changes: 19 additions & 4 deletions src/socket.rs
Original file line number Diff line number Diff line change
Expand Up @@ -790,6 +790,7 @@ fn set_common_flags(socket: Socket) -> io::Result<Socket> {
target_os = "linux",
target_os = "netbsd",
target_os = "openbsd",
target_os = "espidf",
))
))]
socket._set_cloexec(true)?;
Expand Down Expand Up @@ -1108,8 +1109,11 @@ impl Socket {
/// For more information about this option, see [`set_header_included`].
///
/// [`set_header_included`]: Socket::set_header_included
#[cfg(all(feature = "all", not(target_os = "redox")))]
#[cfg_attr(docsrs, doc(cfg(all(feature = "all", not(target_os = "redox")))))]
#[cfg(all(feature = "all", not(any(target_os = "redox", target_os = "espidf"))))]
#[cfg_attr(
docsrs,
doc(cfg(all(feature = "all", not(any(target_os = "redox", target_os = "espidf")))))
)]
pub fn header_included(&self) -> io::Result<bool> {
unsafe {
getsockopt::<c_int>(self.as_raw(), sys::IPPROTO_IP, sys::IP_HDRINCL)
Expand All @@ -1132,8 +1136,11 @@ impl Socket {
any(target_os = "fuchsia", target_os = "illumos", target_os = "solaris"),
allow(rustdoc::broken_intra_doc_links)
)]
#[cfg(all(feature = "all", not(target_os = "redox")))]
#[cfg_attr(docsrs, doc(cfg(all(feature = "all", not(target_os = "redox")))))]
#[cfg(all(feature = "all", not(any(target_os = "redox", target_os = "espidf"))))]
#[cfg_attr(
docsrs,
doc(cfg(all(feature = "all", not(any(target_os = "redox", target_os = "espidf")))))
)]
pub fn set_header_included(&self, included: bool) -> io::Result<()> {
unsafe {
setsockopt(
Expand Down Expand Up @@ -1237,6 +1244,7 @@ impl Socket {
target_os = "redox",
target_os = "solaris",
target_os = "nto",
target_os = "espidf",
)))]
pub fn join_multicast_v4_n(
&self,
Expand Down Expand Up @@ -1268,6 +1276,7 @@ impl Socket {
target_os = "redox",
target_os = "solaris",
target_os = "nto",
target_os = "espidf",
)))]
pub fn leave_multicast_v4_n(
&self,
Expand Down Expand Up @@ -1300,6 +1309,7 @@ impl Socket {
target_os = "redox",
target_os = "fuchsia",
target_os = "nto",
target_os = "espidf",
)))]
pub fn join_ssm_v4(
&self,
Expand Down Expand Up @@ -1335,6 +1345,7 @@ impl Socket {
target_os = "redox",
target_os = "fuchsia",
target_os = "nto",
target_os = "espidf",
)))]
pub fn leave_ssm_v4(
&self,
Expand Down Expand Up @@ -1512,6 +1523,7 @@ impl Socket {
target_os = "solaris",
target_os = "haiku",
target_os = "nto",
target_os = "espidf",
)))]
pub fn set_recv_tos(&self, recv_tos: bool) -> io::Result<()> {
unsafe {
Expand Down Expand Up @@ -1540,6 +1552,7 @@ impl Socket {
target_os = "solaris",
target_os = "haiku",
target_os = "nto",
target_os = "espidf",
)))]
pub fn recv_tos(&self) -> io::Result<bool> {
unsafe {
Expand Down Expand Up @@ -1755,6 +1768,7 @@ impl Socket {
target_os = "redox",
target_os = "solaris",
target_os = "haiku",
target_os = "espidf",
)))]
pub fn recv_tclass_v6(&self) -> io::Result<bool> {
unsafe {
Expand All @@ -1777,6 +1791,7 @@ impl Socket {
target_os = "redox",
target_os = "solaris",
target_os = "haiku",
target_os = "espidf",
)))]
pub fn set_recv_tclass_v6(&self, recv_tclass: bool) -> io::Result<()> {
unsafe {
Expand Down
31 changes: 21 additions & 10 deletions src/sys/unix.rs
Original file line number Diff line number Diff line change
Expand Up @@ -81,9 +81,9 @@ pub(crate) use libc::{AF_INET, AF_INET6, AF_UNIX};
// Used in `Type`.
#[cfg(all(feature = "all", target_os = "linux"))]
pub(crate) use libc::SOCK_DCCP;
#[cfg(all(feature = "all", not(target_os = "redox")))]
#[cfg(all(feature = "all", not(any(target_os = "redox", target_os = "espidf"))))]
pub(crate) use libc::SOCK_RAW;
#[cfg(feature = "all")]
#[cfg(all(feature = "all", not(target_os = "espidf")))]
pub(crate) use libc::SOCK_SEQPACKET;
pub(crate) use libc::{SOCK_DGRAM, SOCK_STREAM};
// Used in `Protocol`.
Expand Down Expand Up @@ -111,8 +111,10 @@ pub(crate) use libc::{
sa_family_t, sockaddr, sockaddr_in, sockaddr_in6, sockaddr_storage, socklen_t,
};
// Used in `RecvFlags`.
#[cfg(not(any(target_os = "redox", target_os = "espidf")))]
pub(crate) use libc::MSG_TRUNC;
#[cfg(not(target_os = "redox"))]
pub(crate) use libc::{MSG_TRUNC, SO_OOBINLINE};
pub(crate) use libc::SO_OOBINLINE;
// Used in `Socket`.
#[cfg(not(target_os = "nto"))]
pub(crate) use libc::ipv6_mreq as Ipv6Mreq;
Expand All @@ -125,6 +127,7 @@ pub(crate) use libc::ipv6_mreq as Ipv6Mreq;
target_os = "redox",
target_os = "solaris",
target_os = "haiku",
target_os = "espidf",
)))]
pub(crate) use libc::IPV6_RECVTCLASS;
#[cfg(all(feature = "all", not(target_os = "redox")))]
Expand All @@ -140,6 +143,7 @@ pub(crate) use libc::IP_HDRINCL;
target_os = "solaris",
target_os = "haiku",
target_os = "nto",
target_os = "espidf",
)))]
pub(crate) use libc::IP_RECVTOS;
#[cfg(not(any(
Expand Down Expand Up @@ -178,6 +182,7 @@ pub(crate) use libc::{
target_os = "redox",
target_os = "fuchsia",
target_os = "nto",
target_os = "espidf",
)))]
pub(crate) use libc::{
ip_mreq_source as IpMreqSource, IP_ADD_SOURCE_MEMBERSHIP, IP_DROP_SOURCE_MEMBERSHIP,
Expand Down Expand Up @@ -329,6 +334,7 @@ type IovLen = usize;
target_os = "solaris",
target_os = "tvos",
target_os = "watchos",
target_os = "espidf",
))]
type IovLen = c_int;

Expand Down Expand Up @@ -471,10 +477,11 @@ impl_debug!(
libc::SOCK_DGRAM,
#[cfg(all(feature = "all", target_os = "linux"))]
libc::SOCK_DCCP,
#[cfg(not(target_os = "redox"))]
#[cfg(not(any(target_os = "redox", target_os = "espidf")))]
libc::SOCK_RAW,
#[cfg(not(any(target_os = "redox", target_os = "haiku")))]
#[cfg(not(any(target_os = "redox", target_os = "haiku", target_os = "espidf")))]
libc::SOCK_RDM,
#[cfg(not(target_os = "espidf"))]
libc::SOCK_SEQPACKET,
/* TODO: add these optional bit OR-ed flags:
#[cfg(any(
Expand Down Expand Up @@ -538,6 +545,7 @@ impl RecvFlags {
/// On Unix this corresponds to the `MSG_EOR` flag.
///
/// [`SEQPACKET`]: Type::SEQPACKET
#[cfg(not(target_os = "espidf"))]
pub const fn is_end_of_record(self) -> bool {
self.0 & libc::MSG_EOR != 0
}
Expand All @@ -556,11 +564,13 @@ impl RecvFlags {
#[cfg(not(target_os = "redox"))]
impl std::fmt::Debug for RecvFlags {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("RecvFlags")
.field("is_end_of_record", &self.is_end_of_record())
.field("is_out_of_band", &self.is_out_of_band())
.field("is_truncated", &self.is_truncated())
.finish()
let mut s = f.debug_struct("RecvFlags");
#[cfg(not(target_os = "espidf"))]
s.field("is_end_of_record", &self.is_end_of_record());
s.field("is_out_of_band", &self.is_out_of_band());
#[cfg(not(target_os = "espidf"))]
s.field("is_truncated", &self.is_truncated());
s.finish()
}
}

Expand Down Expand Up @@ -1264,6 +1274,7 @@ pub(crate) fn from_in6_addr(addr: in6_addr) -> Ipv6Addr {
target_os = "redox",
target_os = "solaris",
target_os = "nto",
target_os = "espidf",
)))]
pub(crate) const fn to_mreqn(
multiaddr: &Ipv4Addr,
Expand Down

0 comments on commit e5a4d26

Please sign in to comment.