net:net_dev_queue 处的 eBPF 跟踪未提供正确的 IP 地址

问题描述 投票:0回答:1

我编写了一个 eBPF 代码来计算两个跟踪点

net_dev_queue
net_dev_xmit
处的数据包之间的时间差。为了生成密钥,我需要使用 struct
trace_event_raw_net_dev_template
从数据中提取 IP 地址。提取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_probe_read(&iph, sizeof(struct iphdr), skb->data);

    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;
}
linux linux-kernel perf ebpf
1个回答
0
投票

将 & 添加到您的 iph

bpf_printk(" %pI4 -> %pI4 ", &iph.saddr, &iph.daddr);
© www.soinside.com 2019 - 2024. All rights reserved.