Skip to main content

nrf_modem/
ip.rs

1use crate::socket::SocketFamily;
2// use core::mem::size_of;
3use core::net::{Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6};
4use nrfxlib_sys::{nrf_sockaddr, nrf_sockaddr_in, nrf_sockaddr_in6};
5
6pub enum NrfSockAddr {
7    SockAddrIn(nrf_sockaddr_in),
8    SockAddrIn6(nrf_sockaddr_in6),
9}
10
11impl From<SocketAddr> for NrfSockAddr {
12    fn from(addr: SocketAddr) -> Self {
13        match addr {
14            SocketAddr::V4(addr) => nrf_sockaddr_in {
15                // sin_len: size_of::<nrf_sockaddr_in>() as u8,
16                sin_family: SocketFamily::Ipv4 as u16,
17                sin_port: addr.port().to_be(),
18                sin_addr: nrfxlib_sys::nrf_in_addr {
19                    s_addr: u32::to_be((*addr.ip()).into()),
20                },
21            }
22            .into(),
23            SocketAddr::V6(addr) => nrf_sockaddr_in6 {
24                // sin6_len: size_of::<nrf_sockaddr_in6>() as u8,
25                sin6_family: SocketFamily::Ipv6 as u16,
26                sin6_port: addr.port().to_be(),
27                sin6_addr: nrfxlib_sys::nrf_in6_addr {
28                    s6_addr: addr.ip().octets(),
29                },
30                // sin6_flowinfo: 0,
31                sin6_scope_id: 0,
32            }
33            .into(),
34        }
35    }
36}
37
38impl From<NrfSockAddr> for SocketAddr {
39    fn from(addr: NrfSockAddr) -> Self {
40        match addr {
41            NrfSockAddr::SockAddrIn(val) => SocketAddr::V4(SocketAddrV4::new(
42                Ipv4Addr::from(val.sin_addr.s_addr.to_be()),
43                val.sin_port.to_be(),
44            )),
45            NrfSockAddr::SockAddrIn6(val) => SocketAddr::V6(SocketAddrV6::new(
46                Ipv6Addr::from(val.sin6_addr.s6_addr),
47                val.sin6_port.to_be(),
48                0,
49                0,
50            )),
51        }
52    }
53}
54
55impl From<*const nrf_sockaddr> for NrfSockAddr {
56    fn from(v: *const nrf_sockaddr) -> Self {
57        const IPV4: u16 = SocketFamily::Ipv4 as u16;
58        const IPV6: u16 = SocketFamily::Ipv6 as u16;
59
60        unsafe {
61            match (*v).sa_family {
62                IPV4 => (*(v as *const nrf_sockaddr_in)).into(),
63                IPV6 => (*(v as *const nrf_sockaddr_in6)).into(),
64                family => unreachable!("Unknown family: {family}"),
65            }
66        }
67    }
68}
69
70impl From<nrf_sockaddr_in6> for NrfSockAddr {
71    fn from(v: nrf_sockaddr_in6) -> Self {
72        Self::SockAddrIn6(v)
73    }
74}
75
76impl From<nrf_sockaddr_in> for NrfSockAddr {
77    fn from(v: nrf_sockaddr_in) -> Self {
78        Self::SockAddrIn(v)
79    }
80}
81
82impl NrfSockAddr {
83    pub fn as_ptr(&self) -> *const nrf_sockaddr {
84        match self {
85            NrfSockAddr::SockAddrIn(val) => val as *const _ as *const _,
86            NrfSockAddr::SockAddrIn6(val) => val as *const _ as *const _,
87        }
88    }
89
90    pub fn size(&self) -> usize {
91        match self {
92            NrfSockAddr::SockAddrIn(_) => core::mem::size_of::<nrf_sockaddr_in>(),
93            NrfSockAddr::SockAddrIn6(_) => core::mem::size_of::<nrf_sockaddr_in6>(),
94        }
95    }
96}