struct packet_type * struct packet_type ptype_base ip_packet_type +-----+ +--------------+ | 0 |------------------------------>| | |-----| |ETH_P_IP() | | . | | | | . | |--------------| | . | | | | . | |NULL | | . | |--------------| | . | | | | . | |ip_rcv () | | . | |--------------| | . | | | | . | |NULL | | . | |--------------| | . | | | | . | |NULL | | . | +--------------+ | . | struct packet_type | | arp_packet_type |-----| +----------------+ | 6 |----------------------->| | |-----| |ETH_P_ARP | | . | |-------------- | | . | | | | . | |NULL | | . | |--------------- | | . | | | +-----+ |arp_rcv() | |----------------| | | |NULL | |--------------- | | | |NULL | +----------------+ struct packet_type * ptype_all=NULL 初始化的时候为空。用于指向Eth_P_ALL类型的packet_type结构。 注册在这里的接收函数,可以收到所有的数据包,包括incomming, output,forward。并且收到的是一个clone的数据包,也就是说 在这里处理的过程会影响到后面的处理过程。 dev_add_pack就是如上根据类型加到不同的链表中。注册自己的接收函数的。 这个dev_add_pack的确是某些人比较喜欢的东西,呵呵