Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->Linux技术 ->Linux程序设计 ->正文

Linux操作系统网桥源码框架初步分析

来源: 作者: 时间:2007-04-11 点击: [收藏] [投稿]

今天处理网桥的STP的问题遇到了麻烦,对这个东东理论的倒是看了不少,没有真真学习到它的源理,来看Linux的实现,手头没有资料,看了两个钟头,只把网桥的框架结构看完,所以想先贴出来,希望有研究这块的大哥们讨论,继续把它写完,好好学习一下:

版本:Linux 2.4.18

一、调用

在src/net/core/dev.c的软中断函数static void net_rx_action(struct softirq_action *h)中:

line 1479

#if defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE)
if (skb->dev->br_port != NULL &&
br_handle_frame_hook != NULL) {
handle_bridge(skb, pt_prev);
dev_put(rx_dev);
continue;
}
#endif

如果定义了网桥或网桥模块,则由handle_bridge函数处理skb->dev->br_port :接收该数据包的端口是网桥端口组的一员br_handle_frame_hook :定义了网桥处理函数。

二、初始化

src/net/bridge/br.c:
static int __init br_init(void)
{
printk(KERN_INFO "NET4: Ethernet Bridge 008 for NET4.0\n";

br_handle_frame_hook = br_handle_frame;
br_ioctl_hook = br_ioctl_deviceless_stub;
#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
register_netdevice_notifier(&br_device_notifier);

return 0;
}

初始化函数指明了网桥的处理函数是br_handle_frameioctl处理函数是:br_ioctl_deviceless_stub。

三、br_handle_frame(br_input.c)

网桥处理函数

void br_handle_frame(struct sk_buff *skb)
{
struct net_bridge *br;
unsigned char *dest;
struct net_bridge_port *p;

/*获取目的MAC地址*/
dest = skb->mac.ethernet->h_dest;

/*skb->dev->br_port用于指定接收该数据包的端口,
若不是属于网桥的端口,则为NULL*/
p = skb->dev->br_port;
if (p == NULL) /*端口不是网桥组端口中*/
goto err_nolock;

/*本端口所属的网桥组*/
br = p->br;

/*加锁,因为在转发中需要读CAM表,所以必须加读锁,
避免在这个过程中另外的内核控制路径(如多处理机上另外一个CPU上的系统调用)修改CAM表*/
read_lock(&br->lock);
if (skb->dev->br_port == NULL) /*前面判断过的*/
goto err;

/*br->dev是网桥的虚拟网卡,如果它未UP,
或网桥DISABLED,p->state实际上是桥的当前端口的STP计算判断后的状态*/
if (!(br->dev.flags & IFF_UP) ||
p->state == BR_STATE_DISABLED)
goto err;

/*源MAC地址为255.X.X.X,即源MAC是多播或广播,丢弃之*/
if (skb->mac.ethernet->h_source[0] & 1)
goto err;


 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<



上一篇:Linux操作系统设备特性及设备管理分析   下一篇:用Shell编程实现DOS风格Linux命令行

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章
Power by linux-cn.com 粤ICP备05006655号