原文链接:https://www.dazhuanlan.com/2019/12/31/5e0af1858dada/

最近开始调研网卡的OVS流表offload功能,所以目前查看一下OVS这块是怎么做的。

从上面可以看到OVS主要通过netlink发送给网口,接下来我们看一下网卡驱动做了一些什么,因为在做Mellanox家的网卡,所以这里查看代码就查看mlx5_core的驱动代码。

首先是开启offload,Mellanox有两种方案开启offload,设置方法不一样,但是实质是一致的,就是把eswitch_mode配置为switchdev,分别看一下:

第一种配置方法为devlink dev eswitch set pci/${PCI_ADDR} mode switchdev,这是中间一些版本的配置,它对应的代码路径如下:

eswitch_mode_set-->mlx5_devlink_eswitch_mode_set-->esw_offloads_start-->mlx5_eswitch_enable_sriov,我查看的代码没有看到地方调用。

第二种配置方法为echo switchdev > /sys/kernel/debug/mlx5/${PCI_ADDR}/compat/mode,这是后面普遍的一种配置方法,它对应的代码路径如下:

esw_compat_fops-->write-->esw_compat_write-->write_u16-->mlx5_devlink_eswitch_mode_set-->esw_offloads_start-->mlx5_eswitch_enable_sriov

  • mlx5_remove_dev_by_protocol首先从MLX5_INTERFACE_PROTOCOL_IB协议中移除设备
  • mlx5_add_dev_by_protocol将设备添加到协议MLX5_INTERFACE_PROTOCOL_IB中
  • esw_offloads_init初始化offload相关的一些表和repsentor端口
    • esw_create_offloads_fdb_tables创建FDB表
    • esw_create_offloads_table创建转发表
    • esw_create_vport_rx_group创建接收组
    • esw_offloads_load_reps加载repsentor端口
  • esw_create_tsarvport的QoS管理
  • esw_enable_vport使能vport

配置OVS支持offload

配置OVS的流表offload功能的命令如下:

1
ovs-vsctl set Open_vSwitch . Other_config:hw-offload=true

utilities/ovs-vsctl.c实现我们不看了。我们主要看一下vswitchd是做了什么操作。

vswitchd/ovs-vswitchd.c

main-->bridge_run-->netdev_set_flow_api_enabled-->netdev_tc_init_flow_api主要是设置去创建或者删除一条TC规则,如果是添加则类似/sbin/tc qdisc add dev <devname> handle ffff: ingress,如果是删除则类似/sbin/tc qdisc del dev <devname> handle ffff: ingress

OVS offload流表下发

OVS相关部分

当报文不匹配的时候,会将报文上报,会调用udpif_upcall_handler
udpif_upcall_handler-->recv_upcalls-->handle_upcalls-->dpif_operate-->dpif_netlink_operate-->try_send_to_netdev-->parse_flow_put-->netdev_flow_put-->netdev_tc_flow_put

  • 首先判定是不是tunnel,是的话需要存储五元组
  • 是vlan的话,记录vid和mask
  • 记录源目的MAC和掩码
  • 记录五元组及其掩码
  • 检测以上记录的信息是否有不支持的,还是有挺多不支持的,具体查看函数test_key_and_mask
  • 记录action,目前支持的是output,push_vlan,pop_vlan,set,set_mask
  • 调用tc_replace_flower将以上记录的信息进行转换,然后通过netlink发送给端口。

网卡驱动相关

前面ovs调用tc_replace_flower时候会触发kernel调用函数tc_ctl_tfilter,路径如下:

tc_ctl_tfilter-->fl_change-->fl_hw_replace_filter-->mlx5e_rep_ndo_setup_tc-->mlx5e_configure_flower-->mlx5e_tc_add_fdb_flow-->mlx5_eswitch_add_offloaded_rule

mlx5e_configure_flower

  • parse_cls_flower解析ovs传递过来的流表中match的key信息
  • parse_tc_fdb_actions解析ovs传递过来的流表中action信息
  • mlx5e_tc_add_fdb_flow主要是讲match和action添加到fdb流表
  • 后面先不看了,multipath的那些操作

mlx5e_tc_add_fdb_flow

  • 如果action包含encap,那么调用mlx5e_attach_encap生成vxlan所需要的报文头信息
  • mlx5_eswitch_add_vlan_action添加vlan的action
  • mlx5_eswitch_add_offloaded_rule添加offloaded规则

mlx5_eswitch_add_offloaded_rule-->mlx5_add_flow_rules-->_mlx5_add_flow_rules 主要是向firmware发送指令添加offload规则。

这块关联比较多,不太好看,以后遇到问题再去查看。

dump flows

一般是两种命令可以展示datapath的流表,他们的区别主要是能不能dump别的datapath,主要实现都是一致的,所以我们只看一个相关的代码,因为个人认为ovs-appctl命令更好一些,所以就看这个的代码。

1
2
ovs-dpctl dump-flows [type=offloaded/ovs]
ovs-appctl dpctl/dump-flows [type=offloaded/ovs]

命令相关的代码就不看了,因为ovs-appctl调用的命令都需要在ovs-vswitchd中通过函数unixctl_command_register进行注册。我们这里直接查看注册的dpctl相关的命令。

代码路径如下,文件起始于ovs-vswitchd.c

