virtual_net/
composite.rs

1use std::net::SocketAddr;
2use std::task::{Context, Poll};
3
4use crate::{Ipv4Addr, Ipv6Addr, NetworkError, VirtualIoSource, VirtualTcpListener};
5use virtual_mio::ArcInterestHandler;
6
7#[derive(Debug)]
8pub struct CompositeTcpListener {
9    ports: Vec<Box<dyn VirtualTcpListener + Sync>>,
10}
11
12impl CompositeTcpListener {
13    pub fn new() -> Self {
14        Self { ports: Vec::new() }
15    }
16
17    pub fn add_port(&mut self, port: Box<dyn VirtualTcpListener + Sync>) {
18        self.ports.push(port);
19    }
20}
21
22impl Default for CompositeTcpListener {
23    fn default() -> Self {
24        Self::new()
25    }
26}
27
28impl VirtualIoSource for CompositeTcpListener {
29    fn remove_handler(&mut self) {
30        for port in self.ports.iter_mut() {
31            port.remove_handler();
32        }
33    }
34
35    fn poll_read_ready(&mut self, cx: &mut Context<'_>) -> Poll<crate::Result<usize>> {
36        for port in self.ports.iter_mut() {
37            if let Poll::Ready(ready) = port.poll_read_ready(cx) {
38                return Poll::Ready(ready);
39            }
40        }
41        Poll::Pending
42    }
43
44    fn poll_write_ready(
45        &mut self,
46        cx: &mut std::task::Context<'_>,
47    ) -> std::task::Poll<crate::Result<usize>> {
48        for port in self.ports.iter_mut() {
49            if let Poll::Ready(ready) = port.poll_write_ready(cx) {
50                return Poll::Ready(ready);
51            }
52        }
53        Poll::Pending
54    }
55}
56
57impl VirtualTcpListener for CompositeTcpListener {
58    fn try_accept(
59        &mut self,
60    ) -> crate::Result<(Box<dyn crate::VirtualTcpSocket + Sync>, SocketAddr)> {
61        let mut ret = NetworkError::Unsupported;
62        for port in self.ports.iter_mut() {
63            match port.try_accept() {
64                Ok(ret) => return Ok(ret),
65                Err(err) => {
66                    ret = err;
67                }
68            }
69        }
70        Err(ret)
71    }
72
73    fn set_handler(
74        &mut self,
75        handler: Box<dyn crate::InterestHandler + Send + Sync>,
76    ) -> crate::Result<()> {
77        let handler = ArcInterestHandler::new(handler);
78        for port in self.ports.iter_mut() {
79            port.set_handler(Box::new(handler.clone()))?;
80        }
81        Ok(())
82    }
83
84    fn addr_local(&self) -> crate::Result<SocketAddr> {
85        if self.ports.len() > 1 {
86            let addr = self.ports.first().unwrap().addr_local()?;
87            if addr.is_ipv4() {
88                Ok(SocketAddr::new(Ipv4Addr::UNSPECIFIED.into(), addr.port()))
89            } else {
90                Ok(SocketAddr::new(Ipv6Addr::UNSPECIFIED.into(), addr.port()))
91            }
92        } else if let Some(addr) = self.ports.first() {
93            addr.addr_local()
94        } else {
95            Err(NetworkError::Unsupported)
96        }
97    }
98
99    fn set_ttl(&mut self, ttl: u8) -> crate::Result<()> {
100        for port in self.ports.iter_mut() {
101            match port.set_ttl(ttl) {
102                Ok(()) | Err(NetworkError::Unsupported) => {}
103                Err(err) => return Err(err),
104            }
105        }
106        Ok(())
107    }
108
109    fn ttl(&self) -> crate::Result<u8> {
110        let mut ret = u8::MAX;
111        for port in self.ports.iter() {
112            if let Ok(ttl) = port.ttl() {
113                ret = ret.min(ttl)
114            }
115        }
116        Ok(ret)
117    }
118}