Esempio n. 1
0
def __gen_all_to_all_traffic(testbed_config,
                             port_config_list,
                             dut_hostname,
                             conn_data,
                             fanout_data,
                             priority,
                             prio_dscp_map):

    flows = []

    rate_percent = 100 / (len(port_config_list) - 1)
    duration_sec = 2
    pkt_size = 1024

    tx_port_id_list, rx_port_id_list = select_ports(port_config_list=port_config_list,
                                                    pattern="all to all",
                                                    rx_port_id=0)

    for tx_port_id in tx_port_id_list:
        for rx_port_id in rx_port_id_list:
            if tx_port_id == rx_port_id:
                continue

            tx_port_config = next((x for x in port_config_list if x.id == tx_port_id), None)
            rx_port_config = next((x for x in port_config_list if x.id == rx_port_id), None)

            tx_mac = tx_port_config.mac
            if tx_port_config.gateway == rx_port_config.gateway and \
               tx_port_config.prefix_len == rx_port_config.prefix_len:
                """ If soruce and destination port are in the same subnet """
                rx_mac = rx_port_config.mac
            else:
                rx_mac = tx_port_config.gateway_mac

            data_endpoint = PortTxRx(tx_port_name=testbed_config.ports[tx_port_id].name,
                                     rx_port_name=testbed_config.ports[rx_port_id].name)

            eth_hdr = EthernetHeader(src=FieldPattern(tx_mac),
                                     dst=FieldPattern(rx_mac),
                                     pfc_queue=FieldPattern([priority]))

            ip_prio = Priority(Dscp(phb=FieldPattern(choice=prio_dscp_map[priority]),
                                    ecn=FieldPattern(choice=Dscp.ECN_CAPABLE_TRANSPORT_1)))
            ipv4_hdr = Ipv4Header(src=FieldPattern(tx_port_config.ip),
                                  dst=FieldPattern(rx_port_config.ip),
                                  priority=ip_prio)

            flow_name = "Flow {} -> {}".format(tx_port_id, rx_port_id)
            flow = Flow(
                name=flow_name,
                tx_rx=TxRx(data_endpoint),
                packet=[Header(choice=eth_hdr), Header(choice=ipv4_hdr)],
                size=Size(pkt_size),
                rate=Rate('line', rate_percent),
                duration=Duration(FixedSeconds(seconds=duration_sec))
            )

            flows.append(flow)

    return flows
Esempio n. 2
0
def port_ipv4_traffic(tx):
    from abstract_open_traffic_generator.flow import Flow, Pattern, Ipv4
    from abstract_open_traffic_generator.flow import Ethernet, Vlan, Header, TxRx, PortTxRx
    from abstract_open_traffic_generator.flow import Size, Rate
    eth = Ethernet(dst=Pattern('00:00:01:00:00:01'),
                   src=Pattern('00:00:02:00:00:01'))
    vlan = Vlan(priority=Pattern(['0', '1', '2']),
                cfi=Pattern('0'),
                id=Pattern('1'))
    ipv4 = Ipv4(src=Pattern('1.1.1.1'), dst=Pattern('1.1.2.1'))
    return Flow(name='Port Based Ipv4 Traffic',
                tx_rx=TxRx(PortTxRx(tx_port_name=tx.name)),
                packet=[Header(eth), Header(vlan),
                        Header(ipv4)],
                size=Size(512),
                rate=Rate(unit='pps', value=1000000))
Esempio n. 3
0
def b2b_port_flow_config(options, tx_port, rx_port):
    """Returns a configuration with an ethernet flow.
    The flow uses a PortTxRx endpoint.
    """
    from abstract_open_traffic_generator.config import Config
    from abstract_open_traffic_generator.flow import Flow, TxRx, PortTxRx, \
        Size, Rate, Duration, FixedPackets, Header, Ethernet

    endpoint = PortTxRx(tx_port_name=tx_port.name,
                        rx_port_names=[rx_port.name])
    flow = Flow(name='Port Flow',
                tx_rx=TxRx(endpoint),
                packet=[Header(Ethernet())],
                size=Size(128),
                rate=Rate(unit='pps', value=1000),
                duration=Duration(FixedPackets(packets=10000)))
    return Config(ports=[tx_port, rx_port], flows=[flow], options=options)
Esempio n. 4
0
def __gen_traffic(testbed_config,
                  port_config_list,
                  port_id,
                  duthost,
                  pause_flow_name,
                  global_pause,
                  pause_prio_list,
                  test_flow_name,
                  test_flow_prio_list,
                  test_flow_rate_percent,
                  bg_flow_name,
                  bg_flow_prio_list,
                  bg_flow_rate_percent,
                  data_flow_dur_sec,
                  data_flow_delay_sec,
                  data_pkt_size,
                  prio_dscp_map):
    """
    Generate configurations of flows, including test flows, background flows and
    pause storm. Test flows and background flows are also known as data flows.

    Args:
        testbed_config (obj): testbed L1/L2/L3 configuration
        port_config_list (list): list of port configuration
        port_id (int): ID of DUT port to test
        duthost (Ansible host instance): device under test
        pause_flow_name (str): name of pause storm
        global_pause (bool): if pause frame is IEEE 802.3X pause
        pause_prio_list (list): priorities to pause for pause frames
        test_flow_name (str): name of test flows
        test_prio_list (list): priorities of test flows
        test_flow_rate_percent (int): rate percentage for each test flow
        bg_flow_name (str): name of background flows
        bg_prio_list (list): priorities of background flows
        bg_flow_rate_percent (int): rate percentage for each background flow
        data_flow_dur_sec (int): duration of data flows in second
        data_flow_delay_sec (int): start delay of data flows in second
        data_pkt_size (int): packet size of data flows in byte
        prio_dscp_map (dict): Priority vs. DSCP map (key = priority).

    Returns:
        flows configurations (list): the list should have configurations of
        len(test_flow_prio_list) test flow, len(bg_flow_prio_list) background
        flows and a pause storm.
    """

    result = list()

    rx_port_id = port_id
    tx_port_id_list, rx_port_id_list = select_ports(port_config_list=port_config_list,
                                                    duthost=duthost,
                                                    pattern="many to one",
                                                    rx_port_id=rx_port_id)
    pytest_assert(len(tx_port_id_list) > 0, "Cannot find any TX ports")
    tx_port_id = select_tx_port(tx_port_id_list=tx_port_id_list,
                                rx_port_id=rx_port_id)
    pytest_assert(tx_port_id is not None, "Cannot find a suitable TX port")

    tx_port_config = next((x for x in port_config_list if x.id == tx_port_id), None)
    rx_port_config = next((x for x in port_config_list if x.id == rx_port_id), None)

    tx_mac = tx_port_config.mac
    if tx_port_config.gateway == rx_port_config.gateway and \
       tx_port_config.prefix_len == rx_port_config.prefix_len:
        """ If soruce and destination port are in the same subnet """
        rx_mac = rx_port_config.mac
    else:
        rx_mac = tx_port_config.gateway_mac

    data_endpoint = PortTxRx(tx_port_name=testbed_config.ports[tx_port_id].name,
                             rx_port_name=testbed_config.ports[rx_port_id].name)

    data_flow_delay_nanosec = sec_to_nanosec(data_flow_delay_sec)

    """ Test flows """
    for prio in test_flow_prio_list:
        eth_hdr = EthernetHeader(src=FieldPattern(tx_mac),
                                 dst=FieldPattern(rx_mac),
                                 pfc_queue=FieldPattern([prio]))

        ip_prio = Priority(Dscp(phb=FieldPattern(choice=prio_dscp_map[prio]),
                                ecn=FieldPattern(choice=Dscp.ECN_CAPABLE_TRANSPORT_1)))

        ipv4_hdr = Ipv4Header(src=FieldPattern(tx_port_config.ip),
                              dst=FieldPattern(rx_port_config.ip),
                              priority=ip_prio)

        test_flow = Flow(
            name='{} Prio {}'.format(test_flow_name, prio),
            tx_rx=TxRx(data_endpoint),
            packet=[Header(choice=eth_hdr), Header(choice=ipv4_hdr)],
            size=Size(data_pkt_size),
            rate=Rate('line', test_flow_rate_percent),
            duration=Duration(FixedSeconds(seconds=data_flow_dur_sec,
                                           delay=data_flow_delay_nanosec,
                                           delay_unit='nanoseconds'))
        )

        result.append(test_flow)

    """ Background flows """
    for prio in bg_flow_prio_list:
        eth_hdr = EthernetHeader(src=FieldPattern(tx_mac),
                                 dst=FieldPattern(rx_mac),
                                 pfc_queue=FieldPattern([prio]))

        ip_prio = Priority(Dscp(phb=FieldPattern(choice=prio_dscp_map[prio]),
                                ecn=FieldPattern(choice=Dscp.ECN_CAPABLE_TRANSPORT_1)))

        ipv4_hdr = Ipv4Header(src=FieldPattern(tx_port_config.ip),
                              dst=FieldPattern(rx_port_config.ip),
                              priority=ip_prio)

        bg_flow = Flow(
            name='{} Prio {}'.format(bg_flow_name, prio),
            tx_rx=TxRx(data_endpoint),
            packet=[Header(choice=eth_hdr), Header(choice=ipv4_hdr)],
            size=Size(data_pkt_size),
            rate=Rate('line', bg_flow_rate_percent),
            duration=Duration(FixedSeconds(seconds=data_flow_dur_sec,
                                           delay=data_flow_delay_nanosec,
                                           delay_unit='nanoseconds'))
        )

        result.append(bg_flow)

    """ Pause storm """
    if global_pause:
        pause_pkt = Header(EthernetPause(
            dst=FieldPattern(choice='01:80:C2:00:00:01'),
            src=FieldPattern(choice='00:00:fa:ce:fa:ce')
        ))

    else:
        pause_time = []
        for x in range(8):
            if x in pause_prio_list:
                pause_time.append('ffff')
            else:
                pause_time.append('0000')

        vector = pfc_class_enable_vector(pause_prio_list)

        pause_pkt = Header(PfcPause(
            dst=FieldPattern(choice='01:80:C2:00:00:01'),
            src=FieldPattern(choice='00:00:fa:ce:fa:ce'),
            class_enable_vector=FieldPattern(choice=vector),
            pause_class_0=FieldPattern(choice=pause_time[0]),
            pause_class_1=FieldPattern(choice=pause_time[1]),
            pause_class_2=FieldPattern(choice=pause_time[2]),
            pause_class_3=FieldPattern(choice=pause_time[3]),
            pause_class_4=FieldPattern(choice=pause_time[4]),
            pause_class_5=FieldPattern(choice=pause_time[5]),
            pause_class_6=FieldPattern(choice=pause_time[6]),
            pause_class_7=FieldPattern(choice=pause_time[7]),
        ))

    """ Pause frames are sent from the RX port """
    pause_endpoint = PortTxRx(tx_port_name=testbed_config.ports[rx_port_id].name,
                               rx_port_name=testbed_config.ports[tx_port_id].name)

    speed_str = testbed_config.layer1[0].speed
    speed_gbps = int(speed_str.split('_')[1])
    pause_dur = 65535 * 64 * 8.0 / (speed_gbps * 1e9)
    pps = int(2 / pause_dur)

    pause_flow = Flow(
        name=pause_flow_name,
        tx_rx=TxRx(pause_endpoint),
        packet=[pause_pkt],
        size=Size(64),
        rate=Rate('pps', value=pps),
        duration=Duration(Continuous(delay=0, delay_unit='nanoseconds'))
    )

    result.append(pause_flow)
    return result
