Итак, я пытался получить доступ к 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, в других случаях вам нужно быть явным.
и не удается активировать.
Заранее большое спасибо!