Fix multicast support (#1670)
This commit is contained in:
		@@ -479,30 +479,78 @@ impl<D: Driver + 'static> Stack<D> {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[cfg(feature = "igmp")]
 | 
					#[cfg(feature = "igmp")]
 | 
				
			||||||
impl<D: Driver + smoltcp::phy::Device + 'static> Stack<D> {
 | 
					impl<D: Driver + 'static> Stack<D> {
 | 
				
			||||||
    /// Join a multicast group.
 | 
					    /// Join a multicast group.
 | 
				
			||||||
    pub fn join_multicast_group<T>(&self, addr: T) -> Result<bool, MulticastError>
 | 
					    pub async fn join_multicast_group<T>(&self, addr: T) -> Result<bool, MulticastError>
 | 
				
			||||||
 | 
					    where
 | 
				
			||||||
 | 
					        T: Into<IpAddress>,
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        let addr = addr.into();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        poll_fn(move |cx| self.poll_join_multicast_group(addr, cx)).await
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// Join a multicast group.
 | 
				
			||||||
 | 
					    ///
 | 
				
			||||||
 | 
					    /// When the send queue is full, this method will return `Poll::Pending`
 | 
				
			||||||
 | 
					    /// and register the current task to be notified when the queue has space available.
 | 
				
			||||||
 | 
					    pub fn poll_join_multicast_group<T>(&self, addr: T, cx: &mut Context<'_>) -> Poll<Result<bool, MulticastError>>
 | 
				
			||||||
    where
 | 
					    where
 | 
				
			||||||
        T: Into<IpAddress>,
 | 
					        T: Into<IpAddress>,
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        let addr = addr.into();
 | 
					        let addr = addr.into();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.with_mut(|s, i| {
 | 
					        self.with_mut(|s, i| {
 | 
				
			||||||
            s.iface
 | 
					            let mut smoldev = DriverAdapter {
 | 
				
			||||||
                .join_multicast_group(&mut i.device, addr, instant_to_smoltcp(Instant::now()))
 | 
					                cx: Some(cx),
 | 
				
			||||||
 | 
					                inner: &mut i.device,
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            match s
 | 
				
			||||||
 | 
					                .iface
 | 
				
			||||||
 | 
					                .join_multicast_group(&mut smoldev, addr, instant_to_smoltcp(Instant::now()))
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                Ok(announce_sent) => Poll::Ready(Ok(announce_sent)),
 | 
				
			||||||
 | 
					                Err(MulticastError::Exhausted) => Poll::Pending,
 | 
				
			||||||
 | 
					                Err(other) => Poll::Ready(Err(other)),
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        })
 | 
					        })
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /// Leave a multicast group.
 | 
					    /// Leave a multicast group.
 | 
				
			||||||
    pub fn leave_multicast_group<T>(&self, addr: T) -> Result<bool, MulticastError>
 | 
					    pub async fn leave_multicast_group<T>(&self, addr: T) -> Result<bool, MulticastError>
 | 
				
			||||||
 | 
					    where
 | 
				
			||||||
 | 
					        T: Into<IpAddress>,
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        let addr = addr.into();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        poll_fn(move |cx| self.poll_leave_multicast_group(addr, cx)).await
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// Leave a multicast group.
 | 
				
			||||||
 | 
					    ///
 | 
				
			||||||
 | 
					    /// When the send queue is full, this method will return `Poll::Pending`
 | 
				
			||||||
 | 
					    /// and register the current task to be notified when the queue has space available.
 | 
				
			||||||
 | 
					    pub fn poll_leave_multicast_group<T>(&self, addr: T, cx: &mut Context<'_>) -> Poll<Result<bool, MulticastError>>
 | 
				
			||||||
    where
 | 
					    where
 | 
				
			||||||
        T: Into<IpAddress>,
 | 
					        T: Into<IpAddress>,
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        let addr = addr.into();
 | 
					        let addr = addr.into();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.with_mut(|s, i| {
 | 
					        self.with_mut(|s, i| {
 | 
				
			||||||
            s.iface
 | 
					            let mut smoldev = DriverAdapter {
 | 
				
			||||||
                .leave_multicast_group(&mut i.device, addr, instant_to_smoltcp(Instant::now()))
 | 
					                cx: Some(cx),
 | 
				
			||||||
 | 
					                inner: &mut i.device,
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            match s
 | 
				
			||||||
 | 
					                .iface
 | 
				
			||||||
 | 
					                .leave_multicast_group(&mut smoldev, addr, instant_to_smoltcp(Instant::now()))
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                Ok(leave_sent) => Poll::Ready(Ok(leave_sent)),
 | 
				
			||||||
 | 
					                Err(MulticastError::Exhausted) => Poll::Pending,
 | 
				
			||||||
 | 
					                Err(other) => Poll::Ready(Err(other)),
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        })
 | 
					        })
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user