Esempio n. 5
0
def base_configs(testbed, conn_graph_facts, duthost, lossless_prio_dscp_map,
                 one_hundred_gbe, start_delay, traffic_duration,
                 pause_line_rate, traffic_line_rate, pause_frame_type,
                 frame_size, serializer):

    for config in one_hundred_gbe:

        start_delay = start_delay * 1000000000.0

        bg_dscp_list = [str(prio) for prio in lossless_prio_dscp_map]
        test_dscp_list = [str(x) for x in range(64) if x not in bg_dscp_list]

        tx = config.ports[0]
        rx = config.ports[1]

        vlan_subnet = get_vlan_subnet(duthost)
        pytest_assert(vlan_subnet is not None,
                      "Fail to get Vlan subnet information")

        vlan_ip_addrs = get_addrs_in_subnet(vlan_subnet, 2)

        gw_addr = vlan_subnet.split('/')[0]
        interface_ip_addr = vlan_ip_addrs[0]

        tx_port_ip = vlan_ip_addrs[1]
        rx_port_ip = vlan_ip_addrs[0]

        tx_gateway_ip = gw_addr
        rx_gateway_ip = gw_addr

        test_flow_name = 'Test Data'
        background_flow_name = 'Background Data'

        test_line_rate = traffic_line_rate
        background_line_rate = traffic_line_rate
        pause_line_rate = pause_line_rate

        pytest_assert(
            test_line_rate + background_line_rate <= 100,
            "test_line_rate + background_line_rate should be less than 100")

        ######################################################################
        # Create TX stack configuration
        ######################################################################
        tx_ipv4 = Ipv4(name='Tx Ipv4',
                       address=Pattern(tx_port_ip),
                       prefix=Pattern('24'),
                       gateway=Pattern(tx_gateway_ip),
                       ethernet=Ethernet(name='Tx Ethernet'))

        tx.devices.append(
            Device(name='Tx Device', device_count=1, choice=tx_ipv4))

        ######################################################################
        # Create RX stack configuration
        ######################################################################
        rx_ipv4 = Ipv4(name='Rx Ipv4',
                       address=Pattern(rx_port_ip),
                       prefix=Pattern('24'),
                       gateway=Pattern(rx_gateway_ip),
                       ethernet=Ethernet(name='Rx Ethernet'))

        rx.devices.append(
            Device(name='Rx Device', device_count=1, choice=rx_ipv4))

        ######################################################################
        # Traffic configuration Test data
        ######################################################################
        data_endpoint = DeviceTxRx(
            tx_device_names=[tx.devices[0].name],
            rx_device_names=[rx.devices[0].name],
        )

        test_dscp = Priority(Dscp(phb=FieldPattern(choice=test_dscp_list)))

        test_flow = Flow(name=test_flow_name,
                         tx_rx=TxRx(data_endpoint),
                         packet=[
                             Header(choice=EthernetHeader()),
                             Header(choice=Ipv4Header(priority=test_dscp))
                         ],
                         size=Size(frame_size),
                         rate=Rate('line', test_line_rate),
                         duration=Duration(
                             FixedSeconds(seconds=traffic_duration,
                                          delay=start_delay,
                                          delay_unit='nanoseconds')))

        config.flows.append(test_flow)
        #######################################################################
        # Traffic configuration Background data
        #######################################################################
        background_dscp = Priority(Dscp(phb=FieldPattern(choice=bg_dscp_list)))
        background_flow = Flow(
            name=background_flow_name,
            tx_rx=TxRx(data_endpoint),
            packet=[
                Header(choice=EthernetHeader()),
                Header(choice=Ipv4Header(priority=background_dscp))
            ],
            size=Size(frame_size),
            rate=Rate('line', background_line_rate),
            duration=Duration(
                FixedSeconds(seconds=traffic_duration,
                             delay=start_delay,
                             delay_unit='nanoseconds')))
        config.flows.append(background_flow)

        #######################################################################
        # Traffic configuration Pause
        #######################################################################
        pause_endpoint = PortTxRx(tx_port_name='Rx', rx_port_names=['Rx'])
        if (pause_frame_type == 'priority'):
            pause = Header(
                PfcPause(
                    dst=FieldPattern(choice='01:80:C2:00:00:01'),
                    src=FieldPattern(choice='00:00:fa:ce:fa:ce'),
                    class_enable_vector=FieldPattern(choice='E7'),
                    pause_class_0=FieldPattern(choice='ffff'),
                    pause_class_1=FieldPattern(choice='ffff'),
                    pause_class_2=FieldPattern(choice='ffff'),
                    pause_class_3=FieldPattern(choice='0'),
                    pause_class_4=FieldPattern(choice='0'),
                    pause_class_5=FieldPattern(choice='ffff'),
                    pause_class_6=FieldPattern(choice='ffff'),
                    pause_class_7=FieldPattern(choice='ffff'),
                ))

            pause_flow = Flow(name='Pause Storm',
                              tx_rx=TxRx(pause_endpoint),
                              packet=[pause],
                              size=Size(64),
                              rate=Rate('line', value=100),
                              duration=Duration(
                                  FixedPackets(packets=0,
                                               delay=0,
                                               delay_unit='nanoseconds')))
        elif (pause_frame_type == 'global'):
            pause = Header(
                EthernetPause(dst=FieldPattern(choice='01:80:C2:00:00:01'),
                              src=FieldPattern(choice='00:00:fa:ce:fa:ce')))

            pause_flow = Flow(name='Pause Storm',
                              tx_rx=TxRx(pause_endpoint),
                              packet=[pause],
                              size=Size(64),
                              rate=Rate('line', value=pause_line_rate),
                              duration=Duration(
                                  FixedPackets(packets=0,
                                               delay=0,
                                               delay_unit='nanoseconds')))
        else:
            pass

        config.flows.append(pause_flow)

    return one_hundred_gbe
def __gen_pause_flow(testbed_config, src_port_id, flow_name, pause_prio_list,
                     flow_dur_sec):
    """
    Generate the configuration for a PFC pause storm

    Args:
        testbed_config (obj): L2/L3 config of a T0 testbed
        src_port_id (int): ID of the source port
        flow_name (str): flow' name
        pause_prio_list (list): priorities to pause for PFC frames
        flow_dur_sec (float): duration of the flow in second

    Returns:
        flow configuration (obj): including name, packet format, rate, ...
    """
    pause_time = []
    for x in range(8):
        if x in pause_prio_list:
            pause_time.append('ffff')
        else:
            pause_time.append('0000')

    vector = pfc_class_enable_vector(pause_prio_list)

    pause_pkt = Header(
        PfcPause(
            dst=FieldPattern(choice='01:80:C2:00:00:01'),
            src=FieldPattern(choice='00:00:fa:ce:fa:ce'),
            class_enable_vector=FieldPattern(choice=vector),
            pause_class_0=FieldPattern(choice=pause_time[0]),
            pause_class_1=FieldPattern(choice=pause_time[1]),
            pause_class_2=FieldPattern(choice=pause_time[2]),
            pause_class_3=FieldPattern(choice=pause_time[3]),
            pause_class_4=FieldPattern(choice=pause_time[4]),
            pause_class_5=FieldPattern(choice=pause_time[5]),
            pause_class_6=FieldPattern(choice=pause_time[6]),
            pause_class_7=FieldPattern(choice=pause_time[7]),
        ))

    dst_port_id = (src_port_id + 1) % len(testbed_config.devices)
    pause_src_point = PortTxRx(
        tx_port_name=testbed_config.ports[src_port_id].name,
        rx_port_name=testbed_config.ports[dst_port_id].name)
    """
    The minimal fixed time duration in IXIA is 1 second.
    To support smaller durations, we need to use # of packets
    """
    speed_str = testbed_config.layer1[0].speed
    speed_gbps = int(speed_str.split('_')[1])
    pause_dur = 65535 * 64 * 8.0 / (speed_gbps * 1e9)
    pps = int(2 / pause_dur)
    pkt_cnt = pps * flow_dur_sec

    pause_flow = Flow(name=flow_name,
                      tx_rx=TxRx(pause_src_point),
                      packet=[pause_pkt],
                      size=Size(64),
                      rate=Rate('pps', value=pps),
                      duration=Duration(FixedPackets(packets=pkt_cnt,
                                                     delay=0)))

    return pause_flow
