1 // Copyright 2023 The Chromium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "net/base/address_map_cache_linux.h" 6 7 #include <linux/rtnetlink.h> 8 9 #include "base/synchronization/lock.h" 10 11 namespace net { 12 13 AddressMapCacheLinux::AddressMapCacheLinux() = default; 14 AddressMapCacheLinux::~AddressMapCacheLinux() = default; 15 GetAddressMap() const16AddressMapOwnerLinux::AddressMap AddressMapCacheLinux::GetAddressMap() const { 17 base::AutoLock autolock(lock_); 18 return cached_address_map_; 19 } 20 GetOnlineLinks() const21std::unordered_set<int> AddressMapCacheLinux::GetOnlineLinks() const { 22 base::AutoLock autolock(lock_); 23 return cached_online_links_; 24 } 25 GetAddressMapCacheLinux()26AddressMapCacheLinux* AddressMapCacheLinux::GetAddressMapCacheLinux() { 27 return this; 28 } 29 SetCachedInfo(AddressMap address_map,std::unordered_set<int> online_links)30void AddressMapCacheLinux::SetCachedInfo(AddressMap address_map, 31 std::unordered_set<int> online_links) { 32 base::AutoLock autolock(lock_); 33 cached_address_map_ = std::move(address_map); 34 cached_online_links_ = std::move(online_links); 35 } 36 ApplyDiffs(const AddressMapDiff & addr_diff,const OnlineLinksDiff & links_diff)37void AddressMapCacheLinux::ApplyDiffs(const AddressMapDiff& addr_diff, 38 const OnlineLinksDiff& links_diff) { 39 base::AutoLock autolock(lock_); 40 for (const auto& [address, msg_opt] : addr_diff) { 41 if (msg_opt.has_value()) { 42 cached_address_map_[address] = msg_opt.value(); 43 } else { 44 cached_address_map_.erase(address); 45 } 46 } 47 48 for (const auto& [if_index, is_now_online] : links_diff) { 49 if (is_now_online) { 50 cached_online_links_.insert(if_index); 51 } else { 52 cached_online_links_.erase(if_index); 53 } 54 } 55 } 56 57 } // namespace net 58