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}