赛灵思 TSN 解决方案

赛灵思 TSN 解决方案

    • 赛灵思 TSN IP 支持
    • 软件支持
    • 内核配置
    • 设备树
    • TSN系统
    • 流量类
    • PCP 和流量等级
    • 生成 TSN 流量:
    • Converting Legacy Applications to TSN
    • 支持的 PTP 配置文件
    • zynqmp 中 R5 上的 PTP 卸载
    • 运行 gPTP(802.1AS):
    • 运行 PTP 1588v2:
    • 运行 Qbv/Time Aware Shaper:
      • 使用 Wireshark 进行测试:
    • 运行 IPIC:
    • 演示抢占的步骤
    • Running Spanning Tree Protocol
    • 时间感知 DMA (TADMA)
    • OOB 脚本
      • 如何运行
    • 常见问题 (FAQ)
        • Qbv 不起作用 - 使用 qbv_sched 实用程序对 qbv 进行编程后,属于 ST 的数据包不会在指定窗口通过。
        • PTP 时钟总是从 1970 年 1 月 1 日开始。这导致我们的 CNC 出现异常。
        • Qbv 行为不同于 EP+Switch 设计中的 ep 和 temac1/temac2 实例
        • tsn_talker 在 EP+Switch 设计的 eth1 或 eth2 上不能正确运行
        • tsn_talker 传输乱码帧
        • 在 TSN Yocto 版本之外编译 TSN 驱动程序
        • 当主机重启时,从机上的 PTP 与主机失去同步
        • 如何在 EP+Switch 设计上运行 PTP 边界时钟
        • TADMA + Qbv doesn't work - After programming tadma using tadma_prog and qbv using qbv_sched utility, packets belonging to ST don't come through at specified window.
        • 当前的 TSN 设计使用 PS (Zynq Ultrascale+) 上可用的所有 16 个 PL-PS 中断(IRQ0 和 IRQ1)。我们还有其他一些 PL 模块,它们具有需要连接到 PS 的中断。
    • 使用 AXI 中断控制器的 TSN 设计
      • 用法
      • 设备树生成问题
    • 主线状态
    • 已知问题和故障排除
    • 变更日志

时间敏感网络 (TSN) 是 IEEE 802.1 工作组的时间敏感网络任务组正在开发的一组标准。

赛灵思 TSN IP 支持

  • 使用 IEEE 802.1AS 增强时间同步
  • 以太网 AVB(音频视频桥接,IEEE 802.1Qav)
  • 帧复制和消除可靠性 IEEE 802.1CB
  • 预定流量的增强功能 IEEE 802.1Qbv
  • 每流过滤和管制,IEEE 802.1 Qci
  • 增强和性能改进,IEEE 802.1Qcc
  • 帧抢占,IEEE 802.1Qbu
  • 穿插快速流量,IEEE 802.3br

软件支持

Xilinx Linux 暂存区目前支持 TSN 内核驱动程序: https://github.com/Xilinx/linux-xlnx/tree/xilinx-v2022.1/drivers/staging/xilinx-tsn

提供 TSN 用户空间实用程序和示例配置以启用 TSN 功能。有关详细信息,请参阅 TSN SW 用户指南和以下部分。

内核配置

为了构建 TSN 子系统,应启用以下配置选项:

CONFIG_XILINX_TSN

CONFIG_AXIENET_HAS_TADMA

CONFIG_XILINX_TSN_PTP

CONFIG_XILINX_TSN_QBV

CONFIG_XILINX_TSN_SWITCH

CONFIG_XILINX_TSN_QCI

CONFIG_XILINX_TSN_CB

CONFIG_XILINX_TSN_QBR

TSN 子系统需要/选择以下附加配置:

CONFIG_NET_SWITCHDEV

CONFIG_STP

CONFIG_NETFILTER

设备树

TSN 子系统 DT 文档可在此处找到:Documentation/devicetree/bindings/staging/net/xilinx_tsn.txt

对于 TSN TEMAC,请参考 Documentation/devicetree/bindings/staging/net/xilinx-tsn-ethernet.txt

TSN Switch请参考Documentation/devicetree/bindings/staging/net/xilinx_tsn_switch.txt

对于 TSN 端点,请参考 Documentation/devicetree/bindings/staging/net/xilinx_tsn_ep.txt

对于 TSN 扩展端点,请参考 Documentation/devicetree/bindings/staging/net/xilinx_tsn_ep_ex.txt

请参阅 PL 以太网和 DMA 文档以获取更多信息:Documentation/devicetree/bindings/net/xilinx_axienet.txt

有关 phy 绑定的更多详细信息,请参阅“Documentation/devicetree/bindings/net/phy.txt”

TSN系统

  • Xilinx的TSN IP Switch有三个端口Endpoint(端口0)、MAC1(端口1)和MAC2(端口2)
  • 端点连接到 MCDMA(多通道 DMA),每个 MCDMA 通道是每种类型流量的专用通道,即 Best Effort、Scheduled Traffic 和 Reserved。可能还有其他用例,其中会有单独的管理流量通道
  • MAC1通过PHY1与外界相连
  • MAC2通过PHY2与外界相连
    赛灵思 TSN 解决方案_第1张图片
    赛灵思 TSN 解决方案_第2张图片

流量类

​ TSN IP 支持两种配置:
a. 3 queue or 3 traffic class system:

     1. Best Effort
     2. Scheduled
     3. Reserved

b. 2 queue/2 traffic class system

	  1. Best Effort
      2. Scheduled

PCP 和流量等级

以太网帧的 vlan pcp 用于 HW 识别流量类别。默认情况下,4 的 pcp 映射到 ST,2 和 3 的 pcp 映射到 RES(保留)。如果 pcp 是任何其他的或者如果 frame 没有 vlan 标记,则它被认为是 BE。

2019.x 及更早版本:

这个默认映射可以通过 uEnv.txt 中的内核命令行选项更改。

   bootargs=console=ttyPS0,115200 xilinx_tsn_ep.st_pcp=5 xilinx_tsn_ep.res_pcp=2,3 root=/dev/mmcblk0p2 rw rootwait earlyprintk

2020.x 及更高版本:
boot.scr 中的参数确定 PCP 映射。默认值与上述相同。

