void KatranLb::modifyQuicRealsMapping()

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++;
      }
    }
  }
}