Несовместимый указатель на целочисленное преобразование, присвоенное 'u32' (также известному как 'unsigned int') из 'struct net *'

Что я хочу:

Чтобы добавить параметр сетевого пространства имен в инструмент execsnoop bcc для отслеживания только журналов с указанным сетевым пространством имен, как у нас есть параметр PID фильтра во многих других инструментах bcc. Например: execsnoop -N "ns_id"

Я использую структуры ядра Linux для получения идентификатора пространства имен net = task->nsproxy->net_ns; и нужно присвоить извлеченные нс data.netns что u32 int.

Что я делаю:

int syscall__execve(struct pt_regs *ctx,
    const char __user *filename,
    const char __user *const __user *__argv,
    const char __user *const __user *__envp)
{
    // create data here and pass to submit_arg to save stack space (#555)
    //int ret = PT_REGS_RC(ctx);
    struct data_t data = {};
    struct task_struct *task;
    struct nsproxy *nsproxy;
    struct net *net;
    //struct mnt_namespace *mnt_ns;

    data.pid = bpf_get_current_pid_tgid() >> 32;

    u32 net_ns_inum = 0;
    //net = (struct net *)get_net_ns_by_pid(data.pid); //
       //net_ns_inum = (uintptr_t)net;


    task = (struct task_struct *)bpf_get_current_task();
    // Some kernels, like Ubuntu 4.13.0-generic, return 0
    // as the real_parent->tgid.
    // We use the get_ppid function as a fallback in those cases. (#1883)

    data.ppid = task->real_parent->tgid;

    net = task->nsproxy->net_ns;
    FILTER_NETNS

    data.netns =  (uintptr_t)net; //here have to perform casting

я добавил #include </usr/include/stdint.h>но получить предупреждение, хотяinclude <bits/libc-header-start.h> присутствует в stdint.h файл:

In file included from /virtual/main.c:8:
/usr/include/stdint.h:26:10: fatal error: 'bits/libc-header-start.h' file not found
#include <bits/libc-header-start.h>
         ^~~~~~~~~~~~~~~~~~~~~~~~~~

и он продолжает генерировать другие ошибки отсутствующих файлов заголовков, если я разрешу эту ошибку.

1 ответ

Решение

Я решил эту проблему:

Вместо того, чтобы использовать net = task->nsproxy->net_ns; я использовал net = task->nsproxy->net_ns->ns.inum; который является беззнаковым int, и мы можем напрямую получить из него пространство имен.

Эту структуру можно найти в <linux/ns_common.h> заголовочный файл.

struct ns_common {
    atomic_long_t stashed;
    const struct proc_ns_operations *ops;
    unsigned int inum;
};

Чтобы получить измененный код с добавленной опцией пространства имен в инструменте execsnoop, перейдите по этой ссылке: https://github.com/Sheenam3/ebpf/blob/master/execsnoop.py

Другие вопросы по тегам