• TRex学习之旅十一


    本节中的教程演示了基本的 TRex无状态用例。示例包括常见和中等高级的 TRex 概念。

     如何构建 TRex

    1. $cd linux_dpdk
    2. $./b configure (only once)
    3. $./b build

    如何为 vscode 建立索引

    安装 clang-tools/clang-8

    apt-get install clang-8 lldb-8 lld-8 clang-tools-8
    1. $cd linux_dpdk
    2. $CC=clang-8 CXX=clang++-8 ./b configure
    3. $./b build

    这将在 linux_dpdk/build_dpdk/ 下创建 compile_commands.json

    1. "settings": {
    2. "clangd.arguments": [
    3. "-background-index",
    4. "--compile-commands-dir=linux_dpdk/build_dpdk"
    5. ],

    构建输出将在“脚本”文件夹中

    更多选择

    1. $./b configure --sanitized
    2. $./b configure --gcc6
    3. $./b configure --no-mlx
    4. $./b configure --with-ntacc

    如何使用 gdb TRex 进行调试

    从“脚本”文件夹

    $./t-rex-64-debug-gdb [args]

    此脚本将加载将补丁设置为 so 并运行 gdb

    如何构建 TRex 模拟器

    1. $cd linux
    2. $./b configure (only once)
    3. $./b build

    如何构建文档

    1. $cd doc
    2. $./b configure (only once)
    3. $./b build

    构建输出将在“脚本”文件夹中

    运行模拟单元测试

    1. $cd script
    2. $./bp-sim-64 --ut
    3. $./bp-sim-64-debug --ut

    运行仿真功能

    1. $cd script
    2. $ ./run_regression --func

    TRex 无状态 Python API

    TRex 是流量生成器

    该站点涵盖了 TRex 的 Python API,并解释了如何根据您的需要使用它。要完全了解 API 的工作原理以及如何设置服务器端,请查看TRex 网站文档部分下的trex-core Wiki 。

    如何安装

    TRex 包包含 trex_client.tar.gz
    把它放在你喜欢的任何地方,最好是和你的脚本一样的地方。
    (如果它和你的脚本不在同一个地方,你需要确保 trex_client 目录在 sys.path 中)

    使用命令解包:

    tar -xzf trex_client.tar.gz

    如何使用

    客户端假定服务器正在运行。
    解压缩客户端包后,您可以在开箱即用的示例目录中验证基本测试:

    1. cd trex_client/stl/examples
    2. python stl_imix.py -s <server address>

    如果您看到如下内容,您可以验证流量是否已发送并正确到达:

    1. Mapped ports to sides [0, 2] <--> [1, 3]
    2. Injecting [0, 2] <--> [1, 3] on total rate of '30%' for 10 seconds
    3. Packets injected from [0, 2]: 473,856
    4. Packets injected from [1, 3]: 473,856
    5. packets lost from [0, 2] --> [0, 2]: 0 pkts
    6. packets lost from [1, 3] --> [1, 3]: 0 pkts
    7. Test has passed :-)

    此外,在 stl 文件夹中有一些目录,其中包含定义流和控制台的配置文件(您可以使用它们轻松发送配置文件)

    如何 pyATS 

    pyATS 兼容性

    TRex 支持 Python2 和 Python3 pyATS。

    • 安装 python2/python3 pyats

      /auto/pyats/bin/pyats-install –python2 /auto/pyats/bin/pyats-install –python3

    • 更新路径

      • 选项1(更好)

        export PYTHONPATH=[your path]/automation/trex_control_plane/interactive 或者如果是客户端库 export PYTHONPATH=[your path]trex_client_v2xx/interactive

        $PYTHON -m [你的主要] -p $PWD $INPUT_ARGS

      • 选项 2

        setenv TREX_PATH 到 trex 无状态库路径 setenv TREX_PATH <your path>/automation/trex_control_plane/interactive/ 或者如果是客户端库 setenv TREX_PATH <your path>/trex_client_v2xx/interactive

        在脚本或作业文件中,将 TREX_PATH 添加到 sys.path:

        import sys, os; sys.path.append(os.environ['TREX_PATH'])

    • 在任何情况下都不要包含 ../interactive 之外的内部路径。这可能会导致意外行为

    • 脚本中的源 trex 无状态库:

    1. from trex.stl.api import *
    2. from scapy.contrib.mpls import *
    3. from trex.stl.trex_stl_hltapi import *

    教程:准备 TRex 配置文件

    目标

    定义 TRex 物理或虚拟端口并创建配置文件。

    按照本章 第一次配置

    教程:加载 TRex 服务器,简单 IPv4 UDP

    目标

    从 TRex 服务器的所有端口发送简单的 UDP 数据包。

    流量配置

    以下配置文件定义了一个流,其 IP/UDP 数据包模板具有 10 个字节的x (0x78) 负载。有关使用Scapy定义数据包的更多示例,请参阅Scapy 文档

    文件

    stl/udp_1pkt_simple.py

    1. from trex_stl_lib.api import *
    2. class STLS1(object):
    3. def create_stream (self):
    4. return STLStream(
    5. packet =
    6. STLPktBuilder(
    7. pkt = Ether()/IP(src="16.0.0.1",dst="48.0.0.1")/
    8. UDP(dport=12,sport=1025)/(10*'x') 1
    9. ),
    10. mode = STLTXCont()) 2
    11. def get_streams (self, direction = 0, **kwargs): 3
    12. # create 1 stream
    13. return [ self.create_stream() ]
    14. # dynamic load - used for TRex console or simulator
    15. def register(): 4
    16. return STLS1()

    说明:

    1、定义数据包。在这种情况下,数据包是具有 10 个字节x的 IP/UDP 。有关更多信息,请参阅Scapy 文档

    2、模式:连续。费率:1 PPS(默认费率为 1 PPS)

    3、该get_streams功能是强制性的。

    4、每个流量配置文件模块都需要一个register功能。

    SRC/DST MAC 地址取自 /etc/trex_cfg.yaml。要更改它们,请将 Ether(dst="00:00:dd:dd:00:01") 添加到所需的目的地。

    启动 TRex 作为服务器

    TRex 包包括所有必需的包。不需要安装任何 Python 包(包括Scapy)。

    [bash]>sudo ./t-rex-64 -i
    • 等到服务器启动并运行。

    • (可选)-c用于添加更多内核。

    • (可选)--cfg用于指定不同的配置文件。默认值为 /etc/trex_cfg.yaml

    与控制台连接

    在同一台机器上,在新的终端窗口中(使用xtermssh再次打开新窗口),使用 连接到 TRex trex-console

    1. [bash]>trex-console #1
    2. Connecting to RPC server on localhost:4501 [SUCCESS]
    3. connecting to publisher server on localhost:4500 [SUCCESS]
    4. Acquiring ports [0, 1, 2, 3]: [SUCCESS]
    5. 125.69 [ms]
    6. trex>start -f stl/udp_1pkt_simple.py -m 10mbps -a #2
    7. Removing all streams from port(s) [0, 1, 2, 3]: [SUCCESS]
    8. Attaching 1 streams to port(s) [0, 1, 2, 3]: [SUCCESS]
    9. Starting traffic on port(s) [0, 1, 2, 3]: [SUCCESS]
    10. # pause the traffic on all port
    11. >pause -a #3
    12. # resume the traffic on all port
    13. >resume -a #4
    14. # stop traffic on all port
    15. >stop -a #5
    16. # show dynamic statistic
    17. >tui

    说明:

    1、从本地计算机连接到 TRex 服务器。

    2、以 10 mbps 的速度启动所有端口上的流量。也可以指定为 MPPS。示例:14 MPPS ( -m 14mpps)。

    3、暂停流量。

    4、简述。

    5、停止所有端口上的流量。

    如果出现连接错误,请打开 /etc/trex_cfg.yaml 文件,将enable_zmq_pub : truezmq_pub_port : 4501 从文件中删除和等关键字。

    查看流

    要显示所有端口的流数据,请使用streams -a.

    1. trex>streams -a
    2. Port 0:
    3. ID | packet type | length | mode | rate | next stream
    4. -----------------------------------------------------------------------------------
    5. 1 | Ethernet:IP:UDP:Raw | 56 | Continuous | 1.00 pps | -1
    6. Port 1:
    7. ID | packet type | length | mode | rate | next stream
    8. -----------------------------------------------------------------------------------
    9. 1 | Ethernet:IP:UDP:Raw | 56 | Continuous | 1.00 pps | -1
    10. Port 2:
    11. ID | packet type | length | mode | rate | next stream
    12. -----------------------------------------------------------------------------------
    13. 1 | Ethernet:IP:UDP:Raw | 56 | Continuous | 1.00 pps | -1
    14. Port 3:
    15. ID | packet type | length | mode | rate | next stream
    16. -----------------------------------------------------------------------------------
    17. 1 | Ethernet:IP:UDP:Raw | 56 | Continuous | 1.00 pps | -1

    查看命令帮助

    要查看命令的帮助,请使用<command> --help.

    查看一般统计信息

    要查看一般统计数据,请使用tui打开“文本用户界面”。

    1. TRex >tui
    2. Global Statistics
    3. Connection : localhost, Port 4501
    4. Version : v1.93, UUID: N/A
    5. Cpu Util : 0.2%
    6. :
    7. Total Tx L2 : 40.01 Mb/sec
    8. Total Tx L1 : 52.51 Mb/sec
    9. Total Rx : 40.01 Mb/sec
    10. Total Pps : 78.14 Kpkt/sec
    11. :
    12. Drop Rate : 0.00 b/sec
    13. Queue Full : 0 pkts
    14. Port Statistics
    15. port | 0 | 1 |
    16. --------------------------------------------------------
    17. owner | hhaim | hhaim |
    18. state | ACTIVE | ACTIVE |
    19. -- | | |
    20. Tx bps L2 | 10.00 Mbps | 10.00 Mbps |
    21. Tx bps L1 | 13.13 Mbps | 13.13 Mbps |
    22. Tx pps | 19.54 Kpps | 19.54 Kpps |
    23. Line Util. | 0.13 % | 0.13 % |
    24. --- | | |
    25. Rx bps | 10.00 Mbps | 10.00 Mbps |
    26. Rx pps | 19.54 Kpps | 19.54 Kpps |
    27. ---- | | |
    28. opackets | 1725794 | 1725794 |
    29. ipackets | 1725794 | 1725794 |
    30. obytes | 110450816 | 110450816 |
    31. ibytes | 110450816 | 110450816 |
    32. tx-bytes | 110.45 MB | 110.45 MB |
    33. rx-bytes | 110.45 MB | 110.45 MB |
    34. tx-pkts | 1.73 Mpkts | 1.73 Mpkts |
    35. rx-pkts | 1.73 Mpkts | 1.73 Mpkts |
    36. ----- | | |
    37. oerrors | 0 | 0 |
    38. ierrors | 0 | 0 |
    39. status: /
    40. browse: 'q' - quit, 'g' - dashboard, '0-3' - port display
    41. dashboard: 'p' - pause, 'c' - clear, '-' - low 5%, '+' - up 5%,

    扩展

    在此示例中,TRex从所有端口发送相同的数据包如果您的设置与环回连接,您将在 Rx 端口 1 中看到来自端口 0 的 Tx 数据包,反之亦然。如果您有带静态路由的 DUT,您可能会看到所有数据包都流向特定端口。

    静态路由

    1. interface TenGigabitEthernet0/0/0
    2. mtu 9000
    3. ip address 1.1.9.1 255.255.255.0
    4. !
    5. interface TenGigabitEthernet0/1/0
    6. mtu 9000
    7. ip address 1.1.10.1 255.255.255.0
    8. !
    9. ip route 16.0.0.0 255.0.0.0 1.1.9.2
    10. ip route 48.0.0.0 255.0.0.0 1.1.10.2

    在此示例中,所有数据包都被路由到该TenGigabitEthernet0/1/0端口。以下示例使用该direction标志来更改它。

    文件

    stl/udp_1pkt_simple_bdir.py

    1. class STLS1(object):
    2. def create_stream (self):
    3. return STLStream(
    4. packet =
    5. STLPktBuilder(
    6. pkt = Ether()/IP(src="16.0.0.1",dst="48.0.0.1")/
    7. UDP(dport=12,sport=1025)/(10*'x')
    8. ),
    9. mode = STLTXCont())
    10. def get_streams (self, direction = 0, **kwargs):
    11. # create 1 stream
    12. if direction==0: 1
    13. src_ip="16.0.0.1"
    14. dst_ip="48.0.0.1"
    15. else:
    16. src_ip="48.0.0.1"
    17. dst_ip="16.0.0.1"
    18. pkt = STLPktBuilder(
    19. pkt = Ether()/IP(src=src_ip,dst=dst_ip)/
    20. UDP(dport=12,sport=1025)/(10*'x') )
    21. return [ STLStream( packet = pkt,mode = STLTXCont()) ]

    说明:

    1、标志的这种使用direction导致为每个方向发送不同的数据包。

    教程:从远程服务器连接

    目标

    通过控制台从远程机器连接到 TRex 服务器。

    检查TRex 服务器是否正常运行

    确保TRex 服务器正在运行。如果没有,请在交互模式下运行 TRex。

    [bash]>sudo ./t-rex-64 -i

    与控制台连接

    从远程机器,用于trex-console连接。包括-s标志,如下所示,以指定服务器。

    [bash]>trex-console -s csi-kiwi-02  #1

    说明:

    1、TRex 服务器是 csi-kiwi-02。

    TRex 客户端需要 Python 版本 2.7.x 或 3.4.x。要更改 Python 版本,请按如下方式设置PYTHON环境变量:

    tcsh shell

    [tcsh]>setenv PYTHON /bin/python     #tcsh

    bash shell

    [bash]>extern PYTHON=/bin/mypython    #bash

    客户端计算机应运行 Python 2.7.x 或 3.4.x。支持 Cisco CEL/ADS。TRex 包包括所需的客户端存档

    教程:源和目标 MAC 地址

    目标

    更改源/目标 MAC 地址。

    每个 TRex 端口都有一个在 /etc/trex_cfg.yaml 配置文件中配置的源和目标 MAC (DUT)。源 MAC 不一定是 EEPROM 中配置的硬件 MAC 地址。默认情况下,使用硬件指定的 MAC 地址(源和目标)。如果明确配置了源或目标 MAC 地址,则该地址优先于硬件指定的默认值。

                                                                    表 3. MAC 地址

    ScapySource MACDestination MAC

    Ether()

    trex_cfg (src)

    trex_cfg(dst)

    Ether(src="00:bb:12:34:56:01")

    00:bb:12:34:56:01

    trex_cfg(dst)

    Ether(dst="00:bb:12:34:56:01")

    trex_cfg(src)

    00:bb:12:34:56:01

    文件

    stl/udp_1pkt_1mac_override.py

    1. def create_stream (self):
    2. base_pkt = Ether(src="00:bb:12:34:56:01")/ 1
    3. IP(src="16.0.0.1",dst="48.0.0.1")/
    4. UDP(dport=12,sport=1025)

    说明:

    1、指定源接口 MAC 将替换配置 YAML 文件中指定的默认值。

    /etc/trex_cfg.yaml仅当数据包的目标 MAC 与配置文件中为该端口定义的 HW Src MAC 匹配时,TRex 端口才会接收数据包。或者,可以将端口置于混杂模式,允许端口接收线路上的所有数据包。该端口可以通过 API 或控制台上的以下命令配置为混杂模式:portattr -a --prom。

    将端口设置为混杂模式并显示端口状态:

    1. trex>portattr -a --prom on #1
    2. trex>stats --ps #2
    3. Port Status
    4. port | 0 | 1 |
    5. ---------------------------------------------------------------
    6. driver | rte_ixgbe_pmd | rte_ixgbe_pmd |
    7. maximum | 10 Gb/s | 10 Gb/s |
    8. status | IDLE | IDLE |
    9. promiscuous | on | on | #3
    10. -- | | |
    11. HW src mac | 90:e2:ba:36:33:c0 | 90:e2:ba:36:33:c1 |
    12. SW src mac | 00:00:00:01:00:00 | 00:00:00:01:00:00 |
    13. SW dst mac | 00:00:00:01:00:00 | 00:00:00:01:00:00 |
    14. --- | | |
    15. PCI Address | 0000:03:00.0 | 0000:03:00.1 |
    16. NUMA Node | 0 | 0 |

    说明:

    1、将所有端口配置为混杂模式。

    2、显示端口状态。

    3、“on”表示端口混杂模式。

    通过 Python API 将端口更改为混杂模式:

    1. c = STLClient(verbose_level ="error")
    2. c.connect()
    3. my_ports=[0,1]
    4. # prepare our ports
    5. c.reset(ports = my_ports)
    6. # port info, mac-addr info, speed
    7. print c.get_port_info(my_ports) 1
    8. c.set_port_attr(my_ports, promiscuous = True) 2

    说明:

    1、获取所有端口的端口信息。

    2、将端口属性更改为promiscuous = True

    有关更多信息,请参阅Python 客户端 API

    默认情况下,接口未设置为混杂模式。通常,在将端口更改为特定测试的混杂模式后,建议将其更改回非混杂模式。

    教程:Python 自动化

    目标

    在本地或远程机器上使用 Python 进行简单的自动化测试。

    目录

    Python API 示例:automation/trex_control_plane/interactive/trex/examples/stl

    Python API 库:automation/trex_control_plane/interactive/trex/stl

    TRex 控制台使用 Python API 库通过 ZMQ 使用 JSON-RPC2 协议与 TRex 服务器交互。

                                                              图 4. RPC 服务器组件

    文件

    stl_bi_dir_flows.py

    1. import stl_path 1
    2. from trex_stl_lib.api import * 2
    3. import time
    4. import json
    5. # simple packet creation 3
    6. def create_pkt (size, direction):
    7. ip_range = {'src': {'start': "10.0.0.1", 'end': "10.0.0.254"},
    8. 'dst': {'start': "8.0.0.1", 'end': "8.0.0.254"}}
    9. if (direction == 0):
    10. src = ip_range['src']
    11. dst = ip_range['dst']
    12. else:
    13. src = ip_range['dst']
    14. dst = ip_range['src']
    15. vm = [
    16. # src 4
    17. STLVmFlowVar(name="src",
    18. min_value=src['start'],
    19. max_value=src['end'],
    20. size=4,op="inc"),
    21. STLVmWrFlowVar(fv_name="src",pkt_offset= "IP.src"),
    22. # dst
    23. STLVmFlowVar(name="dst",
    24. min_value=dst['start'],
    25. max_value=dst['end'],
    26. size=4,op="inc"),
    27. STLVmWrFlowVar(fv_name="dst",pkt_offset= "IP.dst"),
    28. # checksum
    29. STLVmFixIpv4(offset = "IP")
    30. ]
    31. base = Ether()/IP()/UDP()
    32. pad = max(0, len(base)) * 'x'
    33. return STLPktBuilder(pkt = base/pad,
    34. vm = vm)
    35. def simple_burst ():
    36. # create client
    37. c = STLClient()
    38. # username/server can be changed those are the default
    39. # username = common.get_current_user(),
    40. # server = "localhost"
    41. # STLClient(server = "my_server",username ="trex_client") for example
    42. passed = True
    43. try:
    44. # turn this on for some information
    45. #c.set_verbose("high")
    46. # create two streams
    47. s1 = STLStream(packet = create_pkt(200, 0),
    48. mode = STLTXCont(pps = 100))
    49. # second stream with a phase of 1ms (inter stream gap)
    50. s2 = STLStream(packet = create_pkt(200, 1),
    51. isg = 1000,
    52. mode = STLTXCont(pps = 100))
    53. # connect to server
    54. c.connect() 5
    55. # prepare our ports (my machine has 0 <--> 1 with static route)
    56. c.reset(ports = [0, 1]) # Acquire port 0,1 for $USER 6
    57. # add both streams to ports
    58. c.add_streams(s1, ports = [0])
    59. c.add_streams(s2, ports = [1])
    60. # clear the stats before injecting
    61. c.clear_stats()
    62. # choose rate and start traffic for 10 seconds on 5 mpps
    63. print "Running 5 Mpps on ports 0, 1 for 10 seconds..."
    64. c.start(ports = [0, 1], mult = "5mpps", duration = 10) 7
    65. # block until done
    66. c.wait_on_traffic(ports = [0, 1]) 8
    67. # read the stats after the test
    68. stats = c.get_stats() 9
    69. print json.dumps(stats[0], indent = 4, separators=(',', ': '), sort_keys = True)
    70. print json.dumps(stats[1], indent = 4, separators=(',', ': '), sort_keys = True)
    71. lost_a = stats[0]["opackets"] - stats[1]["ipackets"]
    72. lost_b = stats[1]["opackets"] - stats[0]["ipackets"]
    73. print "\npackets lost from 0 --> 1: {0} pkts".format(lost_a)
    74. print "packets lost from 1 --> 0: {0} pkts".format(lost_b)
    75. if (lost_a == 0) and (lost_b == 0):
    76. passed = True
    77. else:
    78. passed = False
    79. except STLError as e:
    80. passed = False
    81. print e
    82. finally:
    83. c.disconnect() 10
    84. if passed:
    85. print "\nTest has passed :-)\n"
    86. else:
    87. print "\nTest has failed :-(\n"
    88. # run the tests
    89. simple_burst()

    说明:

    1、导入 stl_path。此处的路径特定于此示例。配置时,提供 stl_trex 库的路径。

    2、导入 TRex 无状态库。配置时,提供您的 TRex 无状态库的路径。

    3、使用 Scapy 按方向创建数据包。

    4、有关信息,请参阅现场引擎部分。

    5、连接到本地 TRex。可以添加用户名和服务器。

    6、获取端口。

    7、加载流量配置文件并开始生成流量。

    8、等待流量完成。有一个轮询功能,因此您可以在等待时测试做某事。

    9、获取端口统计信息。

    10、断开连接。

    有关使用 Python API 的详细信息,请参阅TRex Stateless Python API。

    教程:HLT Python API

    HLT Python API 是原生层之上的一层。它支持标准的 Cisco 流量生成器 API。有关详细信息,请参阅 Cisco/IXIA/Spirent 文档。
    TRex 支持有限数量的 HLTAPI 参数。为了简单和灵活,建议使用本机 API。

    支持的 HLT Python API 类:

    • 设备控制

      • 连接

      • cleanup_session

      • 设备信息

      • 信息

    • 界面

      • 接口配置

      • interface_stats

    • 交通

      • traffic_config - 并非所有参数都受支持

      • 交通控制

      • 交通统计

    详情见:附录

    文件

    hlt_udp_simple.py

    1. import sys
    2. import argparse
    3. import stl_path
    4. from trex_stl_lib.api import * 1
    5. from trex_stl_lib.trex_stl_hltapi import * 2
    6. if __name__ == "__main__":
    7. parser = argparse.ArgumentParser(usage="""
    8. Connect to TRex and send burst of packets
    9. examples
    10. hlt_udp_simple.py -s 9000 -d 30
    11. hlt_udp_simple.py -s 9000 -d 30 -rate_percent 10
    12. hlt_udp_simple.py -s 300 -d 30 -rate_pps 5000000
    13. hlt_udp_simple.py -s 800 -d 30 -rate_bps 500000000 --debug
    14. then run the simulator on the output
    15. ./stl-sim -f example.py -o a.pcap ==> a.pcap include the packet
    16. """,
    17. description="Example for TRex HLTAPI",
    18. epilog=" based on hhaim's stl_run_udp_simple example")
    19. parser.add_argument("--ip",
    20. dest="ip",
    21. help='Remote trex ip',
    22. default="127.0.0.1",
    23. type = str)
    24. parser.add_argument("-s", "--frame-size",
    25. dest="frame_size",
    26. help='L2 frame size in bytes without FCS',
    27. default=60,
    28. type = int,)
    29. parser.add_argument('-d','--duration',
    30. dest='duration',
    31. help='duration in second ',
    32. default=10,
    33. type = int,)
    34. parser.add_argument('--rate-pps',
    35. dest='rate_pps',
    36. help='speed in pps',
    37. default="100")
    38. parser.add_argument('--src',
    39. dest='src_mac',
    40. help='src MAC',
    41. default='00:50:56:b9:de:75')
    42. parser.add_argument('--dst',
    43. dest='dst_mac',
    44. help='dst MAC',
    45. default='00:50:56:b9:34:f3')
    46. args = parser.parse_args()
    47. hltapi = CTRexHltApi()
    48. print 'Connecting to TRex'
    49. res = hltapi.connect(device = args.ip, port_list = [0, 1], reset = True, break_locks = True)
    50. check_res(res)
    51. ports = res['port_handle']
    52. if len(ports) < 2:
    53. error('Should have at least 2 ports for this test')
    54. print 'Connected, acquired ports: %s' % ports
    55. print 'Creating traffic'
    56. res = hltapi.traffic_config(mode = 'create', bidirectional = True,
    57. port_handle = ports[0], port_handle2 = ports[1],
    58. frame_size = args.frame_size,
    59. mac_src = args.src_mac, mac_dst = args.dst_mac,
    60. mac_src2 = args.dst_mac, mac_dst2 = args.src_mac,
    61. l3_protocol = 'ipv4',
    62. ip_src_addr = '10.0.0.1', ip_src_mode = 'increment', ip_src_count = 254,
    63. ip_dst_addr = '8.0.0.1', ip_dst_mode = 'increment', ip_dst_count = 254,
    64. l4_protocol = 'udp',
    65. udp_dst_port = 12, udp_src_port = 1025,
    66. stream_id = 1, # temporary workaround, add_stream does not return stream_id
    67. rate_pps = args.rate_pps,
    68. )
    69. check_res(res)
    70. print 'Starting traffic'
    71. res = hltapi.traffic_control(action = 'run', port_handle = ports[:2])
    72. check_res(res)
    73. wait_with_progress(args.duration)
    74. print 'Stopping traffic'
    75. res = hltapi.traffic_control(action = 'stop', port_handle = ports[:2])
    76. check_res(res)
    77. res = hltapi.traffic_stats(mode = 'aggregate', port_handle = ports[:2])
    78. check_res(res)
    79. print_brief_stats(res)
    80. res = hltapi.cleanup_session(port_handle = 'all')
    81. check_res(res)
    82. print 'Done'

    说明:

    1、导入本机 TRex API。

    2、导入 HLT API。

    教程:简单的 IPv4/UDP 数据包模拟器

    目标

    使用 TRex 无状态模拟器。

    演示 TRex 模拟器的最基本用例。

    TRex 软件包包括一个模拟器工具,stl-sim. 模拟器作为调用可执行文件的 Python 脚本运行。模拟器工具的平台要求与 TRex 相同。

    TRex 模拟器可以:

    • 在 TRex 上运行之前测试您的流量配置文件。

    • 生成输出 PCAP 文件。

    • 模拟多个线程。

    • 从一种类型的配置文件转换为另一种类型。

    • 将任何配置文件转换为 JSON (API)。请参阅:TRex 流规范

    示例流量配置文件:

    1. from trex_stl_lib.api import *
    2. class STLS1(object):
    3. def create_stream (self):
    4. return STLStream(
    5. packet =
    6. STLPktBuilder(
    7. pkt = Ether()/IP(src="16.0.0.1",dst="48.0.0.1")/
    8. UDP(dport=12,sport=1025)/(10*'x') 1
    9. ),
    10. mode = STLTXCont()) 2
    11. def get_streams (self, direction = 0, **kwargs):
    12. # create 1 stream
    13. return [ self.create_stream() ]
    14. # dynamic load - used for TRex console or simulator
    15. def register(): 3
    16. return STLS1()

    说明:

    1、定义数据包 - 在这种情况下,IP/UDP 具有 10 个字节的x

    2、模式是连续的,速率为 1 PPS。(默认费率:1 PPS)

    3、每个流量配置文件模块都需要一个register功能。

    下面通过 TRex 模拟器运行流量配置文件,将数据包数量限制为 10,并将输出存储在 PCAP 文件中。

    1. [bash]>./stl-sim -f stl/udp_1pkt_simple.py -o b.pcap -l 10
    2. executing command: 'bp-sim-64-debug --pcap --sl --cores 1 --limit 5000 -f /tmp/tmpq94Tfx -o b.pcap'
    3. General info:
    4. ------------
    5. image type: debug
    6. I/O output: b.pcap
    7. packet limit: 10
    8. core recording: merge all
    9. Configuration info:
    10. -------------------
    11. ports: 2
    12. cores: 1
    13. Port Config:
    14. ------------
    15. stream count: 1
    16. max PPS : 1.00 pps
    17. max BPS L1 : 672.00 bps
    18. max BPS L2 : 512.00 bps
    19. line util. : 0.00 %
    20. Starting simulation...
    21. Simulation summary:
    22. -------------------
    23. simulated 10 packets
    24. written 10 packets to 'b.pcap'

    上一步模拟器生成的输出PCAP文件内容:

                                           图 5. 存储在 PCAP 文件中的 TRex 模拟器输出

    添加--json显示用于添加流的 JSON 命令的详细信息:

    1. [bash]>./stl-sim -f stl/udp_1pkt_simple.py --json
    2. [
    3. {
    4. "id": 1,
    5. "jsonrpc": "2.0",
    6. "method": "add_stream",
    7. "params": {
    8. "handler": 0,
    9. "port_id": 0,
    10. "stream": {
    11. "action_count": 0,
    12. "enabled": true,
    13. "flags": 0,
    14. "isg": 0.0,
    15. "mode": {
    16. "rate": {
    17. "type": "pps",
    18. "value": 1.0
    19. },
    20. "type": "continuous"
    21. },
    22. "next_stream_id": -1,
    23. "packet": {
    24. "binary": "AAAAAQAAAAAAAgAACABFAAAmAA",
    25. "meta": ""
    26. },
    27. "rx_stats": {
    28. "enabled": false
    29. },
    30. "self_start": true,
    31. "vm": {
    32. "instructions": [],
    33. "split_by_var": ""
    34. }
    35. },
    36. "stream_id": 1
    37. }
    38. },
    39. {
    40. "id": 1,
    41. "jsonrpc": "2.0",
    42. "method": "start_traffic",
    43. "params": {
    44. "duration": -1,
    45. "force": true,
    46. "handler": 0,
    47. "mul": {
    48. "op": "abs",
    49. "type": "raw",
    50. "value": 1.0
    51. },
    52. "port_id": 0
    53. }
    54. }
    55. ]

    有关流定义的更多信息,请参阅RPC 规范

    要将配置文件转换为 YAML 格式:

    1. $./stl-sim -f stl/udp_1pkt_simple.py --yaml
    2. - stream:
    3. action_count: 0
    4. enabled: true
    5. flags: 0
    6. isg: 0.0
    7. mode:
    8. pps: 1.0
    9. type: continuous
    10. packet:
    11. binary: AAAAAQAAAAAAAgAACABFAAAmAAEAAEARO
    12. meta: ''
    13. rx_stats:
    14. enabled: false
    15. self_start: true
    16. vm:
    17. instructions: []
    18. split_by_var: ''

    要显示数据包详细信息,请使用该--pkt选项(使用 Scapy)。

    1. [bash]>./stl-sim -f stl/udp_1pkt_simple.py --pkt
    2. =======================
    3. Stream 0
    4. =======================
    5. ###[ Ethernet ]###
    6. dst = 00:00:00:01:00:00
    7. src = 00:00:00:02:00:00
    8. type = IPv4
    9. ###[ IP ]###
    10. version = 4L
    11. ihl = 5L
    12. tos = 0x0
    13. len = 38
    14. id = 1
    15. flags =
    16. frag = 0L
    17. ttl = 64
    18. proto = udp
    19. chksum = 0x3ac5
    20. src = 16.0.0.1
    21. dst = 48.0.0.1
    22. \options \
    23. ###[ UDP ]###
    24. sport = blackjack
    25. dport = 12
    26. len = 18
    27. chksum = 0x6161
    28. ###[ Raw ]###
    29. load = 'xxxxxxxxxx'
    30. 0000 00 00 00 01 00 00 00 00 00 02 00 00 08 00 45 00 ..............E.
    31. 0010 00 26 00 01 00 00 40 11 3A C5 10 00 00 01 30 00 .&....@.:.....0.
    32. 0020 00 01 04 01 00 0C 00 12 61 61 78 78 78 78 78 78 ........aaxxxxxx
    33. 0030 78 78 78 78 xxxx

    要将任何配置文件类型再次转换为本机,请使用该--native选项,如下例所示,其中包括输入文件、将其转换为本机的命令和输出:

    输入 YAML 格式
    1. - name: udp_64B
    2. stream:
    3. self_start: True
    4. packet:
    5. binary: AAAAAAAAAAAAAAAACABFAAAuBNIAAH8R9usQAAABMAAAAQQBBAEAEgAAAAAAAAAAAAAAAAAAAAAAAAAA
    6. mode:
    7. type: continuous
    8. pps: 100

    转换为本机的命令:

    [bash]>./stl-sim -f my_yaml.yaml --native

    输出:

    输出本机
    1. # !!! Auto-generated code !!!
    2. from trex_stl_lib.api import *
    3. class STLS1(object):
    4. def get_streams(self):
    5. streams = []
    6. packet = (Ether(src='00:de:01:0a:01:00', dst='00:50:56:80:0d:28', type=2048) /
    7. IP(src='101.0.0.1', proto=17, dst='102.0.0.1', chksum=28605, len=46, flags=2L, ihl=5L, id=0) /
    8. UDP(dport=2001, sport=2001, len=26, chksum=1176) /
    9. Raw(load='\xde\xad\xbe\xef\x00\x01\x06\x07\x08\x09\x0a\x0b\x00\x9b\xe7\xdb\x82M'))
    10. vm = STLScVmRaw([], split_by_field = '')
    11. stream = STLStream(packet = CScapyTRexPktBuilder(pkt = packet, vm = vm),
    12. name = 'udp_64B',
    13. mac_src_override_by_pkt = 0,
    14. mac_dst_override_mode = 0,
    15. mode = STLTXCont(pps = 100))
    16. streams.append(stream)
    17. return streams
    18. def register():
    19. return STLS1()

    扩展

    以下是主要的流量配置文件格式。本机是首选格式。如何定义流量与如何控制/激活流量之间存在分离。API/控制台/GUI 可以加载流量配置文件并启动/停止/获取统计信息。由于这种分离,可以共享流量配置文件。

    表 4. 流量配置文件格式

    配置文件类型格式描述
    Native

    Python

    最灵活。任何格式都可以使用带有选项的stl-sim命令转换为原生格式。--native

    HLT

    Python

    使用 HLT 参数。

    YAML/JSON

    YAML/JSON

    公分母流量配置文件。信息以 YAML 格式在控制台、GUI 和模拟器之间共享。这种格式很难用于定义数据包;主要用于机器使用。可以使用带有选项的stl-sim命令将YAML 转换为本机。--native

    教程:端口层模式配置

    目标

    使用 IPv4 或 MAC 地址配置 TRex 端口。

    TRex 端口可以在两种不同的互斥模式下运行:

    • 第 2 层模式- MAC 级别配置

    • 第 3 层模式- IPv4/IPv6 配置

                                                          表 5. 端口层模式

    模式端口配置要求笔记

    第 2 层模式

    为 L2 模式配置端口时,必须提供端口的目标 MAC 地址(v2.12 版本之前的 Legacy 模式)。

    -

    第 3 层模式

    为 L3 配置端口时,必须同时提供源 IPv4/IPv6 地址和 IPv4/IPv6 目标地址。

    作为配置 L3 的一个组成部分,客户端会尝试 ARP 解析目标地址并自动配置正确的目标 MAC,而不是在开始流量时发送 ARP 请求。

    注意:在 L3 模式下,TRex 服务器将生成免费的ARP数据包,以确保 DUT/路由器上没有 ARP 超时将导致测试失败。

                                                      配置 L2 模式 Console 示例 

    1. trex>service
    2. trex>l2 --help
    3. usage: port [-h] --port PORT --dst DST_MAC
    4. Configures a port in L2 mode
    5. optional arguments:
    6. -h, --help show this help message and exit
    7. --port PORT, -p PORT source port for the action
    8. --dst DST_MAC Configure destination MAC address
    9. trex(service)>l2 -p 0 --dst 6A:A7:B5:3A:4E:FF
    10. Setting port 0 in L2 mode: [SUCCESS]
    11. trex>service --off

                                                  配置L2模式示例- Python API

    1. client.set_service_mode(port = 0, enabled = True)
    2. client.set_l2_mode(port = 0, dst_mac = "6A:A7:B5:3A:4E:FF")
    3. client.set_service_mode(port = 0, enabled = False)

                                                   配置 L3 模式示例-Console

    1. trex>service
    2. trex(service)>l3 --help
    3. usage: port [-h] --port PORT --src SRC_IPV4 --dst DST_IPV4
    4. Configures a port in L3 mode
    5. optional arguments:
    6. -h, --help show this help message and exit
    7. --port PORT, -p PORT source port for the action
    8. --src SRC_IPV4 Configure source IPv4 address
    9. --dst DST_IPV4 Configure destination IPv4 address
    10. trex(service)>l3 -p 0 --src 1.1.1.2 --dst 1.1.1.1
    11. Setting port 0 in L3 mode: [SUCCESS]
    12. ARP resolving address '1.1.1.1': [SUCCESS]
    13. trex>service --off

                                               配置 L3 模式示例 - Python API

    1. client.set_service_mode(port = 0, enabled = True)
    2. client.set_l3_mode(port = 0, src_ipv4 = '1.1.1.2', dst_ipv4 = '1.1.1.1')
    3. client.set_service_mode(port = 0, enabled = False)
  • 相关阅读:
    python-(4-3)数据类型的应用(元组、集合)
    网络安全(黑客)自学
    史上最全JVM性能调优:线程+子系统+类加载+内存分配+垃圾回收
    智云谷再获AR HUD新项目定点,打开HUD出口海外新通道
    Java中的常见的设计模式总结
    进程管理(一)——进程
    【JAVAWEB】HTML的常见标签
    2023年9月到2024年1月计划安排
    pandas cut 的方法
    计网第五章(运输层)(七)(TCP的连接建立)
  • 原文地址:https://blog.csdn.net/qq_35029061/article/details/125438159