zoukankan      html  css  js  c++  java
  • OVS 流表offload

    原文链接: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进行过滤。
  • 相关阅读:
    MongoDB安装与配置
    关于dependencies和devDependencies的理解
    npm常用指令小记
    git ssh配置
    浅谈sharding jdbc
    浅谈分布式数据库
    web容量规划
    mysql in()后子查询优化
    负载均衡架构
    领域驱动设计-3-模型的管理
  • 原文地址:https://www.cnblogs.com/wangjq19920210/p/13406037.html
Copyright © 2011-2022 走看看