socket_proxy_testing/
lib.rs
1use fidl_fuchsia_net::{IpAddress, SocketAddress};
6use fidl_fuchsia_net_policy_socketproxy::{
7 DnsServerList, FuchsiaNetworkInfo, FuchsiaNetworksProxy, Network, NetworkDnsServers,
8 NetworkInfo, NetworkRegistryAddResult, NetworkRegistryRemoveResult,
9 NetworkRegistrySetDefaultResult, NetworkRegistryUpdateResult, StarnixNetworkInfo,
10 StarnixNetworksProxy,
11};
12use fidl_fuchsia_posix_socket::OptionalUint32;
13use std::future::Future;
14
15fn dns_server_list(id: u32) -> DnsServerList {
16 DnsServerList { source_network_id: Some(id), addresses: Some(vec![]), ..Default::default() }
17}
18
19fn starnix_network_info(mark: u32) -> NetworkInfo {
20 NetworkInfo::Starnix(StarnixNetworkInfo {
21 mark: Some(mark),
22 handle: Some(0),
23 ..Default::default()
24 })
25}
26
27fn starnix_network(network_id: u32) -> Network {
28 Network {
29 network_id: Some(network_id),
30 info: Some(starnix_network_info(network_id)),
31 dns_servers: Some(Default::default()),
32 ..Default::default()
33 }
34}
35
36fn fuchsia_network(network_id: u32) -> Network {
37 Network {
38 network_id: Some(network_id),
39 info: Some(NetworkInfo::Fuchsia(FuchsiaNetworkInfo { ..Default::default() })),
40 dns_servers: Some(Default::default()),
41 ..Default::default()
42 }
43}
44
45pub trait ToNetwork {
46 fn to_network(self, registry: RegistryType) -> Network;
47}
48
49pub trait ToDnsServerList {
50 fn to_dns_server_list(self) -> DnsServerList;
51}
52
53impl ToNetwork for u32 {
54 fn to_network(self, registry: RegistryType) -> Network {
55 match registry {
56 RegistryType::Starnix => starnix_network(self),
57 RegistryType::Fuchsia => fuchsia_network(self),
58 }
59 }
60}
61
62impl ToDnsServerList for u32 {
63 fn to_dns_server_list(self) -> DnsServerList {
64 dns_server_list(self)
65 }
66}
67
68pub enum RegistryType {
69 Starnix,
70 Fuchsia,
71}
72
73impl ToNetwork for (u32, Vec<IpAddress>) {
74 fn to_network(self, registry: RegistryType) -> Network {
75 let (v4, v6) = self.1.iter().fold((Vec::new(), Vec::new()), |(mut v4s, mut v6s), s| {
76 match s {
77 IpAddress::Ipv4(v4) => v4s.push(*v4),
78 IpAddress::Ipv6(v6) => v6s.push(*v6),
79 }
80 (v4s, v6s)
81 });
82 let base = match registry {
83 RegistryType::Starnix => starnix_network(self.0),
84 RegistryType::Fuchsia => fuchsia_network(self.0),
85 };
86 Network {
87 dns_servers: Some(NetworkDnsServers {
88 v4: Some(v4),
89 v6: Some(v6),
90 ..Default::default()
91 }),
92 ..base
93 }
94 }
95}
96
97impl ToDnsServerList for (u32, Vec<SocketAddress>) {
98 fn to_dns_server_list(self) -> DnsServerList {
99 DnsServerList { addresses: Some(self.1), ..dns_server_list(self.0) }
100 }
101}
102
103impl<N: ToNetwork + Clone> ToNetwork for &N {
104 fn to_network(self, registry: RegistryType) -> Network {
105 self.clone().to_network(registry)
106 }
107}
108
109impl<D: ToDnsServerList + Clone> ToDnsServerList for &D {
110 fn to_dns_server_list(self) -> DnsServerList {
111 self.clone().to_dns_server_list()
112 }
113}
114
115pub trait NetworkRegistry {
116 fn set_default(
117 &self,
118 network_id: &OptionalUint32,
119 ) -> impl Future<Output = Result<NetworkRegistrySetDefaultResult, fidl::Error>>;
120 fn add(
121 &self,
122 network: &Network,
123 ) -> impl Future<Output = Result<NetworkRegistryAddResult, fidl::Error>>;
124 fn update(
125 &self,
126 network: &Network,
127 ) -> impl Future<Output = Result<NetworkRegistryUpdateResult, fidl::Error>>;
128 fn remove(
129 &self,
130 network_id: u32,
131 ) -> impl Future<Output = Result<NetworkRegistryRemoveResult, fidl::Error>>;
132}
133
134macro_rules! impl_network_registry {
135 ($($ty:ty),*) => {
136 $(
137 impl NetworkRegistry for $ty {
138 fn set_default(
139 &self,
140 network_id: &OptionalUint32,
141 ) -> impl Future<Output = Result<NetworkRegistrySetDefaultResult, fidl::Error>> {
142 self.set_default(network_id)
143 }
144
145 fn add(
146 &self,
147 network: &Network,
148 ) -> impl Future<Output = Result<NetworkRegistryAddResult, fidl::Error>> {
149 self.add(network)
150 }
151
152 fn update(
153 &self,
154 network: &Network,
155 ) -> impl Future<Output = Result<NetworkRegistryUpdateResult, fidl::Error>> {
156 self.update(network)
157 }
158
159 fn remove(
160 &self,
161 network_id: u32,
162 ) -> impl Future<Output = Result<NetworkRegistryRemoveResult, fidl::Error>> {
163 self.remove(network_id)
164 }
165 }
166 )*
167 };
168 ($($ty:ty),*,) => { impl_network_registry!($($ty),*); };
169}
170
171impl_network_registry!(StarnixNetworksProxy, FuchsiaNetworksProxy);