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