要更改 PCP,请编辑文件 < TOP_DIR >/sources/meta-xilinx-tsn/recipes-bsp/u-boot/uboot-zynq-scr/boot.cmd.sd . < boardname >。
例如,以下命令行将 1 的 pcp 映射到 ST 流量,4 的 pcp 映射到 RES 流量,其余的 pcp 映射到 BE 流量:

bootargs=console=ttyPS0,115200 xilinx_tsn_ep.st_pcp=1 xilinx_tsn_ep.res_pcp= 4
root=/dev/mmcblk0p2 rw rootwait earlyprintk

以下命令行将 2 和 3 的 pcp 映射到 ST 流量,1 的 pcp 到 RES 流量,其余的 pcp 到 BE 流量。

bootargs=console=ttyPS0,115200 xilinx_tsn_ep.st_pcp=2,3 xilinx_tsn_ep.res_pcp=1
root=/dev/mmcblk0p2 rw rootwait earlyprintk

更改 PCP 值后,获取 bitbake 环境并再次运行 bitbake 构建:

#source setupsdk
#bitbake core-image-minimal

注意: 不要直接编辑 boot.scr 文件。

生成 TSN 流量:

生成 TSN 流量,可以通过使用原始套接字来完成,您可以在其中使用相关 pcp 创建以太网帧。一种这样的实现是作为 TSN Yocto 软件版本的一部分提供的 tsn_talker。

Converting Legacy Applications to TSN

有时,用户需要端口遗留应用程序来发送/接收 TSN 流量,而无需更改/修改它们。例如,仅使用 L3 层 (IP) 进行通信的应用程序不应具有将 pcp/vlan 插入帧的能力。为解决这个问题,Xilinx TSN 解决方案具有 IP 拦截内核模块支持,可将遗留应用无缝过渡到使用 TSN 技术。有关详细信息,请参阅“运行 IPIC”部分。

支持的 PTP 配置文件

TSN IP 支持以下配置文件:

    a. 1588v1 and 1588v2
    b. Power Profile
    c. 802.1AS
    d. 802.1ASREV

TSN 驱动程序和 SW 守护程序(ptp4l 和 openAvnu/gptp)支持可用于:

	a. 1588v2
	b. 802.1AS
	c. 802.1ASREV (并非所有功能都可用。请参阅 ptp4l/openAvnu 文档).

zynqmp 中 R5 上的 PTP 卸载

Xilinx TSN 解决方案提供在 zyng Ultrascale 平台的 RPU 上运行多个 802.1AS PTP 功能实例 (ptp4l)。这是通过将 PTP(ptp4l) 守护程序和部分 TSN IP 驱动程序移植到运行在 R5 上的 FreeRTOS 来实现的。控制路径通过 A53(主处理器)通过 OpenAMP 框架进行处理。

 这使打算完全隔离并具有弹性 PTP 功能的客户成为可能。

运行 gPTP(802.1AS):

gPTP 守护进程可以以两种方式运行。一种方法是从 OpenAvnu 运行它,另一种是从 ptp4linux 运行它。后者是首选,因为它在从站打印 rms 值以识别与主站的同步。

  • 从 OpenAvnu 运行 gPTP 守护进程:
    从 Intel 网卡 PC 机启动 gPTP daemon 如下:
  #Open-AVB/daemons/gptp/linux/build/obj/daemon_cl enp4s0 –S

从 Xilinx 板上启动 PTP 守护程序,如下所示:

#daemon_cl eth1 –S

[1] 186
ERROR at 636 in …/src/linux_hal_common.cpp: Group ptp not found, will try root (0) instead
Using clock device: /dev/ptp0
Starting PDelay
root@Xilinx-ZCU102-2016_1:~# AsCapable: Enabled
*** Announce Timeout Expired - Becoming Master
New Grandmaster “00:0A:35:FF:FE:00:01:0E” (previous “00:00:00:00:00:00:00:00”)
<< END >>

  • 从 ptp4linux 运行 gPTP 守护进程:
    从 Xilinx 板上启动 PTP 守护程序,如下所示:
#ptp4l -P -2 -H -i eth1 -p /dev/ptp0 –s -m -f /usr/sbin/ptp4l_slave.conf

从https://sourceforge.net/p/linuxptp/ 下载 PTP daemon 并在 Intel 卡 PC 中编译得到 ptp4l 二进制文件。使用 linuxptp 源代码中的 gPTP.cfg 或 default.cfg 文件。

从 Intel 卡 PC 启动 PTP 守护进程如下:(使用 PC 板上的 /usr/bin/ptp4l_master.conf)

#ptp4l -P -2 -H -i enp4s0 -p /dev/ptp0 -m -f ptp4l_master.conf

同步成功后,slave 打印的 RMS 值如下:

    root@zcu102-zynqmp:~# ptp4l -P -2 -H -i eth1 /dev/ptp0 -s -m -f /usr/sbin/ptp4l_slave.conf
    ptp4l[7940.770]: selected /dev/ptp0 as PTP clock
    ptp4l[7940.800]: driver changed our HWTSTAMP options
    ptp4l[7940.800]: tx_type   1 not 1
    ptp4l[7940.800]: rx_filter 1 not 12
    ptp4l[7940.800]: port 1: INITIALIZING to LISTENING on INITIALIZE
    ptp4l[7940.800]: port 0: INITIALIZING to LISTENING on INITIALIZE
    ptp4l[7948.772]: port 1: LISTENING to MASTER on ANNOUNCE_RECEIPT_TIMEOUT_EXPIRES
    ptp4l[7948.772]: selected best master clock 000a35.fffe.00010e
    ptp4l[7948.772]: assuming the grand master role
    ptp4l[7949.452]: port 1: new foreign master a0369f.fffe.684c96-1
    ptp4l[7953.452]: selected best master clock a0369f.fffe.684c96
    ptp4l[7953.452]: port 1: MASTER to UNCALIBRATED on RS_SLAVE
    ptp4l[7953.951]: port 1: UNCALIBRATED to SLAVE on MASTER_CLOCK_SELECTED
    ptp4l[7954.701]: rms 1732 max 2297 freq -100287 +/- 1208 delay   509 +/-   0
    ptp4l[7955.701]: rms  326 max  499 freq -101341 +/- 438 delay   509 +/-   0
    ptp4l[7956.702]: rms  545 max  579 freq -102323 +/- 151 delay   509 +/-   0
    ptp4l[7957.702]: rms  343 max  463 freq -102512 +/-   9 delay   509 +/-   0
    ptp4l[7958.702]: rms  118 max  193 freq -102419 +/-  43 delay   509 +/-   0

