}
};
+template <class ValueType>
+class BPFInodeStorageTable : public BPFTableBase<int, ValueType> {
+ public:
+ BPFInodeStorageTable(const TableDesc& desc) : BPFTableBase<int, ValueType>(desc) {
+ if (desc.type != BPF_MAP_TYPE_INODE_STORAGE)
+ throw std::invalid_argument("Table '" + desc.name +
+ "' is not a inode_storage table");
+ }
+
+ virtual StatusTuple get_value(const int& fd, ValueType& value) {
+ if (!this->lookup(const_cast<int*>(&fd), get_value_addr(value)))
+ return StatusTuple(-1, "Error getting value: %s", std::strerror(errno));
+ return StatusTuple::OK();
+ }
+
+ virtual StatusTuple update_value(const int& fd, const ValueType& value) {
+ if (!this->update(const_cast<int*>(&fd),
+ get_value_addr(const_cast<ValueType&>(value))))
+ return StatusTuple(-1, "Error updating value: %s", std::strerror(errno));
+ return StatusTuple::OK();
+ }
+
+ virtual StatusTuple remove_value(const int& fd) {
+ if (!this->remove(const_cast<int*>(&fd)))
+ return StatusTuple(-1, "Error removing value: %s", std::strerror(errno));
+ return StatusTuple::OK();
+ }
+};
+
+template <class ValueType>
+class BPFTaskStorageTable : public BPFTableBase<int, ValueType> {
+ public:
+ BPFTaskStorageTable(const TableDesc& desc) : BPFTableBase<int, ValueType>(desc) {
+ if (desc.type != BPF_MAP_TYPE_TASK_STORAGE)
+ throw std::invalid_argument("Table '" + desc.name +
+ "' is not a task_storage table");
+ }
+
+ virtual StatusTuple get_value(const int& fd, ValueType& value) {
+ if (!this->lookup(const_cast<int*>(&fd), get_value_addr(value)))
+ return StatusTuple(-1, "Error getting value: %s", std::strerror(errno));
+ return StatusTuple::OK();
+ }
+
+ virtual StatusTuple update_value(const int& fd, const ValueType& value) {
+ if (!this->update(const_cast<int*>(&fd),
+ get_value_addr(const_cast<ValueType&>(value))))
+ return StatusTuple(-1, "Error updating value: %s", std::strerror(errno));
+ return StatusTuple::OK();
+ }
+
+ virtual StatusTuple remove_value(const int& fd) {
+ if (!this->remove(const_cast<int*>(&fd)))
+ return StatusTuple(-1, "Error removing value: %s", std::strerror(errno));
+ return StatusTuple::OK();
+ }
+};
+
template <class ValueType>
class BPFCgStorageTable : public BPFTableBase<int, ValueType> {
public:
struct _name##_table_t _name = { .flags = BPF_F_NO_PREALLOC }; \
BPF_ANNOTATE_KV_PAIR(_name, int, _leaf_type)
+#define BPF_INODE_STORAGE(_name, _leaf_type) \
+struct _name##_table_t { \
+ int key; \
+ _leaf_type leaf; \
+ void * (*inode_storage_get) (void *, void *, int); \
+ int (*inode_storage_delete) (void *); \
+ u32 flags; \
+}; \
+__attribute__((section("maps/inode_storage"))) \
+struct _name##_table_t _name = { .flags = BPF_F_NO_PREALLOC }; \
+BPF_ANNOTATE_KV_PAIR(_name, int, _leaf_type)
+
+#define BPF_TASK_STORAGE(_name, _leaf_type) \
+struct _name##_table_t { \
+ int key; \
+ _leaf_type leaf; \
+ void * (*task_storage_get) (void *, void *, int); \
+ int (*task_storage_delete) (void *); \
+ u32 flags; \
+}; \
+__attribute__((section("maps/task_storage"))) \
+struct _name##_table_t _name = { .flags = BPF_F_NO_PREALLOC }; \
+BPF_ANNOTATE_KV_PAIR(_name, int, _leaf_type)
+
#define BPF_SOCKMAP_COMMON(_name, _max_entries, _kind, _helper_name) \
struct _name##_table_t { \
u32 key; \
BPF_MAP_TYPE_DEVMAP_HASH = 25
BPF_MAP_TYPE_STRUCT_OPS = 26
BPF_MAP_TYPE_RINGBUF = 27
-
-map_type_name = {BPF_MAP_TYPE_HASH: "HASH",
- BPF_MAP_TYPE_ARRAY: "ARRAY",
- BPF_MAP_TYPE_PROG_ARRAY: "PROG_ARRAY",
- BPF_MAP_TYPE_PERF_EVENT_ARRAY: "PERF_EVENT_ARRAY",
- BPF_MAP_TYPE_PERCPU_HASH: "PERCPU_HASH",
- BPF_MAP_TYPE_PERCPU_ARRAY: "PERCPU_ARRAY",
- BPF_MAP_TYPE_STACK_TRACE: "STACK_TRACE",
- BPF_MAP_TYPE_CGROUP_ARRAY: "CGROUP_ARRAY",
- BPF_MAP_TYPE_LRU_HASH: "LRU_HASH",
- BPF_MAP_TYPE_LRU_PERCPU_HASH: "LRU_PERCPU_HASH",
- BPF_MAP_TYPE_LPM_TRIE: "LPM_TRIE",
- BPF_MAP_TYPE_ARRAY_OF_MAPS: "ARRAY_OF_MAPS",
- BPF_MAP_TYPE_HASH_OF_MAPS: "HASH_OF_MAPS",
- BPF_MAP_TYPE_DEVMAP: "DEVMAP",
- BPF_MAP_TYPE_SOCKMAP: "SOCKMAP",
- BPF_MAP_TYPE_CPUMAP: "CPUMAP",
- BPF_MAP_TYPE_XSKMAP: "XSKMAP",
- BPF_MAP_TYPE_SOCKHASH: "SOCKHASH",
- BPF_MAP_TYPE_CGROUP_STORAGE: "CGROUP_STORAGE",
- BPF_MAP_TYPE_REUSEPORT_SOCKARRAY: "REUSEPORT_SOCKARRAY",
- BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE: "PERCPU_CGROUP_STORAGE",
- BPF_MAP_TYPE_QUEUE: "QUEUE",
- BPF_MAP_TYPE_STACK: "STACK",
- BPF_MAP_TYPE_SK_STORAGE: "SK_STORAGE",
- BPF_MAP_TYPE_DEVMAP_HASH: "DEVMAP_HASH",
- BPF_MAP_TYPE_STRUCT_OPS: "STRUCT_OPS",
- BPF_MAP_TYPE_RINGBUF: "RINGBUF",}
+BPF_MAP_TYPE_INODE_STORAGE = 28
+BPF_MAP_TYPE_TASK_STORAGE = 29
+
+map_type_name = {
+ BPF_MAP_TYPE_HASH: "HASH",
+ BPF_MAP_TYPE_ARRAY: "ARRAY",
+ BPF_MAP_TYPE_PROG_ARRAY: "PROG_ARRAY",
+ BPF_MAP_TYPE_PERF_EVENT_ARRAY: "PERF_EVENT_ARRAY",
+ BPF_MAP_TYPE_PERCPU_HASH: "PERCPU_HASH",
+ BPF_MAP_TYPE_PERCPU_ARRAY: "PERCPU_ARRAY",
+ BPF_MAP_TYPE_STACK_TRACE: "STACK_TRACE",
+ BPF_MAP_TYPE_CGROUP_ARRAY: "CGROUP_ARRAY",
+ BPF_MAP_TYPE_LRU_HASH: "LRU_HASH",
+ BPF_MAP_TYPE_LRU_PERCPU_HASH: "LRU_PERCPU_HASH",
+ BPF_MAP_TYPE_LPM_TRIE: "LPM_TRIE",
+ BPF_MAP_TYPE_ARRAY_OF_MAPS: "ARRAY_OF_MAPS",
+ BPF_MAP_TYPE_HASH_OF_MAPS: "HASH_OF_MAPS",
+ BPF_MAP_TYPE_DEVMAP: "DEVMAP",
+ BPF_MAP_TYPE_SOCKMAP: "SOCKMAP",
+ BPF_MAP_TYPE_CPUMAP: "CPUMAP",
+ BPF_MAP_TYPE_XSKMAP: "XSKMAP",
+ BPF_MAP_TYPE_SOCKHASH: "SOCKHASH",
+ BPF_MAP_TYPE_CGROUP_STORAGE: "CGROUP_STORAGE",
+ BPF_MAP_TYPE_REUSEPORT_SOCKARRAY: "REUSEPORT_SOCKARRAY",
+ BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE: "PERCPU_CGROUP_STORAGE",
+ BPF_MAP_TYPE_QUEUE: "QUEUE",
+ BPF_MAP_TYPE_STACK: "STACK",
+ BPF_MAP_TYPE_SK_STORAGE: "SK_STORAGE",
+ BPF_MAP_TYPE_DEVMAP_HASH: "DEVMAP_HASH",
+ BPF_MAP_TYPE_STRUCT_OPS: "STRUCT_OPS",
+ BPF_MAP_TYPE_RINGBUF: "RINGBUF",
+ BPF_MAP_TYPE_INODE_STORAGE: "INODE_STORAGE",
+ BPF_MAP_TYPE_TASK_STORAGE: "TASK_STORAGE",
+}
stars_max = 40
log2_index_max = 65
def _get_event_class(event_map):
- ct_mapping = { 'char' : ct.c_char,
- 's8' : ct.c_char,
- 'unsigned char' : ct.c_ubyte,
- 'u8' : ct.c_ubyte,
- 'u8 *' : ct.c_char_p,
- 'char *' : ct.c_char_p,
- 'short' : ct.c_short,
- 's16' : ct.c_short,
- 'unsigned short' : ct.c_ushort,
- 'u16' : ct.c_ushort,
- 'int' : ct.c_int,
- 's32' : ct.c_int,
- 'enum' : ct.c_int,
- 'unsigned int' : ct.c_uint,
- 'u32' : ct.c_uint,
- 'long' : ct.c_long,
- 'unsigned long' : ct.c_ulong,
- 'long long' : ct.c_longlong,
- 's64' : ct.c_longlong,
- 'unsigned long long': ct.c_ulonglong,
- 'u64' : ct.c_ulonglong,
- '__int128' : (ct.c_longlong * 2),
- 'unsigned __int128' : (ct.c_ulonglong * 2),
- 'void *' : ct.c_void_p }
+ ct_mapping = {
+ 'char' : ct.c_char,
+ 's8' : ct.c_char,
+ 'unsigned char' : ct.c_ubyte,
+ 'u8' : ct.c_ubyte,
+ 'u8 *' : ct.c_char_p,
+ 'char *' : ct.c_char_p,
+ 'short' : ct.c_short,
+ 's16' : ct.c_short,
+ 'unsigned short' : ct.c_ushort,
+ 'u16' : ct.c_ushort,
+ 'int' : ct.c_int,
+ 's32' : ct.c_int,
+ 'enum' : ct.c_int,
+ 'unsigned int' : ct.c_uint,
+ 'u32' : ct.c_uint,
+ 'long' : ct.c_long,
+ 'unsigned long' : ct.c_ulong,
+ 'long long' : ct.c_longlong,
+ 's64' : ct.c_longlong,
+ 'unsigned long long': ct.c_ulonglong,
+ 'u64' : ct.c_ulonglong,
+ '__int128' : (ct.c_longlong * 2),
+ 'unsigned __int128' : (ct.c_ulonglong * 2),
+ 'void *' : ct.c_void_p,
+ }
# handle array types e.g. "int [16]" or "char[16]"
array_type = re.compile(r"([^ ]+) ?\[([0-9]+)\]$")