Skip to main content

socket_proxy_testing/
lib.rs

1// Copyright 2024 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5use fidl_fuchsia_net::IpAddress;
6use fidl_fuchsia_net_policy_socketproxy::{
7    Network, NetworkDnsServers, NetworkInfo, NetworkRegistryAddResult, NetworkRegistryRemoveResult,
8    NetworkRegistrySetDefaultResult, NetworkRegistryUpdateResult, StarnixNetworkInfo,
9    StarnixNetworksProxy,
10};
11use fidl_fuchsia_posix_socket::OptionalUint32;
12use std::future::Future;
13
14fn starnix_network_info(mark: u32) -> NetworkInfo {
15    NetworkInfo::Starnix(StarnixNetworkInfo {
16        mark: Some(mark),
17        handle: Some(0),
18        ..Default::default()
19    })
20}
21
22fn starnix_network(network_id: u32) -> Network {
23    Network {
24        network_id: Some(network_id),
25        info: Some(starnix_network_info(network_id)),
26        dns_servers: Some(Default::default()),
27        ..Default::default()
28    }
29}
30
31pub trait ToNetwork {
32    fn to_network(self) -> Network;
33}
34
35impl ToNetwork for u32 {
36    fn to_network(self) -> Network {
37        starnix_network(self)
38    }
39}
40
41impl ToNetwork for (u32, Vec<IpAddress>) {
42    fn to_network(self) -> Network {
43        let (v4, v6) = self.1.iter().fold((Vec::new(), Vec::new()), |(mut v4s, mut v6s), s| {
44            match s {
45                IpAddress::Ipv4(v4) => v4s.push(*v4),
46                IpAddress::Ipv6(v6) => v6s.push(*v6),
47            }
48            (v4s, v6s)
49        });
50        let base = starnix_network(self.0);
51        Network {
52            dns_servers: Some(NetworkDnsServers {
53                v4: Some(v4),
54                v6: Some(v6),
55                ..Default::default()
56            }),
57            ..base
58        }
59    }
60}
61
62impl<N: ToNetwork + Clone> ToNetwork for &N {
63    fn to_network(self) -> Network {
64        self.clone().to_network()
65    }
66}
67
68pub trait NetworkRegistry {
69    fn set_default(
70        &self,
71        network_id: &OptionalUint32,
72    ) -> impl Future<Output = Result<NetworkRegistrySetDefaultResult, fidl::Error>>;
73    fn add(
74        &self,
75        network: &Network,
76    ) -> impl Future<Output = Result<NetworkRegistryAddResult, fidl::Error>>;
77    fn update(
78        &self,
79        network: &Network,
80    ) -> impl Future<Output = Result<NetworkRegistryUpdateResult, fidl::Error>>;
81    fn remove(
82        &self,
83        network_id: u32,
84    ) -> impl Future<Output = Result<NetworkRegistryRemoveResult, fidl::Error>>;
85}
86
87macro_rules! impl_network_registry {
88    ($($ty:ty),*) => {
89        $(
90            impl NetworkRegistry for $ty {
91                fn set_default(
92                    &self,
93                    network_id: &OptionalUint32,
94                ) -> impl Future<Output = Result<NetworkRegistrySetDefaultResult, fidl::Error>> {
95                    self.set_default(network_id)
96                }
97
98                fn add(
99                    &self,
100                    network: &Network,
101                ) -> impl Future<Output = Result<NetworkRegistryAddResult, fidl::Error>> {
102                    self.add(network)
103                }
104
105                fn update(
106                    &self,
107                    network: &Network,
108                ) -> impl Future<Output = Result<NetworkRegistryUpdateResult, fidl::Error>> {
109                    self.update(network)
110                }
111
112                fn remove(
113                    &self,
114                    network_id: u32,
115                ) -> impl Future<Output = Result<NetworkRegistryRemoveResult, fidl::Error>> {
116                    self.remove(network_id)
117                }
118            }
119        )*
120    };
121    ($($ty:ty),*,) => { impl_network_registry!($($ty),*); };
122}
123
124impl_network_registry!(StarnixNetworksProxy);