Skip to content

не могу понять логику работу trex в режиме stl на двух портах E810 разбитых на логические интерфейсы vlan #1211

@Evgeniy25-cyber

Description

@Evgeniy25-cyber

вот конфигурационный файл /etc/trex_cfg.yaml

Config file generated by dpdk_setup_ports.py

  • version: 2
    interfaces: ['98:01.0', '98:11.0', '98:01.1', '98:11.1']
    c: 16
    port_info:

    • default_gw : 192.168.101.1
      ip : 192.168.101.2
      vlan: 101
    • default_gw : 192.168.102.1
      ip : 192.168.102.2
      vlan: 102
    • default_gw : 192.168.103.1
      ip : 192.168.103.2
      vlan: 103
    • default_gw : 192.168.104.1
      ip : 192.168.104.2
      vlan: 104

    platform:
    master_thread_id: 0
    latency_thread_id: 1
    dual_if:
    - socket: 1
    threads: [32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47]

      - socket: 1
        threads: [48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63]
    

    memory:
    dp_flows: 40000000
    mbuf_9k: 560000
    ===========================================================================================
    вывод в console
    trex>portattr
    Port Status

    port | 0 | 1 | 2 | 3
    ----------------+----------------------+----------------------+----------------------+---------------------
    driver | net_iavf | net_iavf | net_iavf | net_iavf
    description | Ethernet Adaptive | Ethernet Adaptive | Ethernet Adaptive | Ethernet Adaptive
    link status | UP | UP | UP | UP
    link speed | 100 Gb/s | 100 Gb/s | 100 Gb/s | 100 Gb/s
    port status | IDLE | IDLE | IDLE | IDLE
    promiscuous | off | off | off | off
    multicast | off | off | off | off
    flow ctrl | N/A | N/A | N/A | N/A
    vxlan fs | - | - | - | -
    -- | | | |
    layer mode | IPv4 | IPv4 | IPv4 | IPv4
    src IPv4 | 192.168.101.2 | 192.168.102.2 | 192.168.103.2 | 192.168.104.2
    IPv6 | off | off | off | off
    src MAC | f6:c8:27:bf:6f:52 | 02:88:6c:36:b6:10 | 66:a0:57:d7:34:74 | 3e:f6:6e:08:11:88
    --- | | | |
    Destination | 192.168.101.1 | 192.168.102.1 | 192.168.103.1 | 192.168.104.1
    ARP Resolution | 90:54:b7:79:a4:83 | 90:54:b7:79:ac:83 | 90:54:b7:79:a4:83 | 90:54:b7:79:ac:83
    ---- | | | |
    VLAN | 101 | 102 | 103 | 104
    ----- | | | |
    PCI Address | 0000:98:01.0 | 0000:98:11.0 | 0000:98:01.1 | 0000:98:11.1
    NUMA Node | 1 | 1 | 1 | 1
    RX Filter Mode | hardware match | hardware match | hardware match | hardware match
    RX Queueing | off | off | off | off
    Grat ARP | every 120 seconds | every 120 seconds | every 120 seconds | every 120 seconds
    ------ | | | |

trex>

но при запуске такого скрипта
from trex_stl_lib.api import *
import argparse
import os

class STLImix(object):

def __init__(self):
    # Ваши IP‑диапазоны для каждого порта
    self.ip_ranges = {
        0: {
            'src': {'start': "16.0.0.1",  'end': "16.0.255.254"},
            'dst': {'start': "48.0.0.1",  'end': "48.0.255.254"}
        },
        1: {
            'src': {'start': "48.0.0.1", 'end': "48.0.255.254"},
            'dst': {'start': "16.0.0.1", 'end': "16.0.255.254"}
        },
        2: {
            'src': {'start': "17.0.0.1", 'end': "17.0.255.254"},
            'dst': {'start': "49.0.0.1", 'end': "49.0.255.254"}
        },
        3: {
            'src': {'start': "49.0.0.1", 'end': "49.0.255.254"},
            'dst': {'start': "17.0.0.1", 'end': "17.0.255.254"}
        }
    }

    # IMIX‑таблица: размер пакета, PPS, межпакетный интервал (ISG)
    self.imix_table = [
        {'size': 60,   'pps': 28,  'isg': 0.0},
        {'size': 590,  'pps': 16,  'isg': 0.1},
        {'size': 1514, 'pps': 4,   'isg': 0.2}
    ]

    # MAC‑адреса и VLAN для каждого порта (замените на реальные из portattr)
    self.macs = {
        0: {'src': "f6:c8:27:bf:6f:52", 'dst': "90:54:b7:79:a4:83"},
        1: {'src': "02:88:6c:36:b6:10", 'dst': "90:54:b7:79:ac:83"},
        2: {'src': "66:a0:57:d7:34:74", 'dst': "90:54:b7:79:a4:83"},  # замените на реальные
        3: {'src': "3e:f6:6e:08:11:88", 'dst': "90:54:b7:79:ac:83"}   # замените на реальные
    }
    self.vlan_ids = {0: 101, 1: 102, 2: 103, 3: 104}

