esp_idf_svc::eth

Struct EthDriver

Source
pub struct EthDriver<'d, T> { /* private fields */ }
Expand description

This struct provides a safe wrapper over the ESP IDF Ethernet C driver.

The driver works on Layer 2 (Data Link) in the OSI model, in that it provides facilities for sending and receiving ethernet packets over the built-in RMII interface of esp32 and/or via a dedicated SPI ethernet peripheral for all other MCUs.

For most use cases, utilizing EspEth - which provides a networking (IP) layer as well - should be preferred. Using EthDriver directly is beneficial only when one would like to utilize a custom, non-STD network stack like smoltcp.

Implementations§

Source§

impl<'d, T> EthDriver<'d, SpiEth<T>>
where T: Borrow<SpiDriver<'d>>,

Source

pub fn new( driver: T, int: impl Peripheral<P = impl InputPin> + 'd, cs: Option<impl Peripheral<P = impl OutputPin> + 'd>, rst: Option<impl Peripheral<P = impl OutputPin> + 'd>, chipset: SpiEthChipset, baudrate: Hertz, mac_addr: Option<&[u8; 6]>, phy_addr: Option<u32>, sysloop: EspSystemEventLoop, ) -> Result<Self, EspError>

Source

pub fn new_spi( driver: T, int: impl Peripheral<P = impl InputPin> + 'd, cs: Option<impl Peripheral<P = impl OutputPin> + 'd>, rst: Option<impl Peripheral<P = impl OutputPin> + 'd>, chipset: SpiEthChipset, baudrate: Hertz, mac_addr: Option<&[u8; 6]>, phy_addr: Option<u32>, sysloop: EspSystemEventLoop, ) -> Result<Self, EspError>

Source

pub fn new_spi_with_event_source( driver: T, event_source: SpiEventSource<'d>, cs: Option<impl Peripheral<P = impl OutputPin> + 'd>, rst: Option<impl Peripheral<P = impl OutputPin> + 'd>, chipset: SpiEthChipset, baudrate: Hertz, mac_addr: Option<&[u8; 6]>, phy_addr: Option<u32>, sysloop: EspSystemEventLoop, ) -> Result<Self, EspError>

Source§

impl<'d, T> EthDriver<'d, T>

Source

pub fn is_started(&self) -> Result<bool, EspError>

Source

pub fn is_connected(&self) -> Result<bool, EspError>

Source

pub fn start(&mut self) -> Result<(), EspError>

Source

pub fn stop(&mut self) -> Result<(), EspError>

Source

pub fn set_rx_callback<F>(&mut self, callback: F) -> Result<(), EspError>
where F: FnMut(EthFrame) + Send + 'static,

Source

pub unsafe fn set_nonstatic_rx_callback<F>( &mut self, callback: F, ) -> Result<(), EspError>
where F: FnMut(EthFrame) + Send + 'd,

§Safety

This method - in contrast to method set_rx_callback - allows the user to pass a non-static callback/closure. This enables users to borrow

  • in the closure - variables that live on the stack - or more generally - in the same scope where the service is created.

HOWEVER: care should be taken NOT to call core::mem::forget() on the service, as that would immediately lead to an UB (crash). Also note that forgetting the service might happen with Rc and Arc when circular references are introduced: https://github.com/rust-lang/rust/issues/24456

The reason is that the closure is actually sent to a hidden ESP IDF thread. This means that if the service is forgotten, Rust is free to e.g. unwind the stack and the closure now owned by this other thread will end up with references to variables that no longer exist.

The destructor of the service takes care - prior to the service being dropped and e.g. the stack being unwind - to remove the closure from the hidden thread and destroy it. Unfortunately, when the service is forgotten, the un-subscription does not happen and invalid references are left dangling.

This “local borrowing” will only be possible to express in a safe way once/if !Leak types are introduced to Rust (i.e. the impossibility to “forget” a type and thus not call its destructor).

Source

pub fn send(&mut self, frame: &[u8]) -> Result<(), EspError>

Source

pub fn set_promiscuous(&mut self, state: bool) -> Result<(), EspError>

Enables or disables promiscuous mode for the EthDriver.

When promiscuous mode is enabled, the driver captures all Ethernet frames on the network, regardless of their destination MAC address. This is useful for debugging or monitoring purposes.

Trait Implementations§

Source§

impl<T> Drop for EthDriver<'_, T>

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

impl<T> Eth for EthDriver<'_, T>

Source§

type Error = EspError

Source§

fn start(&mut self) -> Result<(), Self::Error>

Source§

fn stop(&mut self) -> Result<(), Self::Error>

Source§

fn is_started(&self) -> Result<bool, Self::Error>

Source§

fn is_connected(&self) -> Result<bool, Self::Error>

Source§

impl<T> RawHandle for EthDriver<'_, T>

Source§

type Handle = *mut c_void

Source§

fn handle(&self) -> Self::Handle

Care should be taken to use the returned ESP-IDF driver raw handle only while the driver is still alive, so as to avoid use-after-free errors.
Source§

impl<T> Send for EthDriver<'_, T>

Auto Trait Implementations§

§

impl<'d, T> Freeze for EthDriver<'d, T>
where T: Freeze,

§

impl<'d, T> !RefUnwindSafe for EthDriver<'d, T>

§

impl<'d, T> !Sync for EthDriver<'d, T>

§

impl<'d, T> Unpin for EthDriver<'d, T>
where T: Unpin,

§

impl<'d, T> !UnwindSafe for EthDriver<'d, T>

Blanket Implementations§

§

impl<T> Any for T
where T: 'static + ?Sized,

§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> Borrow<T> for T
where T: ?Sized,

§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
§

impl<T> BorrowMut<T> for T
where T: ?Sized,

§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> From<T> for T

§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T, U> Into<U> for T
where U: From<T>,

§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of [From]<T> for U chooses to do.

§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.