Fix multicast support (#1670)

This commit is contained in:
ivmarkov 2023-07-18 18:35:20 +03:00 committed by GitHub
parent 27a3d2cd0b
commit 98576c17b6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -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)),
}
}) })
} }