OVS转发面分析

OVS的转发面?
     安装OVS的时候需要安装gre、openvswitch、libcrc32c、vxlan等内核模块。这些模块中,至少openvswitch是带内核编译选项编译出来的,代码在datapath中。
     OVS的转发面代码主要在datapath中,通过netlink传递下来命令。这里主要分析datapath中各种网络功能的实现。转发面作为内核安装模块,安装到内核之后即从网卡收包的位置截取数据包进入datapath。datapath实现了multi-datapath,也就是多种type的datapath,每个datapath上有多个vport,数据包进入datapath之后通过流程发送到vport上,流程后面详述。
     datapath与外围交互的基本流程可以参看ovs_code.pdf这个文档,这里主要分析datapath中使用的linux网络子系统。datapath中主要通过datapath.c实现一个支持多path的交换机模块,datapath中依次有flow、action、vport等模块,还有Queue、netdev_port、netlink、tunnel等附加功能模块。数据包基本流程应该是netdev_port模块首先接收来数据包,datapath注册了回调函数,所以将数据包收到自己这里而不是进入linux kernel的网络协议栈。然后数据包进入datapath中,首先在flow中进行匹配,会有三种情况即匹配上、暂时没有匹配上、永远匹配不上,不管哪种情况,假设匹配上之后,会执行action中的动作。在action中主要做field的set、get、add、delete等功能,然后会指向一个output,这个output可能是ovs_port(使用vport模块)、tunnel(使用tnl模块)、drop、to controller或者to local或者to vswitchd(使用netlink模块,通过handler线程收包)。
     datapath是作为内核加载模块,所以分析是可以从module_init和module_exit开始看起,具体insmod等工具后面有机会分析,初始化内容可以参看pdf。


netlink机制?
     RFC3549,这是一种IPC机制,说道这里不得不说其他IPC机制(锁及pthread库中的东东、管道、消息、共享内存、socket)。( http://www.infradead.org/~tgr/libnl/)介绍了netlink的大概,首先使用socket实现这样可以跨机器。其次netlink不仅能使用于进程间通信也可以与内核通信,原理也很简单,进程间通信也是需要内核转达,这里只要发给内核即可。netlink中的libnl-route,主要用于配置内核的网络子系统,包括routing、networking、interface、QoS的TC机制。libnl-genl主要用于与kernel module通信,OvS中就是使用这个。 libnl-nf主要用于与netfilter通信,这个后面分析。
     netlink中使用的socket是对其他socket的扩展,命令字使用AF_NETLINK,数据包类型使用SOCK_RAW,除此之外还设了recvbuf大小等。自己写了一个demo(MyLife/Demos/linux-kernel-demo)。
     datapath中使用netlink直接使用netlink机制。datapath中注册的位置在dp_register_genl函数,原理就是注册了dp_flow_genl_family,其中dp_flow_genl_op中定义的几种netlink操作,即flow的new/del/get/set。
     OVS user space使用netlink库主要在lib/netlink-socket.c中,提供的API包括nl-socket的创建、销毁、发送/接受、 加入与离开mcgroup。使用netlink的地方在dpif_classs,初始化在dpif_linux_init,具体可以看dpif_linux_flow_put和dpif_linux_flow_transact,都调用nl-socket这些API。


netdev机制?
     内核中netdev(参看 http://www.cnblogs.com/mosp/p/3550985.html了解大概或者读《深入理解linux网络技术内幕》)用来标识一个网络接口,物理的或者虚拟的都可以使用这个。使用的基本内核功能包括:用户空间与内核空间接口(这里使用netlink)、内核通知链( http://www.cnblogs.com/mosp/p/3551006.html和Demos/linux-kernel-demo/notifier-chain-demo.c)、网络设备初始化( http://www.cnblogs.com/mosp/p/3553398.html)、PCI驱动( http://www.cnblogs.com/mosp/p/3553386.html,因为NIC也是作为PCI设备挂载过来的)、设备注册与初始化(???)、中断(上半部硬件中断、下半部软件中断IRQ及其使用)、数据包接受。上述的这些最后就是把数据包接收到内核中来。






你可能感兴趣的:(OVS转发面分析)