psp_net/socket/
mod.rs

1//! This module contains the socket types.
2//! Currently, three socket types are provided:
3//! - [`udp::UdpSocket`] – a UDP socket
4//! - [`tcp::TcpSocket`] – a TCP socket
5//! - [`tls::TlsSocket`] – a TCP socket wrapper that provides a TLS connection
6
7#![allow(clippy::module_name_repetitions)]
8
9use core::net::Ipv4Addr;
10use psp::sys::{in_addr, sockaddr};
11
12use super::netc;
13
14pub mod error;
15#[cfg(feature = "macros")]
16pub mod macros;
17mod sce;
18pub mod state;
19pub mod tcp;
20pub mod tls;
21pub mod udp;
22
23/// Convert a [`SocketAddrV4`] to a [`sockaddr`]
24fn socket_addr_v4_to_sockaddr(addr: SocketAddrV4) -> sockaddr {
25    let octets = addr.ip().octets();
26    let sin_addr = u32::from_le_bytes(octets);
27    let port = addr.port().to_be();
28
29    let sockaddr_in = netc::sockaddr_in {
30        sin_len: core::mem::size_of::<netc::sockaddr_in>() as u8,
31        sin_family: netc::AF_INET,
32        sin_port: port,
33        sin_addr: netc::in_addr(sin_addr),
34        sin_zero: [0u8; 8],
35    };
36
37    unsafe { core::mem::transmute::<netc::sockaddr_in, netc::sockaddr>(sockaddr_in) }
38}
39
40/// Convert to a [`sockaddr`]
41pub trait ToSockaddr {
42    /// Convert to a [`sockaddr`]
43    fn to_sockaddr(&self) -> sockaddr;
44}
45
46impl ToSockaddr for SocketAddrV4 {
47    fn to_sockaddr(&self) -> sockaddr {
48        socket_addr_v4_to_sockaddr(*self)
49    }
50}
51
52/// Convert to a [`SocketAddr`]
53pub trait ToSocketAddr {
54    /// Convert to a [`SocketAddr`]
55    fn to_socket_addr(&self) -> SocketAddr;
56}
57
58impl ToSocketAddr for in_addr {
59    fn to_socket_addr(&self) -> SocketAddr {
60        let octets = self.0.to_be_bytes();
61        let ip = Ipv4Addr::new(octets[0], octets[1], octets[2], octets[3]);
62        SocketAddr::V4(SocketAddrV4::new(ip, 0))
63    }
64}
65
66impl ToSocketAddr for sockaddr {
67    fn to_socket_addr(&self) -> SocketAddr {
68        let sockaddr_in =
69            unsafe { core::mem::transmute::<netc::sockaddr, netc::sockaddr_in>(*self) };
70
71        let octets = sockaddr_in.sin_addr.0.to_be_bytes();
72
73        let port = u16::to_be(sockaddr_in.sin_port);
74
75        SocketAddr::V4(SocketAddrV4::new(
76            Ipv4Addr::new(octets[0], octets[1], octets[2], octets[3]),
77            port,
78        ))
79    }
80}
81
82// re-exports
83pub type SocketAddr = core::net::SocketAddr;
84pub type SocketAddrV4 = core::net::SocketAddrV4;