一、datapath 简介

datapath为 ovs内核模块,负责执行数据交换,也就是把从接收端口收到的数据包在流表中进行匹配,并执行匹配到的动作。

一个datapath可以对应多个vport,一个vport类似物理交换机的端口概念。一个datapth关联一个flow table,一个flow table包含多个条目,每个条目包括两个内容:一个match/key和一个action

二、数据流向


一般的数据包在 Linux 网络协议中的流向为上图中的蓝色箭头流向:网卡eth0 收到数据包后判断报文走向,如果是本地报文把数据传送到用户态,如果是转发报文根据选路(二层交换或三层路由)把报文送到另一个网卡如eth1。当有 OVS 时,数据流向如红色所示:从网卡 eth0 收到报文后进入ovs 的端口,根据 key 值进行流表匹配,如果匹配成功执行流表对应的 action;如果失败通过upcall 送入用户态处理。

三、源码分析

1、模块初始化

内核模块采用module_init(dp_init)进行datapath 的初始化,代码如下:

其中dp 的genl_family 注册了如下四个类型:

2、收包处理

通过vport注册的回调函数netdev_frame_hook()-> netdev_port_receive()->ovs_vport_receive()处理接收报文,ovs_flow_key_extract()函数生成flow的key内容用以接下来进行流表匹配,最后调用ovs_dp_process_packet()函数进入真正的ovs数据包处理,代码流程如下:

3、流表哈希桶

流表采用hash的方式排列存放,流表的hash头结点存储数据结构如下:

该hash 桶的初始化函数alloc_buckets (),生成的数据格式可参考如下:

4、流表创建

用户态通过netlink 进行datapath 流表更新的入口函数都定义在dp_flow_genl_ops中,流表创建的入口函数是ovs_flow_cmd_new 函数,代码分析如下:

根据上述流程给出流表的主要数据结构如下:

5、流表查询

流表查找主要是查表关键字的匹配,关键字数据结构如下,根据skb 中的Ethernet 帧生成key 的函数为ovs_flow_key_extract():

流表查询的入口函数ovs_flow_tbl_lookup_stats(),flow 的匹配策略是和流表中所有mask 和所有key 进行匹配处理,为了加速查询效率,在调用真正的流表查询函数flow_lookup()之前,对于mask 的查询采用了缓存机制,实现原理是首先查询缓存的mask_cache_entry,这些cache 是查询成功后形成的cache,并针对cache 采用分段查询的方式,代码如下:

flow_lookup()函数的处理流程如下:

masked_flow_lookup()函数处理如下:

6、action处理

ovs的action类型如下,使用nla_type()函数获取nl_type的值,入口处理函数为do_execute_actions()。

  • OVS_ACTION_ATTR_OUTPUT:获取port号,调用do_output()发送报文到该port;
  • OVS_ACTION_ATTR_USERSPACE:调用output_userspace()发送到用户态;
  • OVS_ACTION_ATTR_HASH:调用execute_hash()获取skb的hash赋值到ovs_flow_hash
  • OVS_ACTION_ATTR_PUSH_VLAN:调用push_vlan()增加vlan头部
  • OVS_ACTION_ATTR_POP_VLAN:调用pop_vlan()移除vlan头
  • OVS_ACTION_ATTR_RECIRC:在action_fifos全局数组中添加一个deferred_action;
  • OVS_ACTION_ATTR_SET:调用execute_set_action()设置相关参数;
  • OVS_ACTION_ATTR_SAMPLE:概率性的发送报文到用户态(详见sflow 章节)。

7、upcall 处理

当没有找到匹配的流表时,内核通过netlink 发送报文到用户层处理,入口函数ovs_dp_upcall(),该函数调用queue_userspace_packet()构造发往用户层的skb,通过netlink 通信机制发送到用户层,其中形成的主要数据格式如下:

原文链接:https://www.sdnlab.com/my_sdnlab/wp-content/uploads/2017/02/cntctfrm_1a5b490b5708a374ad0d207df48ec29e_Openvswitch%E6%BA%90%E7%A0%81%E9%98%85%E8%AF%BB%E7%AC%94%E8%AE%B0.pdf

