Chinaunix首页 | 论坛 | 博客
  • 博客访问: 26925
  • 博文数量: 6
  • 博客积分: 240
  • 博客等级: 二等列兵
  • 技术积分: 80
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-09 22:54
文章分类
文章存档

2011年(1)

2010年(2)

2009年(3)

我的朋友

分类: LINUX

2010-03-25 16:59:48

内核版本 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) |
给主人留下些什么吧!~~