1use crate::socket::SocketFamily;
2use 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_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_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_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}