注意:

  • 目前软件不支持 1 step ptp 模式
  • 可以通过更改优先级值来更改主从角色。低优先级表示它是主设备,较高优先级表示它是从设备。
  • 默认情况下 MAC 端口链路速度为 1Gbps,使用以下命令将其设置为 100Mbps,以防需要 100Mbps 设置
    #mii-tool -F 100baseTx-FD eth1

更改 ptp4l 配置文件(/usr/sbin/ptp4l_slave.conf 和 /usr/sbin/ptp4l_master.conf)参数 neighborPropDelayThresh 如下

neighborPropDelayThresh 2000 - for 100Mbps link speed
or
neighborPropDelayThresh 800 - for 1Gbps link speed

运行 PTP 1588v2:

  • PTPv2 使用最佳主时钟算法来确定网络中哪个时钟质量最高(主时钟)以创建主/从层次结构并将所有其他节点与主时钟同步。要使节点成为主节点,配置文件中的优先级字段应具有最小值。
  • PTPv2 可以在 L2 或 UDP 上运行。当通过 UDP 运行时,它可以在 ep + 交换机系统上以多播模式运行,在 ep only 系统上以多播和单播模式运行。
  • 要在 Intel Card PC 上运行,请从https://sourceforge.net/p/linuxptp/下载 PTP 守护程序并编译以获取 ptp4l 二进制文件。将主/从配置文件复制到 linuxptp 文件夹并从该文件夹启动 ptp4l 守护进程,如下所述。

要在 L2 上运行 PTPv2:
点对点(P2P)机制:

要在 zcu102 或 zc702 上作为 master 运行:

ptp4l -P -2 -H -i eth1 -p /dev/ptp0 -m -f /usr/sbin/ptp4l_master_v2_l2.conf

要在 zcu102 或 zc702 上作为从属运行:

ptp4l -P -2 -H -i eth1 -p /dev/ptp0 -m -f /usr/sbin/ptp4l_slave_v2_l2.conf

在 Intel Card PC 上作为主机运行:

ptp4l -P -2 -H -i eth1 -p /dev/ptp0 -m -f ptp4l_master_v2_l2.conf

在 Intel Card PC 上作为从机运行:

ptp4l -P -2 -H -i eth1 -p /dev/ptp0 -m -f ptp4l_slave_v2_l2.conf

端到端(E2E)机制:

要在 zcu102 或 zc702 上作为 master 运行:

ptp4l -E -2 -H -i eth1 -p /dev/ptp0 -m -f /usr/sbin/ptp4l_master_v2_l2.conf

要在 zcu102 或 zc702 上作为从属运行:

ptp4l -E -2 -H -i eth1 -p /dev/ptp0 -m -f /usr/sbin/ptp4l_slave_v2_l2.conf

在 Intel Card PC 上作为主机运行:

ptp4l -E -2 -H -i eth1 -p /dev/ptp0 -m -f ptp4l_master_v2_l2.conf

在 Intel Card PC 上作为从机运行:

ptp4l -E -2 -H -i eth1 -p /dev/ptp0 -m -f ptp4l_slave_v2_l2.conf

基于 UDP 的 PTPv2 和多播模式:

点对点(P2P)机制:

要在 zcu102 或 zc702 上作为 master 运行:

ptp4l -P -4 -H -i eth1 -p /dev/ptp0 -m -f /usr/sbin/ptp4l_master_v2_udp_multicast.conf

要在 zcu102 或 zc702 上作为从属运行:

ptp4l -P -4 -H -i eth1 -p /dev/ptp0 -m -f /usr/sbin/ptp4l_slave_v2_udp_multicast.conf

在 Intel Card PC 上作为主机运行:

ptp4l -P -4 -H -i eth1 -p /dev/ptp0 -m -f ptp4l_master_v2_udp_multicast.conf

在 Intel Card PC 上作为从机运行:

ptp4l -P -4 -H -i eth1 -p /dev/ptp0 -m -f ptp4l_slave_v2_udp_multicast.conf

端到端(E2E)机制:

要在 zcu102 或 zc702 上作为 master 运行:

ptp4l -E -4 -H -i eth1 -p /dev/ptp0 -m -f /usr/sbin/ptp4l_master_v2_udp_multicast.conf

要在 zcu102 或 zc702 上作为从属运行:

ptp4l -E -4 -H -i eth1 -p /dev/ptp0 -m -f /usr/sbin/ptp4l_slave_v2_udp_multicast.conf

在 Intel Card PC 上作为主机运行:

ptp4l -E -4 -H -i eth1 -p /dev/ptp0 -m -f ptp4l_master_v2_udp_multicast.conf

在 Intel Card PC 上作为从机运行:

ptp4l -E -4 -H -i eth1 -p /dev/ptp0 -m -f ptp4l_slave_v2_udp_multicast.conf

基于 UDP 的 PTPv2 和单播模式:

点对点(P2P)机制:

要在 zcu102 或 zc702 上作为 master 运行:

ptp4l -P -4 -H -i eth1 -p /dev/ptp0 -m -f /usr/sbin/ptp4l_master_v2_udp_unicast_p2p.conf

要在 zcu102 或 zc702 上作为从属运行:
"/usr/sbin/ptp4l_slave_v2_udp_unicast_p2p.conf"文件中的’peer_address’字段应设置为主机的IP地址。

ptp4l -P -4 -H -i eth1 -p /dev/ptp0 -m -f /usr/sbin/ptp4l_slave_v2_udp_unicast_p2p.conf

在 Intel Card PC 上作为主机运行:

ptp4l -P -4 -H -i eth1 -p /dev/ptp0 -m -f ptp4l_master_v2_udp_unicast_p2p.conf

在 Intel Card PC 上作为从机运行:
ptp4l_slave_v2_udp_unicast_p2p.conf文件中的’peer_address’字段应设置为主节点的IP地址。

ptp4l -P -4 -H -i eth1 -p /dev/ptp0 -m -f ptp4l_slave_v2_udp_unicast_p2p.conf

端到端(E2E)机制:

要在 zcu102 或 zc702 上作为 master 运行:

ptp4l -E -4 -H -i eth1 -p /dev/ptp0 -m -f /usr/sbin/ptp4l_master_v2_udp_unicast_e2e.conf