Esempio n. 7
0
    def _pfcwd_configs(prio):
        """
         A fixture to create pfcwd configs on traffic generator using open traffic genertor model

        :param prio: dscp priority 3 or 4
        """

        vlan_subnet = get_vlan_subnet(duthost)
        pytest_assert(vlan_subnet is not None,
                      "Fail to get Vlan subnet information")

        vlan_ip_addrs = get_addrs_in_subnet(vlan_subnet, 3)

        gw_addr = vlan_subnet.split('/')[0]

        device1_ip = vlan_ip_addrs[0]
        device2_ip = vlan_ip_addrs[1]
        device3_ip = vlan_ip_addrs[2]

        device1_gateway_ip = gw_addr
        device2_gateway_ip = gw_addr
        device3_gateway_ip = gw_addr

        available_phy_port = ports_config.get_available_phy_ports()
        pytest_assert(
            len(available_phy_port) > 3,
            "Number of physical ports must be at least 3")

        ports_list = ports_config.create_ports_list(no_of_ports=3)

        configs = []
        for phy_ports in ports_list:
            config = ports_config.create_config(phy_ports)

            line_rate = traffic_line_rate

            ######################################################################
            # Device Configuration
            ######################################################################
            port1 = config.ports[0]
            port2 = config.ports[1]
            port3 = config.ports[2]

            #Device 1 configuration
            port1.devices = [
                Device(name='Port 1',
                       device_count=1,
                       choice=Ipv4(name='Ipv4 1',
                                   address=Pattern(device1_ip),
                                   prefix=Pattern('24'),
                                   gateway=Pattern(device1_gateway_ip),
                                   ethernet=Ethernet(name='Ethernet 1')))
            ]

            #Device 2 configuration
            port2.devices = [
                Device(name='Port 2',
                       device_count=1,
                       choice=Ipv4(name='Ipv4 2',
                                   address=Pattern(device2_ip),
                                   prefix=Pattern('24'),
                                   gateway=Pattern(device2_gateway_ip),
                                   ethernet=Ethernet(name='Ethernet 2')))
            ]

            #Device 3 configuration
            port3.devices = [
                Device(name='Port 3',
                       device_count=1,
                       choice=Ipv4(name='Ipv4 3',
                                   address=Pattern(device3_ip),
                                   prefix=Pattern('24'),
                                   gateway=Pattern(device3_gateway_ip),
                                   ethernet=Ethernet(name='Ethernet 3')))
            ]

            device1 = port1.devices[0]
            device2 = port2.devices[0]
            device3 = port3.devices[0]
            ######################################################################
            # Traffic configuration Traffic 1->2
            ######################################################################

            dscp_prio = Priority(Dscp(phb=FieldPattern(choice=[str(prio)])))

            flow_1to2 = Flow(name="Traffic 1->2",
                             tx_rx=TxRx(
                                 DeviceTxRx(tx_device_names=[device1.name],
                                            rx_device_names=[device2.name])),
                             packet=[
                                 Header(choice=EthernetHeader()),
                                 Header(choice=Ipv4Header(priority=dscp_prio)),
                             ],
                             size=Size(frame_size),
                             rate=Rate('line', line_rate),
                             duration=Duration(
                                 Continuous(delay=start_delay,
                                            delay_unit='nanoseconds')))

            config.flows.append(flow_1to2)

            ######################################################################
            # Traffic configuration Traffic 2->1
            ######################################################################

            flow_2to1 = Flow(name="Traffic 2->1",
                             tx_rx=TxRx(
                                 DeviceTxRx(tx_device_names=[device2.name],
                                            rx_device_names=[device1.name])),
                             packet=[
                                 Header(choice=EthernetHeader()),
                                 Header(choice=Ipv4Header(priority=dscp_prio)),
                             ],
                             size=Size(frame_size),
                             rate=Rate('line', line_rate),
                             duration=Duration(
                                 Continuous(delay=start_delay,
                                            delay_unit='nanoseconds')))

            config.flows.append(flow_2to1)
            ######################################################################
            # Traffic configuration Traffic 2->3
            #######################################################################

            flow_2to3 = Flow(name="Traffic 2->3",
                             tx_rx=TxRx(
                                 DeviceTxRx(tx_device_names=[device2.name],
                                            rx_device_names=[device3.name])),
                             packet=[
                                 Header(choice=EthernetHeader()),
                                 Header(choice=Ipv4Header(priority=dscp_prio)),
                             ],
                             size=Size(frame_size),
                             rate=Rate('line', line_rate),
                             duration=Duration(
                                 Continuous(delay=start_delay,
                                            delay_unit='nanoseconds')))

            config.flows.append(flow_2to3)

            ######################################################################
            # Traffic configuration Traffic 3->2
            #######################################################################

            flow_3to2 = Flow(name="Traffic 3->2",
                             tx_rx=TxRx(
                                 DeviceTxRx(tx_device_names=[device3.name],
                                            rx_device_names=[device2.name])),
                             packet=[
                                 Header(choice=EthernetHeader()),
                                 Header(choice=Ipv4Header(priority=dscp_prio)),
                             ],
                             size=Size(frame_size),
                             rate=Rate('line', line_rate),
                             duration=Duration(
                                 Continuous(delay=start_delay,
                                            delay_unit='nanoseconds')))

            config.flows.append(flow_3to2)

            #######################################################################
            # Traffic configuration Pause
            #######################################################################

            if prio == 3:
                pause = Header(
                    PfcPause(
                        dst=FieldPattern(choice='01:80:C2:00:00:01'),
                        src=FieldPattern(choice='00:00:fa:ce:fa:ce'),
                        class_enable_vector=FieldPattern(choice='8'),
                        pause_class_0=FieldPattern(choice='0'),
                        pause_class_1=FieldPattern(choice='0'),
                        pause_class_2=FieldPattern(choice='0'),
                        pause_class_3=FieldPattern(choice='ffff'),
                        pause_class_4=FieldPattern(choice='0'),
                        pause_class_5=FieldPattern(choice='0'),
                        pause_class_6=FieldPattern(choice='0'),
                        pause_class_7=FieldPattern(choice='0'),
                    ))
            elif prio == 4:
                pause = Header(
                    PfcPause(
                        dst=FieldPattern(choice='01:80:C2:00:00:01'),
                        src=FieldPattern(choice='00:00:fa:ce:fa:ce'),
                        class_enable_vector=FieldPattern(choice='10'),
                        pause_class_0=FieldPattern(choice='0'),
                        pause_class_1=FieldPattern(choice='0'),
                        pause_class_2=FieldPattern(choice='0'),
                        pause_class_3=FieldPattern(choice='0'),
                        pause_class_4=FieldPattern(choice='ffff'),
                        pause_class_5=FieldPattern(choice='0'),
                        pause_class_6=FieldPattern(choice='0'),
                        pause_class_7=FieldPattern(choice='0'),
                    ))
            else:
                pytest_assert(
                    False,
                    "This testcase supports only lossless priorities 3 & 4, need to enhance the script based on requirement"
                )

            pause_flow = Flow(name='Pause Storm',
                              tx_rx=TxRx(
                                  PortTxRx(tx_port_name=port3.name,
                                           rx_port_names=[port3.name])),
                              packet=[pause],
                              size=Size(64),
                              rate=Rate('line', value=pause_line_rate),
                              duration=Duration(
                                  Continuous(delay=t_start_pause * (10**9),
                                             delay_unit='nanoseconds')))

            config.flows.append(pause_flow)

            configs.append(config)

        return configs
