%{ #include #include %} function skb_dump:string(skb_ptr:long) %{ struct sk_buff *skb = (void*)THIS->skb_ptr; if (!skb) { snprintf(THIS->__retvalue, MAXSTRINGLEN, "skb=NULL"); return; } snprintf(THIS->__retvalue, MAXSTRINGLEN, "dev:%s proto:%04x len:%u vlan_tci:{prio:%d cfi:%d vid:%d}", skb->dev ? skb->dev->name : "NULL", htons(skb->protocol), skb->len, skb->vlan_tci & VLAN_PRIO_MASK, skb->vlan_tci & VLAN_CFI_MASK, skb->vlan_tci & VLAN_VID_MASK); %} function dev_dump:string(dev_ptr:long) %{ struct net_device *dev = (void*)THIS->dev_ptr; if (!dev) { snprintf(THIS->__retvalue, MAXSTRINGLEN, "dev=NULL"); return; } snprintf(THIS->__retvalue, MAXSTRINGLEN, "name:%s", dev->name); %} function deref_unsafe:long(pskb_ptr:long) %{ struct sk_buff **pskb = (void*)THIS->pskb_ptr; if (!pskb || !(*pskb)) THIS->__retvalue = 0; else THIS->__retvalue = (long)*pskb; %} probe begin { printf ("started\n") } global nesting = 0 probe probepoints.call = module("tun").function("*@drivers/net/tun.c").call, module("macvlan").function("*@drivers/net/macvlan.c").call, module("macvtap").function("*@drivers/net/macvtap.c").call, module("bridge").function("*@net/bridge/br_device.c").call, module("bridge").function("*@net/bridge/br_forward.c").call, kernel.function("vlan_*").call, kernel.function("__vlan_*").call, kernel.function("*@net/packet/af_packet.c").call, kernel.function("*@net/core/netpoll.c").call, kernel.function("*@net/core/dev.c").call { nesting++ } probe probepoints.return = module("tun").function("*@drivers/net/tun.c").return, module("macvlan").function("*@drivers/net/macvlan.c").return, module("macvtap").function("*@drivers/net/macvtap.c").return, module("bridge").function("*@net/bridge/br_device.c").return, module("bridge").function("*@net/bridge/br_forward.c").return, kernel.function("vlan_*").return, kernel.function("__vlan_*").return, kernel.function("*@net/packet/af_packet.c").return, kernel.function("*@net/core/netpoll.c").return, kernel.function("*@net/core/dev.c").return { nesting-- } probe probepoints.call { printf ("%s -> %s(%s)\n", thread_indent(1), probefunc(), $$vars) if (@defined($skb)) printf("\tskb_dump:%s\n", skb_dump($skb)) if (@defined($pskb)) printf("\tpskb_dump:%s\n", skb_dump(deref_unsafe($pskb))) if (@defined($skbp)) printf("\tskbp_dump:%s\n", skb_dump(deref_unsafe($skbp))) if (@defined($dev)) printf("\tdev:%s\n", dev_dump($dev)) if (@defined($orig_dev)) printf("\torig_dev:%s\n", dev_dump($dev)) if (nesting == 1) print_stack(backtrace()) } probe probepoints.return { printf ("%s <- %s(): %s\n", thread_indent(-1), probefunc(), $$return) }