mirror of
https://github.com/cirruslabs/softnet.git
synced 2026-10-17 20:25:54 +02:00
Allocate a /29 network instead of /30 to work around bootpd bug (#214)
This commit is contained in:
@@ -23,7 +23,7 @@ Softnet solves two problems:
|
||||
2. DHCP exhaustion
|
||||
* macOS built-in DHCP-server allocates a `/24` subnet with 86400 seconds lease time by default, which only allows for ~253 VMs a day (or 1 VM every ~6 minutes) to be spawned without causing a denial-of-service, which is pretty limiting for CI services like Cirrus CI
|
||||
|
||||
Each VM gets a separate [`vmnet` network](https://developer.apple.com/documentation/vmnet/vmnet_network_create(_:_:)) with a private `/30` subnet selected to avoid overlap with existing host interface subnets. Softnet reserves an IP-address for the VM's MAC-address, delivers it through its own DHCP-server, and uses the reserved address for packet filtering.
|
||||
Each VM gets a separate [`vmnet` network](https://developer.apple.com/documentation/vmnet/vmnet_network_create(_:_:)) with a private `/29` subnet selected to avoid overlap with existing host interface subnets. Softnet reserves an IP-address for the VM's MAC-address, delivers it through its own DHCP-server, and uses the reserved address for packet filtering.
|
||||
|
||||
### Stateful flow authorization
|
||||
|
||||
|
||||
+2
-2
@@ -42,8 +42,8 @@ impl Host {
|
||||
vm_mac: EthernetAddress,
|
||||
enable_isolation: bool,
|
||||
) -> Result<Host> {
|
||||
// Find an unused /30 subnet for the gateway and VM
|
||||
let (gateway_ip, vm_ip, subnet) = subnet_finder::find_available_subnet(30)?;
|
||||
// Find an unused /29 subnet for the gateway and VM
|
||||
let (gateway_ip, vm_ip, subnet) = subnet_finder::find_available_subnet(29)?;
|
||||
|
||||
// Create vmnet's network configuration
|
||||
let mut configuration = NetworkConfiguration::new(match vm_net_type {
|
||||
|
||||
@@ -76,11 +76,11 @@ mod tests {
|
||||
#[serial_test::serial]
|
||||
fn finds_two_usable_addresses() {
|
||||
// Find a subnet on the current host
|
||||
let (gateway_ip, vm_ip, subnet) = find_available_subnet(30).unwrap();
|
||||
let (gateway_ip, vm_ip, subnet) = find_available_subnet(29).unwrap();
|
||||
|
||||
// Check the subnet and its two usable addresses
|
||||
assert_eq!(subnet.prefix_len(), 30);
|
||||
// Check the subnet and its first two usable addresses
|
||||
assert_eq!(subnet.prefix_len(), 29);
|
||||
assert!(subnet.network().is_private());
|
||||
assert_eq!(subnet.hosts().collect::<Vec<_>>(), [gateway_ip, vm_ip]);
|
||||
assert_eq!(subnet.hosts().collect::<Vec<_>>()[..2], [gateway_ip, vm_ip]);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user