def __gen_data_flow(testbed_config, port_config_list, src_port_id, dst_port_id,
                    flow_name_prefix, flow_prio, flow_rate_percent,
                    flow_dur_sec, data_pkt_size, prio_dscp_map):
    """
    Generate the configuration for a data flow

    Args:
        testbed_config (obj): testbed L1/L2/L3 configuration
        port_config_list (list): list of port configuration
        src_port_id (int): ID of the source port
        dst_port_id (int): ID of destination port
        flow_name_prefix (str): prefix of flow' name
        flow_prio_list (list): priorities of the flow
        flow_rate_percent (int): rate percentage for the flow
        flow_dur_sec (int): duration of the flow in second
        data_pkt_size (int): packet size of the flow in byte
        prio_dscp_map (dict): Priority vs. DSCP map (key = priority).

    Returns:
        flow configuration (obj): including name, packet format, rate, ...
    """
    tx_port_config = next((x for x in port_config_list if x.id == src_port_id),
                          None)
    rx_port_config = next((x for x in port_config_list if x.id == dst_port_id),
                          None)

    tx_mac = tx_port_config.mac
    if tx_port_config.gateway == rx_port_config.gateway and \
       tx_port_config.prefix_len == rx_port_config.prefix_len:
        """ If soruce and destination port are in the same subnet """
        rx_mac = rx_port_config.mac
    else:
        rx_mac = tx_port_config.gateway_mac

    data_endpoint = PortTxRx(
        tx_port_name=testbed_config.ports[src_port_id].name,
        rx_port_name=testbed_config.ports[dst_port_id].name)

    eth_hdr = EthernetHeader(src=FieldPattern(tx_mac),
                             dst=FieldPattern(rx_mac),
                             pfc_queue=FieldPattern([flow_prio]))

    ip_prio = Priority(
        Dscp(phb=FieldPattern(choice=prio_dscp_map[flow_prio]),
             ecn=FieldPattern(choice=Dscp.ECN_CAPABLE_TRANSPORT_1)))
    ipv4_hdr = Ipv4Header(src=FieldPattern(tx_port_config.ip),
                          dst=FieldPattern(rx_port_config.ip),
                          priority=ip_prio)

    flow_name = __data_flow_name(name_prefix=flow_name_prefix,
                                 src_id=src_port_id,
                                 dst_id=dst_port_id,
                                 prio=flow_prio)

    flow = Flow(name=flow_name,
                tx_rx=TxRx(data_endpoint),
                packet=[Header(choice=eth_hdr),
                        Header(choice=ipv4_hdr)],
                size=Size(data_pkt_size),
                rate=Rate('line', flow_rate_percent),
                duration=Duration(FixedSeconds(seconds=flow_dur_sec)))

    return flow
Esempio n. 9
0
def __gen_traffic(testbed_config, port_id, pause_flow_name, pause_flow_dur_sec,
                  data_flow_name_list, data_flow_delay_sec_list,
                  data_flow_dur_sec_list, data_pkt_size, prio_list,
                  prio_dscp_map):
    """
    Generate configurations of flows, including data flows and pause storm.

    Args:
        testbed_config (obj): L2/L3 config of a T0 testbed
        port_id (int): ID of DUT port to test.
        pause_flow_name (str): name of pause storm
        pause_flow_dur_sec (float): duration of pause storm in second
        data_flow_name_list (list): list of data flow names
        data_flow_delay_sec_list (list): list of data flow start delays in second
        data_flow_dur_sec_list (list): list of data flow durations in second
        data_pkt_size (int): size of data packets in byte
        prio_list (list): priorities of data flows and pause storm
        prio_dscp_map (dict): Priority vs. DSCP map (key = priority).

    Returns:
        flows configurations (list): the list should have configurations of
        len(prio_list) * 2 data flows, and a pause storm.
    """
    result = list()

    rx_port_id = port_id
    tx_port_id = (port_id + 1) % len(testbed_config.devices)

    data_endpoint = DeviceTxRx(
        tx_device_names=[testbed_config.devices[tx_port_id].name],
        rx_device_names=[testbed_config.devices[rx_port_id].name],
    )
    """ PFC storm """
    pause_time = []
    for x in range(8):
        if x in prio_list:
            pause_time.append('ffff')
        else:
            pause_time.append('0000')

    vector = pfc_class_enable_vector(prio_list)

    pause_pkt = Header(
        PfcPause(
            dst=FieldPattern(choice='01:80:C2:00:00:01'),
            src=FieldPattern(choice='00:00:fa:ce:fa:ce'),
            class_enable_vector=FieldPattern(choice=vector),
            pause_class_0=FieldPattern(choice=pause_time[0]),
            pause_class_1=FieldPattern(choice=pause_time[1]),
            pause_class_2=FieldPattern(choice=pause_time[2]),
            pause_class_3=FieldPattern(choice=pause_time[3]),
            pause_class_4=FieldPattern(choice=pause_time[4]),
            pause_class_5=FieldPattern(choice=pause_time[5]),
            pause_class_6=FieldPattern(choice=pause_time[6]),
            pause_class_7=FieldPattern(choice=pause_time[7]),
        ))

    pause_src_point = PortTxRx(
        tx_port_name=testbed_config.ports[rx_port_id].name,
        rx_port_name=testbed_config.ports[tx_port_id].name)

    speed_str = testbed_config.layer1[0].speed
    speed_gbps = int(speed_str.split('_')[1])
    pause_dur = 65535 * 64 * 8.0 / (speed_gbps * 1e9)
    pps = int(2 / pause_dur)
    pause_pkt_cnt = pps * pause_flow_dur_sec

    pause_flow = Flow(name=pause_flow_name,
                      tx_rx=TxRx(pause_src_point),
                      packet=[pause_pkt],
                      size=Size(64),
                      rate=Rate('pps', value=pps),
                      duration=Duration(
                          FixedPackets(packets=pause_pkt_cnt, delay=0)))

    result.append(pause_flow)

    data_flow_rate_percent = int(100 / len(prio_list))
    """ For each data flow """
    for i in range(len(data_flow_name_list)):
        """ For each priority """
        for prio in prio_list:
            ip_prio = Priority(
                Dscp(phb=FieldPattern(choice=prio_dscp_map[prio]),
                     ecn=FieldPattern(choice=Dscp.ECN_CAPABLE_TRANSPORT_1)))
            pfc_queue = FieldPattern([prio])

            data_flow = Flow(
                name='{} Prio {}'.format(data_flow_name_list[i], prio),
                tx_rx=TxRx(data_endpoint),
                packet=[
                    Header(choice=EthernetHeader(pfc_queue=pfc_queue)),
                    Header(choice=Ipv4Header(priority=ip_prio))
                ],
                size=Size(data_pkt_size),
                rate=Rate('line', data_flow_rate_percent),
                duration=Duration(
                    FixedSeconds(seconds=data_flow_dur_sec_list[i],
                                 delay=sec_to_nanosec(
                                     data_flow_delay_sec_list[i]),
                                 delay_unit='nanoseconds')))

            result.append(data_flow)

    return result
Esempio n. 10
0
def __gen_traffic(testbed_config, port_config_list, port_id, pause_flow_name,
                  data_flow_name, prio, data_pkt_size, data_pkt_cnt,
                  data_flow_delay_sec, exp_dur_sec, prio_dscp_map):
    """
    Generate configurations of flows, including a data flow and a PFC pause storm.

    Args:
        testbed_config (obj): testbed L1/L2/L3 configuration
        port_config_list (list): list of port configuration
        port_id (int): ID of DUT port to test
        pause_flow_name (str): name of the pause storm
        data_flow_name (str): name of the data flow
        prio (int): priority of the data flow and PFC pause storm
        data_pkt_size (int): packet size of the data flow in byte
        data_pkt_cnt (int): # of packets of the data flow
        data_flow_delay_sec (float): start delay of the data flow in second
        exp_dur_sec (float): experiment duration in second
        prio_dscp_map (dict): Priority vs. DSCP map (key = priority).

    Returns:
        Configurations of the data flow and the PFC pause storm (list)

    """
    result = list()

    rx_port_id = port_id
    tx_port_id_list, rx_port_id_list = select_ports(
        port_config_list=port_config_list,
        pattern="many to one",
        rx_port_id=rx_port_id)
    pytest_assert(len(tx_port_id_list) > 0, "Cannot find any TX ports")
    tx_port_id = select_tx_port(tx_port_id_list=tx_port_id_list,
                                rx_port_id=rx_port_id)
    pytest_assert(tx_port_id is not None, "Cannot find a suitable TX port")

    tx_port_config = next((x for x in port_config_list if x.id == tx_port_id),
                          None)
    rx_port_config = next((x for x in port_config_list if x.id == rx_port_id),
                          None)

    tx_mac = tx_port_config.mac
    if tx_port_config.gateway == rx_port_config.gateway and \
       tx_port_config.prefix_len == rx_port_config.prefix_len:
        """ If soruce and destination port are in the same subnet """
        rx_mac = rx_port_config.mac
    else:
        rx_mac = tx_port_config.gateway_mac

    data_endpoint = PortTxRx(
        tx_port_name=testbed_config.ports[tx_port_id].name,
        rx_port_name=testbed_config.ports[rx_port_id].name)

    data_flow_delay_nanosec = sec_to_nanosec(data_flow_delay_sec)

    eth_hdr = EthernetHeader(src=FieldPattern(tx_mac),
                             dst=FieldPattern(rx_mac),
                             pfc_queue=FieldPattern([prio]))

    ip_prio = Priority(
        Dscp(phb=FieldPattern(choice=prio_dscp_map[prio]),
             ecn=FieldPattern(choice=Dscp.ECN_CAPABLE_TRANSPORT_1)))
    ipv4_hdr = Ipv4Header(src=FieldPattern(tx_port_config.ip),
                          dst=FieldPattern(rx_port_config.ip),
                          priority=ip_prio)

    data_flow = Flow(name=data_flow_name,
                     tx_rx=TxRx(data_endpoint),
                     packet=[Header(choice=eth_hdr),
                             Header(choice=ipv4_hdr)],
                     size=Size(data_pkt_size),
                     rate=Rate('line', 100),
                     duration=Duration(
                         FixedPackets(packets=data_pkt_cnt,
                                      delay=data_flow_delay_nanosec,
                                      delay_unit='nanoseconds')))
    result.append(data_flow)
    """ PFC Pause Storm """
    pause_time = []
    for x in range(8):
        if x == prio:
            pause_time.append('ffff')
        else:
            pause_time.append('0000')

    vector = pfc_class_enable_vector([prio])
    pause_pkt = Header(
        PfcPause(
            dst=FieldPattern(choice='01:80:C2:00:00:01'),
            src=FieldPattern(choice='00:00:fa:ce:fa:ce'),
            class_enable_vector=FieldPattern(choice=vector),
            pause_class_0=FieldPattern(choice=pause_time[0]),
            pause_class_1=FieldPattern(choice=pause_time[1]),
            pause_class_2=FieldPattern(choice=pause_time[2]),
            pause_class_3=FieldPattern(choice=pause_time[3]),
            pause_class_4=FieldPattern(choice=pause_time[4]),
            pause_class_5=FieldPattern(choice=pause_time[5]),
            pause_class_6=FieldPattern(choice=pause_time[6]),
            pause_class_7=FieldPattern(choice=pause_time[7]),
        ))
    """ Pause frames are sent from the RX port """
    pause_endpoint = PortTxRx(
        tx_port_name=testbed_config.ports[rx_port_id].name,
        rx_port_name=testbed_config.ports[tx_port_id].name)

    speed_str = testbed_config.layer1[0].speed
    speed_gbps = int(speed_str.split('_')[1])
    pause_dur = 65535 * 64 * 8.0 / (speed_gbps * 1e9)
    pps = int(2 / pause_dur)

    pause_flow = Flow(name=pause_flow_name,
                      tx_rx=TxRx(pause_endpoint),
                      packet=[pause_pkt],
                      size=Size(64),
                      rate=Rate('pps', value=pps),
                      duration=Duration(
                          FixedSeconds(seconds=exp_dur_sec,
                                       delay=0,
                                       delay_unit='nanoseconds')))
    result.append(pause_flow)

    return result
