Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2759891
  • 博文数量: 79
  • 博客积分: 30130
  • 博客等级: 大将
  • 技术积分: 2608
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-22 14:58
个人简介

博所搬至http://xiaogr.com

文章存档

2015年(2)

2009年(3)

2008年(56)

2007年(18)

分类: LINUX

2007-10-25 18:19:14

------------------------------------------

本文系本站原创,欢迎转载!

转载请注明出处:http://ericxiao.cublog.cn/

------------------------------------------

关于网桥:

网桥是一个二层设备,在深入之前可以把它当成一个二层的交换机。它在二层协议上转发数据。

网桥为了转发数据,维持了一个端口与MAC的对应表,通常通为CAM表。根据这张表可以把数据送往相应的端口进行发送.

网桥的转发过程为:

1:接收到一个包。判断自己的CAM表中是否含包它此包的源地址.如果没有,则把源地址与端口更新至于CAM.

2:判断包是否是送给本机,如果是,则送往本机上层协议栈处理。如果不是,则查寻CAM表。找到相应的出口。

3:如果找到出口,则将此包送至出口。如果不存在,将会在各端口发送。

4:如果CAM表中对应表项在规定时间之内没有得到更新,则删除此项。

网桥的配置:

Brctl是一个比较好的配置网桥的工具。它的源代码和配置方法极其简单。我们将从网桥的配置流程说起,看linux内核是怎样一步步管理的。

首先,创建一个网桥: brctl addbr br0             (建立一个br0的网桥)

然后,将接口添加进网桥:brctl addif  br0 eth0   (eth0eth1添加进网桥br0)

                                               brctl addif   bro eth1

OK,网桥现在就配置好了。这台linux的主机可以当作交换机使用了,从eth0的包都可以转发到eth1

现在,我们看下代码中如何进行处理

首先 brctl addbr 。查看brctl的代码发现它调用了:ioctl(br_socket_fd, SIOCBRADDBR, brname);

然后 brctl addif    brctl的代码中调用了:ioctl(br_socket_fd, SIOCBRADDIF, &ifr);

呵呵。Brctl的代码很简单吧,只是调用了用户空间的配置工具ioctl.

 Linux网桥分析:

好了,现在就可以进入内核分析网桥模式了:

static int __init br_init(void)                                                net/brige/br.c

{

         //分配slab缓冲区

         br_fdb_init();

//网桥的netfiter处理,将在以后的章节中分析

#ifdef CONFIG_BRIDGE_NETFILTER

         if (br_netfilter_init())

                   return 1;

#endif

         //用户空间ioctl调用的函数

         brioctl_set(br_ioctl_deviceless_stub);

         //接收到数据包的处理,也就是我们在上面netif_receive_skb函数中看到的br_handle_frame_hook

         br_handle_frame_hook = br_handle_frame;

 

#if defined(CONFIG_ATM_LANE) || defined(CONFIG_ATM_LANE_MODULE)

         br_fdb_get_hook = br_fdb_get;

         br_fdb_put_hook = br_fdb_put;

#endif

         //netdev_chain通知链表上注册。关于通知链表,在前面已经介绍过,这里不再讨论了

         register_netdevice_notifier(&br_device_notifier);

 

         return 0;

}

 

阅读(4605) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~