У меня ошибка при попытке доступа к iphdr с помощью eBPF - PullRequest
1 голос
/ 10 июля 2019

Итак, я пытался получить доступ к iphdr с помощью eBPF.

static inline int parse_ipv4(void *data, u64 nh_off, void *data_end) {
struct iphdr *iph = data + nh_off;

if ((void*)&iph[1] > data_end)
    return 0;
return iph->protocol;
}

Когда я использую код выше в функции eBPF, он отлично работает, как:

if (h_proto == htons(ETH_P_IP)){
index = parse_ipv4(data, nh_off, data_end);

Таким образом, вызов функции parse_ipv4 работает.

Однако, если я пытаюсь получить доступ к ipheader напрямую без использования функции, он не работает.

if (h_proto == htons(ETH_P_IP)){
    index = parse_ipv4(data, nh_off, data_end);

    struct iphdr *iph2 = sizeof(*eth) + nh_off;
}

Это дает мне ошибку:СОВЕТ: Ошибка недопустимого доступа к mem 'inv' может произойти, если вы попытаетесь разыменовать память без предварительного использования bpf_probe_read () для ее копирования в стек BPF.Иногда bpf_probe_read автоматически переписывается с помощью bcc, в других случаях вам нужно быть явным.

и не удается активировать.

Заранее большое спасибо!

1 Ответ

2 голосов
/ 10 июля 2019

Если я не понимаю вашу программу, следующее:

struct iphdr *iph2 = sizeof(*eth) + nh_off;

выглядит ошибочно. Вместо этого iph2 должно быть что-то вроде data + nh_off, как в вашей функции, нет? Если вы установите сумму двух размеров без какого-либо базового адреса, вы попытаетесь получить доступ к данным в произвольном месте памяти (что-то вроде 0x28, я полагаю), что, конечно, недопустимо.

...