ipstack_geph/stream/
mod.rs

1use std::net::{IpAddr, Ipv4Addr, SocketAddr, SocketAddrV4, SocketAddrV6};
2
3pub use self::tcp_wrapper::IpStackTcpStream;
4pub use self::udp::IpStackUdpStream;
5pub use self::unknown::IpStackUnknownTransport;
6
7mod tcb;
8mod tcp;
9mod tcp_wrapper;
10mod udp;
11mod unknown;
12
13pub enum IpStackStream {
14    Tcp(IpStackTcpStream),
15    Udp(IpStackUdpStream),
16    UnknownTransport(IpStackUnknownTransport),
17    UnknownNetwork(Vec<u8>),
18}
19
20impl IpStackStream {
21    pub fn local_addr(&self) -> SocketAddr {
22        match self {
23            IpStackStream::Tcp(tcp) => tcp.local_addr(),
24            IpStackStream::Udp(udp) => udp.local_addr(),
25            IpStackStream::UnknownNetwork(_) => {
26                SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::new(0, 0, 0, 0), 0))
27            }
28            IpStackStream::UnknownTransport(unknown) => match unknown.src_addr() {
29                IpAddr::V4(addr) => SocketAddr::V4(SocketAddrV4::new(addr, 0)),
30                IpAddr::V6(addr) => SocketAddr::V6(SocketAddrV6::new(addr, 0, 0, 0)),
31            },
32        }
33    }
34    pub fn peer_addr(&self) -> SocketAddr {
35        match self {
36            IpStackStream::Tcp(tcp) => tcp.peer_addr(),
37            IpStackStream::Udp(udp) => udp.peer_addr(),
38            IpStackStream::UnknownNetwork(_) => {
39                SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::new(0, 0, 0, 0), 0))
40            }
41            IpStackStream::UnknownTransport(unknown) => match unknown.dst_addr() {
42                IpAddr::V4(addr) => SocketAddr::V4(SocketAddrV4::new(addr, 0)),
43                IpAddr::V6(addr) => SocketAddr::V6(SocketAddrV6::new(addr, 0, 0, 0)),
44            },
45        }
46    }
47}