capsules_extra/net/
network_capabilities.rs1use crate::net::ipv6::ip_utils::IPAddr;
26
27const MAX_ADDR_SET_SIZE: usize = 8;
28const MAX_PORT_SET_SIZE: usize = 8;
29
30use kernel::capabilities::NetworkCapabilityCreationCapability;
31
32#[derive(Debug, Clone, Copy, PartialEq)]
33pub enum AddrRange {
34 Any, NoAddrs,
36 AddrSet([IPAddr; MAX_ADDR_SET_SIZE]),
37 Addr(IPAddr),
38 Subnet(IPAddr, usize), }
40
41impl AddrRange {
42 pub fn is_addr_valid(&self, addr: IPAddr) -> bool {
43 match self {
44 AddrRange::Any => true,
45 AddrRange::NoAddrs => false,
46 AddrRange::AddrSet(allowed_addrs) => allowed_addrs.contains(&addr),
47 AddrRange::Addr(allowed_addr) => addr == *allowed_addr, AddrRange::Subnet(allowed_addr, prefix_len) => {
49 let full_bytes: usize = prefix_len / 8;
50 let remainder_bits: usize = prefix_len % 8;
51 if allowed_addr.0[0..full_bytes] != addr.0[0..full_bytes] {
53 false
54 } else if remainder_bits == 0 {
55 true } else {
57 addr.0[full_bytes] >> (8 - remainder_bits)
58 == allowed_addr.0[full_bytes] >> (8 - remainder_bits)
59 }
60 }
61 }
62 }
63}
64
65#[derive(Debug, Clone, Copy, PartialEq)]
66pub enum PortRange {
67 Any,
68 NoPorts,
69 PortSet([u16; MAX_PORT_SET_SIZE]),
70 Range(u16, u16),
71 Port(u16),
72}
73
74impl PortRange {
75 pub fn is_port_valid(&self, port: u16) -> bool {
76 match self {
77 PortRange::Any => true,
78 PortRange::NoPorts => false,
79 PortRange::PortSet(allowed_ports) => allowed_ports.contains(&port), PortRange::Range(low, high) => *low <= port && port <= *high,
81 PortRange::Port(allowed_port) => port == *allowed_port,
82 }
83 }
84}
85
86pub struct UdpVisibilityCapability {
88 _priv: (), }
90
91pub struct IpVisibilityCapability {
93 _priv: (), }
95
96impl UdpVisibilityCapability {
97 pub fn new(
98 _create_net_cap: &dyn NetworkCapabilityCreationCapability,
99 ) -> UdpVisibilityCapability {
100 UdpVisibilityCapability { _priv: () }
101 }
102}
103
104impl IpVisibilityCapability {
105 pub fn new(
106 _create_net_cap: &dyn NetworkCapabilityCreationCapability,
107 ) -> IpVisibilityCapability {
108 IpVisibilityCapability { _priv: () }
109 }
110}
111
112pub struct NetworkCapability {
118 remote_addrs: AddrRange, remote_ports: PortRange, local_ports: PortRange, }
123
124impl NetworkCapability {
125 pub fn new(
126 remote_addrs: AddrRange,
127 remote_ports: PortRange,
128 local_ports: PortRange,
129 _create_net_cap: &dyn NetworkCapabilityCreationCapability,
130 ) -> NetworkCapability {
131 NetworkCapability {
132 remote_addrs,
133 remote_ports,
134 local_ports,
135 }
136 }
137
138 pub fn get_range(&self, _ip_cap: &'static IpVisibilityCapability) -> AddrRange {
139 self.remote_addrs
140 }
141
142 pub fn remote_addr_valid(
143 &self,
144 remote_addr: IPAddr,
145 _ip_cap: &'static IpVisibilityCapability,
146 ) -> bool {
147 self.remote_addrs.is_addr_valid(remote_addr)
148 }
149
150 pub fn get_remote_ports(&self, _udp_cap: &'static UdpVisibilityCapability) -> PortRange {
151 self.remote_ports
152 }
153
154 pub fn get_local_ports(&self, _udp_cap: &'static UdpVisibilityCapability) -> PortRange {
155 self.local_ports
156 }
157
158 pub fn remote_port_valid(
159 &self,
160 remote_port: u16,
161 _udp_cap: &'static UdpVisibilityCapability,
162 ) -> bool {
163 self.remote_ports.is_port_valid(remote_port)
164 }
165
166 pub fn local_port_valid(
167 &self,
168 local_port: u16,
169 _udp_cap: &'static UdpVisibilityCapability,
170 ) -> bool {
171 self.local_ports.is_port_valid(local_port)
172 }
173}