Esempio n. 11
0
    def _pfc_watch_dog_config(pi):

        vlan_subnet = get_vlan_subnet(duthost)
        pytest_assert(vlan_subnet is not None,
                      "Fail to get Vlan subnet information")

        vlan_ip_addrs = get_addrs_in_subnet(vlan_subnet, 3)

        gw_addr = vlan_subnet.split('/')[0]
        interface_ip_addr = vlan_ip_addrs[0]

        device1_ip = vlan_ip_addrs[0]
        device2_ip = vlan_ip_addrs[1]
        device3_ip = vlan_ip_addrs[2]

        device1_gateway_ip = gw_addr
        device2_gateway_ip = gw_addr
        device3_gateway_ip = gw_addr

        config = one_hundred_gbe.create_config()
        line_rate = pfcwd_params['traffic_line_rate']
        pause_line_rate = pfcwd_params['pause_line_rate']
        start_delay = pfcwd_params['start_delay']
        frame_size = pfcwd_params['frame_size']
        t_start_pause = pfcwd_params['t_start_pause']

        ######################################################################
        # Device Configuration
        ######################################################################
        port1 = config.ports[0]
        port2 = config.ports[1]
        port3 = config.ports[2]

        #Device 1 configuration
        port1.devices = [
            Device(name='Port 1',
                   device_count=1,
                   choice=Ipv4(name='Ipv4 1',
                               address=Pattern(device1_ip),
                               prefix=Pattern('24'),
                               gateway=Pattern(device1_gateway_ip),
                               ethernet=Ethernet(name='Ethernet 1')))
        ]

        #Device 2 configuration
        port2.devices = [
            Device(name='Port 2',
                   device_count=1,
                   choice=Ipv4(name='Ipv4 2',
                               address=Pattern(device2_ip),
                               prefix=Pattern('24'),
                               gateway=Pattern(device2_gateway_ip),
                               ethernet=Ethernet(name='Ethernet 2')))
        ]

        #Device 3 configuration
        port3.devices = [
            Device(name='Port 3',
                   device_count=1,
                   choice=Ipv4(name='Ipv4 3',
                               address=Pattern(device3_ip),
                               prefix=Pattern('24'),
                               gateway=Pattern(device3_gateway_ip),
                               ethernet=Ethernet(name='Ethernet 3')))
        ]

        device1 = port1.devices[0]
        device2 = port2.devices[0]
        device3 = port3.devices[0]
        ######################################################################
        # Traffic configuration Traffic 1->2
        ######################################################################

        dscp_pi = Priority(Dscp(phb=FieldPattern(choice=[str(pi)])))

        flow_1to2 = Flow(name="Traffic 1->2",
                         tx_rx=TxRx(
                             DeviceTxRx(tx_device_names=[device1.name],
                                        rx_device_names=[device2.name])),
                         packet=[
                             Header(choice=EthernetHeader()),
                             Header(choice=Ipv4Header(priority=dscp_pi)),
                         ],
                         size=Size(frame_size),
                         rate=Rate('line', line_rate),
                         duration=Duration(
                             Continuous(delay=start_delay,
                                        delay_unit='nanoseconds')))

        config.flows.append(flow_1to2)

        ######################################################################
        # Traffic configuration Traffic 2->1
        ######################################################################

        flow_2to1 = Flow(name="Traffic 2->1",
                         tx_rx=TxRx(
                             DeviceTxRx(tx_device_names=[device2.name],
                                        rx_device_names=[device1.name])),
                         packet=[
                             Header(choice=EthernetHeader()),
                             Header(choice=Ipv4Header(priority=dscp_pi)),
                         ],
                         size=Size(frame_size),
                         rate=Rate('line', line_rate),
                         duration=Duration(
                             Continuous(delay=start_delay,
                                        delay_unit='nanoseconds')))

        config.flows.append(flow_2to1)
        ######################################################################
        # Traffic configuration Traffic 2->3
        #######################################################################

        flow_2to3 = Flow(name="Traffic 2->3",
                         tx_rx=TxRx(
                             DeviceTxRx(tx_device_names=[device2.name],
                                        rx_device_names=[device3.name])),
                         packet=[
                             Header(choice=EthernetHeader()),
                             Header(choice=Ipv4Header(priority=dscp_pi)),
                         ],
                         size=Size(frame_size),
                         rate=Rate('line', line_rate),
                         duration=Duration(
                             Continuous(delay=start_delay,
                                        delay_unit='nanoseconds')))

        config.flows.append(flow_2to3)

        ######################################################################
        # Traffic configuration Traffic 3->2
        #######################################################################

        flow_3to2 = Flow(name="Traffic 3->2",
                         tx_rx=TxRx(
                             DeviceTxRx(tx_device_names=[device3.name],
                                        rx_device_names=[device2.name])),
                         packet=[
                             Header(choice=EthernetHeader()),
                             Header(choice=Ipv4Header(priority=dscp_pi)),
                         ],
                         size=Size(frame_size),
                         rate=Rate('line', line_rate),
                         duration=Duration(
                             Continuous(delay=start_delay,
                                        delay_unit='nanoseconds')))

        config.flows.append(flow_3to2)

        #######################################################################
        # Traffic configuration Pause
        #######################################################################

        if (pi == 3):
            pause = Header(
                PfcPause(
                    dst=FieldPattern(choice='01:80:C2:00:00:01'),
                    src=FieldPattern(choice='00:00:fa:ce:fa:ce'),
                    class_enable_vector=FieldPattern(choice='8'),
                    pause_class_0=FieldPattern(choice='0'),
                    pause_class_1=FieldPattern(choice='0'),
                    pause_class_2=FieldPattern(choice='0'),
                    pause_class_3=FieldPattern(choice='ffff'),
                    pause_class_4=FieldPattern(choice='0'),
                    pause_class_5=FieldPattern(choice='0'),
                    pause_class_6=FieldPattern(choice='0'),
                    pause_class_7=FieldPattern(choice='0'),
                ))
        elif (pi == 4):
            pause = Header(
                PfcPause(
                    dst=FieldPattern(choice='01:80:C2:00:00:01'),
                    src=FieldPattern(choice='00:00:fa:ce:fa:ce'),
                    class_enable_vector=FieldPattern(choice='10'),
                    pause_class_0=FieldPattern(choice='0'),
                    pause_class_1=FieldPattern(choice='0'),
                    pause_class_2=FieldPattern(choice='0'),
                    pause_class_3=FieldPattern(choice='0'),
                    pause_class_4=FieldPattern(choice='ffff'),
                    pause_class_5=FieldPattern(choice='0'),
                    pause_class_6=FieldPattern(choice='0'),
                    pause_class_7=FieldPattern(choice='0'),
                ))
        else:
            pytest_assert(
                False, "This testcase supports only lossless priorities 3 & 4")

        pause_flow = Flow(name='Pause Storm',
                          tx_rx=TxRx(
                              PortTxRx(tx_port_name=port3.name,
                                       rx_port_names=[port3.name])),
                          packet=[pause],
                          size=Size(64),
                          rate=Rate('line', value=pause_line_rate),
                          duration=Duration(
                              Continuous(delay=t_start_pause * (10**9),
                                         delay_unit='nanoseconds')))

        config.flows.append(pause_flow)

        return config
