Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Libbpf API compatibility #350

Merged
merged 8 commits into from Jul 30, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitmodules
Expand Up @@ -6,3 +6,6 @@
path = external/ubpf
url = https://github.com/iovisor/ubpf.git
branch = master
[submodule "external/libbpf"]
path = external/libbpf
url = https://github.com/libbpf/libbpf.git
93 changes: 62 additions & 31 deletions ebpfapi/Source.def
Expand Up @@ -5,34 +5,65 @@

LIBRARY
EXPORTS
ebpf_api_initiate
ebpf_api_terminate
ebpf_api_load_program
ebpf_api_create_map
ebpf_api_map_find_element
ebpf_api_map_update_element
ebpf_api_map_delete_element
ebpf_api_get_next_map_key
ebpf_api_elf_enumerate_sections
ebpf_api_elf_disassemble_section
ebpf_api_elf_verify_section
ebpf_api_elf_free
ebpf_api_pin_object
ebpf_api_unpin_object
ebpf_api_get_next_map
ebpf_api_get_pinned_map
ebpf_api_get_next_program
ebpf_api_program_query_info
ebpf_api_link_program
ebpf_api_close_handle
ebpf_api_get_pinned_map_info
ebpf_api_map_info_free
ebpf_free_string
ebpf_map_get_fd
ebpf_map_next
ebpf_map_previous
ebpf_object_close
ebpf_program_get_fd
ebpf_program_load
ebpf_program_next
ebpf_program_previous
bpf_link__destroy
bpf_map__fd
bpf_map__is_pinned
bpf_map__key_size
bpf_map__max_entries
bpf_map__next
bpf_map__pin
bpf_map__prev
bpf_map__type
bpf_map__unpin
bpf_map__value_size
bpf_object__close
bpf_object__find_program_by_name
bpf_object__name
bpf_object__pin
bpf_object__pin_maps
bpf_object__pin_programs
bpf_object__unpin_maps
bpf_object__unpin_programs
bpf_prog_load
bpf_program__attach
bpf_program__attach_xdp
bpf_program__fd
bpf_program__get_expected_attach_type
bpf_program__name
bpf_program__next
bpf_program__pin
bpf_program__prev
bpf_program__section_name
bpf_program__set_expected_attach_type
bpf_program__unpin
ebpf_api_initiate
ebpf_api_terminate
ebpf_api_load_program
ebpf_api_create_map
ebpf_api_map_find_element
ebpf_api_map_update_element
ebpf_api_map_delete_element
ebpf_api_get_next_map_key
ebpf_api_elf_enumerate_sections
ebpf_api_elf_disassemble_section
ebpf_api_elf_verify_section
ebpf_api_elf_free
ebpf_api_pin_object
ebpf_api_unpin_object
ebpf_api_get_next_map
ebpf_api_get_pinned_map
ebpf_api_get_next_program
ebpf_api_program_query_info
ebpf_api_link_program
ebpf_api_close_handle
ebpf_api_get_pinned_map_info
ebpf_api_map_info_free
ebpf_free_string
ebpf_map_get_fd
ebpf_map_next
ebpf_map_previous
ebpf_object_close
ebpf_program_get_fd
ebpf_program_load
ebpf_program_next
ebpf_program_previous
1 change: 1 addition & 0 deletions external/libbpf
Submodule libbpf added at 90405f
47 changes: 47 additions & 0 deletions include/linux/bpf.h
@@ -0,0 +1,47 @@
// Copyright (c) Microsoft Corporation
// // SPDX-License-Identifier: MIT
#pragma once

// This file is needed since bpf.h includes it.
// It should be thought of as platform/bpf.h not Linux per se.

#include "ebpf_program_types.h"
#include "ebpf_api.h"
#define LIBBPF_API
#include "libbpf_common.h"
#undef LIBBPF_DEPRECATED
#define LIBBPF_DEPRECATED(x)

typedef uint8_t __u8;
typedef uint32_t __u32;
typedef uint64_t __u64;
typedef uint32_t pid_t;

#define bpf_map _ebpf_map
#define bpf_map_type _ebpf_map_type
#define bpf_object _ebpf_object
#define bpf_program _ebpf_program
#define bpf_prog_info _ebpf_program_info
#define BPF_MAP_TYPE_ARRAY EBPF_MAP_TYPE_ARRAY

