openVswitch(OVS)源代码分析
文章平均质量分 90
openVswitch,是一个开放的虚拟交换机(open virtual switch);它是实现网络虚拟化SDN的基础,它是在开源的Apache2.0许可下的产品级质量的多层虚拟交换标准。openVswitch较物理交换机而言有着更低的成本和更高的工作效率......
庾志辉
这个作者很懒,什么都没留下…
展开
-
openVswitch(OVS)源代码分析 upcall调用(一)
看了下upcall()函数的大体实现,其中主线是用Linux内核中的NetLink通信机制。而其中涉及到一些其他知识点,大部分在前面已经分析过了,除了vlan知识。现在来想下为什么有upcall()函数?因为比如当第一个数据包过来时(前期没有和这个数据包的ip主机通信过),ovs中没有任何有关于该主机的信息,更没有设置一些规则来处理接受到该主机的数据包。所以当第一次接受到这个数据包时,就要提取出数据包中一些信息,下发到用户空间去,让用户空间做些规则用来处理下次接收到的该类数据包。原创 2014-11-27 15:07:34 · 6245 阅读 · 4 评论 -
openVswitch(OVS)源代码分析 upcall调用(之linux中的NetLink通信机制)
如果看了前面的源码分析的就会知道,在什么情况下会调用upcall函数呢?就是在一个数据包查找不到相应的流表项时,才会调用upcall函数(比如一个数据包第一次进入这个内核,里面没有为这个数据包设定相应的流表规则)。upcall函数的调用其实就是把数据包的信息下发到用户 空间去,而由内核空间到用户空间的通信则要用到linux中的NetLink机制。所以熟悉下NetLink通信可以知道upcall函数调用需要什么样的参数以及整个函数的作用和功能。原创 2014-11-04 19:13:12 · 4681 阅读 · 0 评论 -
openVswitch(OVS)源代码之linux RCU锁机制分析
RCU是read copy udate的缩写,按照单词意思就知道这是一种针对数据的读、复制、修改的保护锁机制。锁机制原理: 第一、写数据的时候,不需要像读写锁那样等待所有锁的释放。而是会拷贝一份数据区的副本,然后在副本中修改,等待修改完后。用这个副本替换原来的数据区,替换的时候就要像读写锁中上写锁那样,等到原数据区上所有访问者都退出后,才进行数据的替换;根据这种特性可以推断出,用RCU锁可以有多个写者,拷贝了多份数据区数据,修改后各个写着陆续的替换掉原数据区内容。 第二、读数原创 2014-10-15 19:07:11 · 4892 阅读 · 9 评论 -
openVswitch(OVS)源代码分析之工作流程(哈希桶结构体的解释)
需要的流表项链表头结点比较少(total_nr_elements < 1024),那么不需要分配一个parts指针(一个parts数组指针元素有一个页大小的空间)来存储,如果total_nr_elements不大于1020,就没必要分配parts指针了,直接在flex_array结构体(该结构体的大小为一个页,有3个int型和1个u32成员,所以剩下的就是1020 * 4个字节了)中存储就得了。来分析调用了static inline int elements_fit_in_base(struct flex_原创 2014-10-09 21:31:01 · 4939 阅读 · 3 评论 -
openVswitch(OVS)源代码的分析技巧(哈希桶结构体为例)
于是在整个项目中进行搜索得,也可以理性的去分析下哪个函数会调用下面的flex_array申请函数,其实就是buckets内存申请函数(alloc_buckets)了;在该函数中有行代码为:buckets = flex_array_alloc(sizeof(struct hlist_head *),n_buckets, GFP_KERNEL); 至此已经找到了 element_size的含义了,即:哈希头指针的大小。那么就剩下total参数了。 继续往上个查找,看看哪个函数调用了alloc_bu原创 2014-09-25 21:37:01 · 5352 阅读 · 0 评论 -
OVS datapath模块分析:packet处理流程
这来主要看看ovs从网络接口收到packet后的一系列操作。 在内核模块启动的时候会初始化vport子系统(ovs_vport_init),各种vport类型,那么什么时候会调用相应的函数与实际网络设备建立联系?其实当我们在为网桥增设端口的时候,就会进入ovs_netdev_vport_ops中的create方法,进而 注册网络设备。看ovs-vsctl add-port br转载 2014-07-25 12:24:51 · 4606 阅读 · 0 评论 -
openVswitch(OVS)源代码分析之工作流程(flow流表查询)
本文分析了openVswitch中的核心部分flow流表查询(flow_lookup),从流表查询的大体框架或者说理论开始一步一步的结合openVswitch中的数据结构图示(openVswitch的整体框架图)分析了flow查询步骤;最后又分析了openVswitch的源代码,以ovs_flow_lookup()函数为主线,一层一层深入的分析了流表查询的源代码实现。根据这个指针遍历整个流表项节点元素(就是struct sw_flow结构体元素),每遍历得到一个流表项sw_flow结构体元素,就把流表项中原创 2014-09-23 21:03:35 · 15283 阅读 · 5 评论 -
openVswitch(OVS)源代码分析之工作流程(key值得提取)
我依然去简单分析key值得提取函数,有两个原因:第一、key值作为数据结构在openVswitch中是非常重要的,后期的一些流表查询和匹配都要用到key值;第二、想借机复习下内核网络协议栈的各层协议信息;原创 2014-09-22 20:53:40 · 6299 阅读 · 2 评论 -
openVswitch(OVS)源代码分析之工作流程(数据包处理)
在openVswitch中数据包的处理是其核心技术,该技术分为三部分来实现:第一、根据skb数据包提取相关信息封装成key值;第二、根据提取到key值和skb数据包进行流表的匹配;第三、根据匹配到的流表做相应的action操作(若没匹配到则调用函数往用户空间传递数据包)。函数为: void ovs_dp_process_received_packet(struct vport *p, struct sk_buff *skb);当接受到一个数据包后,自然而然的就应该是开始对其进行处理了。上篇的接受数据包函数:原创 2014-09-18 20:51:17 · 11249 阅读 · 14 评论 -
openVswitch(OVS)源代码分析之工作流程(收发数据包)
加载网卡时把网卡绑定到openVswitch端口上(ovs-vsctl add-port br0 eth0),绑定后每当有数据包过来时,都会调用该函数,把数据包传送给这个函数去处理。而不是像开始那样(未绑定前)把数据包往内核网络协议栈中发送,让内核协议栈去处理。openVswitch中数据包接受函数为:void ovs_vport_receive(struct vport *vport, struct sk_buff *skb);函数,该函数所在位置为:datapath/vport.c中。数据包进入open原创 2014-09-16 22:52:23 · 13809 阅读 · 7 评论 -
openVswitch(OVS)源代码分析之数据结构
记得Pascal之父、结构化程序设计的先驱Niklaus Wirth最著名的一本书,书名叫作《算法 + 数据结构 = 程序》。还有位传奇的软件工程师Frederick P. Brooks曾经说过:“给我看你的数据”。因此可见数据结构对于一个程序来说是多么的重要,如果你不了解程序中的数据结构,你根本就无法去理解整个程序的工作流程。所以在分析openVswitch(OVS)源代码之前先来了解下openVswitch中一些重要的数据结构,这将对你分析后面的源代码起着至关重要的作用。 下面是整个openVswit原创 2014-09-10 22:18:45 · 15882 阅读 · 7 评论 -
openVswitch(OVS)源代码分析之简介
云计算是个全世界的话题,所以也有全世界的能人异士来为实现这个云计算而奋斗。我现阶段遇到的有关云计算的技术就是openVswitch和docker技术。那就先从openVswitch开始介绍起,我会用一系列blog来分析openVswitch的相关数据结构和工作流程,以及各个重要模块的分析。所有的介绍都是基于源码的分析,希望对初学着有点用。 openVswitch,根据其名就可以知道这是一个开放的虚拟交换机(open virtual switch);它是实现网络虚拟化SDN的基础,它是在开源的Apache原创 2014-09-09 23:39:52 · 16921 阅读 · 9 评论