use crate::iface::Context;
use crate::time::Instant;
#[cfg(feature = "socket-dhcpv4")]
mod dhcpv4;
#[cfg(feature = "socket-icmp")]
mod icmp;
#[cfg(feature = "socket-raw")]
mod raw;
#[cfg(feature = "socket-tcp")]
mod tcp;
#[cfg(feature = "socket-udp")]
mod udp;
#[cfg(feature = "async")]
mod waker;
#[cfg(feature = "socket-dhcpv4")]
pub use self::dhcpv4::{Config as Dhcpv4Config, Dhcpv4Socket, Event as Dhcpv4Event};
#[cfg(feature = "socket-icmp")]
pub use self::icmp::{Endpoint as IcmpEndpoint, IcmpPacketMetadata, IcmpSocket, IcmpSocketBuffer};
#[cfg(feature = "socket-raw")]
pub use self::raw::{RawPacketMetadata, RawSocket, RawSocketBuffer};
#[cfg(feature = "socket-tcp")]
pub use self::tcp::{SocketBuffer as TcpSocketBuffer, State as TcpState, TcpSocket};
#[cfg(feature = "socket-udp")]
pub use self::udp::{UdpPacketMetadata, UdpSocket, UdpSocketBuffer};
#[cfg(feature = "async")]
pub(crate) use self::waker::WakerRegistration;
#[derive(Debug, PartialOrd, Ord, PartialEq, Eq, Clone, Copy)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) enum PollAt {
Now,
Time(Instant),
Ingress,
}
#[derive(Debug)]
pub enum Socket<'a> {
#[cfg(feature = "socket-raw")]
Raw(RawSocket<'a>),
#[cfg(feature = "socket-icmp")]
Icmp(IcmpSocket<'a>),
#[cfg(feature = "socket-udp")]
Udp(UdpSocket<'a>),
#[cfg(feature = "socket-tcp")]
Tcp(TcpSocket<'a>),
#[cfg(feature = "socket-dhcpv4")]
Dhcpv4(Dhcpv4Socket),
}
impl<'a> Socket<'a> {
pub(crate) fn poll_at(&self, cx: &mut Context) -> PollAt {
match self {
#[cfg(feature = "socket-raw")]
Socket::Raw(s) => s.poll_at(cx),
#[cfg(feature = "socket-icmp")]
Socket::Icmp(s) => s.poll_at(cx),
#[cfg(feature = "socket-udp")]
Socket::Udp(s) => s.poll_at(cx),
#[cfg(feature = "socket-tcp")]
Socket::Tcp(s) => s.poll_at(cx),
#[cfg(feature = "socket-dhcpv4")]
Socket::Dhcpv4(s) => s.poll_at(cx),
}
}
}
pub trait AnySocket<'a>: Sized {
fn upcast(self) -> Socket<'a>;
fn downcast<'c>(socket: &'c mut Socket<'a>) -> Option<&'c mut Self>;
}
macro_rules! from_socket {
($socket:ty, $variant:ident) => {
impl<'a> AnySocket<'a> for $socket {
fn upcast(self) -> Socket<'a> {
Socket::$variant(self)
}
fn downcast<'c>(socket: &'c mut Socket<'a>) -> Option<&'c mut Self> {
#[allow(unreachable_patterns)]
match socket {
Socket::$variant(socket) => Some(socket),
_ => None,
}
}
}
};
}
#[cfg(feature = "socket-raw")]
from_socket!(RawSocket<'a>, Raw);
#[cfg(feature = "socket-icmp")]
from_socket!(IcmpSocket<'a>, Icmp);
#[cfg(feature = "socket-udp")]
from_socket!(UdpSocket<'a>, Udp);
#[cfg(feature = "socket-tcp")]
from_socket!(TcpSocket<'a>, Tcp);
#[cfg(feature = "socket-dhcpv4")]
from_socket!(Dhcpv4Socket, Dhcpv4);