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 rust-lang#379
  • Loading branch information
jasta committed Jul 14, 2023
1 parent 9ce984d commit 71fbf6b
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 14 deletions.
15 changes: 11 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 @@ -428,6 +431,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 +440,7 @@ pub struct TcpKeepalive {
target_os = "solaris",
target_os = "windows",
target_os = "nto",
target_os = "espidf",
)))]
retries: Option<u32>,
}
Expand All @@ -450,6 +455,7 @@ impl TcpKeepalive {
target_os = "redox",
target_os = "solaris",
target_os = "nto",
target_os = "espidf",
)))]
interval: None,
#[cfg(not(any(
Expand All @@ -458,6 +464,7 @@ impl TcpKeepalive {
target_os = "solaris",
target_os = "windows",
target_os = "nto",
target_os = "espidf",
)))]
retries: None,
}
Expand Down
17 changes: 13 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,8 @@ 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 +1133,8 @@ 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 +1238,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 +1270,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 +1303,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 +1339,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 +1517,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 +1546,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 +1762,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 +1785,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
33 changes: 27 additions & 6 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,11 +111,19 @@ 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;
#[cfg(target_os = "espidf")]
pub(crate) const MSG_TRUNC: libc::c_int = 4; // TODO: Expose in libc for ESP-IDF/LwIP
// Used in `Socket`.
// Used in `Socket`.
// Used in `Socket`.
#[cfg(not(target_os = "nto"))]
pub(crate) use libc::ipv6_mreq as Ipv6Mreq;
#[cfg(all(feature = "all", not(any(target_os = "redox", target_os = "espidf"))))]
pub(crate) use libc::IP_HDRINCL;
#[cfg(not(any(
target_os = "dragonfly",
target_os = "fuchsia",
Expand All @@ -125,6 +133,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 +149,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 +188,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 +340,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 +483,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 @@ -539,7 +552,14 @@ impl RecvFlags {
///
/// [`SEQPACKET`]: Type::SEQPACKET
pub const fn is_end_of_record(self) -> bool {
self.0 & libc::MSG_EOR != 0
// TODO: Expose this constant in libc for the ESP-IDF/LwIP framework
#[cfg(target_os = "espidf")]
const MSG_EOR: libc::c_int = 8;

#[cfg(not(target_os = "espidf"))]
use libc::MSG_EOR;

self.0 & MSG_EOR != 0
}

/// Check if the message contains out-of-band data.
Expand Down Expand Up @@ -1264,6 +1284,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 71fbf6b

Please sign in to comment.