コード例 #1
0
    def _start_traffic_api(self, packet_limit):
        """
        Start the Xena traffic using the socket API driver
        :param packet_limit: packet limit for stream, set to -1 for no limit
        :return: None
        """
        if not self.xmanager:
            self._xsocket = XenaSocketDriver(
                settings.getValue('TRAFFICGEN_XENA_IP'))
            self.xmanager = XenaManager(
                self._xsocket, settings.getValue('TRAFFICGEN_XENA_USER'),
                settings.getValue('TRAFFICGEN_XENA_PASSWORD'))

        # for the report file version info ask the chassis directly for its
        # software versions
        settings.setValue('XENA_VERSION', 'XENA Socket API - {}'.format(
            self.xmanager.get_version()))

        if not self.xmanager.ports:
            self.xmanager.ports[0] = self.xmanager.add_module_port(
                settings.getValue('TRAFFICGEN_XENA_MODULE1'),
                settings.getValue('TRAFFICGEN_XENA_PORT1'))
            if not self.xmanager.ports[0].reserve_port():
                self._logger.error(
                    'Unable to reserve port 0. Please release Xena Port')

        if len(self.xmanager.ports) < 2:
            self.xmanager.ports[1] = self.xmanager.add_module_port(
                settings.getValue('TRAFFICGEN_XENA_MODULE2'),
                settings.getValue('TRAFFICGEN_XENA_PORT2'))
            if not self.xmanager.ports[1].reserve_port():
                self._logger.error(
                    'Unable to reserve port 1. Please release Xena Port')

        # Clear port configuration for a clean start
        self.xmanager.ports[0].reset_port()
        self.xmanager.ports[1].reset_port()
        if settings.getValue('TRAFFICGEN_XENA_CONT_PORT_LEARNING_ENABLED'):
            # turn on port learning
            self.xmanager.ports[0].set_port_learning(1)
            self.xmanager.ports[1].set_port_learning(1)
            sleep(settings.getValue('TRAFFICGEN_XENA_CONT_PORT_LEARNING_DURATION'))
            # turn off port learning
            self.xmanager.ports[0].set_port_learning(0)
            self.xmanager.ports[1].set_port_learning(0)
            sleep(1)
        self.xmanager.ports[0].clear_stats()
        self.xmanager.ports[1].clear_stats()

        # set the port IP from the conf file
        self.xmanager.ports[0].set_port_ip(
            settings.getValue('TRAFFICGEN_XENA_PORT0_IP'),
            settings.getValue('TRAFFICGEN_XENA_PORT0_CIDR'),
            settings.getValue('TRAFFICGEN_XENA_PORT0_GATEWAY'))
        self.xmanager.ports[1].set_port_ip(
            settings.getValue('TRAFFICGEN_XENA_PORT1_IP'),
            settings.getValue('TRAFFICGEN_XENA_PORT1_CIDR'),
            settings.getValue('TRAFFICGEN_XENA_PORT1_GATEWAY'))
        self.xmanager.ports[0].set_port_time_limit(self._duration)
        self.xmanager.ports[1].set_port_time_limit(self._duration)

        def setup_stream(stream, port, payload_id, flip_addr=False):
            """
            Helper function to configure streams.
            :param stream: Stream object from XenaDriver module
            :param port: Port object from XenaDriver module
            :param payload_id: payload ID as int
            :param flip_addr: Boolean if the source and destination addresses
            should be flipped.
            :return: None
            """
            stream.set_on()
            if packet_limit != -1:
                stream.set_packet_limit(packet_limit)

            port.set_port_arp_reply(is_on=True)
            port.set_port_arp_reply(is_on=True, ipv6=True)
            port.set_port_ping_reply(is_on=True)
            port.set_port_ping_reply(is_on=True, ipv6=True)

            stream.set_rate_fraction(int(
                10000 * self._params['traffic']['frame_rate']))
            stream.set_packet_header(self._build_packet_header(
                reverse=flip_addr))
            stream.set_header_protocol(
                'ETHERNET VLAN IP UDP' if self._params['traffic']['vlan'][
                    'enabled'] else 'ETHERNET IP UDP')
            stream.set_packet_length(
                'fixed', self._params['traffic']['l2']['framesize'],
                self._params['traffic']['l2']['framesize'])
            stream.set_packet_payload('incrementing', '0x00')
            stream.set_payload_id(payload_id)
            port.set_port_time_limit(self._duration * 1000000)

            if self._params['traffic']['l2']['framesize'] == 64:
                # set micro tpld
                port.micro_tpld_enable()

            if self._params['traffic']['multistream']:
                if self._params['traffic']['stream_type'] == 'L2':
                    modobj = ModSet(mod_src_mac=True, mod_dst_mac=True)
                elif self._params['traffic']['stream_type'] == 'L3':
                    modobj = ModSet(mod_src_ip=True, mod_dst_ip=True)
                elif self._params['traffic']['stream_type'] == 'L4':
                    modobj = ModSet(mod_src_port=True, mod_dst_port=True)
                else:
                    self._logger.error('Invalid segment for multistream. Using L2..')
                    modobj = ModSet(mod_src_mac=True, mod_dst_mac=True)
                stream.enable_multistream(
                    flows=self._params['traffic']['multistream'], mod_class=modobj)

        s1_p0 = self.xmanager.ports[0].add_stream()
        setup_stream(s1_p0, self.xmanager.ports[0], 0)

        if self._params['traffic']['bidir'] == 'True':
            s1_p1 = self.xmanager.ports[1].add_stream()
            setup_stream(s1_p1, self.xmanager.ports[1], 1, flip_addr=True)

        if not self.xmanager.ports[0].traffic_on():
            self._logger.error(
                "Failure to start port 0. Check settings and retry.")
        if self._params['traffic']['bidir'] == 'True':
            if not self.xmanager.ports[1].traffic_on():
                self._logger.error(
                    "Failure to start port 1. Check settings and retry.")
        sleep(self._duration + 5) # the extra 5 seconds is to allow packets in flight to complete
        # getting results
        if self._params['traffic']['bidir'] == 'True':
            # need to aggregate out both ports stats and assign that data
            self.rx_stats = self.xmanager.ports[1].get_rx_stats()
            self.tx_stats = self.xmanager.ports[0].get_tx_stats()
            self.tx_stats.data = aggregate_stats(
                self.tx_stats.data,
                self.xmanager.ports[1].get_tx_stats().data)
            self.rx_stats.data = aggregate_stats(
                self.rx_stats.data,
                self.xmanager.ports[0].get_rx_stats().data)
        else:
            # no need to aggregate, just grab the appropriate port stats
            self.tx_stats = self.xmanager.ports[0].get_tx_stats()
            self.rx_stats = self.xmanager.ports[1].get_rx_stats()
        sleep(1)
