Compatibility with embassy-net fixed multicast support

This commit is contained in:
ivmarkov 2023-07-17 20:26:50 +00:00
parent 24cdf079a6
commit aa2d5dfe20
4 changed files with 22 additions and 43 deletions

View file

@ -128,9 +128,7 @@ impl<'a> MdnsRunner<'a> {
buffers: &mut MdnsUdpBuffers, buffers: &mut MdnsUdpBuffers,
) -> Result<(), Error> ) -> Result<(), Error>
where where
D: crate::transport::network::NetworkStackMulticastDriver D: crate::transport::network::NetworkStackDriver,
+ crate::transport::network::NetworkStackDriver
+ 'static,
{ {
let mut udp = crate::transport::udp::UdpListener::new( let mut udp = crate::transport::udp::UdpListener::new(
stack, stack,
@ -139,11 +137,13 @@ impl<'a> MdnsRunner<'a> {
) )
.await?; .await?;
udp.join_multicast_v6(IPV6_BROADCAST_ADDR, self.0.interface)?; udp.join_multicast_v6(IPV6_BROADCAST_ADDR, self.0.interface)
.await?;
udp.join_multicast_v4( udp.join_multicast_v4(
IP_BROADCAST_ADDR, IP_BROADCAST_ADDR,
crate::transport::network::Ipv4Addr::from(self.0.host.ip), crate::transport::network::Ipv4Addr::from(self.0.host.ip),
)?; )
.await?;
let tx_pipe = Pipe::new(unsafe { buffers.tx_buf.assume_init_mut() }); let tx_pipe = Pipe::new(unsafe { buffers.tx_buf.assume_init_mut() });
let rx_pipe = Pipe::new(unsafe { buffers.rx_buf.assume_init_mut() }); let rx_pipe = Pipe::new(unsafe { buffers.rx_buf.assume_init_mut() });

View file

@ -68,10 +68,6 @@ pub mod std_stack {
impl NetworkStackDriver for () {} impl NetworkStackDriver for () {}
pub trait NetworkStackMulticastDriver {}
impl NetworkStackMulticastDriver for () {}
pub struct NetworkStack<D>(D); pub struct NetworkStack<D>(D);
impl NetworkStack<()> { impl NetworkStack<()> {
@ -85,5 +81,4 @@ pub mod std_stack {
pub mod embassy_net_stack { pub mod embassy_net_stack {
pub use embassy_net::Stack as NetworkStack; pub use embassy_net::Stack as NetworkStack;
pub use embassy_net_driver::Driver as NetworkStackDriver; pub use embassy_net_driver::Driver as NetworkStackDriver;
pub use smoltcp::phy::Device as NetworkStackMulticastDriver;
} }

View file

@ -138,9 +138,7 @@ impl<'a> TransportRunner<'a> {
handler: &H, handler: &H,
) -> Result<(), Error> ) -> Result<(), Error>
where where
D: crate::transport::network::NetworkStackDriver D: crate::transport::network::NetworkStackDriver,
+ crate::transport::network::NetworkStackMulticastDriver
+ 'static,
H: DataModelHandler, H: DataModelHandler,
{ {
let mut mdns_runner = crate::mdns::MdnsRunner::new(mdns); let mut mdns_runner = crate::mdns::MdnsRunner::new(mdns);

View file

@ -31,9 +31,7 @@ pub mod async_io {
use log::{debug, info, warn}; use log::{debug, info, warn};
use crate::transport::network::std_stack::{ use crate::transport::network::std_stack::{NetworkStack, NetworkStackDriver};
NetworkStack, NetworkStackDriver, NetworkStackMulticastDriver,
};
use crate::transport::network::{Ipv4Addr, Ipv6Addr, SocketAddr}; use crate::transport::network::{Ipv4Addr, Ipv6Addr, SocketAddr};
pub struct UdpBuffers(()); pub struct UdpBuffers(());
@ -46,11 +44,11 @@ pub mod async_io {
pub struct UdpListener<'a, D>(Async<UdpSocket>, &'a NetworkStack<D>) pub struct UdpListener<'a, D>(Async<UdpSocket>, &'a NetworkStack<D>)
where where
D: NetworkStackDriver; D: NetworkStackDriver + 'static;
impl<'a, D> UdpListener<'a, D> impl<'a, D> UdpListener<'a, D>
where where
D: NetworkStackDriver + 'a, D: NetworkStackDriver + 'a + 'static,
{ {
pub async fn new( pub async fn new(
stack: &'a NetworkStack<D>, stack: &'a NetworkStack<D>,
@ -64,14 +62,11 @@ pub mod async_io {
Ok(listener) Ok(listener)
} }
pub fn join_multicast_v6( pub async fn join_multicast_v6(
&mut self, &mut self,
multiaddr: Ipv6Addr, multiaddr: Ipv6Addr,
interface: u32, interface: u32,
) -> Result<(), Error> ) -> Result<(), Error> {
where
D: NetworkStackMulticastDriver + 'static,
{
self.0.get_ref().join_multicast_v6(&multiaddr, interface)?; self.0.get_ref().join_multicast_v6(&multiaddr, interface)?;
info!("Joined IPV6 multicast {}/{}", multiaddr, interface); info!("Joined IPV6 multicast {}/{}", multiaddr, interface);
@ -79,14 +74,11 @@ pub mod async_io {
Ok(()) Ok(())
} }
pub fn join_multicast_v4( pub async fn join_multicast_v4(
&mut self, &mut self,
multiaddr: Ipv4Addr, multiaddr: Ipv4Addr,
interface: Ipv4Addr, interface: Ipv4Addr,
) -> Result<(), Error> ) -> Result<(), Error> {
where
D: NetworkStackMulticastDriver + 'static,
{
#[cfg(not(target_os = "espidf"))] #[cfg(not(target_os = "espidf"))]
self.0.get_ref().join_multicast_v4(&multiaddr, &interface)?; self.0.get_ref().join_multicast_v4(&multiaddr, &interface)?;
@ -181,9 +173,7 @@ pub mod embassy_net {
use log::{debug, info, warn}; use log::{debug, info, warn};
use crate::transport::network::embassy_net_stack::{ use crate::transport::network::embassy_net_stack::{NetworkStack, NetworkStackDriver};
NetworkStack, NetworkStackDriver, NetworkStackMulticastDriver,
};
use crate::transport::network::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr}; use crate::transport::network::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr};
const RX_BUF_SIZE: usize = 4096; const RX_BUF_SIZE: usize = 4096;
@ -210,11 +200,11 @@ pub mod embassy_net {
pub struct UdpListener<'a, D>(UdpSocket<'a>, &'a NetworkStack<D>) pub struct UdpListener<'a, D>(UdpSocket<'a>, &'a NetworkStack<D>)
where where
D: NetworkStackDriver; D: NetworkStackDriver + 'static;
impl<'a, D> UdpListener<'a, D> impl<'a, D> UdpListener<'a, D>
where where
D: NetworkStackDriver + 'a, D: NetworkStackDriver + 'a + 'static,
{ {
pub async fn new( pub async fn new(
stack: &'a NetworkStack<D>, stack: &'a NetworkStack<D>,
@ -239,16 +229,14 @@ pub mod embassy_net {
Ok(UdpListener(socket, stack)) Ok(UdpListener(socket, stack))
} }
pub fn join_multicast_v6( pub async fn join_multicast_v6(
&mut self, &mut self,
multiaddr: Ipv6Addr, multiaddr: Ipv6Addr,
_interface: u32, _interface: u32,
) -> Result<(), Error> ) -> Result<(), Error> {
where
D: NetworkStackMulticastDriver + 'static,
{
self.1 self.1
.join_multicast_group(Self::from_ip_addr(IpAddr::V6(multiaddr))) .join_multicast_group(Self::from_ip_addr(IpAddr::V6(multiaddr)))
.await
.map_err(|e| { .map_err(|e| {
warn!("Error on the network: {:?}", e); warn!("Error on the network: {:?}", e);
ErrorCode::Network ErrorCode::Network
@ -259,16 +247,14 @@ pub mod embassy_net {
Ok(()) Ok(())
} }
pub fn join_multicast_v4( pub async fn join_multicast_v4(
&mut self, &mut self,
multiaddr: Ipv4Addr, multiaddr: Ipv4Addr,
_interface: Ipv4Addr, _interface: Ipv4Addr,
) -> Result<(), Error> ) -> Result<(), Error> {
where
D: NetworkStackMulticastDriver + 'static,
{
self.1 self.1
.join_multicast_group(Self::from_ip_addr(IpAddr::V4(multiaddr))) .join_multicast_group(Self::from_ip_addr(IpAddr::V4(multiaddr)))
.await
.map_err(|e| { .map_err(|e| {
warn!("Error on the network: {:?}", e); warn!("Error on the network: {:?}", e);
ErrorCode::Network ErrorCode::Network