网桥在内核的实现
2009-09-10 00:00:00 来源:WEB开发网通过下面的图能更好的理解这个结构:
图片看不清楚?请点击这里查看原图(大图)。
接下来简要的介绍一下网桥的初始化。
网桥的初始化和一般网络设备的初始化很相似,只不过由于它是虚拟设备,因此这里还有一点不同。
首先来看内核的网络模块的初始化br_init,也就是初始化上面介绍的数据结构:
Java代码
static int __init br_init(void)
{
int err;
///stp的注册。
err = stp_proto_register(&br_stp_proto);
if (err < 0) {
printk(KERN_ERR "bridge: can't register sap for STP\n");
return err;
}
///forwarding database的初始化
err = br_fdb_init();
if (err)
goto err_out;
///网桥的netfilter钩子函数的初始化。
err = br_netfilter_init();
if (err)
goto err_out1;
///注册到netdevice的通知链上
err = register_netdevice_notifier(&br_device_notifier);
if (err)
goto err_out2;
err = br_netlink_init();
if (err)
goto err_out3;
///安装网络设备的do_ioctl函数,也就是提供给用户空间ioctl接口。
brioctl_set(br_ioctl_deviceless_stub);
br_handle_frame_hook = br_handle_frame;
br_fdb_get_hook = br_fdb_get;
br_fdb_put_hook = br_fdb_put;
return 0;
.........................................
return err;
}
更多精彩
赞助商链接