bpftrace对udp及内核函数dev_queue_xmit及sk_buff的解析

bpftrace对udp及内核函数dev_queue_xmit及sk_buff的解析

#!/usr/bin/bpftrace
#include <linux/skbuff.h>
#include <linux/ip.h>
#include <linux/udp.h>
#include <linux/socket.h>


kprobe:ip_finish_output2
{
	// 获取ip_finish_output2函数的调用次数
	@ip_finish_output2[tid]=count();
}

kprobe:udp_sendmsg
{
	// 保存tid
	@udp_tid[tid]=tid
}

kprobe:__dev_queue_xmit
{
	//获取调用次数
	@dev_queue_xmit[tid]=count();
	@skb[tid]=(struct sk_buff *)arg0;
}

kr:__dev_queue_xmit
/@skb[tid]/
{
	// 过滤udp的进程
	if (tid == @udp_tid[tid]){ 
		$skb = @skb[tid];
		// get IPv4 header; see skb_network_header():
		$iph = (struct iphdr *)($skb->head + $skb->network_header);
		$sip = ntop(AF_INET, $iph->saddr);
		$dip = ntop(AF_INET, $iph->daddr);
         //id 为ip数据包标识
        $id = (($iph->id & 0x00ff) << 8) | (($iph->id & 0xff00) >> 8);
        $tot_len = (($iph->tot_len & 0x00ff) << 8) | (( $iph->tot_len  & 0xff00) >> 8);
        $frag_off = (($iph->frag_off & 0x001f) << 8) | (($iph->frag_off  & 0xff00) >> 8) ;

		$udphdr = (struct udphdr *)($skb->head + $skb->transport_header);
		// 以下两行不可使用,因为经过一个变量后就取不到想要的端口号,原因未知
		$sport = (($udphdr->source & 0x00ff) << 8) | (($udphdr->source & 0xff00) >> 8);
		$dport = (($udphdr->dest & 0x00ff) << 8) | (($udphdr->dest & 0xff00) >> 8);
		
		// 过滤目标地址为172.20.101.63的地址
 		if ($iph->daddr == 0x3f6514ac){
			printf("tot_len = %d, $skb->truesize=%d \t", $tot_len, $skb->truesize);
			printf("sip %s(%d) \t ---> dip %s(%d), id= %d,  frag_off = %d\n", $sip, $sport, $dip, $dport, $id, $frag_off * 8);
		}
	}
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值