def create_stream(self, size, pps, isg, vm, src_mac, dst_mac, vlan_id):
    # Создаём базовый пакет с MAC и VLAN
    base_pkt = Ether(src=src_mac, dst=dst_mac)
    if vlan_id:
        base_pkt /= Dot1Q(vlan=vlan_id)  # Добавляем VLAN‑тег
    base_pkt /= IP()/UDP()

    # Дополняем пакетом до нужного размера
    pad = max(0, size - len(base_pkt)) * 'x'
    pkt = STLPktBuilder(pkt=base_pkt/pad, vm=vm)


    return STLStream(
        isg=isg,
        packet=pkt,
        mode=STLTXCont(pps=pps)
    )

def get_streams(self, direction=0, tunables="", **kwargs):
    # Парсим аргументы (если нужны дополнительные настройки)
    parser = argparse.ArgumentParser(
        description='Argparser for {}'.format(os.path.basename(__file__)),
        formatter_class=argparse.ArgumentDefaultsHelpFormatter
    )
    args, unknown = parser.parse_known_args(tunables)
    if unknown:
        raise Exception('Unrecognized arguments: {}'.format(unknown))


    port_id = kwargs.get('port_id', 0)

    # Выбираем IP‑диапазоны для порта
    if direction == 0:
        src = self.ip_ranges[port_id]['src']
        dst = self.ip_ranges[port_id]['dst']
    else:
        src = self.ip_ranges[port_id]['dst']
        dst = self.ip_ranges[port_id]['src']

    # VM‑шаблон для генерации IP
    vm = STLVM()
    vm.var(name="src_ip", min_value=src['start'], max_value=src['end'], size=4, op="inc")
    vm.var(name="dst_ip", min_value=dst['start'], max_value=dst['end'], size=4, op="inc")
    vm.write(fv_name="src_ip", pkt_offset="IP.src")
    vm.write(fv_name="dst_ip", pkt_offset="IP.dst")
    vm.fix_chksum()  # Рсправляем checksum

    # Получаем MAC и VLAN для порта
    src_mac = self.macs[port_id]['src']
    dst_mac = self.macs[port_id]['dst']
    vlan_id = self.vlan_ids[port_id]

    # Создаём потоки для IMIX
    return [
        self.create_stream(x['size'], x['pps'], x['isg'], vm, src_mac, dst_mac, vlan_id)
        for x in self.imix_table
    ]

Функция для динамической загрузки профиля в TRex

def register():
return STLImix()

и если на сетевом уровне между сетевыми оборудование есть канал он передает значения где tx и rx не равные значения вот пример trex>portattr
Port Status

 port       |          0           |          1           |          2           |          3

----------------+----------------------+----------------------+----------------------+---------------------
driver | net_iavf | net_iavf | net_iavf | net_iavf
description | Ethernet Adaptive | Ethernet Adaptive | Ethernet Adaptive | Ethernet Adaptive
link status | UP | UP | UP | UP
link speed | 100 Gb/s | 100 Gb/s | 100 Gb/s | 100 Gb/s
port status | IDLE | IDLE | IDLE | IDLE
promiscuous | off | off | off | off
multicast | off | off | off | off
flow ctrl | N/A | N/A | N/A | N/A
vxlan fs | - | - | - | -
-- | | | |
layer mode | IPv4 | IPv4 | IPv4 | IPv4
src IPv4 | 192.168.101.2 | 192.168.102.2 | 192.168.103.2 | 192.168.104.2
IPv6 | off | off | off | off
src MAC | f6:c8:27:bf:6f:52 | 02:88:6c:36:b6:10 | 66:a0:57:d7:34:74 | 3e:f6:6e:08:11:88
--- | | | |
Destination | 192.168.101.1 | 192.168.102.1 | 192.168.103.1 | 192.168.104.1
ARP Resolution | 90:54:b7:79:a4:83 | 90:54:b7:79:ac:83 | 90:54:b7:79:a4:83 | 90:54:b7:79:ac:83
---- | | | |
VLAN | 101 | 102 | 103 | 104
----- | | | |
PCI Address | 0000:98:01.0 | 0000:98:11.0 | 0000:98:01.1 | 0000:98:11.1
NUMA Node | 1 | 1 | 1 | 1
RX Filter Mode | hardware match | hardware match | hardware match | hardware match
RX Queueing | off | off | off | off
Grat ARP | every 120 seconds | every 120 seconds | every 120 seconds | every 120 seconds
------ | | | |

trex>
Или он не может в такой конфигурации работать?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions