......
全部博文(52)
分类: LINUX
2013-11-30 18:39:06
点击(此处)折叠或打开
INIT_LIST_HEAD(&ptype_all); //在net_dev_init函数中进行了初始化
for (i = 0; i < 16; i++)
INIT_LIST_HEAD(&ptype_base[i]);
/*
* IP protocol layer initialiser
*/
static struct packet_type ip_packet_type = {
.type = __constant_htons(ETH_P_IP),
.func = ip_rcv,
.gso_send_check = inet_gso_send_check,
.gso_segment = inet_gso_segment,
};
void dev_add_pack(struct packet_type *pt)
{
int hash;
spin_lock_bh(&ptype_lock);
if (pt->type == htons(ETH_P_ALL)) { //抓包软件定义的类型为ETH_P_ALL
netdev_nit++;
list_add_rcu(&pt->list, &ptype_all); //抓包软件就挂在这里
} else {
hash = ntohs(pt->type) & 15; //这个哈希很简单啊
list_add_rcu(&pt->list, &ptype_base[hash]); //根据协议类型进行哈希挂在ptype_base数组中,
}
spin_unlock_bh(&ptype_lock);
}
dev_add_pack(&ip_packet_type); //在inet_init初始化函数中我们ip协议packet_type结构根据ETH_P_IP类型挂在了ptype_base数组中。在netif_receive_skb函数中我们根据
//收到数据包的类型为索引来遍历ptype_base数组,找到挂接的ip协议类型,然后就能把数据包交给注册的L3回调函数ip_rcv来处理了
//我们可以推测像其他协议appTalk等也会有相应的操作,如果收到的数据包的类型是appTalk,那么会交个appTalk注册的回调函数
点击(此处)折叠或打开