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)
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)