main-->bridge_run-->bridge_reconfigure-->bridge_add_ports-->bridge_add_ports__-->iface_create-->iface_do_create-->netdev_open-->construct-->dpif_create_and_open-->dpif_open-->do_open-->dp_initialize-->dpctl_unixctl_register-->dpctl_unixctl_handler-->dpctl_dump_flows

dpctl_dump_flows

  • 首先做参数检测,保证参数合理性
  • dpif_flow_dump_create-->dpif_netlink_flow_dump_create主要有两个事情,一个就是nl_dump_start,原来的dump ovs的流表,另一个就是dump offloaded流表,用的函数start_netdev_dump
  • 遍历所有满足类型条件的流表,并且根据filter进行过滤。

OVS 流表offload的更多相关文章

  1. OVS流表table之间的跳转

    OVS流表table之间的跳转 前言 今天在帮学弟解决问题的时候,遇到一个table0.table1之间的微妙小插曲,引起了注意,后来查了一下资料发现原因了. 问题描述 wpq@wpq:~$ sudo ...

  2. OVS 内核KEY值提取及匹配流表代码分析

    原文链接:http://ry0117.com/2016/12/24/OVS内核KEY值提取及匹配流表代码分析/ 当开启OVS后,创建datapath类型为system的网桥并他添加相关接口,OVS网桥 ...

  3. Neutron 理解 (4): Neutron OVS OpenFlow 流表 和 L2 Population [Netruon OVS OpenFlow tables + L2 Population]

    学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...

  4. OVS中arp响应的流表的实现

    总结: 1.br-int 流表总体是按照Normal 的方式,即常规的交换机的转发方式进行转发.而br-tun 交换机则主要按照流表的方式进行转发. 2.一般情况下,VM发出的ARP请求,会在该VM的 ...

  5. OVS 精确删除流表

    OVS 精确删除流表 前言 今天看了sdnlab小姐姐的mininet教程之后,看到有一个下流表的操作,优先级没能下成功,然后回来实验一下,这个问题是解决了,不过遇到了一个小问题,ovs如何精确删除流 ...

  6. ovs源码阅读--流表查询原理

    背景 在ovs交换机中,报文的处理流程可以划分为一下三个步骤:协议解析,表项查找和动作执行,其中最耗时的步骤在于表项查找,往往一个流表中有数目巨大的表项,如何根据数据报文的信息快速的查找到对应的流表项 ...

  7. openVswitch(OVS)源代码分析之工作流程(flow流表查询)

    原文链接: openVswitch(OVS)源代码分析之工作流程(flow流表查询)

  8. [ovs] 编写openflow流表的文档指引

    首先,openflow流表都是使用ovs-ofctl命令进行添加的. 1. 看 ovs-ofctl 的man手册 man ovs-ofctl 或者,这个地方也有:http://www.openvswi ...

  9. openflow流表分析(草稿)

    OVS bridge 有两种模式:“normal” 和 “flow”.“normal” 模式的 bridge 同普通的 Linux 桥,而 “flow” 模式的 bridge 是根据其流表(flow ...

随机推荐

  1. Apache HTTP Server 虚拟主机配置

    Apache HTTP Server 虚拟主机配置(三)     什么是虚拟主机 "虚拟主机"是指在一个机器上运行多个网站(比如:www.company1.com  和 www.c ...

  2. 基于Centos7安装Docker-registry2.0

    我们可能希望构建和存储包含不想公开的信息或数据的镜像,因为Docker公司的团队开源了docker-registry的代码,这样我们就可以基于此代码在内部运行自己的registry. 服务端1.拉去仓 ...

  3. Java 继承与抽象类

    一.继承 1.概念 在Java中,类的继承是指在一个现有类的基础上去构建一个新的类,构建出来的新类被称作子类,现有类被称作父类,子类会自动拥有父类所有可继承的属性和方法. 2.继承的格式&使用 ...

  4. 《Python Web开发学习实录》高清PDF版|百度网盘免费下载|Python Web开发学习实录

    <Python Web开发学习实录>高清PDF版|百度网盘免费下载|Python Web开发学习实录 提取码:9w3o 内容简介 Python是目前流行的动态脚本语言之一. 李勇,本书共1 ...

  5. 使用MacOS直播

    参考链接:https://www.jianshu.com/p/94f42a793a7e 参考链接:https://blog.dreamtobe.cn/live_guideline/ 所需软件  密码: ...

  6. numpy的random方法和常用数据类型

    NumPy 的常用数据类型 np.random 随机数模块

  7. PHP strcasecmp() 函数

    实例 比较两个字符串(不区分大小写): <?php高佣联盟 www.cgewang.comecho strcasecmp("Hello world!","HELLO ...

  8. Linux的VMWare中Centos7磁盘分区管理 fdisk分区和制作文件系统格式化和开机自动挂载

    一.硬盘的组成零件扇区 磁道 磁盘容量 磁盘分区 简介 硬盘由容量.柱面数.磁头数.扇区数 C/H/S, Cylinder, Head, Sector(柱面/磁头数/扇区数) 1.磁头数表示硬盘总共有 ...

  9. kubernetes 中安装 heapster 问题

    step1: 在官网下载部署文件 https://github.com/kubernetes-retired/heapster/tree/master/deploy/kube-config/influ ...

  10. 曲线生成与求交—Bezier曲线

    Bezier曲线生成 法国工程师Pierre Bezier在雷诺公司使用该方法来设计汽车.一条Bezier曲线可以拟合任何数目的控制点. 公式 设\(n+1\)个控制点\(P_0,P_1--P_n\) ...