Трассировка eBPF в сети: net_dev_queue не предоставляет правильный IP-адресLinux

Ответить
Anonymous
 Трассировка eBPF в сети: net_dev_queue не предоставляет правильный IP-адрес

Сообщение Anonymous »


Я написал код eBPF для расчета разницы во времени между пакетом в двух точках трассировки: net_dev_queue и net_dev_xmit. Чтобы сгенерировать ключ, мне нужно извлечь IP-адрес из данных с помощью структуры трассировки_event_raw_net_dev_template. При извлечении IP-адреса он всегда равен 0.0.0.0. Следуя коду, который я использую. Могу ли я узнать, что мне не хватает?
Спасибо
struct flow_key
{
__be32 src_ip;
__be32 dst_ip;
__u16 src_port;
__u16 dst_port;
__u8 protocol;
};

static __always_inline int parse_flow_key(struct sk_buff *skb, struct flow_key *key)
{
struct iphdr iph;
bpf_core_read(&iph, sizeof(iph), skb->head + skb->network_header);

if (skb->protocol != bpf_htons(ETH_P_IP)) {
// This is not an IP packet
bpf_printk("Not an IP packet 0x%xn", skb->protocol);
return -1;
}

key->src_ip = iph.saddr;
key->dst_ip = iph.daddr;
key->protocol = iph.protocol;
bpf_printk(" %pI4 -> %pI4 ", iph.saddr, iph.daddr);

// More code
}

SEC("tracepoint/net/net_dev_queue")
int tp_ingress_kernel(struct trace_event_raw_net_dev_template *ctx)
{
struct sk_buff skb;
bpf_probe_read(&skb, sizeof(skb), ctx->skbaddr);
struct flow_key key = {};

if (parse_flow_key(&skb, &key) < 0)
return 0;
bpf_printk("Packet received in kernel\n");

return 0;
}


Подробнее здесь: https://stackoverflow.com/questions/787 ... ip-address
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»