要在 zcu102 或 zc702 上作为从属运行:
/usr/sbin/ptp4l_slave_v2_udp_unicast_e2e.conf 的“UDPv4”字段应设置为主机IP地址

ptp4l -E -4 -H -i eth1 -p /dev/ptp0 -m -f /usr/sbin/ptp4l_slave_v2_udp_unicast_e2e.conf

在 Intel Card PC 上作为主机运行:

ptp4l -E -4 -H -i eth1 -p /dev/ptp0 -m -f ptp4l_master_v2_udp_unicast_e2e.conf

在 Intel Card PC 上作为从机运行:
ptp4l_slave_v2_udp_unicast_e2e.conf 的“UDPv4”字段应设置为主机IP地址

ptp4l -E -4 -H -i eth1 -p /dev/ptp0 -m -f ptp4l_slave_v2_udp_unicast_e2e.conf

同步成功后,slave 的日志如下:

ptp4l[765.873]: selected /dev/ptp0 as PTP clock
ptp4l[765.960]: driver rejected most general HWTSTAMP filter
ptp4l[765.960]: port 1: INITIALIZING to LISTENING on INIT_COMPLETE
ptp4l[765.960]: port 0: INITIALIZING to LISTENING on INIT_COMPLETE
ptp4l[772.710]: port 1: LISTENING to MASTER on ANNOUNCE_RECEIPT_TIMEOUT_EXPIRES
ptp4l[772.710]: selected local clock 000a35.fffe.00012e as best master
ptp4l[772.710]: assuming the grand master role
ptp4l[775.065]: port 1: new foreign master 000a35.fffe.00013e-1
ptp4l[779.065]: selected best master clock 000a35.fffe.00013e
ptp4l[779.065]: port 1: MASTER to UNCALIBRATED on RS_SLAVE
ptp4l[780.064]: master offset 3409342692 s0 freq      +0 path delay       396
ptp4l[781.065]: master offset 3409344460 s1 freq   +1768 path delay       396
ptp4l[782.065]: master offset       -373 s2 freq   +1395 path delay       396
ptp4l[782.065]: port 1: UNCALIBRATED to SLAVE on MASTER_CLOCK_SELECTED
ptp4l[783.065]: master offset       -333 s2 freq   +1323 path delay       396
ptp4l[784.065]: master offset       -404 s2 freq   +1152 path delay       396
ptp4l[785.065]: master offset       -381 s2 freq   +1054 path delay       396
ptp4l[786.065]: master offset       -303 s2 freq   +1017 path delay       396
ptp4l[787.065]: master offset       -297 s2 freq    +933 path delay       396
ptp4l[788.065]: master offset        -19 s2 freq   +1121 path delay       396
ptp4l[789.065]: master offset        316 s2 freq   +1451 path delay       396
ptp4l[790.065]: master offset        373 s2 freq   +1603 path delay       396

s0、s1、s2 字符串表示不同的时钟伺服状态:s0 解锁,s1 时钟步进,s2 锁定。一旦舵机处于锁定状态,时钟将不会步进(只能慢慢调整)。INITIALIZING、LISTENING、UNCALIBRATED 和 SLAVE 是一些可能的端口状态,它们在 INITIALIZE、RS_SLAVE、MASTER_CLOCK_SELECTED 事件上发生变化。主偏移值是以纳秒为单位的主偏移测量值。这已从 3409342692 减少到 -373,表示成功与主同步,将端口状态从未校准更改为从属

运行 Qbv/Time Aware Shaper:

可以使用 qbv_sched 实用程序对 Qbv 功能进行编程。

例如:

qbv_sched -c ep /tmp/abc.cfg

这使用 tmp 目录中存在的 abc.cfg 的 TSN 配置在 ep 上安排 Qbv

qbv_sched ep

这使用 /etc/qbv.cfg 中存在的默认 TSN 配置在 ep 上安排 Qbv

qbv_sched -g ep

这将返回在ep上运行的时schedule

qbv_sched -s ep -f

这将强制运行Qbv,使用tmp目录下abv.cfg的TSN配置,即使ep上的schedule 正在等待运行。

qbv_sched -c ep /tmp/abc.cfg -f

使用 Wireshark 进行测试:

配置 Qbv:
默认 TSN 配置存在于 /etc/qbv.cfg 文件中。此文件包含 QBV 门时间表。要运行 Qbv,您需要按照其中给出的说明配置此文件。要打开所有门,cycle_time 应该为 0。

例如:

qbv =
{
              temac1 =
              {
                      start_sec = 0;
                      start_ns = 0;
                      cycle_time = 10000000; //cycle time is 10ms
                      gate_list_length = 2;
                      gate_list =
                          (
                             {
                                  state = 4;
                                  time = 100000;
                             },
                             {
                                    state = 1;
                                    time = 100000;
                              }

                          );
               }; 
};

配置文件的“temac1”部分后,Qbv 调度程序使用 qbv_sched 实用程序在“eth1”上运行,如下所示:

# qbv_sched eth1

qbv_sched 实用程序可用于调度所有接口 ep、eth1-temac1 和 eth2-temac2

上述 Qbv 时间表打开 ST 门达 100uS,然后将其关闭。循环时间为10ms;因此,在 100uS BE 门在剩余的周期时间内保持打开状态,即使它的门时间是 100uS,因为门时间的总和不是周期时间。

要测试 TSN 功能,您需要在后台运行 PTP 并确保其正常运行且没有任何错误。PTP 开始在后台运行后,从 Xilinx HW 运行 tsn_talker 程序。在启动 tsn_talker 应用程序之前,配置开关 CAM 条目以允许相应的流量。

#switch_cam -a a0:36:9f:68:4c:96 10 swp1

添加交换机 CAM 条目,目标 MAC 为 a0:36:9f:68:4c:96,VLAN ID 为 10,端口为 swp1 (Temac1)。

#tsn_talker eth1 a0:36:9f:68:4c:96 00:0a:35:00:01:0e 10 4 1500 0 12 1000000000 1

该应用程序每1秒发送12个ST数据包,VLAN ID为10,数据包大小为1500字节。

从 Intel 卡 PC 运行 Wireshark 并观察传入的数据包。

Qbv 编程前的 Wireshark:
赛灵思 TSN 解决方案_第3张图片
正如我们在上图中看到的,从第 106 个数据包到第 117 个数据包都是按顺序排列的,下一个数据包从下一秒开始。