コード例 #2
0
ファイル: xena.py プロジェクト: DongCai008/Xena-VSPerf
    def _start_traffic_api(self, packet_limit):
        """
        Start the Xena traffic using the socket API driver
        :param packet_limit: packet limit for stream, set to -1 for no limit
        :return: None
        """
        if not self.xmanager:
            self._xsocket = XenaSocketDriver(
                settings.getValue('TRAFFICGEN_XENA_IP'))
            self.xmanager = XenaManager(
                self._xsocket, settings.getValue('TRAFFICGEN_XENA_USER'),
                settings.getValue('TRAFFICGEN_XENA_PASSWORD'))

        if not len(self.xmanager.ports):
            self.xmanager.ports[0] = self.xmanager.add_module_port(
                settings.getValue('TRAFFICGEN_XENA_MODULE1'),
                settings.getValue('TRAFFICGEN_XENA_PORT1'))
            if not self.xmanager.ports[0].reserve_port():
                self._logger.error(
                    'Unable to reserve port 0. Please release Xena Port')
                sys.exit(1)

        if len(self.xmanager.ports) < 2:
            self.xmanager.ports[1] = self.xmanager.add_module_port(
                settings.getValue('TRAFFICGEN_XENA_MODULE2'),
                settings.getValue('TRAFFICGEN_XENA_PORT2'))
            if not self.xmanager.ports[1].reserve_port():
                self._logger.error(
                    'Unable to reserve port 1. Please release Xena Port')
                sys.exit(1)

        # Clear port configuration for a clean start
        self.xmanager.ports[0].reset_port()
        self.xmanager.ports[1].reset_port()
        self.xmanager.ports[0].clear_stats()
        self.xmanager.ports[1].clear_stats()

        s1_p0 = self.xmanager.ports[0].add_stream()
        s1_p0.set_on()
        s1_p0.set_packet_limit(packet_limit)

        s1_p0.set_rate_fraction(10000 * self._params['traffic']['frame_rate'])
        s1_p0.set_packet_header(self._build_packet_header())
        s1_p0.set_header_protocol(
            'ETHERNET VLAN IP UDP' if self.
            _params['traffic']['vlan']['enabled'] else 'ETHERNET IP UDP')
        s1_p0.set_packet_length('fixed',
                                self._params['traffic']['l2']['framesize'],
                                16383)
        s1_p0.set_packet_payload('incrementing', '0x00')
        s1_p0.set_payload_id(0)

        self.xmanager.ports[0].set_port_time_limit(self._duration * 1000000)

        if self._params['traffic']['l2']['framesize'] == 64:
            # set micro tpld
            self.xmanager.ports[0].micro_tpld_enable()

        if self._params['traffic']['multistream']:
            s1_p0.enable_multistream(
                flows=self._params['traffic']['multistream'],
                layer=self._params['traffic']['stream_type'])

        if self._params['traffic']['bidir']:
            s1_p1 = self.xmanager.ports[1].add_stream()
            s1_p1.set_on()
            s1_p1.set_packet_limit(packet_limit)

            s1_p1.set_rate_fraction(10000 *
                                    self._params['traffic']['frame_rate'])
            s1_p1.set_packet_header(self._build_packet_header(reverse=True))
            s1_p1.set_header_protocol(
                'ETHERNET VLAN IP UDP' if self.
                _params['traffic']['vlan']['enabled'] else 'ETHERNET IP UDP')
            s1_p1.set_packet_length('fixed',
                                    self._params['traffic']['l2']['framesize'],
                                    16383)
            s1_p1.set_packet_payload('incrementing', '0x00')
            s1_p1.set_payload_id(1)

            self.xmanager.ports[1].set_port_time_limit(self._duration *
                                                       1000000)

            if self._params['traffic']['l2']['framesize'] == 64:
                # set micro tpld
                self.xmanager.ports[1].micro_tpld_enable()

            if self._params['traffic']['multistream']:
                s1_p1.enable_multistream(
                    flows=self._params['traffic']['multistream'],
                    layer=self._params['traffic']['stream_type'])

        if not self.xmanager.ports[0].traffic_on():
            self._logger.error(
                "Failure to start port 0. Check settings and retry.")
        if self._params['traffic']['bidir']:
            if not self.xmanager.ports[1].traffic_on():
                self._logger.error(
                    "Failure to start port 1. Check settings and retry.")
        Time.sleep(self._duration)
        # getting results
        if self._params['traffic']['bidir']:
            # need to average out both ports and assign that data
            self.rx_stats = self.xmanager.ports[1].get_rx_stats()
            self.tx_stats = self.xmanager.ports[0].get_tx_stats()
            self.tx_stats.data = average_stats(
                self.tx_stats.data, self.xmanager.ports[1].get_tx_stats().data)
            self.rx_stats.data = average_stats(
                self.rx_stats.data, self.xmanager.ports[0].get_rx_stats().data)
        else:
            # no need to average, just grab the appropriate port stats
            self.tx_stats = self.xmanager.ports[0].get_tx_stats()
            self.rx_stats = self.xmanager.ports[1].get_rx_stats()
        Time.sleep(1)