Esempio n. 12
0
def __gen_traffic(testbed_config, port_config_list, port_id, data_flow_name,
                  data_flow_dur_sec, data_pkt_size, prio_list, prio_dscp_map):
    """
    Generate configurations of flows

    Args:
        testbed_config (obj): testbed L1/L2/L3 configuration
        port_config_list (list): list of port configuration
        port_id (int): ID of DUT port to test.
        data_flow_name (str): data flow name
        data_flow_dur_sec (int): duration of data flows in second
        data_pkt_size (int): size of data packets in byte
        prio_list (list): priorities of data flows
        prio_dscp_map (dict): Priority vs. DSCP map (key = priority).

    Returns:
        flows configurations (list): the list should have configurations of
        len(prio_list) data flows
    """
    result = list()

    rx_port_id = port_id
    tx_port_id_list, rx_port_id_list = select_ports(
        port_config_list=port_config_list,
        pattern="many to one",
        rx_port_id=rx_port_id)
    pytest_assert(len(tx_port_id_list) > 0, "Cannot find any TX ports")
    tx_port_id = select_tx_port(tx_port_id_list=tx_port_id_list,
                                rx_port_id=rx_port_id)
    pytest_assert(tx_port_id is not None, "Cannot find a suitable TX port")

    tx_port_config = next((x for x in port_config_list if x.id == tx_port_id),
                          None)
    rx_port_config = next((x for x in port_config_list if x.id == rx_port_id),
                          None)

    tx_mac = tx_port_config.mac
    if tx_port_config.gateway == rx_port_config.gateway and \
       tx_port_config.prefix_len == rx_port_config.prefix_len:
        """ If soruce and destination port are in the same subnet """
        rx_mac = rx_port_config.mac
    else:
        rx_mac = tx_port_config.gateway_mac

    data_endpoint = PortTxRx(
        tx_port_name=testbed_config.ports[tx_port_id].name,
        rx_port_name=testbed_config.ports[rx_port_id].name)
    data_flow_rate_percent = int(100 / len(prio_list))
    """ For each priority """
    for prio in prio_list:
        eth_hdr = EthernetHeader(src=FieldPattern(tx_mac),
                                 dst=FieldPattern(rx_mac),
                                 pfc_queue=FieldPattern([prio]))

        ip_prio = Priority(
            Dscp(phb=FieldPattern(choice=prio_dscp_map[prio]),
                 ecn=FieldPattern(choice=Dscp.ECN_CAPABLE_TRANSPORT_1)))

        ipv4_hdr = Ipv4Header(src=FieldPattern(tx_port_config.ip),
                              dst=FieldPattern(rx_port_config.ip),
                              priority=ip_prio)

        data_flow = Flow(
            name='{} Prio {}'.format(data_flow_name, prio),
            tx_rx=TxRx(data_endpoint),
            packet=[Header(choice=eth_hdr),
                    Header(choice=ipv4_hdr)],
            size=Size(data_pkt_size),
            rate=Rate('line', data_flow_rate_percent),
            duration=Duration(FixedSeconds(seconds=data_flow_dur_sec)))

        result.append(data_flow)

    return result
Esempio n. 13
0
def __gen_traffic(testbed_config, port_id, pause_flow_name, global_pause,
                  pause_prio_list, test_flow_name, test_flow_prio_list,
                  test_flow_rate_percent, bg_flow_name, bg_flow_prio_list,
                  bg_flow_rate_percent, data_flow_dur_sec, data_flow_delay_sec,
                  data_pkt_size, prio_dscp_map):
    """
    Generate configurations of flows, including test flows, background flows and
    pause storm. Test flows and background flows are also known as data flows.

    Args:
        testbed_config (obj): L2/L3 config of a T0 testbed
        port_id (int): ID of DUT port to test.
        pause_flow_name (str): name of pause storm
        global_pause (bool): if pause frame is IEEE 802.3X pause
        pause_prio_list (list): priorities to pause for pause frames
        test_flow_name (str): name of test flows
        test_prio_list (list): priorities of test flows
        test_flow_rate_percent (int): rate percentage for each test flow
        bg_flow_name (str): name of background flows
        bg_prio_list (list): priorities of background flows
        bg_flow_rate_percent (int): rate percentage for each background flow
        data_flow_dur_sec (int): duration of data flows in second
        data_flow_delay_sec (int): start delay of data flows in second
        data_pkt_size (int): packet size of data flows in byte
        prio_dscp_map (dict): Priority vs. DSCP map (key = priority).

    Returns:
        flows configurations (list): the list should have configurations of
        len(test_flow_prio_list) test flow, len(bg_flow_prio_list) background
        flows and a pause storm.
    """

    result = list()

    rx_port_id = port_id
    tx_port_id = (port_id + 1) % len(testbed_config.devices)

    data_endpoint = DeviceTxRx(
        tx_device_names=[testbed_config.devices[tx_port_id].name],
        rx_device_names=[testbed_config.devices[rx_port_id].name],
    )

    data_flow_delay_nanosec = sec_to_nanosec(data_flow_delay_sec)
    """ Test flows """
    for prio in test_flow_prio_list:
        ip_prio = Priority(
            Dscp(phb=FieldPattern(choice=prio_dscp_map[prio]),
                 ecn=FieldPattern(choice=Dscp.ECN_CAPABLE_TRANSPORT_1)))
        pfc_queue = FieldPattern([prio])

        test_flow = Flow(
            name='{} Prio {}'.format(test_flow_name, prio),
            tx_rx=TxRx(data_endpoint),
            packet=[
                Header(choice=EthernetHeader(pfc_queue=pfc_queue)),
                Header(choice=Ipv4Header(priority=ip_prio))
            ],
            size=Size(data_pkt_size),
            rate=Rate('line', test_flow_rate_percent),
            duration=Duration(
                FixedSeconds(seconds=data_flow_dur_sec,
                             delay=data_flow_delay_nanosec,
                             delay_unit='nanoseconds')))

        result.append(test_flow)
    """ Background flows """
    for prio in bg_flow_prio_list:
        ip_prio = Priority(
            Dscp(phb=FieldPattern(choice=prio_dscp_map[prio]),
                 ecn=FieldPattern(choice=Dscp.ECN_CAPABLE_TRANSPORT_1)))
        pfc_queue = FieldPattern([prio])

        bg_flow = Flow(name='{} Prio {}'.format(bg_flow_name, prio),
                       tx_rx=TxRx(data_endpoint),
                       packet=[
                           Header(choice=EthernetHeader(pfc_queue=pfc_queue)),
                           Header(choice=Ipv4Header(priority=ip_prio))
                       ],
                       size=Size(data_pkt_size),
                       rate=Rate('line', bg_flow_rate_percent),
                       duration=Duration(
                           FixedSeconds(seconds=data_flow_dur_sec,
                                        delay=data_flow_delay_nanosec,
                                        delay_unit='nanoseconds')))

        result.append(bg_flow)
    """ Pause storm """
    if global_pause:
        pause_pkt = Header(
            EthernetPause(dst=FieldPattern(choice='01:80:C2:00:00:01'),
                          src=FieldPattern(choice='00:00:fa:ce:fa:ce')))

    else:
        pause_time = []
        for x in range(8):
            if x in pause_prio_list:
                pause_time.append('ffff')
            else:
                pause_time.append('0000')

        vector = pfc_class_enable_vector(pause_prio_list)

        pause_pkt = Header(
            PfcPause(
                dst=FieldPattern(choice='01:80:C2:00:00:01'),
                src=FieldPattern(choice='00:00:fa:ce:fa:ce'),
                class_enable_vector=FieldPattern(choice=vector),
                pause_class_0=FieldPattern(choice=pause_time[0]),
                pause_class_1=FieldPattern(choice=pause_time[1]),
                pause_class_2=FieldPattern(choice=pause_time[2]),
                pause_class_3=FieldPattern(choice=pause_time[3]),
                pause_class_4=FieldPattern(choice=pause_time[4]),
                pause_class_5=FieldPattern(choice=pause_time[5]),
                pause_class_6=FieldPattern(choice=pause_time[6]),
                pause_class_7=FieldPattern(choice=pause_time[7]),
            ))
    """ Pause frames are sent from the RX port """
    pause_src_point = PortTxRx(
        tx_port_name=testbed_config.ports[rx_port_id].name,
        rx_port_name=testbed_config.ports[tx_port_id].name)

    speed_str = testbed_config.layer1[0].speed
    speed_gbps = int(speed_str.split('_')[1])
    pause_dur = 65535 * 64 * 8.0 / (speed_gbps * 1e9)
    pps = int(2 / pause_dur)

    pause_flow = Flow(name=pause_flow_name,
                      tx_rx=TxRx(pause_src_point),
                      packet=[pause_pkt],
                      size=Size(64),
                      rate=Rate('pps', value=pps),
                      duration=Duration(
                          Continuous(delay=0, delay_unit='nanoseconds')))

    result.append(pause_flow)
    return result