Wireshark qbv编程后:

您会观察到每秒发送 12 个 ST 数据包,其中 8 个数据包在 10 毫秒的 100us 周期内发送,其余 4 个数据包在下一个周期内发送。
赛灵思 TSN 解决方案_第4张图片
正如我们在上图中看到的,从第 4 个数据包到第 11 个数据包(8 个数据包)被顺序接收,下一个数据包在 10 毫秒延迟后开始(第 12 号数据包)。

运行 IPIC:

如果数据包的 IPv4 元组(源 IP、目标 IP、DSCP、协议、源端口号和目标端口号)匹配,IP 拦截将使用配置的源、目标 MAC 地址、VLAN ID 和 PCP 值转换传输数据包。IPIC 模块维护 IPv4 元组的哈希条目,如果传出数据包的元组数据与哈希条目的元组数据匹配,则转换 IP 流。

配置IPv4元组的匹配条件,在驱动加载时,对对应的元组数据选择’1’(设置)或’0’(未设置)其中IPv4元组顺序为’IPv4_tuple=src_ip, dest_ip, dscp, protocol, src_port , dest_port’。

例如,要过滤具有特定源 IP、源端口号和目标端口号的数据包,需要加载 IPIC 模块,如下所示:

  • insmod /lib/modules/4.14.0-xilinx-v2018.1/extra/xilinx_tsn_ip_intercept.ko IPv4_tuple=1,1,0,0,0,0

用户应用程序 ipic_prog 对 IPIC 模块进行编程,以添加对应于设置的 IPv4 元组数据的哈希条目,并在设置的 IPv4 元组数据匹配时使用提供的源、目标 MAC 地址、VLAN ID 和 PCP 值转换 IP 流。

ipic_prog的用法如下:

  • ipic_prog

以下是添加单个条目以及删除单个条目和所有条目的示例。
Addition of Entry::

  • ipic_prog add 192.168.10.5 192.168.10.9 17 0 8000 1000 00-0a-35-00-01-0e a0-36-9f-68-4c-96 10 4

Deletion of Entry:

  • ipic_prog del 192.168.10.5 192.168.10.9 17 0 8000 1000 00-0a-35-00-01-0e a0-36-9f-68-4c-96 10 4

Deletion/Flushing of All Entries:

  • ipic_prog flush

如果要添加具有不同 IPv4 元组组合和不同翻译字段的多个条目,请为每个条目运行 ipic_prog 命令。

例如,以下命令添加两个具有相同源 IP 和不同目​​的 IP 的条目,并转换具有不同源、目的 MAC 地址和 VLAN ID 的流

  • ipic_prog add 192.168.10.5 192.168.10.9 17 0 8000 1000 00-0a-35-00-01-0e a0-36-9f-68-4c-96 10 4

在这种情况下,目标 IP 为 192.168.10.3 的数据包被转换为 VLAN-ID 99,源 MAC 地址为00:0a:35:07:89:ff,目标为 a0:36:9f:87:44 :00

如果存在与目标MAC地址和VLAN ID对应的交换机CAM条目,则转换后的IP流从网络端口发送出去。因此,请确保使用 switch_cam 命令添加 CAM 条目。

例如,对于上面添加的两个条目,switch_cam运行如下:

  • switch_cam -a a0:36:9f:68:4c:96 10 swp1
  • switch_cam -a a0:36:9f:68:4c:96 99 swp1

从板子传数据包,例如使用iperf3如下:

  • iperf3 -c 192.168.11.9
  • iperf3 -c 192.168.11.3
    确保 iperf3 服务器在接收器上运行,如下所示,并观察接收到的包含目标 MAC、源 MAC 地址和 VLAN ID 的数据包。
  • iperf3 -s
    当系统具备抢占能力时,运行openlldp检测对端帧抢占能力,如果对端具备抢占能力,则开启抢占。

运行 openlldp 如下:

  • conf/local.conf 中“EXTRA_IMAGEDEPENDS”和“IMAGE_INSTALL_append”的“lldpd”字段(假定您位于“Yocto_TSN/build”路径中)必须替换为“lldpad”,如下所示:

EXTRA_IMAGEDEPENDS += "gptp misc-utils linuxptp bridge-utils python python-json python-codecs python-io curl lldpad strace lrzsz net-tools tcpdump netcat iperf3 iproute2 python-mmap python-flask python-ctypes python-re python-werkzeug python- jinja2 python-itsdangerous gui-init gui-scripts”

IMAGE_INSTALL_append = "gptp misc-utils linuxptp bridge-utils python python-json python-codecs python-io curl lldpad strace lrzsz net-tools tcpdump netcat iperf3 ipic-module iproute2 python-mmap python-flask python-ctypes python-re python-werkzeug python-jinja2 python-itsdangerous gui-init gui-scripts”

  • 使用“bitbake core_image_minimal”构建图像
  • 启动后,运行以下命令:
# lldpad -d
# lldptool 设置-lldp -i eth1 adminStatus=rxtx 
  • 要将其他以太网功能 TLV 添加到 openlldp 框架,请运行:
# lldptool -i eth1 set-tlv -V addEth enableTx=yes 

运行此命令对于抢占是强制性的

  • 要将 MAC/PHY 配置状态 TLV 添加到 openlldp 帧,请运行:
# lldptool -i eth1 set-tlv -V macPhyCfg enableTx=yes
  • 要将 Power via MDI TLV 添加到 openlldp 框架,请运行:
# lldptool -i eth1 set-tlv -V powerMdi enableTx=yes
  • 要将链路聚合 TLV 添加到 openlldp 帧,请运行:
# lldptool -i eth1 set-tlv -V linkAgg enableTx=yes
  • 要将最大帧大小 TLV 添加到 openlldp 帧,请运行:
# lldptool -i eth1 set-tlv -V MTU enableTx=yes
  • 要将系统名称添加到 openlldp 框架,请运行:
# lldptool -T -i eth1 -V sysName enableTx=yes

= 要将端口描述添加到 openlldp 框架,请运行:

# lldptool -T -i eth1 -V portDesc enableTx=yes
  • 要将系统描述添加到 openlldp 框架,请运行:
# lldptool -T -i eth1 -V sysDesc enableTx=yes
  • 要将系统功能添加到 openlldp 框架,请运行:
