in katran/lib/KatranLb.cpp [1762:1837]
void KatranLb::modifyQuicRealsMapping(
const ModifyAction action,
const std::vector<QuicReal>& reals) {
if (config_.disableForwarding) {
LOG(ERROR) << "modifyQuicRealsMapping ignored for non-forwarding instance";
return;
}
std::unordered_map<uint32_t, uint32_t> to_update;
for (auto& real : reals) {
if (validateAddress(real.address) == AddressType::INVALID) {
LOG(ERROR) << "Invalid quic real's address: " << real.address;
continue;
}
if (real.id > kMaxQuicId) {
LOG(ERROR) << "trying to add mapping for id out of assigned space";
continue;
}
VLOG(4) << folly::sformat(
"modifying quic's real {} id {:x}", real.address, real.id);
auto raddr = folly::IPAddress(real.address);
auto real_iter = quicMapping_.find(real.id);
if (action == ModifyAction::DEL) {
if (real_iter == quicMapping_.end()) {
LOG(ERROR) << folly::sformat(
"trying to delete nonexisting mapping for id {:x} address {}",
real.id,
real.address);
continue;
}
if (real_iter->second != raddr) {
LOG(ERROR) << folly::sformat(
"deleted id {} pointed to diffrent address {} than given {}",
real.id,
real_iter->second.str(),
real.address);
continue;
}
decreaseRefCountForReal(raddr);
quicMapping_.erase(real_iter);
} else {
if (real_iter != quicMapping_.end()) {
if (real_iter->second == raddr) {
continue;
}
LOG(WARNING) << folly::sformat(
"overriding address {} for existing mapping id {} address {}",
real_iter->second.str(),
real.id,
real.address);
decreaseRefCountForReal(real_iter->second);
}
auto rnum = increaseRefCountForReal(raddr);
if (rnum == config_.maxReals) {
LOG(ERROR) << "exhausted real's space";
continue;
}
to_update[real.id] = rnum;
quicMapping_[real.id] = raddr;
}
}
if (!config_.testing) {
auto server_id_map_fd = bpfAdapter_.getMapFdByName("server_id_map");
uint32_t id, rnum;
int res;
for (auto& mapping : to_update) {
id = mapping.first;
rnum = mapping.second;
res = bpfAdapter_.bpfUpdateMap(server_id_map_fd, &id, &rnum);
if (res != 0) {
LOG(ERROR) << "can't update quic mapping, error: "
<< folly::errnoStr(errno);
lbStats_.bpfFailedCalls++;
}
}
}
}