我编写了一个 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;
}
将 & 添加到您的 iph
bpf_printk(" %pI4 -> %pI4 ", &iph.saddr, &iph.daddr);