Open vSwitch(OvS)源代码分析之工作流程(收发数据包)


前面已经把分析Open vSwitch源代码的基础写得非常清楚了,虽然访问的人比较少,也因此让我看到了一个现象:第一篇,《Open vSwitch(OvS)源代码分析之简介》(https://www.sdnlab.com/2788)其实就是介绍了下有关于云计算现状和Open vSwitch的各个组成模块,还有笼统的介绍了下其工作流程,个人感觉对于学习Open vSwitch源代码来说没有多大含金量。云计算现状是根据公司发展得到的个人体会,对学习Open vSwitch源代码其实没什么帮助;Open vSwitch各个组成模块到网上一搜一大堆,更别说什么含金量了;最后唯一一点还算过的去的就是Open vSwitch工作流程图,对从宏观方面来了解整个Open vSwitch来说还算是有点帮助的。但整体感觉对于学Open vSwitch源代码没有多少实质性的帮助,可是访问它的人就比较多。相反,第二篇,《Open vSwitch(OvS)源代码分析之数据结构》(https://www.sdnlab.com/2796)分析了整个Open vSwitch源代码中涉及到的主要数据结构,这可是花了我不少精力。它也是分析整个源代码的重要基础,更或者说可以把它当做分析Open vSwitch源代码的字典工具。可是访问它的人数却是少的可怜,为什么会这样呢?

网上有很多blog写有关于Open vSwitch的,但是绝大部分只是介绍Open vSwitch以及怎么安装配置它,或者是一些命令的解释。对于源代码的分析是非常少的,至少我开始学习Open vSwitch时在网上搜资料那会是这样的。因此对于一个开始接触学习Open vSwitch源代码的初学者来说是非常困难的,什么资料都没有(当然官网上还是有些资料的,如果你英文够好,看官网的资料也是个不错的选择),只得从头开始去分析,可是要想想Open vSwitch是由一个世界级的杰出团队花几年的时间设计而成的,如果要从零开始学习分析它,要到猴年马月。所幸的是我开始学的时候,公司前辈们提供了些学习心得以及结构资料,所以在此我也把自己的学习心得和一些理解和大家分享。如有不正确之处,望大家指正,谢谢!!!

言归正传,基础已经学习过了,下面来正真分析下Open vSwitch的工作流程源代码。

首先是数据包的接受函数,这是在加载网卡时把网卡绑定到Open vSwitch端口上(ovs-vsctl add-port br0 eth0),绑定后每当有数据包过来时,都会调用该函数,把数据包传送给这个函数去处理。而不是像开始那样(未绑定前)把数据包往内核网络协议栈中发送,让内核协议栈去处理。Open vSwitch中数据包接受函数为:void ovs_vport_receive(struct vport *vport, struct sk_buff *skb);函数,该函数所在位置为:datapath/vport.c中。实现如下:

俗话说有接必有还,有进必有出嘛。上面的是数据包进入Open vSwitch的函数,那一定有其对应的出Open vSwitch的函数。数据包进入Open vSwitch后会调用函数ovs_dp_process_received_packet(vport,skb);对数据包进行处理,到后期会分析到,这个函数对数据包进行流表的匹配,然后执行相应的action。其中action动作会操作对数据包进行一些修改,然后再把数据包发送出去,这时就会调用vport.c中的数据包发送函数: ovs_vport_send(struct vport *vport, struct sk_buff *skb);来把数据包发送到端口绑定的网卡设备上去,然后网卡驱动就好把数据包中的数据发送出去。当然也有些action会把数据包直接向上层应用发送。下面来分析下数据包发送函数的实现,函数所在位置为:datapath/vport.c中。

这两个函数就是Open vSwitch中收发数据包函数了,对这两个函数没有完全去分析它的所有代码,这也不是我的本意,我只是想让初学者知道这是数据包进入和离开Open vSwitch的函数。其实知道了这个是非常有用的,因为不管你是什么数据包,只要是到该主机的(当然了包括主机内的各种虚拟机及服务器),全部都会经过这两个函数(对于接受的数据时一定要进过接受函数的,但是发送数据包有时候到不了发送函数的),那么要对数据包进行怎么样的操作那就全看你想要什么操作了。

在这两个函数中对数据包操作举例:

数据包接受函数中操作:如果你要阻断和某个IP主机间的通信(或者对某个IP主机数据包进行特殊处理),那么你可以在数据进入Open vSwitch的入口函数(ovs_vport_receive(struct vport *vport, struct sk_buff *skb);)中进行处理,判断数据包中提取到的IP对比,如果是指定IP则把这个数据包直接销毁掉(也可以自己定义函数做些特殊操作)。这样就可以对整个数据进行控制。

数据包发送函数中操作:就像上面的函数中我自己写的那些代码一样,提取数据包中数据包类型进行判断,当判断如果是ARP数据包时,则调用我自定义的 arp_proc_send(vport,skb);函数进行去处理,而不是贸然的直接把它发送出去,因为你不知道该数据包发送的端口是什么类型的。如果是公网IP端口,那么就在自定义函数中直接把这个数据包掐死掉(ARP数据包是在局域网内作用的,就算发到公网上也会被处理掉的);如果是发送到外层局域网中或者是相连的服务器中,则修改数据包中的目的Mac地址进行洪发;又如果是个ARP请求数据包,则把该数据包修改为应答包,再原路发送回去,等等情况;这些操作控制都是在发送数据包函数中做的手脚。

以上就是Open vSwitch(OvS)工作流程中的数据包收发函数,经过大概的分析和应用举例说明,我想对于初学者来说应该知道大概在哪个地方添加自己的代码,实现自己的功能要求了。

如有不正确之处,望大家指正,谢谢!

转载自:CSDN,http://blog.csdn.net/yuzhihui_no1/article/details/39298321


  • 本站原创文章仅代表作者观点,不代表SDNLAB立场。所有原创内容版权均属SDNLAB,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用,转载须注明来自 SDNLAB并附上本文链接。 本站中所有编译类文章仅用于学习和交流目的,编译工作遵照 CC 协议,如果有侵犯到您权益的地方,请及时联系我们。
  • 本文链接https://www.sdnlab.com/2946.html
分享到:
相关文章
条评论

登录后才可以评论

SDNLAB君 发表于14-10-31
4