OVS datapath简介(十八)相关推荐

  1. OVS datapath主流程分析(二十一)

    网络报文到达主机后,最终会到达协议栈的netif_receive_skb函数,该函数会通过设备对象的rx_handler函数把报文交给OVS处理. 而该rx_handler函数其实就是OVS 定义的n ...

  2. ROS探索总结(十六)(十七)(十八)(十九)——HRMRP机器人的设计 构建完整的机器人应用系统 重读tf 如何配置机器人的导航功能

    ROS探索总结(十六)--HRMRP机器人的设计 1. HRMRP简介         HRMRP(Hybrid Real-time Mobile Robot Platform,混合实时移动机器人平台 ...

  3. MATLAB学习笔记(十八)

    MATLAB学习笔记(十八) 一.Simulink仿真基础 1.1 Simulink的启动 1.2 系统仿真模型的创建 1.3 仿真参数的设置 1.4 总结 二.子系统的创建与封装 2.1 子系统的创 ...

  4. (94)FPGA 两个触发器时序分析模型中,涉及到哪些参数?,面试必问(十八)(第19天)

    (94)FPGA 两个触发器时序分析模型中,涉及到哪些参数?(第19天) 1 文章目录 1)文章目录 2)FPGA初级课程介绍 3)FPGA初级课程架构 4)FPGA 两个触发器时序分析模型中,涉及到 ...

  5. 中科院回应木兰语言造假:当事人已停职;中国软件业务收入百强:华为蝉联十八冠;Ionic 5.0.0-beta.5 发布|极客头条...

    整理 | 伍杏玲 出品 | CSDN(ID:CSDNnews) 快来收听极客头条音频版吧,智能播报由标贝科技提供技术支持. 「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客 ...

  6. 思维导图的三招十八式

    思维导图的三招十八式  张鄂勇 编著 ISBN978-7-121-14010-5 2012年1月出版 定价:49.00元 16开 396页 宣传语:会降龙十八掌,才混得到九袋弟子.         懂 ...

  7. Go入门系列(十八) 反射、包和测试工具

    本系列文章目录 展开/收起 Go入门系列(一) 初识Go语言 Go入门系列(二) 变量.指针.数据类型简介和作用域 Go入门系列(三) 基础类型--整型.浮点型.布尔类型和字符串 Go入门系列(四) ...

  8. 布尔教育 mysql高级_布尔教育 Mysql高级 燕十八

    布尔教育 Mysql高级 燕十八--更多资源,课程更新在 多智时代 duozhishidai.com 多智时代资源,简介: 这是燕十八出的mysql教程,需要的可以看看 目录: 布尔教育 Mysql高 ...

  9. 燕十八PHP高性能架构班Oracle部分课程

    课程简介: 本课程为燕十八老师的燕十八PHP高性能架构班内的Oracle教程,众所周知,燕十八老师的讲课风格都是一种幽默易懂深受学生喜欢,本部分课程依然继承了这种风格.本部分课程通过31课来讲解Ora ...

最新文章

  1. SQL语句技巧:查询时巧用OR实现逻辑判断
  2. python基础语法手册format-python的格式化输出(format,%)实例详解
  3. Java Review - 并发编程_ScheduledThreadPoolExecutor原理源码剖析
  4. idea redis 插件_Redis客户端RDM收费后,还有哪些开源的替代品呢?
  5. python实现二分查找算法_两种方法实现Python二分查找算法
  6. 延迟加载的一些知识和误区
  7. JS--我发现,原来你是这样的JS:面向对象编程OOP[1]--(理解对象和对象属性类型)...
  8. Pytorch 微积分
  9. 语义分割系列3-SegNet(pytorch实现)
  10. 浙大PAT考试经验/考前必看/日常刷题总结(经验只写了一点点
  11. 4k hidpi 黑苹果_黑苹果 篇四:开启mac下的2k hidpi选项,同时开启144hz
  12. EasyCVR接入华为视频云系统查询集群编码和查询网关
  13. python 数独_python 实现 数独 解法 (穷举法)
  14. 「量化技术」Inv_Strategy 胜率76%的趋势反转策略
  15. oracle 帮助文件,oracle chm帮助文件下载
  16. Vue3 中定义ts 对象
  17. java获取本周第一天的日期
  18. lumia 525 android 7.1,给大神跪了!诺基亚Lumia 520成功刷上安卓7.1
  19. 格网DEM生成不规则三角网TIN
  20. Spring Boot 集成支付宝 沙箱支付

热门文章

  1. python怎么用excel-Python怎么写入excel文件?详细实例在这里。。。
  2. 用python画简单的动物-使用Python的turtle画小绵羊
  3. python3.6.5安装教程-Ubuntu16.04安装python3.6.5步骤详解
  4. python编程入门指南怎么样-大家都是怎么样自学python的?
  5. python运行非常慢的解决-为什么python运行的慢
  6. python写文件读文件-Python 读写文件和file对象的方法(推荐)
  7. python在日常工作处理中的应用-谈谈Python在工作中的应用
  8. mmdetection2.3.0版本安装过程,以及训练、测试、可视化等(亲测好用,很顺利)
  9. android mmkv使用_MMKV解读
  10. 取景框图片 小程序_敲敲级简单的鉴别H图片的小程序