Я пытаюсь установить программу XDP на свой сетевой драйвер, но получаю сообщение об ошибке ELF содержит не связанные с {map, call} данные relo в записи 0, указывающей на раздел 4! Ошибка компилятора?! Ошибка загрузки программы/карты!
код, который я пытаюсь запустить:
#define KBUILD_MODNAME "filter"
#include <arpa/inet.h>
#include <linux/bpf.h>
#include <linux/if_ether.h>
#include <linux/ip.h>
#include <linux/in.h>
#include <linux/udp.h>
static int (*bpf_trace_printk)(const char *fmt,...) = (void *)BPF_FUNC_trace_printk;
int udpfilter(struct xdp_md *ctx) {
bpf_trace_printk("got a packet\n");
void *data = (void *)(long)ctx->data;
void *data_end = (void *)(long)ctx->data_end;
struct ethhdr *eth = data;
if ((void*)eth + sizeof(*eth) <= data_end) {
struct iphdr *ip = data + sizeof(*eth);
if ((void*)ip + sizeof(*ip) <= data_end) {
if (ip->protocol == IPPROTO_UDP) {
struct udphdr *udp = (void*)ip + sizeof(*ip);
if ((void*)udp + sizeof(*udp) <= data_end) {
if (udp->dest == ntohs(7999)) {
bpf_trace_printk("udp port 7999\n");
udp->dest = ntohs(7998);
}
}
}
}
}
return XDP_PASS;
}
команда компиляции: clang -O2 -g -Wall -target bpf -c filter.c -o filter.o и все в порядке!
и команда, которую я использую для установки: ip link set enp0s3 xdpgeneric obj filter.o, тогда я получаю указанную выше ошибку.
я не уверен, что должно означать это сообщение, я что-то пропустил?
bpf_trace_printk()
. У него должен быть как минимум еще один аргумент для передачи размера строки формата, и я не уверен, что вы можете передать строку формата напрямую, как это может быть причиной создания данных о перемещении. См. другие примеры вызова помощника. См. также его документацию. - person Qeole   schedule 02.07.2021