荔园在线

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

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


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

----------------------------------------------------------------------------
----
协议初始化-3
    下面是ip_init函数,它在net/ipv4/ip_output.c里面:(下面假定定义了CONFIG_P
ROC_FS,CONFIG_IP_MULTICAST和CONFIG_NET_CLS_ROUTE)
__initfunc(void ip_init(void))
{
dev_add_pack(&ip_packet_type);
ip_rt_init();
proc_net_register(&proc_net_igmp);
}
    前面的dev_add_pack是说过的,这里就不再说了,而且proc_net_register也是前面
提过的,这里都不说了,先来看看ip_rt_init函数把,它在net/ipv4/route.c里面,函
数是这样的:
__initfunc(void ip_rt_init(void))
{
struct proc_dir_entry *ent;
devinet_init();
ip_fib_init();
rt_periodic_timer.function = rt_check_expire;
/* All the timers, started at system startup tend
to synchronize. Perturb it a bit.
*/
rt_periodic_timer.expires = jiffies + net_random()%
ip_rt_gc_interval + ip_rt_gc_interval;
add_timer(&rt_periodic_timer);
proc_net_register(&(struct proc_dir_entry) {
PROC_NET_RTCACHE, 8, "rt_cache",
S_IFREG | S_IRUGO, 1, 0, 0,
0, &proc_net_inode_operations,
rt_cache_get_info
});
ent = create_proc_entry("net/rt_acct", 0, 0);
ent->read_proc = ip_rt_acct_read;
}
    这个函数总的看来就是注册几个notifier(后面还要看的)和初始化路由表的timer,
最后就在/proc目录下面创建一个目录项。其中proc_net_register函数就不说了,而cr
eate_proc_entry函数就是在/proc/net目录下面创建一个rt_acct,就是路由参数统计(
account)目录,读函数就是ip_rt_acct_read,这个函数就是从全局变量ip_rt_acct中间
拷贝数据到用户缓冲中而已。
    devinet_init函数是net/ipv4/devinet.c里面的函数,整理后如下:
register_gifconf(PF_INET, inet_gifconf);
register_netdevice_notifier(&ip_netdev_notifier);
    register_netdevice_notifier函数在说PACKET协议的时候提过,这里不说了,reg
ister_gifconf函数是用来注册对应SIOCGIFCONF这个系统调用的协议无关的一个回调函
数,这个函数对于PF_INET来说就是inet_gifconf函数。
    其中inet_gifconf函数是net/ipv4/devinet.c里面的,我大概的看了一点,主要好
象是在所有的interface里面做一个循环,得到相应的name和address然后返回的。不过
不是非常确定。大家参谋呀:)
    而register_gifconf函数本身是在net/core/dev.c里面的,如下:
static gifconf_func_t * gifconf_list [NPROTO];
int register_gifconf(unsigned int family, gifconf_func_t * gifconf)
{
if (family>=NPROTO)
return -EINVAL;
gifconf_list[family] = gifconf;
return 0;
}
    这个函数的意义一目了然,就不说了。
    gifconf_list里的函数会在dev_ifconf函数中间被调用,而dev_ifconf函数被dev_
ioctl函数调用,dev_ioctl函数负责所有的针对interface的I/O控制。所以我们调用的
interface的ioctl函数有一部分就会分到每个协议的gifconf函数里面来,我猜gifconf
大概是generous interface configure的意思。就是通用接口配置的意思。
    下面再看ip_fib_init函数,它在net/ipv4/fib_frontend.c中间,如下:
    (假定没有define CONFIG_IP_MULTIPLE_TABLES,这个参数好象是要创建两个路由表
,一个是local的,一个叫main)
__initfunc(void ip_fib_init(void))
{
proc_net_register(&(struct proc_dir_entry) {
PROC_NET_ROUTE, 5, "route",
S_IFREG | S_IRUGO, 1, 0, 0,
0, &proc_net_inode_operations,
fib_get_procinfo
});
fib_rules_init();
register_netdevice_notifier(&fib_netdev_notifier);
register_inetaddr_notifier(&fib_inetaddr_notifier);
}
    其中proc_net_register和register_netdevice_notifier函数上面已经提过了,re
gister_inetaddr_notifier函数的作用和register_netdevice_notifier差不多,这个函
数也是调用的notifier_chain_register函数注册一个回调函数,这个回调函数在inter
face加上和删除的时候被调用,fib_rules_init函数其实也差不多,这个函数在net/ip
v4/fib_rules.c里面,它其实就是调用一个
register_netdevice_notifier函数注册fib_rules_notifier回调结构体。
    fib代表IPv4 Forwarding Information Base,就是IPv4转发信息的意思

--
也许轮回里早已经注定
今生就该我还给你
一颗心在风雨里飘来飘去
只是为你
※ 来源:·幽幽黄桷兰 bbs.cqupt.edu.cn·[FROM: BlueCrystal]


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

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