From 04a0e5c51eb28e11c3337fc3b85fc16167c4af95 Mon Sep 17 00:00:00 2001 From: Christian Trautman Date: Mon, 21 Nov 2016 09:28:41 -0500 Subject: Xena_cont_accuracy: Modify continuous from duration to packet limit First of a few patches planned to help increase Xena continuous traffic accuracy. Modifies port limits to packet calculated limits versus time based limits which can be wildly inaccurate. Also modifies some port settings to be more inline with how rfc2544 settings are applied on Xena. Increased time delay by one second to allow packets to finish transmitting before stat collection occurs. JIRA: VSPerf-423 Change-Id: I214b13d743a84a0733e885ccfc5bdd57812d7104 Signed-off-by: Christian Trautman --- tools/pkt_gen/xena/XenaDriver.py | 28 ++++++++++++++++++++++++++++ tools/pkt_gen/xena/xena.py | 22 ++++++++++++++++++---- 2 files changed, 46 insertions(+), 4 deletions(-) diff --git a/tools/pkt_gen/xena/XenaDriver.py b/tools/pkt_gen/xena/XenaDriver.py index d3862312..04a99e9d 100644 --- a/tools/pkt_gen/xena/XenaDriver.py +++ b/tools/pkt_gen/xena/XenaDriver.py @@ -61,6 +61,10 @@ CMD_RESERVE = 'p_reservation reserve' CMD_RELEASE = 'p_reservation release' CMD_RELINQUISH = 'p_reservation relinquish' CMD_RESET = 'p_reset' +CMD_SET_PORT_ARP_REPLY = 'p_arpreply' +CMD_SET_PORT_ARP_V6_REPLY = 'p_arpv6reply' +CMD_SET_PORT_PING_REPLY = 'p_pingreply' +CMD_SET_PORT_PING_V6_REPLY = 'p_pingv6reply' CMD_SET_PORT_TIME_LIMIT = 'p_txtimelimit' CMD_SET_STREAM_HEADER_PROTOCOL = 'ps_headerprotocol' CMD_SET_STREAM_ON_OFF = 'ps_enable' @@ -532,6 +536,30 @@ class XenaPort(object): command = make_port_command(CMD_RESET, self) return self._manager.driver.ask_verify(command) + def set_port_arp_reply(self, on=True, v6=False): + """ + Set the port arpreply value + :param on: Enable or disable the arp reply on the port + :param v6: set the value on the ip v6, disabled will set at ip v4 + :return: Boolean True if response OK, False if error + """ + command = make_port_command('{} {}'.format( + CMD_SET_PORT_ARP_V6_REPLY if v6 else CMD_SET_PORT_ARP_REPLY, + "on" if on else "off"), self) + return self._manager.driver.ask_verify(command) + + def set_port_ping_reply(self, on=True, v6=False): + """ + Set the port ping reply value + :param on: Enable or disable the ping reply on the port + :param v6: set the value on the ip v6, disabled will set at ip v4 + :return: Boolean True if response OK, False if error + """ + command = make_port_command('{} {}'.format( + CMD_SET_PORT_PING_V6_REPLY if v6 else CMD_SET_PORT_PING_REPLY, + "on" if on else "off"), self) + return self._manager.driver.ask_verify(command) + def set_port_ip(self, ip_addr, cidr, gateway, wild='255'): """ Set the port ip address of the specific port diff --git a/tools/pkt_gen/xena/xena.py b/tools/pkt_gen/xena/xena.py index 8d45053e..798bb832 100755 --- a/tools/pkt_gen/xena/xena.py +++ b/tools/pkt_gen/xena/xena.py @@ -421,7 +421,20 @@ class Xena(ITrafficGenerator): :return: None """ stream.set_on() - stream.set_packet_limit(packet_limit) + if packet_limit != -1: + stream.set_packet_limit(packet_limit) + else: + speed = port.get_port_speed() / 8 # convert to bytes + gap = port.get_inter_frame_gap() + pkt_size = self._params['traffic']['l2']['framesize'] + packets = int(((speed / (pkt_size + gap)) * self._duration) * + (self._params['traffic']['frame_rate'] / 100)) + stream.set_packet_limit(packets) + + port.set_port_arp_reply(on=True) + port.set_port_arp_reply(on=True, v6=True) + port.set_port_ping_reply(on=True) + port.set_port_ping_reply(on=True, v6=True) stream.set_rate_fraction( 10000 * self._params['traffic']['frame_rate']) @@ -431,10 +444,11 @@ class Xena(ITrafficGenerator): 'ETHERNET VLAN IP UDP' if self._params['traffic']['vlan'][ 'enabled'] else 'ETHERNET IP UDP') stream.set_packet_length( - 'fixed', self._params['traffic']['l2']['framesize'], 16383) + '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) + port.set_port_time_limit(0) if self._params['traffic']['l2']['framesize'] == 64: # set micro tpld @@ -459,7 +473,7 @@ class Xena(ITrafficGenerator): if not self.xmanager.ports[1].traffic_on(): self._logger.error( "Failure to start port 1. Check settings and retry.") - sleep(self._duration) + sleep(self._duration + 1) # getting results if self._params['traffic']['bidir'] == 'True': # need to aggregate out both ports stats and assign that data -- cgit 1.2.3-korg