Chirantan Ekbote | ad25b65 | 2017-12-11 18:37:09 -0800 | [diff] [blame] | 1 | // Copyright 2017 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/mac_address_generator.h" |
Chirantan Ekbote | ad25b65 | 2017-12-11 18:37:09 -0800 | [diff] [blame] | 6 | |
| 7 | #include <base/rand_util.h> |
| 8 | |
Garrick Evans | 3388a03 | 2020-03-24 11:25:55 +0900 | [diff] [blame^] | 9 | namespace patchpanel { |
Garrick Evans | 2013a79 | 2020-04-02 11:27:57 +0900 | [diff] [blame] | 10 | namespace { |
| 11 | constexpr MacAddress kStableBaseAddr = {0x42, 0x37, 0x05, 0x13, 0x17, 0x00}; |
| 12 | } // namespace |
Chirantan Ekbote | ad25b65 | 2017-12-11 18:37:09 -0800 | [diff] [blame] | 13 | |
| 14 | MacAddress MacAddressGenerator::Generate() { |
| 15 | MacAddress addr; |
| 16 | do { |
| 17 | base::RandBytes(addr.data(), addr.size()); |
| 18 | |
| 19 | // Set the locally administered flag. |
| 20 | addr[0] |= static_cast<uint8_t>(0x02); |
| 21 | |
| 22 | // Unset the multicast flag. |
| 23 | addr[0] &= static_cast<uint8_t>(0xfe); |
Garrick Evans | 2013a79 | 2020-04-02 11:27:57 +0900 | [diff] [blame] | 24 | } while (addrs_.find(addr) != addrs_.end() || |
| 25 | (addr[0] == kStableBaseAddr[0] && addr[1] == kStableBaseAddr[1] && |
| 26 | addr[2] == kStableBaseAddr[2] && addr[3] == kStableBaseAddr[3] && |
| 27 | addr[4] == kStableBaseAddr[4])); |
Chirantan Ekbote | ad25b65 | 2017-12-11 18:37:09 -0800 | [diff] [blame] | 28 | |
| 29 | addrs_.insert(addr); |
| 30 | |
| 31 | return addr; |
| 32 | } |
| 33 | |
Garrick Evans | 2013a79 | 2020-04-02 11:27:57 +0900 | [diff] [blame] | 34 | MacAddress MacAddressGenerator::GetStable(uint8_t id) const { |
| 35 | MacAddress addr = kStableBaseAddr; |
| 36 | addr[5] = id; |
| 37 | return addr; |
| 38 | } |
| 39 | |
Garrick Evans | 3388a03 | 2020-03-24 11:25:55 +0900 | [diff] [blame^] | 40 | } // namespace patchpanel |