# lldptool -T -i eth1 -V sysCap enableTx=yes
  • 要将管理地址添加到 openlldp 框架,请运行:
#lldptool -T -i eth1 -V mngAddr -c ipv4=

#lldptool -T -i eth1 -V mngAddr enableTx=yes

例如:
测试步骤:
要在支持抢占的 zcu102 板上激活抢占,请将一块板的 eth1 连接到另一块板的 eth1。在两者上运行 lldpad 守护进程,如下所示:

# lldpad -d

# lldptool 设置-lldp -i eth1 adminStatus=rxtx 

通过读取抢占启用寄存器和抢占控制状态寄存器来观察抢占是否启用和激活,如下所示:

#devmem 0x80040440

#devmem 0x80040444

可以看出,抢占未启用且处于活动状态,此时附加以太网功能 TLV 被设置为包含在两块板的帧中,如下所示:

#lldptool -i eth1 set-tlv -V addEth enableTx=yes 

可以看出,lldpad 守护程序检测对等方的抢占功能,如果支持抢占,则在其系统中启用抢占,最终激活抢占。

检测结果:
在设置其他以太网功能 TLV 之前:

root@zcu102-zynqmp:~# devmem 0x80040440

0x00000000

root@zcu102-zynqmp:~# devmem 0x80040444

0x00000900

抢占使能寄存器的第0位为0表示抢占未使能,抢占控制状态寄存器的第31位为0表示抢占未激活。

在两块板上设置额外的以太网功能 TLV 后:

After setting additional Ethernet capabilities TLV in both the boards:

root@zcu102-zynqmp:~# devmem 0x80040440

0x00000001

root@zcu102-zynqmp:~# devmem 0x80040444

0x820000900

抢占使能寄存器的第0位为1表示抢占使能,抢占控制状态寄存器的第31位为1表示抢占有效。

演示抢占的步骤

1.更改MAC地址(如果背靠背使用两块xilinx板)。
2. 启动 lldpad 守护程序。

# lldpad -d
# lldptool 设置-lldp -i eth1 adminStatus=rxtx

3.设置 lldpad 以获得额外的以太网功能 TLV。确保抢占已启用并处于活动状态。

#lldptool -i eth1 set-tlv -V addEth enableTx=yes 

4.打开网络接口。
5.建立PTP同步,在tx端运行qbv。
6. 根据需要添加交换机 CAM 条目,并从 tx 端发送 ST 和 BE(快速和可抢占)流量。
7. 运行 br_prog < interface name> stats,检查 TX MAC MERGE FRAGMENT COUNT(在 tx 端)、RX MAC MERGE FRAGMENT COUNT(在 rx 端)是否在增加。

Running Spanning Tree Protocol

在 EP+Switch 系统上,使用基于标准 linux 的工具运行 STP 已启用。为了使 HW 使用基于源 MAC 的过滤机制来识别 STP 帧应从哪个端口退出。TSN 驱动程序在驱动程序初始化期间设置这些过滤器。但要实现这一点,环的每个节点都应在编译期间在设备树中设置唯一的 mac 地址。

要在每个节点上运行 STP,请执行以下操作:

#ip link add name br0 type bridge
#ip link set dev eth1 master br0
#ip link set dev eth2 master br0
#ifconfig br0 up
#ip link set dev br0 type bridge stp_state 1

检查生成树的状态

#brctl showstp br0

时间感知 DMA (TADMA)

TimeAware DMA 是一项功能,用户可以通过它控制数据包被拾取进行传输的精确时间。不要与时间感知整形器 (TAS) 混淆。例如,对于循环时间为 1 毫秒的 Qbv 计划,可以将流编程为在特定偏移处触发。如果在该偏移量期间流的流量类别窗口是打开的,则帧将在该偏移量处精确传输。

TADMA 使用 tadma_prog 命令进行编程,在 /etc/stream.cfg 中添加流和每个流的触发点。触发点是相对于 qbv 循环开始时间的,而不是绝对的 PTP 时间。

#tadma_prog -c < interface> < streams config file>

Stream 是 MAC 地址和 VLAN ID 的组合。TADMA 仅适用于 ST – 预定流量数据包。在 QBV 循环时间上提供流的触发点,并在计数值 1 到 4 中提及要发送的 pacect 数。在对 TADMA 编程之前安排 QBV。

默认情况下,TADMA 引擎以连续模式工作,它以连续循环的方式获取 ST 帧。当对流进行编程时,它会进入离散模式,在触发点获取帧。

示例 /etc/stream.cfg:

streams =
(
	{
		dest = "00:0a:35:00:01:0e";
		vid = 10;
		trigger = 100000;
		count = 1; // fetch 1 frame at this time
	},

	{
		dest = "00:0a:35:00:01:0f";
		vid = 20;
		trigger = 200000;
		count = 2; // fetch 2 frame at this time
	}
);

OOB 脚本

从2020.1版本的lounge发布开始,开箱即用脚本已包含在其中,用于基本演示任何子句。这些脚本可以在Linux探测之后直接运行,无需任何额外的命令。
OOB 脚本可用于:

  • Qbv+TADMA
  • FRER
  • Qci

如何运行

  • 像往常一样启动 Linux 并在 rootfs 的 /usr sbin/ 文件夹中找到脚本

  • 对于 Qbv 和 tadma

    1. 脚本需要目标 mac 地址作为参数。在链接伙伴上,要查看 mac 地址,请使用以下命令:
      ifconfig < interface >
    2. 为要运行的子句运行脚本
      #sh qbv_auto.sh < dest mac >
    
  • 对于 FRER 和 Qci,接收方脚本应该首先运行。

    1.接收方

    #sh < clause>_receive.sh
    

    2.发送方

    #sh _sender.sh
    

有关设置的更多详细信息,请参阅入门指南。

