2017-05-29 24 views
-1

例如,访问skb变量函数ip_rcv如何使用BPF访问内核变量?

int ip_rcv(struct sk_buff *skb, struct net_device *dev, 
      struct packet_type *pt, struct net_device *orig_dev) 
{ 
... 
} 

我在网上搜索,但找不到任何例子。

回答

0

使用BPF拦截内核函数的最简单方法可能是使用bcc。它提供了一个更高的层次,Python的API来加载BPF程序内核,并与他们互动:

#!/usr/bin/env python 
from bcc import BPF 

BPF(text=""" 
int kprobe__ip_rcv(struct pt_regs *ctx, struct sk_buff *skb) { 
    bpf_trace_printk("skb=%p!\\n", skb); 
    return 0; 
} 
""").trace_print() 

返回:

 <idle>-0  [007] d.s. 1441.065248: : skb=ffff906b2bd53400! 
     <idle>-0  [007] d.s. 1442.267325: : skb=ffff906b76c5b700! 
     <idle>-0  [007] d.s. 1442.993894: : skb=ffff906b42b76800! 
     <idle>-0  [007] d.s. 1443.194334: : skb=ffff906be925d300! 
     <idle>-0  [007] d.s. 1444.616469: : skb=ffff906b67e6a200! 

欲了解更多信息,请参阅the tutorial在BCC库。

如果您不想使用密件抄送,您可以在Linux内核中找到examples of BPF programs。我特别邀请你看看tracex1_kern/user.c