Openvswitch原理与代码分析(5): 内核中的流表flow table操作
当一个数据包到达网卡的时候,首先要经过内核Openvswitch.ko,流表Flow Table在内核中有一份,通过key查找内核中的flow table,即可以得到action,然后执行action之后,直接发送这个包,只有在内核无法查找到流表项的时候,才会到用户态查找用户态的流表。仅仅查找内核中flow table的情况被称为fast path.
第一步:从数据包中提取出key
实现函数为int ovs_flow_key_extract(const struct ip_tunnel_info *tun_info, struct sk_buff *skb, struct sw_flow_key *key)
在这个函数中,首先提取的是物理层的信息,主要是从哪个网口进入的。
|
然后调用函数static int key_extract(struct sk_buff *skb, struct sw_flow_key *key)提取其他的key
提取MAC层
|
提取网络层
|
提取传输层
|
第二步:根据key查找flow table
调用struct sw_flow *ovs_flow_tbl_lookup_stats(struct flow_table *tbl, const struct sw_flow_key *key, u32 skb_hash, u32 *n_mask_hit)进行查找。
在内核中,flow table的数据结构如上图所示。
每个虚拟交换机对应一个datapath,每个datapath有一个flow table,每个flow table分成N个桶,根据key进行哈希,不同的key分布在不同的桶里面。
每个桶的大小是一个内存页的大小,在内存页的头部保存了保存了多少个元素,每个元素的大小。每个元素都是sw_flow,里面有key,也有action。
ovs_flow_tbl_lookup_stats会调用static struct sw_flow *flow_lookup(struct flow_table *tbl, struct table_instance *ti, const struct mask_array *ma, const struct sw_flow_key *key, u32 *n_mask_hit, u32 *index)
会调用masked_flow_lookup如下
|
其中flow_hash计算哈希值,find_bucket根据哈希值查找桶,然后就是一个循环,逐个比较key是否相等,相等则返回flow。
第三步:执行action
调用int ovs_execute_actions(struct datapath *dp, struct sk_buff *skb, const struct sw_flow_actions *acts,struct sw_flow_key *key)
调用static int do_execute_actions(struct datapath *dp, struct sk_buff *skb, struct sw_flow_key *key, const struct nlattr *attr, int len)
在这个函数中,通过case语句,不同的action进行不同的操作。
|
如果可以直接输出,则调用static void do_output(struct datapath *dp, struct sk_buff *skb, int out_port, struct sw_flow_key *key)他调用void ovs_vport_send(struct vport *vport, struct sk_buff *skb)进行发送。
转载于:https://www.cnblogs.com/popsuper1982/p/5886819.html
Openvswitch原理与代码分析(5): 内核中的流表flow table操作相关推荐
- Openvswitch原理与代码分析(2): ovs-vswitchd的启动
ovs-vswitchd.c的main函数最终会进入一个while循环,在这个无限循环中,里面最重要的两个函数是bridge_run()和netdev_run(). Openvswitch主要管理两种 ...
- Openvswitch原理与代码分析(3): openvswitch内核模块的加载
上一节我们讲了ovs-vswitchd,其中虚拟网桥初始化的时候,对调用内核模块来添加虚拟网卡. 我们从openvswitch内核模块的加载过程,来看这个过程. 在datapath/datapath. ...
- 对dpdk的rte_ring实现原理和代码分析
对dpdk的rte_ring实现原理和代码分析 前言 dpdk的rte_ring是借鉴了linux内核的kfifo实现原理,这里统称为无锁环形缓冲队列. 环形缓冲区通常有一个读指针和一个写指针.读指针 ...
- TrueCrypt 6.2a原理及代码分析
TrueCrypt 6.2a原理及代码分析 3 comments 25th Apr 10 rafa 1 项目物理布局 Project |____ Boot /* MBR部分的代码 */ ...
- 免费的Lucene 原理与代码分析完整版下载
Lucene是一个基于Java的高效的全文检索库. 那么什么是全文检索,为什么需要全文检索? 目前人们生活中出现的数据总的来说分为两类:结构化数据和非结构化数据.很容易理解,结构化数据是有固定格式和结 ...
- Lucene 原理与代码分析完整版
原文地址为: Lucene 原理与代码分析完整版 Lucene 原理与代码分析系列文章已经基本告一段落,可能问题篇还会有新的更新. 完整版pdf可由以下链接下载. Lucene 原理与代码分析完整版 ...
- Lucene原理与代码分析(高手博客备忘)
2019独角兽企业重金招聘Python工程师标准>>> 随笔 - 69 文章 - 77 评论 - 687 随笔分类 - Lucene原理与代码分析 Lucene 4.X 倒排索引 ...
- 二值图像分析:OpenCV中的二值化阈值操作
二值图像分析:OpenCV中的二值化阈值操作 1.二值图像的定义 2.OpenCV中的基本阈值操作 3.OTSU二值寻找算法 3.1 OTSU二值寻找算法介绍 3.2 OTSU二值寻找算法分析 3.2 ...
- mysql 操作表的例子,mysql中库和表的简单操作总结(附示例)
本篇文章给大家带来的内容是关于mysql中库和表的简单操作总结(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 一. 库的操作 1.创建数据库 创建数据库: create d ...
- mysql数据表案例_mysql中库和表的简单操作案例
mysql中库和表的简单操作案例 发布时间:2020-12-05 09:54:06 来源:亿速云 阅读:71 作者:小新 这篇文章主要介绍mysql中库和表的简单操作案例,文中介绍的非常详细,具有一定 ...
最新文章
- IE6、 IE7、IE8、Firefox兼容性问题
- 电机编码器调零步骤_各种编码器的调零方法
- java求多项式回归_多项式回归(Polynomial Regression)(附代码)
- ASP.NET中共有哪几种类型的控件?其中,HTML控件、HTML服务器控件和WEB服务器控件之间有什么区别
- thinkphp v5.0.11漏洞_ThinkPHP5丨远程代码执行漏洞动态分析
- php header 跳转 ie问题
- VRTK HTC手柄发出射线,瞬移,选择物体 VRTK和steamVR对应版本
- 7000个源码批量下载---复制来的
- java 场景面试题_Java面试场景整理收录
- 爬虫 and 数据分析 | 一万条b站评论看工作细胞
- 计算机网络技能大赛感受,技能大赛心得体会
- Python学习培训方法
- 华为有望解决5G射频芯片问题,5G手机或将回归
- 【CXY】JAVA基础 之 System
- pandas 改列名称_01_Pandas.DataFrame的行名和列名的修改
- 用android写的微信闲聊机器人
- Unix 开机时如何自启动oracle
- android GoogleMap画导航线路图 路径规划
- 专科毕业学习python有前途吗_专科生学IT有前途吗?
- 让BAT执行php程序,不错哦!
热门文章
- 孤荷凌寒自学python第八十天开始写Python的第一个爬虫10
- 使用 profile 进行python代码性能分析
- bzoj 2243: [SDOI2011]染色 线段树区间合并+树链剖分
- linux设备驱动归纳总结(三):5.阻塞型IO实现【转】
- android shape的使用详解以及常用效果(渐变色、分割线、边框、半透明阴影效果等)...
- C#:Md5和Sha1两种加密方式
- javascript的table 对象 属性 方法
- 明天发布一个基于Silverlight的类Visio小型绘图工具项目。
- 人性的弱点---第三篇---得人同意于你的十二种方法3
- ASP.NET profile之 找不到存储过程'dbo.aspnet_CheckSchemaVersion'