常见问题 (FAQ)

  • Qbv 不起作用 - 使用 qbv_sched 实用程序对 qbv 进行编程后,属于 ST 的数据包不会在指定窗口通过。

    Answer:

      a.确保先运行 PTP。不运行 PTP qbv 状态机将停止。
      b. 确保为与您尝试发送的流量关联的目标 MAC 和 VLAN 对交换机 CAM 进行编程。
    
  • PTP 时钟总是从 1970 年 1 月 1 日开始。这导致我们的 CNC 出现异常。

    默认情况下,PTP RTC 时钟在启动时以(0 秒,0 纳秒)或 1970 年 1 月 1 日开始。这可以通过将 PTP RTC 时钟设置为系统时钟的 CLOCK_REALTIME 来更改。

    #phc2sys -c /dev/ptp0 -s CLOCK_REALTIME -O 0
    

    运行此命令一次,以便使用系统时间 (CLOCK_REALTIME) 设置 PTP RTC 时钟。

  • Qbv 行为不同于 EP+Switch 设计中的 ep 和 temac1/temac2 实例

    temac1 和 EP 出口上的 Qbv 略有不同。原因是由于EP侧的存储转发。在 MAC 端(temac1 或 temac2),如果它的存储和转发(可配置)则它们的行为完全相同。如果它的直通是我们发布的参考硬件设计中的情况,那么它的行为会略有不同。例如,要发送一个 1500 字节的帧,EP 端需要 16uS 窗口,temac1+cut_through 需要稍高的 16.5uS 窗口,因为直通在 16us 之上会有一些延迟。

  • tsn_talker 在 EP+Switch 设计的 eth1 或 eth2 上不能正确运行

    从 2018.3 开始,数据路径移至内部 cpu 绑定接口“ep”。在网络端口 eth1 和 eth2 上只能传输或接收控制路径(STP/LLDP/PTP)帧。请使用带有 ep 接口的 tsn_talker。

  • tsn_talker 传输乱码帧

    这是预期和故意的。TSN talker 被编程为发送带有随机数据有效负载的任意 IPv6 帧。然而,它在有效载荷中的固定偏移处具有序列号,以识别和/或弄清楚 Qbv 是如何工作的。

  • 在 TSN Yocto 版本之外编译 TSN 驱动程序

    TSN 驱动程序和子系统包(Yocto 版本)通过 Xilinx.com 上的 TSN lounge Access 交付给我们的许可客户,直到 2020.1

    从 2022.1 开始,TSN 内核驱动程序存在于 AMD/Xilinx linux-xlnx 内核中,如此处指定 Xilinx TSN 解决方案#Softwaresupport

  • 当主机重启时,从机上的 PTP 与主机失去同步

    使用 slave 和 master 运行 ptp4l。一段时间后重新启动主系统并再次运行 ptp4l。现在从机上的 ptp4l 实例永远不会重新获得与主机的同步并发布巨大的 rms:

    ptp4l[1471.104] rms 1257113383298 max 1257507158007 freq +90000000 +/- 0 delay 407 +/- 0
    ptp4l[1471.104] rms 1257103383298 max 1257506158007 freq +90000000 +/- 0 delay 407 +/- 0

Answer:
来自 ptp4l 手册页:
伺服将通过更改时钟频率而不是步进时钟来校正的最大偏移量。当设置为 0.0 时,伺服将永远不会步进时钟,除非在启动时。它以秒为单位指定。默认值为 0.0。

所以时钟只在守护进程启动时调整,而不是在守护进程运行期间调整。您可以通过将 ptp4l_slave.cfg 中的 step_threshold 设置为 1ms 来传递它
/* 将此行添加到从站上的 ptp4l cfg 文件 */
step_threshold 0.001

如果主从之间的差异超过 1 毫秒,这将强制守护进程步进时钟。通常不建议这样做,因为步进时钟会显着改变所有使用 ptp 时间的正在运行的应用程序的时间。

  • 如何在 EP+Switch 设计上运行 PTP 边界时钟

    实例化 EP+Switch 设计时,系统应具有两个网络接口(eth1 和 eth2)和一个内部 cpu 端口/接口(ep)。当使用系统作为终端节点时,PTP 守护进程可以在 eth1 或 eth2 上独立运行。但是,当该系统成为 eth1 和 eth2 都连接到外部系统的 TSN 网络的一部分时,在两个接口(eth1、eth2)上运行 PTP 守护程序(单个实例)很重要。系统中只有一个 PTP 硬件时钟(RTC)。

    使用 ptp4l 运行 BC:
    在 ptp4l 配置文件中启用 clock_type 字段作为 BC。然后按如下方式运行ptp4l。BMCA 应在整个设备上发生。如果 Xilinx 设备成为 GM(通过 BMCA),则通过 eth1 和 eth2 连接的设备应将其时钟(从时钟)与其 PTP 时钟同步。

    #ptp4l -P -2 -H -i eth1 -i eth2 -p /dev/ptp0 -m -f /usr/sbin/ptp4l.conf
    
    ptp4l[139.040]: selected /dev/ptp0 as PTP clock	
    ptp4l[139.076]: driver rejected most general HWTSTAMP filter	
    ptp4l[139.076]: port 1: INITIALIZING to LISTENING on INIT_COMPLETE	
    ptp4l[139.108]: driver rejected most general HWTSTAMP filter	
    ptp4l[139.108]: port 2: INITIALIZING to LISTENING on INIT_COMPLETE	
    ptp4l[139.108]: port 0: INITIALIZING to LISTENING on INIT_COMPLETE	
    ptp4l[142.111]: port 2: new foreign master 000a35.fffe.00012e-1	
    ptp4l[146.111]: selected best master clock 000a35.fffe.00012e	
    ptp4l[146.112]: port 2: LISTENING to UNCALIBRATED on RS_SLAVE	
    ptp4l[146.780]: port 1: LISTENING to MASTER on ANNOUNCE_RECEIPT_TIMEOUT_EXPIRES	
    ptp4l[146.780]: selected best master clock 000a35.fffe.00012e	
    ptp4l[147.362]: port 2: UNCALIBRATED to SLAVE on MASTER_CLOCK_SELECTED	
    ptp4l[147.987]: rms 3090228936610 max 6180457873230 freq -160 +/- 65 delay 394 +/- 0	
    ptp4l[148.987]: rms 39 max 49 freq -240 +/- 8 delay 392 +/- 0	
    ptp4l[149.971]: port 1: new foreign master a0369f.fffe.684c96-1	
    ptp4l[149.987]: rms 18 max 25 freq -239 +/- 7 delay 392 +/- 0	
    ptp4l[150.988]: rms 8 max 13 freq -233 +/- 10 delay 393 +/- 0	
    ptp4l[151.988]: rms 8 max 14 freq -239 +/- 8 delay 393 +/- 0
    
  • TADMA + Qbv doesn’t work - After programming tadma using tadma_prog and qbv using qbv_sched utility, packets belonging to ST don’t come through at specified window.

    Answer:

      a. 确保先运行 PTP。不运行 PTP qbv 状态机将停止。
      b. 确保您在 EP Qbv 上有一个有效的时间表。
      c. 确保您的循环时间大于所有触发点。
      d. 确保您的 ST 流量与 streams.cfg 中编程的流匹配 
    

