没有合适的资源?快使用搜索试试~ 我知道了~
首页Openvswitch源码阅读笔记.pdf
资源详情
资源评论
资源推荐

1 / 30
Open vSwitch 源码阅读笔记
引言
本文主要对 OpenvSwitch(基于 2.3.90 版本)重点模块的源码实现流程做了简要的阅
读记录,适合阅读 OpenvSwitch 源码的初级读者参考使用,任何错误和建议欢迎加作者 QQ
号 38293996 沟通交流。
1. OVS 网络架构
Openvswitch 是一个虚拟交换机,支持 Open Flow 协议(也有一些硬件交换机支持
Open Flow),他们被远端的 controller 通过 Open Flow 协议统一管理着,从而实现对接
入的虚拟机(或设备)进行组网和互通,整体组网结构如下图:
2. OVS 内部架构

2 / 30
ovs-vswitchd 主要模块,实现 vswitch 的守候进程 daemon;
ovsdb-server 轻量级数据库服务器,用于 ovs 的配置信息;
ovs-vsctl 通过和 ovsdb-server 通信,查询和更新 vswitch 的配置;
ovs-dpctl 用来配置 vswitch 内核模块的一个工具;
ovs-appctl 发送命令消息到 ovs 进程;
ovs-ofctl 查询和控制 OpenFlow 虚拟交换机的流表;
datapath 内核模块,根据流表匹配结果做相应处理;
3. OVS 代码架构

3 / 30
vswitchd 是 ovs 主要的用户态程序,它从 ovsdb-server 读取配置并发送到 ofproto
层,也从 ofproto 读取特定的状态和统计信息并发送到数据库;
ofproto 是 openflow 的接口层,负责和 Openflow controller 通信并通过
ofproto_class 与 ofproto provider 底层交互;
ofproto-dpif 是 ofproto 接口类的具体实现;
netdev 是 ovs 系统的网络设备抽象(比如 linux 的 net_device 或交换机的 port),
netdev_class 定义了 netdev-provider 的具体实现需要的接口,具体的平台实现需要
支持这些统一的接口,从而完成 netdev 设备的创建、销毁、打开、关闭等一系列操作;
3.1 datapath
由于 openvswitch 用户态代码相对复杂,首先从内核模块入手分析。
datapath 为 ovs 内核模块,负责执行数据处理,也就是把从接收端口收到的数据
包在流表中进行匹配,并执行匹配到的动作。一个 datapath 可以对应多个 vport,一个
vport 类似物理交换机的端口概念。一个 datapth 关联一个 flow table,一个 flow table
包含多个条目,每个条目包括两个内容:一个 match/key 和一个 action。
3.1.1 数据流向

4 / 30
eth0
eth1
用户态接口
Vport
Kernel
Datapath
Flow
Table
Action
一般的数据包在 Linux 网络协议中的流向为上图中的蓝色箭头流向:网卡 eth0 收到
数据包后判断报文走向,如果是本地报文把数据传送到用户态,如果是转发报文根据选路
(二层交换或三层路由)把报文送到另一个网卡如 eth1。当有 OVS 时,数据流向如红色所
示:从网卡 eth0 收到报文后进入 ovs 的端口,根据 key 值进行流表匹配,如果匹配成功
执行流表对应的 action;如果失败通过 upcall 送入用户态处理。
3.1.2 模块初始化
内核模块采用 module_init(dp_init)进行 datapath 的初始化,代码如下:
其中 dp 的 genl_family 注册了如下四个类型:

5 / 30
3.1.3 收包处理
通过 vport 注册的回调函数 netdev_frame_hook()->netdev_frame_hook()->
netdev_port_receive()->ovs_vport_receive()处理接收报文,ovs_flow_key_extract()
函数生成 flow 的 key 内容用以接下来进行流表匹配,最后调用 ovs_dp_process_packet()
函数进入真正的 ovs 数据包处理,代码流程如下:
3.1.3 流表哈希桶
流表采用 hash 的方式排列存放,流表的 hash 头结点存储数据结构如下:
剩余29页未读,继续阅读














安全验证
文档复制为VIP权益,开通VIP直接复制

评论0