整整一个月前,老板发信给我说要链接我的blog,然后就问我:
All I have been able to find so far was:
http://blogs.sun.com/roller/page/hdh?anchor=first_one_has_to_be
Is that all?
嗯,这个,我狂汗,是啊,申请了blog接近一年,却是连个坑都没有挖,惭愧
于是下决心,写!
这个决心一下,又是一个月过去了,申请blog已经超过一年了,今天不再下决心了,直接动手吧。
这里借用赵本山、宋丹丹和崔永元的一个著名小品的题目:昨天今天明天:
昨天,我在三层以上写代码,今天,我在二层做研发,明天,明天星期二吧?
好,废话少说,现在我正在参与的项目叫做 Ethernet bridge module for Solaris
这个项目就是在Solaris上实现以太网桥,也就是二层交换的功能。当前的目标很简单,就是实现基本的
桥接功能,包括生成树算法的实现。另外,一个间接的好处(也非常重要)就是让Solaris能够成为各种主流
虚拟机软件的宿主系统,包括VMware和Xen。
既然是网桥,那么其功能也就没有什么特别之处了,不过由于Solaris协议栈的实现采用了STREAMS与DLPI,在
Bridge的实现上就有些复杂之处了。譬如说一个很微妙的地方就在于回环(loopback)处理。
关于这个内容,我们的老大,Mike Ditto已经在OpenSolaris的
论坛上发表了意见:http://www.opensolaris.org/jive/message.jspa?messageID=28615
(在该讨论内容的底部)
另外,对这个主题感兴趣的朋友还可以参考GLDv3的源代码:
mac_txloop
与
i_dls_link_ether_loopback
它们一个是GLDv3 mac层的通用函数,另一个是以太网处理的相关函数。
简单点说,我们要解决的主要有以下三点:
1 数据包的发送者不再收到它自己发送的数据包,这一点对于Bridge非常重要,因为Bridge做的就是将数据包
从一个接口“桥接”到另一个(或者多个)接口,而在另一个接口发送这些数据包的时候,在当前的实现中,
这个数据包会被回环给Bridge,增加了额外的处理负担。
2 如果被发送的数据包的目的地址包含了本接口的mac地址(可以是等于,也可能是一个组播地址),就一定要
把该数据包送给合适的接收方。这一点对IP协议栈很重要,因为在当前的实现中,IP栈是没有考虑接受回环
的数据包的,原因很简单,没有需求,发送方只有一个,就是IP自己。但是加入Bridge之后就不同了,我们就
要考虑让IP接收通过Bridge转送过来的,发给本机的,针对当前接口的MAC地址的数据包了。
3 同2,从另一个角度考虑,要不要把这个数据包真正发送到网络上去,这是比较微妙的一个问题,当前还没有
定论,有时间我会再写一篇来专门讨论。
之所以要这么处理这些问题,原因就在于我们选择了做一个“守法”的DLPI公民,将Bridge实现为与IP并行的
DLS用户,而不是像各种BSD与Linux那样将Bridge“插入”到IP与网卡驱动之间,这更多的是一种哲学或者说
美学上的选择,性能的优劣,就等我们做完才知道了。
最后,再借用一下这个我很喜欢的小品的名字:
昨天,我只能在Linux/Windows上使用虚拟机,今天,我们要改变它,明天,明天确实是星期二。
All I have been able to find so far was:
http://blogs.sun.com/roller/page/hdh?anchor=first_one_has_to_be
Is that all?
嗯,这个,我狂汗,是啊,申请了blog接近一年,却是连个坑都没有挖,惭愧
于是下决心,写!
这个决心一下,又是一个月过去了,申请blog已经超过一年了,今天不再下决心了,直接动手吧。
这里借用赵本山、宋丹丹和崔永元的一个著名小品的题目:昨天今天明天:
昨天,我在三层以上写代码,今天,我在二层做研发,明天,明天星期二吧?
好,废话少说,现在我正在参与的项目叫做 Ethernet bridge module for Solaris
这个项目就是在Solaris上实现以太网桥,也就是二层交换的功能。当前的目标很简单,就是实现基本的
桥接功能,包括生成树算法的实现。另外,一个间接的好处(也非常重要)就是让Solaris能够成为各种主流
虚拟机软件的宿主系统,包括VMware和Xen。
既然是网桥,那么其功能也就没有什么特别之处了,不过由于Solaris协议栈的实现采用了STREAMS与DLPI,在
Bridge的实现上就有些复杂之处了。譬如说一个很微妙的地方就在于回环(loopback)处理。
关于这个内容,我们的老大,Mike Ditto已经在OpenSolaris的
论坛上发表了意见:http://www.opensolaris.org/jive/message.jspa?messageID=28615
(在该讨论内容的底部)
另外,对这个主题感兴趣的朋友还可以参考GLDv3的源代码:
mac_txloop
与
i_dls_link_ether_loopback
它们一个是GLDv3 mac层的通用函数,另一个是以太网处理的相关函数。
简单点说,我们要解决的主要有以下三点:
1 数据包的发送者不再收到它自己发送的数据包,这一点对于Bridge非常重要,因为Bridge做的就是将数据包
从一个接口“桥接”到另一个(或者多个)接口,而在另一个接口发送这些数据包的时候,在当前的实现中,
这个数据包会被回环给Bridge,增加了额外的处理负担。
2 如果被发送的数据包的目的地址包含了本接口的mac地址(可以是等于,也可能是一个组播地址),就一定要
把该数据包送给合适的接收方。这一点对IP协议栈很重要,因为在当前的实现中,IP栈是没有考虑接受回环
的数据包的,原因很简单,没有需求,发送方只有一个,就是IP自己。但是加入Bridge之后就不同了,我们就
要考虑让IP接收通过Bridge转送过来的,发给本机的,针对当前接口的MAC地址的数据包了。
3 同2,从另一个角度考虑,要不要把这个数据包真正发送到网络上去,这是比较微妙的一个问题,当前还没有
定论,有时间我会再写一篇来专门讨论。
之所以要这么处理这些问题,原因就在于我们选择了做一个“守法”的DLPI公民,将Bridge实现为与IP并行的
DLS用户,而不是像各种BSD与Linux那样将Bridge“插入”到IP与网卡驱动之间,这更多的是一种哲学或者说
美学上的选择,性能的优劣,就等我们做完才知道了。
最后,再借用一下这个我很喜欢的小品的名字:
昨天,我只能在Linux/Windows上使用虚拟机,今天,我们要改变它,明天,明天确实是星期二。

发表于 chengfang 在 2006年04月03日, 08:04 下午 CST #
发表于 Donghai 在 2006年04月04日, 01:34 下午 CST #
发表于 wow gold 在 2006年04月20日, 09:34 下午 CST #