Esempio n. 14
0
def __gen_traffic(testbed_config, port_config_list, port_id, pause_flow_name,
                  pause_flow_dur_sec, data_flow_name_list,
                  data_flow_delay_sec_list, data_flow_dur_sec_list,
                  data_pkt_size, prio_list, prio_dscp_map):
    """
    Generate configurations of flows, including data flows and pause storm.

    Args:
        testbed_config (obj): testbed L1/L2/L3 configuration
        port_config_list (list): list of port configuration
        port_id (int): ID of DUT port to test.
        pause_flow_name (str): name of pause storm
        pause_flow_dur_sec (float): duration of pause storm in second
        data_flow_name_list (list): list of data flow names
        data_flow_delay_sec_list (list): list of data flow start delays in second
        data_flow_dur_sec_list (list): list of data flow durations in second
        data_pkt_size (int): size of data packets in byte
        prio_list (list): priorities of data flows and pause storm
        prio_dscp_map (dict): Priority vs. DSCP map (key = priority).

    Returns:
        flows configurations (list): the list should have configurations of
        len(prio_list) * 2 data flows, and a pause storm.
    """
    result = list()

    rx_port_id = port_id
    tx_port_id_list, rx_port_id_list = select_ports(
        port_config_list=port_config_list,
        pattern="many to one",
        rx_port_id=rx_port_id)
    pytest_assert(len(tx_port_id_list) > 0, "Cannot find any TX ports")
    tx_port_id = select_tx_port(tx_port_id_list=tx_port_id_list,
                                rx_port_id=rx_port_id)
    pytest_assert(tx_port_id is not None, "Cannot find a suitable TX port")

    tx_port_config = next((x for x in port_config_list if x.id == tx_port_id),
                          None)
    rx_port_config = next((x for x in port_config_list if x.id == rx_port_id),
                          None)

    tx_mac = tx_port_config.mac
    if tx_port_config.gateway == rx_port_config.gateway and \
       tx_port_config.prefix_len == rx_port_config.prefix_len:
        """ If soruce and destination port are in the same subnet """
        rx_mac = rx_port_config.mac
    else:
        rx_mac = tx_port_config.gateway_mac
    """ PFC storm """
    pause_time = []
    for x in range(8):
        if x in prio_list:
            pause_time.append('ffff')
        else:
            pause_time.append('0000')

    vector = pfc_class_enable_vector(prio_list)

    pause_pkt = Header(
        PfcPause(
            dst=FieldPattern(choice='01:80:C2:00:00:01'),
            src=FieldPattern(choice='00:00:fa:ce:fa:ce'),
            class_enable_vector=FieldPattern(choice=vector),
            pause_class_0=FieldPattern(choice=pause_time[0]),
            pause_class_1=FieldPattern(choice=pause_time[1]),
            pause_class_2=FieldPattern(choice=pause_time[2]),
            pause_class_3=FieldPattern(choice=pause_time[3]),
            pause_class_4=FieldPattern(choice=pause_time[4]),
            pause_class_5=FieldPattern(choice=pause_time[5]),
            pause_class_6=FieldPattern(choice=pause_time[6]),
            pause_class_7=FieldPattern(choice=pause_time[7]),
        ))

    pause_endpoint = PortTxRx(
        tx_port_name=testbed_config.ports[rx_port_id].name,
        rx_port_name=testbed_config.ports[tx_port_id].name)

    speed_str = testbed_config.layer1[0].speed
    speed_gbps = int(speed_str.split('_')[1])
    pause_dur = 65535 * 64 * 8.0 / (speed_gbps * 1e9)
    pps = int(2 / pause_dur)
    pause_pkt_cnt = pps * pause_flow_dur_sec

    pause_flow = Flow(name=pause_flow_name,
                      tx_rx=TxRx(pause_endpoint),
                      packet=[pause_pkt],
                      size=Size(64),
                      rate=Rate('pps', value=pps),
                      duration=Duration(
                          FixedPackets(packets=pause_pkt_cnt, delay=0)))

    result.append(pause_flow)

    data_endpoint = PortTxRx(
        tx_port_name=testbed_config.ports[tx_port_id].name,
        rx_port_name=testbed_config.ports[rx_port_id].name)

    data_flow_rate_percent = int(100 / len(prio_list))
    """ For each data flow """
    for i in range(len(data_flow_name_list)):
        """ For each priority """
        for prio in prio_list:
            eth_hdr = EthernetHeader(src=FieldPattern(tx_mac),
                                     dst=FieldPattern(rx_mac),
                                     pfc_queue=FieldPattern([prio]))

            ip_prio = Priority(
                Dscp(phb=FieldPattern(choice=prio_dscp_map[prio]),
                     ecn=FieldPattern(choice=Dscp.ECN_CAPABLE_TRANSPORT_1)))

            ipv4_hdr = Ipv4Header(src=FieldPattern(tx_port_config.ip),
                                  dst=FieldPattern(rx_port_config.ip),
                                  priority=ip_prio)

            data_flow = Flow(
                name='{} Prio {}'.format(data_flow_name_list[i], prio),
                tx_rx=TxRx(data_endpoint),
                packet=[Header(choice=eth_hdr),
                        Header(choice=ipv4_hdr)],
                size=Size(data_pkt_size),
                rate=Rate('line', data_flow_rate_percent),
                duration=Duration(
                    FixedSeconds(seconds=data_flow_dur_sec_list[i],
                                 delay=sec_to_nanosec(
                                     data_flow_delay_sec_list[i]),
                                 delay_unit='nanoseconds')))

            result.append(data_flow)

    return result
Esempio n. 15
0
def configure_pfc_lossy(api,
                        phy_tx_port,
                        phy_rx_port,
                        port_speed,
                        tx_port_ip='0.0.0.0',
                        rx_port_ip='0.0.0.0',
                        tx_gateway_ip='0.0.0.0',
                        rx_gateway_ip='0.0.0.',
                        tx_ip_incr='0.0.0.0',
                        rx_ip_incr='0.0.0.0',
                        tx_gateway_incr='0.0.0.0',
                        rx_gateway_incr='0.0.0.0',
                        configure_pause_frame=True):

    api.set_config(None)

    tx = Port(name='Tx', location=phy_tx_port)
    rx = Port(name='Rx', location=phy_rx_port)

    #########################################################################
    # common L1 configuration
    #########################################################################
    pfc = Ieee8021qbb(pfc_delay=1,
                      pfc_class_0=0,
                      pfc_class_1=1,
                      pfc_class_2=2,
                      pfc_class_3=3,
                      pfc_class_4=4,
                      pfc_class_5=5,
                      pfc_class_6=6,
                      pfc_class_7=7)

    flow_ctl = FlowControl(choice=pfc)

    l1_oneHundredGbe = OneHundredGbe(link_training=True,
                                     ieee_media_defaults=False,
                                     auto_negotiate=False,
                                     speed='one_hundred_gbps',
                                     rs_fec=True,
                                     flow_control=flow_ctl)

    common_l1_config = Layer1(name='common L1 config',
                              choice=l1_oneHundredGbe,
                              port_names=[tx.name, rx.name])

    ###########################################################################
    # Create TX stack configuration
    ###########################################################################
    tx_ipv4 = Ipv4(name='Tx Ipv4',
                   address=Pattern(tx_port_ip),
                   prefix=Pattern('24'),
                   gateway=Pattern(tx_gateway_ip),
                   ethernet=Ethernet(name='Tx Ethernet'))

    tx.devices.append(Device(name='Tx Device', device_count=1, choice=tx_ipv4))

    ###########################################################################
    # Create RX stack configuration
    ###########################################################################
    rx_ipv4 = Ipv4(name='Rx Ipv4',
                   address=Pattern(rx_port_ip),
                   prefix=Pattern('24'),
                   gateway=Pattern(rx_gateway_ip),
                   ethernet=Ethernet(name='Rx Ethernet'))

    rx.devices.append(Device(name='Rx Device', device_count=1, choice=rx_ipv4))

    ###########################################################################
    # Traffic configuration Test data
    ###########################################################################
    data_endpoint = DeviceTxRx(tx_device_names=[tx.devices[0].name],
                               rx_device_names=[rx.devices[0].name])

    test_dscp = Priority(
        Dscp(phb=PATTERN(choice=["0", "1", "2", "5", "6", "7"])))

    test_flow = Flow(name='Test Data',
                     tx_rx=TxRx(data_endpoint),
                     packet=[
                         Header(choice=ETHERNET()),
                         Header(choice=IPV4(priority=test_dscp))
                     ],
                     size=Size(128),
                     rate=Rate('line', 50),
                     duration=Duration(
                         FixedPackets(packets=0,
                                      delay=1000000000,
                                      delay_unit='nanoseconds')))

    ###########################################################################
    # Traffic configuration Background data
    ###########################################################################
    background_dscp = Priority(Dscp(phb=PATTERN(choice=["3", "4"])))
    background_flow = Flow(name='Background Data',
                           tx_rx=TxRx(data_endpoint),
                           packet=[
                               Header(choice=ETHERNET()),
                               Header(choice=IPV4(priority=background_dscp))
                           ],
                           size=Size(128),
                           rate=Rate('line', 50),
                           duration=Duration(
                               FixedPackets(packets=0,
                                            delay=1000000000,
                                            delay_unit='nanoseconds')))

    ###########################################################################
    # Traffic configuration Pause
    ###########################################################################
    if (configure_pause_frame):
        pause_endpoint = PortTxRx(tx_port_name=rx.name)
        pause = Header(
            PfcPause(
                dst=PATTERN(choice='01:80:C2:00:00:01'),
                src=PATTERN(choice='00:00:fa:ce:fa:ce'),
                class_enable_vector=PATTERN(choice='E7'),
                pause_class_0=PATTERN(choice='ffff'),
                pause_class_1=PATTERN(choice='ffff'),
                pause_class_2=PATTERN(choice='ffff'),
                pause_class_3=PATTERN(choice='0'),
                pause_class_4=PATTERN(choice='0'),
                pause_class_5=PATTERN(choice='ffff'),
                pause_class_6=PATTERN(choice='ffff'),
                pause_class_7=PATTERN(choice='ffff'),
            ))

        pause_flow = Flow(name='Pause Storm',
                          tx_rx=TxRx(pause_endpoint),
                          packet=[pause],
                          size=Size(64),
                          rate=Rate('line', value=100),
                          duration=Duration(
                              FixedPackets(packets=0,
                                           delay=0,
                                           delay_unit='nanoseconds')))
        flows = [test_flow, background_flow, pause_flow]
    else:
        flows = [test_flow, background_flow]

    ###########################################################################
    # Set config
    ###########################################################################
    config = Config(ports=[tx, rx], layer1=[common_l1_config], flows=flows)

    api.set_config(config)
    return config
