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, SocketAddress};
6use fidl_fuchsia_netpol_socketproxy::{
7    DnsServerList, FuchsiaNetworkInfo, Network, NetworkDnsServers, NetworkInfo, StarnixNetworkInfo,
8};
9
10fn dns_server_list(id: u32) -> DnsServerList {
11    DnsServerList { source_network_id: Some(id), addresses: Some(vec![]), ..Default::default() }
12}
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
31fn fuchsia_network(network_id: u32) -> Network {
32    Network {
33        network_id: Some(network_id),
34        info: Some(NetworkInfo::Fuchsia(FuchsiaNetworkInfo { ..Default::default() })),
35        dns_servers: Some(Default::default()),
36        ..Default::default()
37    }
38}
39
40pub trait ToNetwork {
41    fn to_network(self, registry: RegistryType) -> Network;
42}
43
44pub trait ToDnsServerList {
45    fn to_dns_server_list(self) -> DnsServerList;
46}
47
48impl ToNetwork for u32 {
49    fn to_network(self, registry: RegistryType) -> Network {
50        match registry {
51            RegistryType::Starnix => starnix_network(self),
52            RegistryType::Fuchsia => fuchsia_network(self),
53        }
54    }
55}
56
57impl ToDnsServerList for u32 {
58    fn to_dns_server_list(self) -> DnsServerList {
59        dns_server_list(self)
60    }
61}
62
63pub enum RegistryType {
64    Starnix,
65    Fuchsia,
66}
67
68impl ToNetwork for (u32, Vec<IpAddress>) {
69    fn to_network(self, registry: RegistryType) -> Network {
70        let (v4, v6) = self.1.iter().fold((Vec::new(), Vec::new()), |(mut v4s, mut v6s), s| {
71            match s {
72                IpAddress::Ipv4(v4) => v4s.push(*v4),
73                IpAddress::Ipv6(v6) => v6s.push(*v6),
74            }
75            (v4s, v6s)
76        });
77        let base = match registry {
78            RegistryType::Starnix => starnix_network(self.0),
79            RegistryType::Fuchsia => fuchsia_network(self.0),
80        };
81        Network {
82            dns_servers: Some(NetworkDnsServers {
83                v4: Some(v4),
84                v6: Some(v6),
85                ..Default::default()
86            }),
87            ..base
88        }
89    }
90}
91
92impl ToDnsServerList for (u32, Vec<SocketAddress>) {
93    fn to_dns_server_list(self) -> DnsServerList {
94        DnsServerList { addresses: Some(self.1), ..dns_server_list(self.0) }
95    }
96}
97
98impl<N: ToNetwork + Clone> ToNetwork for &N {
99    fn to_network(self, registry: RegistryType) -> Network {
100        self.clone().to_network(registry)
101    }
102}
103
104impl<D: ToDnsServerList + Clone> ToDnsServerList for &D {
105    fn to_dns_server_list(self) -> DnsServerList {
106        self.clone().to_dns_server_list()
107    }
108}