PF_PACKET 往是专门用于抓包的,往系统网络层注册一个协议。然后所有的往外发的包和进来的包都会调到http://lxr.linux.no/linux+v3.4/net/packet/af_packet.c 这个文件里面 的packet_rcv() 函数,
其中 outgoing方向(出去的包)会在 dev_queue_xmit_nit里面遍历 ptype_all 链表进行所有网络协议处理的时候调用到packet_rcv 。
incoming 方向(从外面其他机器进来的包会在 netif_receive_skb 函数里面同样办法遍历 ptype_all进行处理的时候调用到packet_rcv 。
在之前的一篇文章
http://gmd20.blog.163.com/blog/static/16843923201011194136744/
里面有分析过了,但太久了又忘了出去方向的包是怎么又被发到PF_PACKET 的来了。唉!看看下面的吧,希望以后不会再次忘记了。
int dev_queue_xmit(struct sk_buff *skb)
2213 if (!netif_tx_queue_stopped(txq)) {
2214 rc = dev_hard_start_xmit(skb, dev, txq);
--------------------------------------
1938


