From 1eb7ed460e977aa1d036e697626eb4f0e08e8e04 Mon Sep 17 00:00:00 2001 From: Pragyansh Chaturvedi Date: Mon, 20 Oct 2025 00:28:27 +0530 Subject: [PATCH] Fix Bindings and PerfEventArray --- src/bindings/main.cpp | 109 ++++++++++++++++++++-------------- src/maps/perf_event_array.cpp | 2 + 2 files changed, 65 insertions(+), 46 deletions(-) diff --git a/src/bindings/main.cpp b/src/bindings/main.cpp index d374ff7..ef9d63b 100644 --- a/src/bindings/main.cpp +++ b/src/bindings/main.cpp @@ -6,16 +6,17 @@ extern "C" { #include } -#include "core/bpf_object.h" -#include "core/bpf_program.h" #include "core/bpf_exception.h" #include "core/bpf_map.h" +#include "core/bpf_object.h" +#include "core/bpf_program.h" #include "maps/perf_event_array.h" +#include "utils/struct_parser.h" namespace py = pybind11; PYBIND11_MODULE(pylibbpf, m) { - m.doc() = R"pbdoc( + m.doc() = R"pbdoc( Pylibbpf - libbpf bindings for Python ----------------------- @@ -29,56 +30,72 @@ PYBIND11_MODULE(pylibbpf, m) { BpfException )pbdoc"; - // Register the custom exception - py::register_exception(m, "BpfException"); + // Register the custom exception + py::register_exception(m, "BpfException"); - // BpfObject - py::class_>(m, "BpfObject") - .def(py::init(), py::arg("object_path")) - .def("load", &BpfObject::load) - .def("is_loaded", &BpfObject::is_loaded) - .def("get_program_names", &BpfObject::get_program_names) - .def("get_program", &BpfObject::get_program, py::arg("name")) - .def("attach_all", &BpfObject::attach_all) - .def("get_map_names", &BpfObject::get_map_names) - .def("get_map", &BpfObject::get_map, py::arg("name")); + // BpfObject + py::class_>(m, "BpfObject") + .def(py::init(), py::arg("object_path"), + py::arg("structs") = py::dict()) + .def("load", &BpfObject::load) + .def("is_loaded", &BpfObject::is_loaded) + .def("get_program_names", &BpfObject::get_program_names) + .def("get_program", &BpfObject::get_program, py::arg("name")) + .def("attach_all", &BpfObject::attach_all) + .def("get_map_names", &BpfObject::get_map_names) + .def("get_map", &BpfObject::get_map, py::arg("name")) + .def("get_struct_defs", &BpfObject::get_struct_defs) + .def("__getitem__", &BpfObject::get_map, py::arg("name")); - // BpfProgram - py::class_>(m, "BpfProgram") - .def("attach", &BpfProgram::attach) - .def("detach", &BpfProgram::detach) - .def("is_attached", &BpfProgram::is_attached) - .def("get_name", &BpfProgram::get_name); + // BpfProgram + py::class_>(m, "BpfProgram") + .def("attach", &BpfProgram::attach) + .def("detach", &BpfProgram::detach) + .def("is_attached", &BpfProgram::is_attached) + .def("get_name", &BpfProgram::get_name); - // BpfMap - py::class_>(m, "BpfMap") - .def("lookup", &BpfMap::lookup, py::arg("key")) - .def("update", &BpfMap::update, py::arg("key"), py::arg("value")) - .def("delete_elem", &BpfMap::delete_elem, py::arg("key")) - .def("get_next_key", &BpfMap::get_next_key, py::arg("key") = py::none()) - .def("items", &BpfMap::items) - .def("keys", &BpfMap::keys) - .def("values", &BpfMap::values) - .def("get_name", &BpfMap::get_name) - .def("get_fd", &BpfMap::get_fd) - .def("get_type", &BpfMap::get_type) - .def("get_key_size", &BpfMap::get_key_size) - .def("get_value_size", &BpfMap::get_value_size) - .def("get_max_entries", &BpfMap::get_max_entries); + // BpfMap + py::class_>(m, "BpfMap") + .def("lookup", &BpfMap::lookup, py::arg("key")) + .def("update", &BpfMap::update, py::arg("key"), py::arg("value")) + .def("delete_elem", &BpfMap::delete_elem, py::arg("key")) + .def("get_next_key", &BpfMap::get_next_key, py::arg("key") = py::none()) + .def("items", &BpfMap::items) + .def("keys", &BpfMap::keys) + .def("values", &BpfMap::values) + .def("get_name", &BpfMap::get_name) + .def("get_fd", &BpfMap::get_fd) + .def("get_type", &BpfMap::get_type) + .def("get_key_size", &BpfMap::get_key_size) + .def("get_value_size", &BpfMap::get_value_size) + .def("get_max_entries", &BpfMap::get_max_entries) + .def("__getitem__", &BpfMap::lookup, py::arg("key")) + .def("__setitem__", &BpfMap::update, py::arg("key"), py::arg("value")); - py::class_(m, "PerfEventArray") - .def(py::init(), - py::arg("map_fd"), - py::arg("page_cnt") = 8, - py::arg("callback"), - py::arg("lost_callback") = py::none()) - .def("poll", &PerfEventArray::poll, py::arg("timeout_ms") = -1) - .def("consume", &PerfEventArray::consume); + // StructParser + py::class_(m, "StructParser") + .def(py::init(), py::arg("structs")) + .def("parse", &StructParser::parse, py::arg("struct_name"), + py::arg("data")) + .def("has_struct", &StructParser::has_struct, py::arg("struct_name")); + // PerfEventArray + py::class_>(m, + "PerfEventArray") + .def(py::init, int, py::function, py::object>(), + py::arg("map"), py::arg("page_cnt"), py::arg("callback"), + py::arg("lost_callback") = py::none()) + .def(py::init, int, py::function, std::string, + py::object>(), + py::arg("map"), py::arg("page_cnt"), py::arg("callback"), + py::arg("struct_name"), py::arg("lost_callback") = py::none()) + .def("poll", &PerfEventArray::poll, py::arg("timeout_ms")) + .def("consume", &PerfEventArray::consume) + .def("get_map", &PerfEventArray::get_map); #ifdef VERSION_INFO - m.attr("__version__") = MACRO_STRINGIFY(VERSION_INFO); + m.attr("__version__") = MACRO_STRINGIFY(VERSION_INFO); #else - m.attr("__version__") = "dev"; + m.attr("__version__") = "dev"; #endif } diff --git a/src/maps/perf_event_array.cpp b/src/maps/perf_event_array.cpp index a8183b8..56f4959 100644 --- a/src/maps/perf_event_array.cpp +++ b/src/maps/perf_event_array.cpp @@ -1,6 +1,8 @@ #include "perf_event_array.h" #include "core/bpf_exception.h" #include "core/bpf_map.h" +#include "core/bpf_object.h" +#include "utils/struct_parser.h" PerfEventArray::PerfEventArray(std::shared_ptr map, int page_cnt, py::function callback, py::object lost_callback)