diff options
author | Chenbo Feng <fengc@google.com> | 2019-04-17 19:21:51 -0700 |
---|---|---|
committer | Chenbo Feng <fengc@google.com> | 2019-04-19 12:56:02 -0700 |
commit | 9ef62ac51441a03dd841db27eb1bb977437199bf (patch) | |
tree | fa9b33a7f75301eca114e7ba05bd0358e88b93fc | |
parent | 64b91ac112506e19e01819197d6e7b6585ffdb65 (diff) | |
download | platform_system_bpf-9ef62ac51441a03dd841db27eb1bb977437199bf.tar.gz platform_system_bpf-9ef62ac51441a03dd841db27eb1bb977437199bf.tar.bz2 platform_system_bpf-9ef62ac51441a03dd841db27eb1bb977437199bf.zip |
Clean up the legacy loader
delete the loader code that is no longer used by any bpf programs.
Bug: 130206035
Test: build all the bpf related target.
Change-Id: I3ea4e40cb986b380f3b79a7685c3c09633e4d199
Merged-In: I3ea4e40cb986b380f3b79a7685c3c09633e4d199
(cherry picked from commit 097205c8e1b5843f0249626704a7f3082ab6303b)
-rw-r--r-- | libbpf_android/BpfUtils.cpp | 181 | ||||
-rw-r--r-- | libbpf_android/include/bpf/BpfUtils.h | 2 |
2 files changed, 0 insertions, 183 deletions
diff --git a/libbpf_android/BpfUtils.cpp b/libbpf_android/BpfUtils.cpp index 081317b..b3ff108 100644 --- a/libbpf_android/BpfUtils.cpp +++ b/libbpf_android/BpfUtils.cpp @@ -48,7 +48,6 @@ using android::netdutils::Slice; // The buffer size for the buffer that records program loading logs, needs to be large enough for // the largest kernel program. -constexpr size_t LOG_BUF_SIZE = 0x20000; namespace android { namespace bpf { @@ -290,185 +289,5 @@ BpfLevel getBpfSupportLevel() { return BpfLevel::NONE; } -int loadAndPinProgram(BpfProgInfo* prog, Slice progBlock) { - // Program doesn't exist. Try to load it. - char bpf_log_buf[LOG_BUF_SIZE]; - Slice bpfLog = Slice(bpf_log_buf, sizeof(bpf_log_buf)); - prog->fd.reset(bpfProgLoad(prog->loadType, progBlock, "Apache 2.0", 0, bpfLog)); - if (prog->fd < 0) { - int ret = -errno; - ALOGE("load %s failed: %s", prog->name, strerror(errno)); - return ret; - } - if (prog->attachType == BPF_CGROUP_INET_EGRESS || prog->attachType == BPF_CGROUP_INET_INGRESS) { - std::string cg2_path; - if (!CgroupGetControllerPath(CGROUPV2_CONTROLLER_NAME, &cg2_path)) { - int ret = -errno; - ALOGE("Failed to find cgroup v2 root"); - return ret; - } - unique_fd cg_fd(open(cg2_path.c_str(), O_DIRECTORY | O_RDONLY | O_CLOEXEC)); - if (cg_fd < 0) { - int ret = -errno; - ALOGE("Failed to open the cgroup directory"); - return ret; - } - int ret = android::bpf::attachProgram(prog->attachType, prog->fd, cg_fd); - if (ret) { - ret = -errno; - ALOGE("%s attach failed: %s", prog->name, strerror(errno)); - return ret; - } - } - if (prog->path) { - int ret = android::bpf::bpfFdPin(prog->fd, prog->path); - if (ret) { - ret = -errno; - ALOGE("Pin %s as file %s failed: %s", prog->name, prog->path, strerror(errno)); - return ret; - } - } - return 0; -} - -int extractAndLoadProg(BpfProgInfo* prog, Elf64_Shdr* sectionPtr, Slice fileContents, - const std::vector<BpfMapInfo>& mapPatterns) { - uint64_t progSize = (uint64_t)sectionPtr->sh_size; - Slice progSection = take(drop(fileContents, sectionPtr->sh_offset), progSize); - if (progSection.size() < progSize) { - ALOGE("programSection out of bound"); - return -EINVAL; - } - MemBlock progCopy(progSection); - if (progCopy.get().size() != progSize) { - ALOGE("program cannot be extracted"); - return -EINVAL; - } - Slice remaining = progCopy.get(); - while (remaining.size() >= MAP_CMD_SIZE) { - // Scan the program, examining all possible places that might be the start of a - // map load operation (i.e., all bytes of value MAP_LD_CMD_HEAD). - // In each of these places, check whether it is the start of one of the patterns - // we want to replace, and if so, replace it. - Slice mapHead = findFirstMatching(remaining, MAP_LD_CMD_HEAD); - if (mapHead.size() < MAP_CMD_SIZE) break; - bool replaced = false; - for (const auto& pattern : mapPatterns) { - if (!memcmp(mapHead.base(), pattern.search.data(), MAP_CMD_SIZE)) { - memcpy(mapHead.base(), pattern.replace.data(), MAP_CMD_SIZE); - replaced = true; - break; - } - } - remaining = drop(mapHead, replaced ? MAP_CMD_SIZE : sizeof(uint8_t)); - } - if (!(prog->path) || access(prog->path, R_OK) == -1) { - return loadAndPinProgram(prog, progCopy.get()); - } - return 0; -} - -int parsePrograms(Slice fileContents, BpfProgInfo* programs, size_t size, - const std::vector<BpfMapInfo>& mapPatterns) { - Slice elfHeader = take(fileContents, sizeof(Elf64_Ehdr)); - if (elfHeader.size() < sizeof(Elf64_Ehdr)) { - ALOGE("bpf fileContents does not have complete elf header"); - return -EINVAL; - } - - Elf64_Ehdr* elf = (Elf64_Ehdr*)elfHeader.base(); - // Find section names string table. This is the section whose index is e_shstrndx. - if (elf->e_shstrndx == SHN_UNDEF) { - ALOGE("cannot locate namesSection\n"); - return -EINVAL; - } - size_t totalSectionSize = (elf->e_shnum) * sizeof(Elf64_Shdr); - Slice sections = take(drop(fileContents, elf->e_shoff), totalSectionSize); - if (sections.size() < totalSectionSize) { - ALOGE("sections corrupted"); - return -EMSGSIZE; - } - - Slice namesSection = - take(drop(sections, elf->e_shstrndx * sizeof(Elf64_Shdr)), sizeof(Elf64_Shdr)); - if (namesSection.size() != sizeof(Elf64_Shdr)) { - ALOGE("namesSection corrupted"); - return -EMSGSIZE; - } - size_t strTabOffset = ((Elf64_Shdr*)namesSection.base())->sh_offset; - size_t strTabSize = ((Elf64_Shdr*)namesSection.base())->sh_size; - - Slice strTab = take(drop(fileContents, strTabOffset), strTabSize); - if (strTab.size() < strTabSize) { - ALOGE("string table out of bound\n"); - return -EMSGSIZE; - } - - for (int i = 0; i < elf->e_shnum; i++) { - Slice section = take(drop(sections, i * sizeof(Elf64_Shdr)), sizeof(Elf64_Shdr)); - if (section.size() < sizeof(Elf64_Shdr)) { - ALOGE("section %d is out of bound, section size: %zu, header size: %zu, total size: " - "%zu", - i, section.size(), sizeof(Elf64_Shdr), sections.size()); - return -EBADF; - } - Elf64_Shdr* sectionPtr = (Elf64_Shdr*)section.base(); - Slice nameSlice = drop(strTab, sectionPtr->sh_name); - if (nameSlice.size() == 0) { - ALOGE("nameSlice out of bound, i: %d, strTabSize: %zu, sh_name: %u", i, strTabSize, - sectionPtr->sh_name); - return -EBADF; - } - for (size_t i = 0; i < size; i++) { - BpfProgInfo* prog = programs + i; - if (!strcmp((char*)nameSlice.base(), prog->name)) { - int ret = extractAndLoadProg(prog, sectionPtr, fileContents, mapPatterns); - if (ret) return ret; - } - } - } - - // Check all the program struct passed in to make sure they all have a valid fd. - for (size_t i = 0; i < size; i++) { - BpfProgInfo* prog = programs + i; - if (access(prog->path, R_OK) == -1) { - ALOGE("Load program %s failed", prog->name); - return -EINVAL; - } - } - return 0; -} - -int parseProgramsFromFile(const char* path, BpfProgInfo* programs, size_t size, - const std::vector<BpfMapInfo>& mapPatterns) { - unique_fd fd(open(path, O_RDONLY | O_CLOEXEC)); - int ret; - if (fd < 0) { - ret = -errno; - ALOGE("Failed to open %s program: %s", path, strerror(errno)); - return ret; - } - - struct stat stat; - if (fstat(fd.get(), &stat)) { - ret = -errno; - ALOGE("Failed to get file (%s) size: %s", path, strerror(errno)); - return ret; - } - - off_t fileLen = stat.st_size; - char* baseAddr = (char*)mmap(NULL, fileLen, PROT_READ, MAP_PRIVATE | MAP_POPULATE, fd.get(), 0); - if (baseAddr == MAP_FAILED) { - ALOGE("Failed to map the program (%s) into memory: %s", path, strerror(errno)); - ret = -errno; - return ret; - } - - ret = parsePrograms(Slice(baseAddr, fileLen), programs, size, mapPatterns); - - munmap(baseAddr, fileLen); - return ret; -} - } // namespace bpf } // namespace android diff --git a/libbpf_android/include/bpf/BpfUtils.h b/libbpf_android/include/bpf/BpfUtils.h index 93a13a4..23026bb 100644 --- a/libbpf_android/include/bpf/BpfUtils.h +++ b/libbpf_android/include/bpf/BpfUtils.h @@ -162,8 +162,6 @@ uint64_t getSocketCookie(int sockFd); int setrlimitForTest(); std::string BpfLevelToString(BpfLevel BpfLevel); BpfLevel getBpfSupportLevel(); -int parseProgramsFromFile(const char* path, BpfProgInfo* programs, size_t size, - const std::vector<BpfMapInfo>& mapPatterns); int synchronizeKernelRCU(); #define SKIP_IF_BPF_NOT_SUPPORTED \ |