Garrick Evans | 0dbd418 | 2019-03-07 08:38:38 +0900 | [diff] [blame] | 1 | // Copyright 2019 The Chromium OS 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 | |
Garrick Evans | 3388a03 | 2020-03-24 11:25:55 +0900 | [diff] [blame] | 5 | #include "patchpanel/address_manager.h" |
Garrick Evans | 0dbd418 | 2019-03-07 08:38:38 +0900 | [diff] [blame] | 6 | |
Garrick Evans | 3388a03 | 2020-03-24 11:25:55 +0900 | [diff] [blame] | 7 | #include "patchpanel/net_util.h" |
Hugo Benichi | 2ac4d07 | 2019-05-28 14:51:23 +0900 | [diff] [blame] | 8 | |
Garrick Evans | 3388a03 | 2020-03-24 11:25:55 +0900 | [diff] [blame] | 9 | namespace patchpanel { |
Garrick Evans | 0dbd418 | 2019-03-07 08:38:38 +0900 | [diff] [blame] | 10 | |
| 11 | namespace { |
| 12 | |
| 13 | // The 100.115.92.0/24 subnet is reserved and not publicly routable. This subnet |
Hugo Benichi | adf1ec5 | 2020-01-17 16:23:58 +0900 | [diff] [blame] | 14 | // is sliced into the following IP pools for use among the various usages: |
Garrick Evans | 0dbd418 | 2019-03-07 08:38:38 +0900 | [diff] [blame] | 15 | // +---------------+------------+----------------------------------------------+ |
| 16 | // | IP Range | Guest | | |
| 17 | // +---------------+------------+----------------------------------------------+ |
Hugo Benichi | ad1bdd9 | 2020-06-12 13:48:37 +0900 | [diff] [blame] | 18 | // | 0 (/30) | ARC | Used for ARC management interface | |
| 19 | // | 4-20 (/30) | ARC | Used to expose multiple host networks to ARC | |
Garrick Evans | 0dbd418 | 2019-03-07 08:38:38 +0900 | [diff] [blame] | 20 | // | 24-124 (/30) | Termina VM | Used by Crostini | |
Garrick Evans | 98143e7 | 2020-12-03 08:56:47 +0900 | [diff] [blame] | 21 | // | 128-188 (/30) | Host netns | Used for netns hosting minijailed services | |
Garrick Evans | 0dbd418 | 2019-03-07 08:38:38 +0900 | [diff] [blame] | 22 | // | 192-252 (/28) | Containers | Used by Crostini | |
| 23 | // +---------------+------------+----------------------------------------------+ |
Garrick Evans | bdc2267 | 2019-12-10 16:03:55 +0900 | [diff] [blame] | 24 | // |
| 25 | // The 100.115.93.0/24 subnet is reserved for plugin VMs. |
Garrick Evans | 0dbd418 | 2019-03-07 08:38:38 +0900 | [diff] [blame] | 26 | |
Garrick Evans | 0dbd418 | 2019-03-07 08:38:38 +0900 | [diff] [blame] | 27 | } // namespace |
| 28 | |
Garrick Evans | 4ee5ce2 | 2020-03-18 07:05:17 +0900 | [diff] [blame] | 29 | AddressManager::AddressManager() { |
Hugo Benichi | ad1bdd9 | 2020-06-12 13:48:37 +0900 | [diff] [blame] | 30 | for (auto g : {Guest::ARC, Guest::ARC_NET, Guest::VM_TERMINA, |
Hugo Benichi | adf1ec5 | 2020-01-17 16:23:58 +0900 | [diff] [blame] | 31 | Guest::VM_PLUGIN, Guest::CONTAINER, Guest::MINIJAIL_NETNS}) { |
Hugo Benichi | 6c63ae2 | 2019-05-29 11:19:15 +0900 | [diff] [blame] | 32 | uint32_t base_addr; |
| 33 | uint32_t prefix_length = 30; |
Garrick Evans | f4a9329 | 2019-03-13 14:19:43 +0900 | [diff] [blame] | 34 | uint32_t subnets = 1; |
Garrick Evans | 0dbd418 | 2019-03-07 08:38:38 +0900 | [diff] [blame] | 35 | switch (g) { |
| 36 | case Guest::ARC: |
Hugo Benichi | 6c63ae2 | 2019-05-29 11:19:15 +0900 | [diff] [blame] | 37 | base_addr = Ipv4Addr(100, 115, 92, 0); |
Garrick Evans | 0dbd418 | 2019-03-07 08:38:38 +0900 | [diff] [blame] | 38 | break; |
Garrick Evans | 0dbd418 | 2019-03-07 08:38:38 +0900 | [diff] [blame] | 39 | case Guest::ARC_NET: |
Hugo Benichi | ad1bdd9 | 2020-06-12 13:48:37 +0900 | [diff] [blame] | 40 | base_addr = Ipv4Addr(100, 115, 92, 4); |
| 41 | subnets = 5; |
Garrick Evans | 0dbd418 | 2019-03-07 08:38:38 +0900 | [diff] [blame] | 42 | break; |
| 43 | case Guest::VM_TERMINA: |
Hugo Benichi | 6c63ae2 | 2019-05-29 11:19:15 +0900 | [diff] [blame] | 44 | base_addr = Ipv4Addr(100, 115, 92, 24); |
Garrick Evans | 0dbd418 | 2019-03-07 08:38:38 +0900 | [diff] [blame] | 45 | subnets = 26; |
| 46 | break; |
Hugo Benichi | adf1ec5 | 2020-01-17 16:23:58 +0900 | [diff] [blame] | 47 | case Guest::MINIJAIL_NETNS: |
| 48 | base_addr = Ipv4Addr(100, 115, 92, 128); |
| 49 | prefix_length = 30; |
Garrick Evans | 98143e7 | 2020-12-03 08:56:47 +0900 | [diff] [blame] | 50 | subnets = 16; |
Garrick Evans | bdc2267 | 2019-12-10 16:03:55 +0900 | [diff] [blame] | 51 | break; |
Garrick Evans | 0dbd418 | 2019-03-07 08:38:38 +0900 | [diff] [blame] | 52 | case Guest::CONTAINER: |
Hugo Benichi | 6c63ae2 | 2019-05-29 11:19:15 +0900 | [diff] [blame] | 53 | base_addr = Ipv4Addr(100, 115, 92, 192); |
Hugo Benichi | bd8ec4d | 2019-05-28 12:52:49 +0900 | [diff] [blame] | 54 | prefix_length = 28; |
Garrick Evans | 0dbd418 | 2019-03-07 08:38:38 +0900 | [diff] [blame] | 55 | subnets = 4; |
| 56 | break; |
Hugo Benichi | adf1ec5 | 2020-01-17 16:23:58 +0900 | [diff] [blame] | 57 | case Guest::VM_PLUGIN: |
| 58 | base_addr = Ipv4Addr(100, 115, 93, 0); |
| 59 | prefix_length = 29; |
| 60 | subnets = 32; |
| 61 | break; |
Garrick Evans | 0dbd418 | 2019-03-07 08:38:38 +0900 | [diff] [blame] | 62 | } |
Hugo Benichi | bd8ec4d | 2019-05-28 12:52:49 +0900 | [diff] [blame] | 63 | pools_.emplace(g, SubnetPool::New(base_addr, prefix_length, subnets)); |
Garrick Evans | 0dbd418 | 2019-03-07 08:38:38 +0900 | [diff] [blame] | 64 | } |
| 65 | } |
| 66 | |
Garrick Evans | 7d9a232 | 2020-04-02 11:59:56 +0900 | [diff] [blame] | 67 | MacAddress AddressManager::GenerateMacAddress(uint8_t index) { |
| 68 | return index == kAnySubnetIndex ? mac_addrs_.Generate() |
| 69 | : mac_addrs_.GetStable(index); |
Garrick Evans | f4a9329 | 2019-03-13 14:19:43 +0900 | [diff] [blame] | 70 | } |
| 71 | |
Garrick Evans | 0dbd418 | 2019-03-07 08:38:38 +0900 | [diff] [blame] | 72 | std::unique_ptr<Subnet> AddressManager::AllocateIPv4Subnet( |
Garrick Evans | 53a2a98 | 2020-02-05 10:53:35 +0900 | [diff] [blame] | 73 | AddressManager::Guest guest, uint32_t index) { |
Garrick Evans | 1fa4e64 | 2020-03-13 11:43:41 +0900 | [diff] [blame] | 74 | if (index > 0 && guest != AddressManager::Guest::VM_PLUGIN) { |
Garrick Evans | 43b4e2d | 2019-12-11 13:43:08 +0900 | [diff] [blame] | 75 | LOG(ERROR) << "Subnet indexing not supported for guest"; |
| 76 | return nullptr; |
| 77 | } |
Garrick Evans | f4a9329 | 2019-03-13 14:19:43 +0900 | [diff] [blame] | 78 | const auto it = pools_.find(guest); |
Garrick Evans | 43b4e2d | 2019-12-11 13:43:08 +0900 | [diff] [blame] | 79 | return (it != pools_.end()) ? it->second->Allocate(index) : nullptr; |
Garrick Evans | 0dbd418 | 2019-03-07 08:38:38 +0900 | [diff] [blame] | 80 | } |
| 81 | |
Garrick Evans | 3388a03 | 2020-03-24 11:25:55 +0900 | [diff] [blame] | 82 | } // namespace patchpanel |