1#![deny(missing_docs)]
6
7use crate::{IcmpSocket, Ipv4, Ipv6};
8use core::task::{Context, Poll};
9use fuchsia_async as fasync;
10use futures::ready;
11
12impl<I> IcmpSocket<I> for fasync::net::DatagramSocket
13where
14 I: crate::IpExt,
15{
16 fn async_recv_from(
20 &self,
21 buf: &mut [u8],
22 cx: &mut Context<'_>,
23 ) -> Poll<std::io::Result<(usize, I::SockAddr)>> {
24 Poll::Ready(ready!(self.async_recv_from(buf, cx)).and_then(|(len, addr)| {
25 <I::SockAddr as crate::TryFromSockAddr>::try_from(addr).map(|addr| (len, addr))
26 }))
27 }
28
29 fn async_send_to_vectored(
33 &self,
34 bufs: &[std::io::IoSlice<'_>],
35 addr: &I::SockAddr,
36 cx: &mut Context<'_>,
37 ) -> Poll<std::io::Result<usize>> {
38 self.async_send_to_vectored(bufs, &(*addr).clone().into(), cx)
39 }
40
41 fn bind_device(&self, interface: Option<&[u8]>) -> std::io::Result<()> {
48 self.bind_device(interface)
49 }
50}
51
52pub fn new_icmp_socket<I: IpExt>() -> std::io::Result<fasync::net::DatagramSocket> {
54 fasync::net::DatagramSocket::new(I::DOMAIN, Some(I::PROTOCOL))
55}
56
57pub trait IpExt: crate::IpExt {
59 const DOMAIN_FIDL: fidl_fuchsia_posix_socket::Domain;
61}
62
63impl IpExt for Ipv4 {
64 const DOMAIN_FIDL: fidl_fuchsia_posix_socket::Domain = fidl_fuchsia_posix_socket::Domain::Ipv4;
65}
66
67impl IpExt for Ipv6 {
68 const DOMAIN_FIDL: fidl_fuchsia_posix_socket::Domain = fidl_fuchsia_posix_socket::Domain::Ipv6;
69}