#ifndef PYLIBBPF_BPF_OBJECT_H #define PYLIBBPF_BPF_OBJECT_H #include #include #include #include #include #include namespace py = pybind11; class BpfProgram; class BpfMap; /** * BpfObject - Represents a loaded BPF object file. * * This is the main entry point for loading BPF programs. * Owns the bpf_object* and manages all programs and maps within it. */ class BpfObject : public std::enable_shared_from_this { private: struct bpf_object *obj_; std::string object_path_; bool loaded_; mutable std::unordered_map> maps_cache_; mutable std::unordered_map> prog_cache_; std::shared_ptr _get_or_create_program(struct bpf_program *prog); std::shared_ptr _get_or_create_map(struct bpf_map *map); public: explicit BpfObject(std::string object_path); ~BpfObject(); // Disable copy, allow move BpfObject(const BpfObject &) = delete; BpfObject &operator=(const BpfObject &) = delete; BpfObject(BpfObject &&) noexcept; BpfObject &operator=(BpfObject &&) noexcept; /** * Load the BPF object into the kernel. * Must be called before accessing programs or maps. */ void load(); /** * Check if object is loaded. */ [[nodiscard]] bool is_loaded() const { return loaded_; } /** * Get the underlying bpf_object pointer. * Only for internal use by BpfProgram and BpfMap. */ [[nodiscard]] struct bpf_object *get_obj() const { return obj_; } /** * Attach all programs in the object. */ py::dict attach_all(); // Program access [[nodiscard]] py::list get_program_names(); [[nodiscard]] std::shared_ptr get_program(const std::string &name); [[nodiscard]] struct bpf_program * find_program_by_name(const std::string &name) const; [[nodiscard]] py::dict get_cached_programs() const; // Map access [[nodiscard]] py::list get_map_names(); [[nodiscard]] std::shared_ptr get_map(const std::string &name); [[nodiscard]] struct bpf_map *find_map_by_name(const std::string &name) const; [[nodiscard]] py::dict get_cached_maps() const; }; #endif // PYLIBBPF_BPF_OBJECT_H