xref: /aosp_15_r20/external/cronet/net/base/address_map_cache_linux.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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() const16 AddressMapOwnerLinux::AddressMap AddressMapCacheLinux::GetAddressMap() const {
17   base::AutoLock autolock(lock_);
18   return cached_address_map_;
19 }
20 
GetOnlineLinks() const21 std::unordered_set<int> AddressMapCacheLinux::GetOnlineLinks() const {
22   base::AutoLock autolock(lock_);
23   return cached_online_links_;
24 }
25 
GetAddressMapCacheLinux()26 AddressMapCacheLinux* AddressMapCacheLinux::GetAddressMapCacheLinux() {
27   return this;
28 }
29 
SetCachedInfo(AddressMap address_map,std::unordered_set<int> online_links)30 void 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)37 void 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