blob: 1a706f7450265802f2da4fdcf982f7f758cfebd1 [file] [log] [blame]
Chirantan Ekbotead25b652017-12-11 18:37:09 -08001// 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 Evans3388a032020-03-24 11:25:55 +09005#include "patchpanel/mac_address_generator.h"
Chirantan Ekbotead25b652017-12-11 18:37:09 -08006
7#include <base/rand_util.h>
8
Garrick Evans3388a032020-03-24 11:25:55 +09009namespace patchpanel {
Garrick Evans2013a792020-04-02 11:27:57 +090010namespace {
11constexpr MacAddress kStableBaseAddr = {0x42, 0x37, 0x05, 0x13, 0x17, 0x00};
12} // namespace
Chirantan Ekbotead25b652017-12-11 18:37:09 -080013
14MacAddress 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 Evans2013a792020-04-02 11:27:57 +090024 } 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 Ekbotead25b652017-12-11 18:37:09 -080028
29 addrs_.insert(addr);
30
31 return addr;
32}
33
Garrick Evans2013a792020-04-02 11:27:57 +090034MacAddress MacAddressGenerator::GetStable(uint8_t id) const {
35 MacAddress addr = kStableBaseAddr;
36 addr[5] = id;
37 return addr;
38}
39
Garrick Evans3388a032020-03-24 11:25:55 +090040} // namespace patchpanel