Трассировка eBPF в сети: net_dev_queue не предоставляет правильный IP-адрес ⇐ Linux
-
Anonymous
Трассировка eBPF в сети: net_dev_queue не предоставляет правильный IP-адрес
Я написал код 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
Я написал код 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
Мобильная версия