荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: ykwch.bbs@bbs.cqupt.edu.cn (心蓝--雨下), 信区: Linux
标  题: 协议初始化1
发信站: 幽幽黄桷兰 (Sat Apr  5 15:26:35 2003)
转信站: SZU!news.tiaozhan.com!news.happynet.org!CQUPT

----------------------------------------------------------------------------
----
协议初始化-1
下面来看看IPv4协议和PACKET协议的初始化过程。
    首先看PACKET协议,首先我们假定PACKET协议是编译在核心里面的,而不是一个MO
DULE,这样得到packet_proto_init函数在net/packet/af_packet.c里面是这样的:
void __init packet_proto_init(struct net_proto *pro)
{
sock_register(&packet_family_ops);
register_netdevice_notifier(&packet_netdev_notifier);
}
    其中sock_register函数在net/socket.c里面,就是简单的设置前面说的net_famil
ies数组中间对应的值:
int sock_register(struct net_proto_family *ops)
{
if (ops->family >= NPROTO) {
printk(KERN_CRIT "protocol %d >= NPROTO(%d)\n",
ops->family, NPROTO);
return -ENOBUFS;
}
net_families[ops->family]=ops;
return 0;
}
    这里要说明的是packet_netdev_notifier是一个struct notifier_block类型,这个
struct是在include/linux/notifier.h里面的:
struct notifier_block
{
int (*notifier_call)(struct notifier_block *self, unsigned long, void *);
struct notifier_block *next;
int priority;
};
    而register_netdevice_notifier函数在net/core/dev.c里面,是这样的:
int register_netdevice_notifier(struct notifier_block *nb)
{
return notifier_chain_register(&netdev_chain, nb);
}
    而notifier_chain_register函数在include/linux/notifier.h里面,是这样的:
extern __inline__ int notifier_chain_register(
struct notifier_block **list, struct notifier_block *n)
{
while(*list)
{
if(n->priority > (*list)->priority)
break;
list= &((*list)->next);
}
n->next = *list;
*list=n;
return 0;
}
    显然就是根据每个block的优先级把这个block排列在一个block的链表里面,在not
ifier_chain_register函数里面我们可以发现这个链表是netdev_chain。实际上这个链
表的作用就是在每个interface打开,关闭状态改变或者外界调用相应的ioctl的时候通
知这个链表上面的所有相关的设备,而每一个协议都调用register_netdevice_notifie
r注册了一个netdev_notifier的结构体,这样就可以在interface改变的时候得到通知了
(通过调用每个notifier_call函数)。
    下面来看inet_proto_init函数,这个函数在net/ipv4/af_inet.c中间,里面也有很
多ifdef的编译选项,假定下面几个是没有定义的:CONFIG_NET_IPIP,CONFIG_NET_IPG
RE,CONFIG_IP_FIREWALL,CONFIG_IP_MASQUERADE,CONFIG_IP_MROUTE
    假定下面几个是定义了的:CONFIG_INET_RARP,CONFIG_PROC_FS
    下面是整理后的代码:
(void) sock_register(&inet_family_ops);
for(p = inet_protocol_base; p != NULL;) {
struct inet_protocol *tmp=(struct inet_protocol *)p->next;
inet_add_protocol(p);
printk("%s%s",p->name,tmp?", ":"\n");
p = tmp;
}
arp_init();
ip_init();
tcp_v4_init(&inet_family_ops);
tcp_init();
icmp_init(&inet_family_ops);
rarp_ioctl_hook = rarp_ioctl;
proc_net_register(&proc_net_rarp);
proc_net_register(&proc_net_raw);
proc_net_register(&proc_net_snmp);
proc_net_register(&proc_net_netstat);
proc_net_register(&proc_net_sockstat);
proc_net_register(&proc_net_tcp);
proc_net_register(&proc_net_udp)
--
也许轮回里早已经注定
今生就该我还给你
一颗心在风雨里飘来飘去
只是为你
※ 来源:·幽幽黄桷兰 bbs.cqupt.edu.cn·[FROM: BlueCrystal]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店