From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by dpdk.org (Postfix) with ESMTP id 57D302C4F for ; Mon, 16 Jan 2017 04:51:43 +0100 (CET) Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga103.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 15 Jan 2017 19:51:43 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.33,237,1477983600"; d="scan'208";a="1083421061" Received: from unknown (HELO dpdk-fedora20.icx.intel.com) ([10.240.176.135]) by orsmga001.jf.intel.com with ESMTP; 15 Jan 2017 19:51:42 -0800 From: yufengx.mo@intel.com To: dts@dpdk.org Cc: yufengmx Date: Mon, 16 Jan 2017 11:52:45 +0800 Message-Id: <1484538765-45921-2-git-send-email-yufengx.mo@intel.com> X-Mailer: git-send-email 1.9.3 In-Reply-To: <1484538765-45921-1-git-send-email-yufengx.mo@intel.com> References: <1484538765-45921-1-git-send-email-yufengx.mo@intel.com> Subject: [dts] [PATCH V1]userspace_ethtool: remove eeprom content checking file size X-BeenThere: dts@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: test suite reviews and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 16 Jan 2017 03:51:43 -0000 From: yufengmx limitation commit 001a1c0f98f4e3ac19c26515892e2448a7547c38 Author: Zyta Szpak Date: Mon Jul 4 13:36:46 2016 +0200 ethdev: get registers width The ethtool app was allocating too little space for 64-bit registers which resulted in memory corruption. Removes hard-coded assumption that device registers are always 32 bits wide. The rte_eth_dev_get_reg_length and rte_eth_dev_get_reg_info callbacks did not provide register size to the app in any way while is needed to allocate correct number of bytes before retrieving registers using rte_eth_dev_get_reg. This commit changes rte_eth_dev_get_reg_info so that it can be used to retrieve both the number of registers and their width, and removes the now-redundant rte_eth_dev_get_reg_length. Signed-off-by: yufengmx --- tests/TestSuite_userspace_ethtool.py | 136 +++++++++++++++++++++++++++-------- 1 file changed, 106 insertions(+), 30 deletions(-) diff --git a/tests/TestSuite_userspace_ethtool.py b/tests/TestSuite_userspace_ethtool.py index ced7e96..d12e6d3 100644 --- a/tests/TestSuite_userspace_ethtool.py +++ b/tests/TestSuite_userspace_ethtool.py @@ -128,22 +128,6 @@ class TestUserspaceEthtool(TestCase, IxiaPacketGenerator): else: return 1518 - def resize_linux_eeprom_file(self, dpdk_eeprom_file, linux_eeprom_file): - basePath = os.sep + "root" + self.dut.base_dir[1:] + os.sep - with open( basePath + os.sep + dpdk_eeprom_file, 'rb') as fpDpdk: - dpdk_bytes = fpDpdk.read() - dpdk_length = len(dpdk_bytes) - - with open( basePath + linux_eeprom_file, 'rb') as fplinux: - linux_bytes = fplinux.read() - linux_length = len(linux_bytes) - - self.verify(dpdk_length <= linux_length, - "linux ethtool haven't dump out enough data as dpdk ethtool") - - with open( basePath + linux_eeprom_file, 'wb') as fplinux: - fplinux.write(linux_bytes[:dpdk_length]) - def strip_md5(self, filename): md5_info = self.dut.send_expect("md5sum %s" % filename, "# ") md5_pattern = r"(\w+) (\w+)" @@ -153,25 +137,118 @@ class TestUserspaceEthtool(TestCase, IxiaPacketGenerator): else: return "" + def get_driver_info(self, dpdk_driver_msg): + # get nic driver information using dpdk's ethtool + info_lines = dpdk_driver_msg.strip().splitlines() + driver_pattern = r"Port (\d+) driver: (.*) \(ver: (.*)\)" + pattern = "(.*): (.*)" + firmwarePat = "0x([0-9a-f]+)" + check_content = ['firmware-version', 'driver'] + dpdk_drv_infos = {} + port = None + cnt = 0 + while cnt < len(info_lines): + if not info_lines[cnt]: + pass + else: + m = re.match(driver_pattern, info_lines[cnt]) + if m: + port = m.group(1) + dpdk_drv_infos[port] = {} + dpdk_drv_infos[port]['driver'] = m.group(2).split('_').pop() + dpdk_version = m.group(3) + else: + if port: + out = re.findall(pattern, info_lines[cnt], re.M)[0] + if len(out) == 2: + if out[0] == 'firmware-version': + dpdk_drv_infos[port][out[0]] = "0x" + re.findall(firmwarePat, out[1], re.M)[0] + else: + dpdk_drv_infos[port][out[0]] = out[1] + cnt += 1 + # check driver content + msg = '' + if 'firmware-version' not in dpdk_driver_msg: + self.logger.warning('firmware-version query not supported by current dpdk version') + return dpdk_drv_infos, msg + for port_no in dpdk_drv_infos: + dpdk_drv_info = dpdk_drv_infos[port_no] + for item in check_content: + if item not in dpdk_drv_info.keys(): + msg = os.linesep.join([msg, "port {0} get {1} failed".format(port_no, item)]) + dpdk_drv_infos = None + break + + return dpdk_drv_infos, msg + + def check_driver_info(self, port_name, dpdk_drv_info): + # get nic driver information using linux's ethtool + pattern = "(.*): (.*)" + firmwarePat = "0x([0-9a-f]+)" + infos = self.dut.send_expect("ethtool -i %s"%port_name, "# ").splitlines() + sys_nic_info = {} + for info in infos: + if not info: + continue + result = re.findall(pattern, info, re.M) + if not result: + continue + out = result[0] + if len(out) == 2: + if out[0] == 'firmware-version': + sys_nic_info[out[0]] = "0x" + re.findall(firmwarePat, out[1], re.M)[0] + else: + sys_nic_info[out[0]] = out[1] + # compare two information data + for item, value in dpdk_drv_info.items(): + if item not in sys_nic_info.keys(): + msg = "linux ethtool failed to dump driver info" + status = False + break + if value != sys_nic_info[item]: + msg = "Userspace ethtool failed to dump driver info" + status = False + break + else: + msg = "{0}: dpdk ethtool dump driver info done".format(port_name) + status = True + + return status, msg + def test_dump_driver_info(self): """ Test ethtool can dump basic information """ self.dut.send_expect(self.cmd, "EthApp>", 60) - out = self.dut.send_expect("drvinfo", "EthApp>") - driver_pattern = r"Port (\d+) driver: rte_(.*)_pmd \(ver: RTE (.*)\)" - driver_infos = out.split("\r\n") - self.verify(len(driver_infos) > 1, "Userspace tool failed to dump driver infor") - - # check dump driver info function - for driver_info in driver_infos: - m = re.match(driver_pattern, driver_info) - if m: - port = m.group(1) - driver = m.group(2) - version = m.group(3) - print utils.GREEN("Detect port %s with %s driver\n" % (port, driver)) + dpdk_driver_msg = self.dut.send_expect("drvinfo", "EthApp>") + self.dut.send_expect("quit", "# ") + dpdk_drv_infos, msg = self.get_driver_info(dpdk_driver_msg) + self.verify(dpdk_drv_infos, msg) + + portsinfo = {} + for index in range(len(self.ports)): + portsinfo[index] = {} + portinfo = portsinfo[index] + port = self.ports[index] + netdev = self.dut.ports_info[port]['port'] + intf_name = self.dut.ports_info[port]['intf'] + # strip orignal driver + portinfo['ori_driver'] = netdev.get_nic_driver() + portinfo['net_dev'] = netdev + # bind to default driver + netdev.bind_driver() + # get linux interface + intf = netdev.get_interface_name() + status, msg = self.check_driver_info(intf_name, dpdk_drv_infos[str(index)]) + self.logger.info(msg) + self.verify(status, msg) + for index in range(len(self.ports)): + # bind to original driver + portinfo = portsinfo[index] + portinfo['net_dev'].bind_driver(portinfo['ori_driver']) + + self.dut.send_expect(self.cmd, "EthApp>", 60) # ethtool doesn't support port disconnect by tools of linux # only detect physical link disconnect status if self.nic.startswith("fortville") == False: @@ -294,7 +371,6 @@ class TestUserspaceEthtool(TestCase, IxiaPacketGenerator): for index in range(len(self.ports)): md5 = self.strip_md5(portsinfo[index]['eeprom_file']) - self.resize_linux_eeprom_file( portsinfo[index]['eeprom_file'], portsinfo[index]['ethtool_eeprom']) md5_ref = self.strip_md5(portsinfo[index]['ethtool_eeprom']) print utils.GREEN("Reference eeprom md5 %s" % md5) print utils.GREEN("Reference eeprom md5_ref %s" % md5_ref) -- 1.9.3