in katran/lib/KatranLb.cpp [715:807]
void KatranLb::loadBpfProgs() {
int res;
bool flowDebugInProg = false;
bool globalLruInProg = false;
if (!config_.disableForwarding) {
flowDebugInProg = bpfAdapter_.isMapInBpfObject(
config_.balancerProgPath, kFlowDebugParentMapName.data());
globalLruInProg = bpfAdapter_.isMapInBpfObject(
config_.balancerProgPath, kGlobalLruMapName.data());
initLrus(flowDebugInProg, globalLruInProg);
if (flowDebugInProg) {
initFlowDebugPrototypeMap();
}
if (globalLruInProg) {
initGlobalLruPrototypeMap();
}
res = bpfAdapter_.loadBpfProg(config_.balancerProgPath);
if (res) {
throw std::invalid_argument("can't load main bpf program");
}
}
if (config_.enableHc) {
res = bpfAdapter_.loadBpfProg(config_.healthcheckingProgPath);
if (res) {
throw std::invalid_argument(folly::sformat(
"can't load healthchecking bpf program, error: {}",
folly::errnoStr(errno)));
}
}
initialSanityChecking(flowDebugInProg, globalLruInProg);
featureDiscovering();
if (!config_.disableForwarding && features_.gueEncap) {
setupGueEnvironment();
}
if (!config_.disableForwarding && features_.inlineDecap) {
enableRecirculation();
}
if (!config_.disableForwarding) {
// add values to main prog ctl_array
std::vector<uint32_t> balancer_ctl_keys = {kMacAddrPos};
for (auto ctl_key : balancer_ctl_keys) {
res = bpfAdapter_.bpfUpdateMap(
bpfAdapter_.getMapFdByName("ctl_array"),
&ctl_key,
&ctlValues_[ctl_key]);
if (res != 0) {
throw std::invalid_argument(folly::sformat(
"can't update ctl array for main program, error: {}",
folly::errnoStr(errno)));
}
}
}
if (config_.enableHc) {
std::vector<uint32_t> hc_ctl_keys = {kMainIntfPos};
if (config_.tunnelBasedHCEncap) {
hc_ctl_keys.push_back(kIpv4TunPos);
hc_ctl_keys.push_back(kIpv6TunPos);
}
for (auto ctl_key : hc_ctl_keys) {
res = bpfAdapter_.bpfUpdateMap(
bpfAdapter_.getMapFdByName("hc_ctrl_map"),
&ctl_key,
&ctlValues_[ctl_key].ifindex);
if (res != 0) {
throw std::invalid_argument(folly::sformat(
"can't update ctrl map for hc program, error: {}",
folly::errnoStr(errno)));
}
}
if (features_.directHealthchecking) {
setupHcEnvironment();
}
}
progsLoaded_ = true;
if (!config_.disableForwarding && features_.introspection) {
startIntrospectionRoutines();
introspectionStarted_ = true;
}
if (!config_.disableForwarding) {
attachLrus(flowDebugInProg, globalLruInProg);
}
}