bool KatranLb::modifyLpmMap()

in katran/lib/KatranLb.cpp [1608:1664]


bool KatranLb::modifyLpmMap(
    const std::string& lpmMapNamePrefix,
    ModifyAction action,
    const folly::CIDRNetwork& prefix,
    void* value) {
  auto lpm_addr = IpHelpers::parseAddrToBe(prefix.first.str());
  if (prefix.first.isV4()) {
    struct v4_lpm_key key_v4 = {
        .prefixlen = prefix.second, .addr = lpm_addr.daddr};
    std::string mapName = lpmMapNamePrefix + "_v4";
    if (action == ModifyAction::ADD) {
      auto res = bpfAdapter_.bpfUpdateMap(
          bpfAdapter_.getMapFdByName(mapName), &key_v4, value);
      if (res != 0) {
        LOG(INFO) << "can't add new element into " << mapName
                  << ", error: " << folly::errnoStr(errno);
        lbStats_.bpfFailedCalls++;
        return false;
      }
    } else {
      auto res = bpfAdapter_.bpfMapDeleteElement(
          bpfAdapter_.getMapFdByName(mapName), &key_v4);
      if (res != 0) {
        LOG(INFO) << "can't delete element from " << mapName
                  << ", error: " << folly::errnoStr(errno);
        lbStats_.bpfFailedCalls++;
        return false;
      }
    }
  } else {
    struct v6_lpm_key key_v6 = {
        .prefixlen = prefix.second,
    };
    std::string mapName = lpmMapNamePrefix + "_v6";
    std::memcpy(key_v6.addr, lpm_addr.v6daddr, 16);
    if (action == ModifyAction::ADD) {
      auto res = bpfAdapter_.bpfUpdateMap(
          bpfAdapter_.getMapFdByName(mapName), &key_v6, value);
      if (res != 0) {
        LOG(INFO) << "can't add new element into " << mapName
                  << ", error: " << folly::errnoStr(errno);
        lbStats_.bpfFailedCalls++;
        return false;
      }
    } else {
      auto res = bpfAdapter_.bpfMapDeleteElement(
          bpfAdapter_.getMapFdByName(mapName), &key_v6);
      if (res != 0) {
        LOG(INFO) << "can't delete element from " << mapName
                  << ", error: " << folly::errnoStr(errno);
        lbStats_.bpfFailedCalls++;
        return false;
      }
    }
  }
  return true;
}