内核版本 2.6.16
数据流程:
网卡驱动--->netif_rx()--->netif_receive_skb()--->deliver_skb()--->packet_type.func
函数 |
定义位置 |
netif_receive_skb() |
net\core\dev.c |
deliver_skb() |
net\core\dev.c |
dev_add_pack() |
net\core\dev.c |
inet_init() |
net\ipv4\af_inet.c |
当ipv4协议栈初始化时,在函数inet_init中会调用dev_add_pack(&ip_packet_type)注册ip_rcv函数。
static struct packet_type ip_packet_type = { .type = __constant_htons(ETH_P_IP), .func = ip_rcv, };
static int __init inet_init(void) { ...... dev_add_pack(&ip_packet_type); ...... }
|
函数dev_add_pack会判断协议类型,然后加到ptype_base或者ptype_all中。ptype_base为一个hash表,而ptype_all为一个双向链表。
函数netif_receive_skb()会在ptype_base或者ptype_all中查找相应的packet_type,然后调用deliver_skb(),如果是IP协议,packet_type.func指向的就是ip_rcv().
阅读(1031) | 评论(0) | 转发(0) |