注意事项:

TADMA 在离散模式下始终使用ep qbv实例进行编程。
它仅取决于循环时间,并且应该大于 tadma 配置 (streams.cfg) 中最后一个流的触发时间。
它应该在周期内有一个有效的 ST 窗口。(至少一包出门)

  • 当前的 TSN 设计使用 PS (Zynq Ultrascale+) 上可用的所有 16 个 PL-PS 中断(IRQ0 和 IRQ1)。我们还有其他一些 PL 模块,它们具有需要连接到 PS 的中断。

    Answer:请参阅 使用 AXI 中断控制器的 TSN 设计

  • 如何在 SD 卡上创建 rootfs
    注意: 2020.x 及更高版本中不使用 unenv.txt。有关详细信息,请参阅 TSN SW 用户指南。请参阅上面的 PCP 部分,了解如何在没有 uenv 文件的情况下指定 PCP 值。

  1. 从 tmp/ 中获取 fitImage-< board name >.bin、BOOT-< board name>.bin、uEnv.txt(仅限 2019.x 版本)、boot.scr 和 core-image-minimal- < board name >.cpio deploy/images/< board name>/ . 将 BOOT-< board name>.bin 重命名为 BOOT.bin。
  2. 将 uEnv.txt 中的“fit_image=fitImage-core-image-minimal-< board name>-< board name>”替换为“fit_image=fitImage-.bin”(仅限 2019.x 版本)
  3. 使用 GParted 分区编辑器或 fdisk 命令行参数,将 SD 卡分成两部分。第一部分必须有 FAT32 文件系统,它的大小应该比 fitImage-< board name>.bin、BOOT.bin、uEnv.txt(仅限 2019.x 版本)和 boot.scr 的总和大一点。
  4. 第二部分将包含 SD 卡的剩余部分,并且它必须具有 EXT3 文件系统。
  5. 复制fitImage-< boardname >.bin, BOOT.bin, uEnv.txt(只到2019.x版本)和boot.scr到第一个分区(FAT32文件系统)
  6. 转到第二个分区的挂载区域并运行“cpio -iv < .cpio>”(例如:“cpio -iv < /media/core-image-minimal- <开发板名称>.cpio”)
  7. 使用 SD 卡启动电路板。当您更改任何文件(例如 /etc/qbv.cfg)时,更改将在重新启动时保留。

使用 AXI 中断控制器的 TSN 设计

AXI中断控制器可以在Zynq和ZynqMP平台上以级联方式连接即PL-interruptpin—>AXI-INTC-→GIC。在这种情况下,使用 AXI-INTC 作为中断控制器的外设会将它们的处理程序注册到 AXI-INTC,并且它们可以向 AXI-INTC 生成中断。AXI-INTC 将注册为 GIC 的外设。每当外设对 AXI-INTC 产生中断时,它就会对 GIC 产生中断。

用法

当系统需要超过 16 条中断线连接到 Zynq/ZynqMP 时,AXI 中断控制器将非常有用。

下图显示了中断如何串联并连接到级联到 ZynqMP pl_ps_irq0 的 axi_intc。
赛灵思 TSN 解决方案_第5张图片

										image : 将外设中断线连接到 axi_intc

设备树生成问题

为了正确生成设备树,需要在 axi_intc IP 中进行以下设置。
赛灵思 TSN 解决方案_第6张图片

										  image : 为正确的 dtg 更改 irq 输出连接

此设置启用 irq pin 并确保在 axi_intc 节点内正确生成中断父代和中断号。

axi_intc_0: interrupt-controller@80001000 {
                        #interrupt-cells = <2>;
                        clock-names = "s_axi_aclk";
                        clocks = <&misc_clk_1>;
                        compatible = "xlnx,axi-intc-4.1", "xlnx,xps-intc-1.00.a";
                        interrupt-controller ;
                        interrupt-names = "irq";
                        interrupt-parent = <&gic>;
                        interrupts = <0 89 4>;
                        reg = <0x0 0x80001000 0x0 0x1000>;
                        xlnx,kind-of-intr = <0x8000>;
                        xlnx,num-intr-inputs = <0x10>;
                };

主线状态

目前TSN驱动程序尚未上游化。

已知问题和故障排除

→ 当 TSN 板以环路配置连接时,可以观察到对广播数据包的重复 ping。这可以通过 2 个背靠背板或更多板观察到,其中网络中可能存在环路。一个标准的解决方案是启用 STP(见下文)。这并非特定于 TSN 系统,它是任何可能存在环路的网络的常见预防措施。

ip link add name br0 type bridge
ip link set dev eth1 master br0
ip link set dev eth2 master br0
ifconfig br0 up
ip link set dev br0 type bridge stp_state 1

→ 在繁忙的流量下,PTP 可能会与超时错误不同步,表明 PTP 进程和底层时间戳获取没有收到足够的时间/优先级来运行。调整这取决于系统中的流量,但典型的建议如下:

  • 在 PTP 配置文件中将 tx_timestamp_timeout 增加到 10。如果使用板对板设置,这可以在主配置和从配置上更新,以解决增加的 TX 和 RX 流量。
  • 如果使用 tsn_talker 发送流量,则在数据包大小为 1472 的情况下,可以使用不超过 3 个 tsn talker 实例来实现全吞吐量。

→ TSN 2022.1 内核驱动程序不支持动态设备树覆盖。
→ TSN PCP 值是强制性的,如果未按照“PCP 和流量类别”部分所述进行选择,则 PCP 没有默认值。

变更日志

2023.1

  • Fox 是 6.1.0 Linux 内核
    2022.2

  • Bug修复。

  • 删除了 tsn 接口的硬编码接口名称。

  • 将默认 PCP 设置为队列映射,以防其未通过 bootargs 定义。

2022.1

  • TSN 内核驱动程序支持已添加到暂存区

https://github.com/Xilinx/linux-xlnx/tree/xilinx-v2022.1/drivers/staging/xilinx-tsn

你可能感兴趣的:(linux,运维,服务器)