enum bpf_prog_type
{
BPF_PROG_TYPE_UNKNOWN,
BPF_PROG_TYPE_XDP,
};

enum bpf_attach_type
{
BPF_ATTACH_TYPE_UNKNOWN,
BPF_ATTACH_TYPE_XDP,
};

enum bpf_func_id
{
BPF_FUNC_ID_UNKNOWN
};

enum bpf_stats_type
{
BPF_STATS_TYPE_UNKNOWN
};
11 changes: 8 additions & 3 deletions libs/api/api.vcxproj
Expand Up @@ -97,6 +97,7 @@
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<LanguageStandard>stdcpplatest</LanguageStandard>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<AdditionalIncludeDirectories>$(SolutionDir)external\libbpf\src;$(SolutionDir)libs\api;$(SolutionDir)rpc_interface;$(SolutionDir)libs\service;$(SolutionDir)libs\api_common;$(SolutionDir)include;$(SolutionDir)libs\platform;$(SolutionDir)libs\platform\user;$(SolutionDir)libs\execution_context;$(SolutionDir)external\ubpf\vm;$(SolutionDir)external\ubpf\vm\inc;$(SolutionDir)external\ebpf-verifier\src;$(SolutionDir)external\ebpf-verifier\external;$(SolutionDir)external\ebpf-verifier\external\elfio;$(OutDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
Expand All @@ -115,6 +116,7 @@
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<LanguageStandard>stdcpplatest</LanguageStandard>
<AdditionalIncludeDirectories>$(SolutionDir)external\libbpf\src;</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
Expand All @@ -132,7 +134,7 @@
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<AdditionalIncludeDirectories>$(SolutionDir)libs\api;$(SolutionDir)rpc_interface;$(SolutionDir)libs\service;$(SolutionDir)libs\api_common;$(SolutionDir)include;$(SolutionDir)libs\platform;$(SolutionDir)libs\platform\user;$(SolutionDir)libs\execution_context;$(SolutionDir)external\ubpf\vm;$(SolutionDir)external\ubpf\vm\inc;$(SolutionDir)external\ebpf-verifier\src;$(SolutionDir)external\ebpf-verifier\external;$(SolutionDir)external\ebpf-verifier\external\elfio;$(OutDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>$(SolutionDir)external\libbpf\src;$(SolutionDir)libs\api;$(SolutionDir)rpc_interface;$(SolutionDir)libs\service;$(SolutionDir)libs\api_common;$(SolutionDir)include;$(SolutionDir)libs\platform;$(SolutionDir)libs\platform\user;$(SolutionDir)libs\execution_context;$(SolutionDir)external\ubpf\vm;$(SolutionDir)external\ubpf\vm\inc;$(SolutionDir)external\ebpf-verifier\src;$(SolutionDir)external\ebpf-verifier\external;$(SolutionDir)external\ebpf-verifier\external\elfio;$(OutDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<LanguageStandard>stdcpplatest</LanguageStandard>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<TreatWarningAsError>true</TreatWarningAsError>
Expand All @@ -154,7 +156,7 @@
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<AdditionalIncludeDirectories>$(SolutionDir)rpc_interface;$(SolutionDir)libs\service;$(SolutionDir)libs\api_common;$(SolutionDir)include;$(SolutionDir)libs\platform;$(SolutionDir)libs\platform\user;$(SolutionDir)libs\execution_context;$(SolutionDir)external\ubpf\vm;$(SolutionDir)external\ubpf\vm\inc;$(SolutionDir)external\ebpf-verifier\src;$(SolutionDir)external\ebpf-verifier\external;$(SolutionDir)external\ebpf-verifier\external\elfio;$(OutDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>$(SolutionDir)external\libbpf\src;$(SolutionDir)rpc_interface;$(SolutionDir)libs\service;$(SolutionDir)libs\api_common;$(SolutionDir)include;$(SolutionDir)libs\platform;$(SolutionDir)libs\platform\user;$(SolutionDir)libs\execution_context;$(SolutionDir)external\ubpf\vm;$(SolutionDir)external\ubpf\vm\inc;$(SolutionDir)external\ebpf-verifier\src;$(SolutionDir)external\ebpf-verifier\external;$(SolutionDir)external\ebpf-verifier\external\elfio;$(OutDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<LanguageStandard>stdcpplatest</LanguageStandard>
<TreatWarningAsError>true</TreatWarningAsError>
</ClCompile>
Expand All @@ -171,6 +173,9 @@
</ItemGroup>
<ItemGroup>
<ClCompile Include="ebpf_api.cpp" />
<ClCompile Include="libbpf_object.cpp" />
<ClCompile Include="libbpf_program.cpp" />
<ClCompile Include="libbpf_map.cpp" />
<ClCompile Include="Verifier.cpp" />
<ClCompile Include="windows_platform.cpp" />
</ItemGroup>
Expand Down Expand Up @@ -201,4 +206,4 @@
</PropertyGroup>
<Error Condition="!Exists('..\..\packages\boost.1.75.0.0\build\boost.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\boost.1.75.0.0\build\boost.targets'))" />
</Target>
</Project>
</Project>
9 changes: 9 additions & 0 deletions libs/api/api.vcxproj.filters
Expand Up @@ -25,6 +25,15 @@
<ClCompile Include="windows_platform.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="libbpf_program.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="libbpf_map.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="libbpf_object.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="pch.h">
Expand Down
2 changes: 1 addition & 1 deletion libs/api/api_internal.h
Expand Up @@ -29,7 +29,7 @@ typedef struct _ebpf_map
char* name;
ebpf_handle_t map_handle;
fd_t map_fd;
ebpf_map_definition_t map_defintion;
ebpf_map_definition_t map_definition;
char* pin_path;
bool pinned;
} ebpf_map_t;
Expand Down
13 changes: 7 additions & 6 deletions libs/api/ebpf_api.cpp
Expand Up @@ -3,6 +3,7 @@

#include "pch.h"

#include <fcntl.h>
#include <io.h>
#include "api_common.hpp"
#include "api_internal.h"
Expand Down Expand Up @@ -677,7 +678,7 @@ clean_up_ebpf_program(_In_ _Post_invalid_ ebpf_program_t* program)
_ebpf_programs.erase(program->fd);
}
if (program->handle != ebpf_handle_invalid) {
CloseHandle(program->handle);
Platform::CloseHandle(program->handle);
}
free(program->byte_code);
free(program->program_name);
Expand All @@ -702,7 +703,7 @@ clean_up_ebpf_map(_In_ _Post_invalid_ ebpf_map_t* map)
_ebpf_maps.erase(map->map_fd);
}
if (map->map_handle != ebpf_handle_invalid) {
CloseHandle(map->map_handle);
Platform::CloseHandle(map->map_handle);
}

free(map);
Expand Down Expand Up @@ -758,10 +759,10 @@ _initialize_map(_Out_ ebpf_map_t* map, _In_ const ebpf_object_t* object, _In_ co
map->object = object;
map->map_handle = (ebpf_handle_t)map_cache.handle;
map->map_fd = map_cache.ebpf_map_descriptor.original_fd;
map->map_defintion.type = (ebpf_map_type_t)map_cache.ebpf_map_descriptor.type;
map->map_defintion.key_size = map_cache.ebpf_map_descriptor.key_size;
map->map_defintion.value_size = map_cache.ebpf_map_descriptor.value_size;
map->map_defintion.max_entries = map_cache.ebpf_map_descriptor.max_entries;
map->map_definition.type = (ebpf_map_type_t)map_cache.ebpf_map_descriptor.type;
map->map_definition.key_size = map_cache.ebpf_map_descriptor.key_size;
map->map_definition.value_size = map_cache.ebpf_map_descriptor.value_size;
map->map_definition.max_entries = map_cache.ebpf_map_descriptor.max_entries;
map->pinned = false;
map->pin_path = nullptr;
}
Expand Down
14 changes: 14 additions & 0 deletions libs/api/libbpf_internal.h
@@ -0,0 +1,14 @@
// Copyright (c) Microsoft Corporation
// SPDX-License-Identifier: MIT
#pragma once

#define PATH_MAX MAX_PATH
#define strdup _strdup

static inline int
libbpf_err(int ret)
{
if (ret < 0)
errno = -ret;
return ret;
}