Esempio n. 16
0
def __gen_traffic(testbed_config, port_id, pause_flow_name, data_flow_name,
                  prio, data_pkt_size, data_pkt_cnt, data_flow_delay_sec,
                  exp_dur_sec, prio_dscp_map):
    """
    Generate configurations of flows, including a data flow and a PFC pause storm.

    Args:
        testbed_config (obj): L2/L3 config of a T0 testbed
        port_id (int): ID of DUT port to test
        pause_flow_name (str): name of the pause storm
        data_flow_name (str): name of the data flow
        prio (int): priority of the data flow and PFC pause storm
        data_pkt_size (int): packet size of the data flow in byte
        data_pkt_cnt (int): # of packets of the data flow
        data_flow_delay_sec (float): start delay of the data flow in second
        exp_dur_sec (float): experiment duration in second
        prio_dscp_map (dict): Priority vs. DSCP map (key = priority).

    Returns:
        Configurations of the data flow and the PFC pause storm (list)

    """

    result = list()

    rx_port_id = port_id
    tx_port_id = (port_id + 1) % len(testbed_config.devices)

    data_endpoint = DeviceTxRx(
        tx_device_names=[testbed_config.devices[tx_port_id].name],
        rx_device_names=[testbed_config.devices[rx_port_id].name],
    )

    data_flow_delay_nanosec = sec_to_nanosec(data_flow_delay_sec)
    """ Data Flow """
    ip_prio = Priority(
        Dscp(phb=FieldPattern(choice=prio_dscp_map[prio]),
             ecn=FieldPattern(choice=Dscp.ECN_CAPABLE_TRANSPORT_1)))
    pfc_queue = FieldPattern([prio])

    data_flow = Flow(name=data_flow_name,
                     tx_rx=TxRx(data_endpoint),
                     packet=[
                         Header(choice=EthernetHeader(pfc_queue=pfc_queue)),
                         Header(choice=Ipv4Header(priority=ip_prio))
                     ],
                     size=Size(data_pkt_size),
                     rate=Rate('line', 100),
                     duration=Duration(
                         FixedPackets(packets=data_pkt_cnt,
                                      delay=data_flow_delay_nanosec,
                                      delay_unit='nanoseconds')))

    result.append(data_flow)
    """ PFC Pause Storm """
    pause_time = []
    for x in range(8):
        if x == prio:
            pause_time.append('ffff')
        else:
            pause_time.append('0000')

    vector = pfc_class_enable_vector([prio])
    pause_pkt = Header(
        PfcPause(
            dst=FieldPattern(choice='01:80:C2:00:00:01'),
            src=FieldPattern(choice='00:00:fa:ce:fa:ce'),
            class_enable_vector=FieldPattern(choice=vector),
            pause_class_0=FieldPattern(choice=pause_time[0]),
            pause_class_1=FieldPattern(choice=pause_time[1]),
            pause_class_2=FieldPattern(choice=pause_time[2]),
            pause_class_3=FieldPattern(choice=pause_time[3]),
            pause_class_4=FieldPattern(choice=pause_time[4]),
            pause_class_5=FieldPattern(choice=pause_time[5]),
            pause_class_6=FieldPattern(choice=pause_time[6]),
            pause_class_7=FieldPattern(choice=pause_time[7]),
        ))
    """ Pause frames are sent from the RX port """
    pause_src_point = PortTxRx(
        tx_port_name=testbed_config.ports[rx_port_id].name,
        rx_port_name=testbed_config.ports[tx_port_id].name)

    speed_str = testbed_config.layer1[0].speed
    speed_gbps = int(speed_str.split('_')[1])
    pause_dur = 65535 * 64 * 8.0 / (speed_gbps * 1e9)
    pps = int(2 / pause_dur)

    pause_flow = Flow(name=pause_flow_name,
                      tx_rx=TxRx(pause_src_point),
                      packet=[pause_pkt],
                      size=Size(64),
                      rate=Rate('pps', value=pps),
                      duration=Duration(
                          FixedSeconds(seconds=exp_dur_sec,
                                       delay=0,
                                       delay_unit='nanoseconds')))

    result.append(pause_flow)
    return result
Esempio n. 17
0
def base_configs(testbed, conn_graph_facts, duthost, lossless_prio_dscp_map,
                 one_hundred_gbe, start_delay, pause_line_rate,
                 traffic_line_rate, frame_size, ecn_thresholds, serializer):

    for config in one_hundred_gbe:

        start_delay = start_delay * 1000000000.0

        test_dscp_list = [str(prio) for prio in lossless_prio_dscp_map]

        tx = config.ports[0]
        rx = config.ports[1]

        vlan_subnet = get_vlan_subnet(duthost)
        pytest_assert(vlan_subnet is not None,
                      "Fail to get Vlan subnet information")

        vlan_ip_addrs = get_addrs_in_subnet(vlan_subnet, 2)

        gw_addr = vlan_subnet.split('/')[0]
        interface_ip_addr = vlan_ip_addrs[0]

        tx_port_ip = vlan_ip_addrs[1]
        rx_port_ip = vlan_ip_addrs[0]

        tx_gateway_ip = gw_addr
        rx_gateway_ip = gw_addr

        test_flow_name = 'Test Data'

        test_line_rate = traffic_line_rate
        pause_line_rate = pause_line_rate

        pytest_assert(test_line_rate <= pause_line_rate,
                      "test_line_rate + should be less than pause_line_rate")

        ######################################################################
        # Create TX stack configuration
        ######################################################################
        tx_ipv4 = Ipv4(name='Tx Ipv4',
                       address=Pattern(tx_port_ip),
                       prefix=Pattern('24'),
                       gateway=Pattern(tx_gateway_ip),
                       ethernet=Ethernet(name='Tx Ethernet'))

        tx.devices.append(
            Device(name='Tx Device', device_count=1, choice=tx_ipv4))

        ######################################################################
        # Create RX stack configuration
        ######################################################################
        rx_ipv4 = Ipv4(name='Rx Ipv4',
                       address=Pattern(rx_port_ip),
                       prefix=Pattern('24'),
                       gateway=Pattern(rx_gateway_ip),
                       ethernet=Ethernet(name='Rx Ethernet'))

        rx.devices.append(
            Device(name='Rx Device', device_count=1, choice=rx_ipv4))

        ######################################################################
        # Traffic configuration Test data
        ######################################################################
        data_endpoint = DeviceTxRx(
            tx_device_names=[tx.devices[0].name],
            rx_device_names=[rx.devices[0].name],
        )

        pytest_assert(ecn_thresholds < 1024 * 1024,
                      "keep the ECN thresholds less than 1MB")

        test_dscp = Priority(
            Dscp(phb=FieldPattern(choice=test_dscp_list),
                 ecn=FieldPattern(Dscp.ECN_CAPABLE_TRANSPORT_1)))

        # ecn_thresholds in bytes
        number_of_packets = int(2 * (ecn_thresholds / frame_size))
        logger.info("Total number of packets to send = 2 * %s = %s"\
            %(ecn_thresholds / frame_size, number_of_packets))

        test_flow = Flow(name=test_flow_name,
                         tx_rx=TxRx(data_endpoint),
                         packet=[
                             Header(choice=EthernetHeader()),
                             Header(choice=Ipv4Header(priority=test_dscp))
                         ],
                         size=Size(frame_size),
                         rate=Rate('line', test_line_rate),
                         duration=Duration(
                             FixedPackets(packets=number_of_packets,
                                          delay=start_delay,
                                          delay_unit='nanoseconds')))

        config.flows.append(test_flow)

        #######################################################################
        # Traffic configuration Pause
        #######################################################################
        pause_endpoint = PortTxRx(tx_port_name='Rx', rx_port_names=['Rx'])
        pause = Header(
            PfcPause(
                dst=FieldPattern(choice='01:80:C2:00:00:01'),
                src=FieldPattern(choice='00:00:fa:ce:fa:ce'),
                class_enable_vector=FieldPattern(choice='18'),
                pause_class_0=FieldPattern(choice='0'),
                pause_class_1=FieldPattern(choice='0'),
                pause_class_2=FieldPattern(choice='0'),
                pause_class_3=FieldPattern(choice='ffff'),
                pause_class_4=FieldPattern(choice='ffff'),
                pause_class_5=FieldPattern(choice='0'),
                pause_class_6=FieldPattern(choice='0'),
                pause_class_7=FieldPattern(choice='0'),
            ))

        pause_flow = Flow(name='Pause Storm',
                          tx_rx=TxRx(pause_endpoint),
                          packet=[pause],
                          size=Size(64),
                          rate=Rate('line', value=100),
                          duration=Duration(
                              FixedPackets(packets=0,
                                           delay=0,
                                           delay_unit='nanoseconds')))

        config.flows.append(pause_flow)

    return one_hundred_gbe