From nobody Tue Dec 16 06:52:52 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1530193824667211.6406898527373; Thu, 28 Jun 2018 06:50:24 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E7F793078AAD; Thu, 28 Jun 2018 13:50:22 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 8ED6E11A2BB; Thu, 28 Jun 2018 13:50:22 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 6DC2118037ED; Thu, 28 Jun 2018 13:50:21 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w5SDO4eD021030 for ; Thu, 28 Jun 2018 09:24:04 -0400 Received: by smtp.corp.redhat.com (Postfix) id 7B11219482; Thu, 28 Jun 2018 13:24:04 +0000 (UTC) Received: from mx1.redhat.com (ext-mx11.extmail.prod.ext.phx2.redhat.com [10.5.110.40]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 6A6382910B for ; Thu, 28 Jun 2018 13:24:01 +0000 (UTC) Received: from NAM01-SN1-obe.outbound.protection.outlook.com (mail-sn1nam01on0041.outbound.protection.outlook.com [104.47.32.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 5855A30014B1 for ; Thu, 28 Jun 2018 13:24:00 +0000 (UTC) Received: from hyd1jrana-dt.caveonetworks.com (115.113.156.2) by CY4PR0701MB3747.namprd07.prod.outlook.com (2603:10b6:910:94::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.906.23; Thu, 28 Jun 2018 13:23:57 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=CAVIUMNETWORKS.onmicrosoft.com; s=selector1-cavium-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=gyogXzzUnWUBNw4gHYK9irxWOwzXHZbLMnN1EYOxk08=; b=AEs4c1POo4eQSZliwGm41sXIvsQ5ULsEzauaeU4pxGfhdhjF52H3kfovR90SKHwfQa6bbof+VQYZqYMFP+QJhvOhggVTjRNSLLCnx0ekRofDNocC1jEgSietujSpEiYMQMuSkERWdF1Drr1ifbzhpRCUNG6w52YoXMTwlsD9qhs= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=JaiSingh.Rana@cavium.com; From: Jai Singh Rana To: libvir-list@redhat.com Date: Thu, 28 Jun 2018 18:52:33 +0530 Message-Id: <20180628132237.11811-3-JaiSingh.Rana@cavium.com> In-Reply-To: <20180628132237.11811-1-JaiSingh.Rana@cavium.com> References: <20180628132237.11811-1-JaiSingh.Rana@cavium.com> MIME-Version: 1.0 X-Originating-IP: [115.113.156.2] X-ClientProxiedBy: MA1PR0101CA0066.INDPRD01.PROD.OUTLOOK.COM (2603:1096:a00:20::28) To CY4PR0701MB3747.namprd07.prod.outlook.com (2603:10b6:910:94::11) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 902bbb6f-6d01-4a6f-a52b-08d5dcfa6855 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(8989117)(4534165)(7168020)(4627221)(201703031133081)(201702281549075)(8990107)(5600026)(711020)(2017052603328)(7153060)(7193020); SRVR:CY4PR0701MB3747; X-Microsoft-Exchange-Diagnostics: 1; CY4PR0701MB3747; 3:BywykZu27o8+PD3iF2WrAXgcXimSb2mspLoMT51bFnUR9rHEROIYBV9wBLNRxG631q4la+kNLqkdcgnCckcVTQe28EtrMtj+hA36zIkKDUnHcwIKYg7nC91bISA+R1OG70utpqnyvMxGOrXG6nC2cQAak+oz0jUbGoQNZ8J4+h+lTJaAcOTYkWwUs0z+A8/DrOTxbVmWoqP/XwxiOZpYsEsMcBASW64xYvCeXD3utDdv/cxbBv90POAPcMQ5BZe1; 25:WFthMI4osNBZgNcz+cPBEm3BOTaQucRNoen2Q80vEX7scHO1aAVDXElxwSi9SbDXIc8LfX+RfAzmlRkiLlmyMPvE4kO/q3ILF+KK7ULEIR8BnUoeg35S/1sP+9dNcJcyeH8TQTtn5wG9MLoyArVHBqSF740+/nEjhFJgMjc2GF457tm/C98wdZH1Fjd63Li8Xy0HmQlkmQOy5wshMcuPipIaP9spcXuo7aeXn9gqEaIexb1OX6rIOB9fkgEdGeuOeZqiTvzpcgk8pp6HxmXVnQUFOyfUSJoyHk/Ur0Qhtp4Vg8MdPNAATJIe+xRbxBTudUnYzqorS0WlRWBx++H+rg==; 31:uLic1UE17RVf5zCpek2TJf4o+yBeGCwiEUVij5BjWZaYEvmdLTOMTBHPwZvpPBStQqrzTcsi/PU6u2W9OXkAJO0GIp2773EJKT8GPdBFVnUAGZcV4zHhXx8wcZ/NgrZODAc561tLWj0OTiBoAGk8f9stvG517tJPgwxve/0aKOmMo7yt/i516FM7atu2rkEI3saP5c5t4L2bjJUY3IeqvXbrvkStknrJEbTEPi6X01Q= X-MS-TrafficTypeDiagnostic: CY4PR0701MB3747: X-Microsoft-Exchange-Diagnostics: 1; CY4PR0701MB3747; 20:7N9s7OXdXwK1PNXO/D+Yt40uA27x9pWTWo8Ze4WCzEjDyhPURoVrH+YXpFCKPWxAhqKdmOFU9ep8KeByuwtrDhrhz5HkFksPTrr96zWlxacdnGZ3+0zGMU7Q+Usaia92LaVfubGb11T22D45LvO3/+M0TKwy0PZQATJwqSeKknyu8SQ6j/Es7spVt7yw9UprqoD2MKLaGHPqCxaDfE2h2g9dh6CzZKgLLDt6Pan8WtpTklo6oegSC/gZwJ9yUdc4L6FGZlPX1JP3OnzNbhc9zAKQhQabuwO/fh0Oo/O4pvTRbo5JuyZimfR6saw94SDQVz7j7R21gzJ2cYun0Er4PgAohjhh6jpqyDP4PfRkRUQyA9XQLSdjPWoqIynzsielcdevoHqTzdj1FPL55sqBmv15o76OFARWHItA/PD4stprWyFM8qY3pm3mYZWVEQswxSVP4Lec65CRX5g7sWTOsEp+kkesXluOZ8teNKK+PG+mmHPCoZ9nD3cu4XsSIKp/; 4:4zlRqmCZu5rIgs2gBC5eBzDFZ6FCjmDvNh0hVO5bYnxDdE9RZtlVPt8X2e/7qCS5RH2gJ3KjvIC7Y8xExHCTNK6BMujX0+n+w+s3evOOPU+qjWxwnPI4Nyo77kcoHXkL5t1Bzr8faAH/b73T4CY863McsrE3T5if48HXAR2RcqqJp7yZHwlnPD3X8zIWGDcCHd6McXCH3BifnxlpDm0omPtDIMaw4UYhb3GSvn4sJU89z1YmLv7clBdVHrmFjVDAID2ALZEHw2M36mYwwGCuyg== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-MS-Exchange-SenderADCheck: 1 X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(5005006)(8121501046)(3002001)(93006095)(93001095)(10201501046)(3231254)(944501410)(52105095)(149027)(150027)(6041310)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123560045)(20161123558120)(20161123562045)(20161123564045)(6072148)(201708071742011)(7699016); SRVR:CY4PR0701MB3747; BCL:0; PCL:0; RULEID:; SRVR:CY4PR0701MB3747; X-Forefront-PRVS: 0717E25089 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(346002)(376002)(136003)(366004)(396003)(39860400002)(189003)(199004)(26005)(16526019)(6506007)(446003)(386003)(5660300001)(39060400002)(316002)(486006)(50226002)(3846002)(186003)(2351001)(11346002)(76176011)(51416003)(52116002)(6116002)(6512007)(25786009)(6666003)(6916009)(81166006)(2906002)(575784001)(81156014)(16586007)(8676002)(86362001)(305945005)(55236004)(7736002)(68736007)(476003)(956004)(2616005)(4326008)(8936002)(53936002)(105586002)(106356001)(107886003)(6486002)(36756003)(2361001)(97736004)(72206003)(478600001)(66066001)(48376002)(69596002)(1076002)(53416004)(50466002)(47776003)(41533002); DIR:OUT; SFP:1101; SCL:1; SRVR:CY4PR0701MB3747; H:hyd1jrana-dt.caveonetworks.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; MX:1; A:1; Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Received-SPF: None (protection.outlook.com: cavium.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; CY4PR0701MB3747; 23:yIA8VmBP3fl6kGmt0uffQxdph4zIc4SrrxSmsBx?= =?us-ascii?Q?TGQVi1Nz1qiLcjfOA/IacBPSKs8KWuv+3XYjbcHI0P0EDWItQsGxIvcz7I+9?= =?us-ascii?Q?Z/QbEpOeLofvySXUrX/5xTHFQEeIZmDZxfieqQ6uIBAv8taywss6UzCSTHWR?= =?us-ascii?Q?ntyDYKKIB+2eN1SLf6JNGYdr5ghEYfPYgrPQQ7KAi//moTvHAtAiR55zkh5c?= =?us-ascii?Q?tlRsocvn1VCadRiZqi20xeYZnot6rsx2ablMi+3RSjpx0tcJFPCsLMSWfOKD?= =?us-ascii?Q?ZH6P+Hs1ER1qzRm93hJnSppI98LLGA+wjPkEBvwI9rb9VBuQjjNPgT4yNOpH?= =?us-ascii?Q?cZ0SJ/qm/xtVxfqx52QDNyF58AdKWnHuA3aZ/zq5aKVkllnvT0Mf9bM9x4rt?= =?us-ascii?Q?BwVJWxGHa/73x9NtKhdOqnSWVE5UQZDoqtOqdXhtbFnYfw1Iqiscx5uq1ws7?= =?us-ascii?Q?Y6BokjnA19TfjrdrtMsoPmq/IWXeNuUuXi6rjQ+Yp0yYMONMBV+COuZC1nPY?= =?us-ascii?Q?Mign5x7gPqjGUpyOewrtEby298wQ48188RpxvHBOT/Kox+0g8kEXfcy0KeHw?= =?us-ascii?Q?5fkqquf4mnvsYghJhIu6WCddFjGG6EzEhPENcgSZXivZwi4nrCMoEd2t4zjv?= =?us-ascii?Q?R8BcuPnn/IhSqqKShbyqWYK9z3p9Gekzh2SK+aYKU1PcPhwYc9u2AfsBeHfn?= =?us-ascii?Q?UflwoIqpL8TtFhumciJ/nIXCSymOzBbfA0qRYUgaIsAv0mm4yjFhgkLpe3oN?= =?us-ascii?Q?Lkh2CplTDWXWxLwXH+3WyBCPMPGdSZwSZ9/Dor2/Hc+bAqcTxMGpH2vutTj9?= =?us-ascii?Q?zuaH/V8JGlHyu2d0oUE+UEt81SBIkvgC3+IxgThKISVS2UTXbEWeHfIBtMDW?= =?us-ascii?Q?qCx2yKLCvhusCzU+CFktpYniMI/z39WM2P9AidyQ8XYNs5lDbZqEa9p4O0B3?= =?us-ascii?Q?/flqDwktd9zY/stIO/WHTi1xpRrk1/u+v4s7gb/gRfwanLxTpptrD54LUKzW?= =?us-ascii?Q?T6g7hpXatddgX8H1s76RuiR8IPWOKd5Zpv9lBpU98OpuhbtgB0WmTMW6C96W?= =?us-ascii?Q?u2yJLmXmXk8nXjmDV5PJqv74fhPnoq0ePm/CK43yScEpI3LhcLZyBX5a/UT0?= =?us-ascii?Q?bBC6/56zBdF1ZEWxE1HaYua1yJ0rt0+erGjk71TGH9MHD+DuVSXr/KplJasn?= =?us-ascii?Q?lAPtm2pPNkNFSxGC/g0B8/LvKPyv2jhCJkDus2DELdEtNagTmKVJv9+cD1lv?= =?us-ascii?Q?yOLjTolEv18YjbamAd+vJLPnclP0W+Oul6WMKb+iUAqlGhRnzWGp7HjyeYsH?= =?us-ascii?Q?gTh0+gQ33a1Qphq4w3zifbxQF8BYAd3DPfX/vfc+NV6JB2YL0tw5YPqjWies?= =?us-ascii?Q?ZADPJ2y8YSiSu8YaljDT1nVXP1Qi1c2Etc4NdFZl7uhlXX/go?= X-Microsoft-Antispam-Message-Info: A1yB0qSJWEe6X/ZEZVnLuRSCru6kJIQ5tcBzyzr7fO68zBzGdBcjjAvZ55dVN8JX9rXeyNbVpkPguBjybA+ya9dfV+4rZqAwO98OLNigArClrCoatIzI5PjPKJX0M+wfMLO4BZkX9JEEfmMICqpgqmmZ9IpsTAnjRTQ6lWhp5EOb9cqZKlc1YwLs8cVMfWMWsTTywkdmsOanObtuGhc4L/lQ9q3cgOZQsSHMl9Q25yxPXEBQ2tqu7XexZjNP15tIsK/h7C2CCLut7v9qtab+bAwwMrvE9fr/Oatpn1ha/yNAq3HyO42zTsnAonQURJnZoOFPq9vEWjVc2j2YnBgYejWgI40fsQh6P4xXlchapnQ= X-Microsoft-Exchange-Diagnostics: 1; CY4PR0701MB3747; 6:nR1Bs8MSachLJB4ASf7GVfxue8sYgQ+k4cxx/baLQvCwyIpSFAU/B9vo35sGJVEMffuXHNkXNmquLZmZm5wjk1kShtN8hazeNWLoKbxZFjflf8IzOif2ZAQvcTGxN05d3aPcY3aizBVCHW+UkC21+BgpP6luHiafoFChuOPQ2StDrbB7BuDvrfY4D6zo6XZfQN8JxkVcEXMVrqlHYf+y7IJ1dMV1ZWEB0xDGnLEmolncIFgKoggYbPK70vG5qHe3jLn3iRbQnTDOiA5KeyDeNoOqCnrrIpBGApslAM0g1KTfYwhLr7T6vfKgotP4aJsiWAPbJLPoRKhje1vVbw6+wLYgbAusM9yYDhYarNIKujOPjKcYt0pQcqOq6aUCPckiWH1k2iC8KGz2ooxvWfRH7ICSHs9zPDsvl5oFU2gsCs8v00UEWOR8PyNURtcsQukCDgASoW0LobM+TENPZIrYSg==; 5:e3Vv8bM2hNcAar3xafL3jgCbNQfmaNHlpBdHQcAD9g41t8bJxO2NIrohEzGIcifHE41tQrGwEbWnwpSZhQbFNd7OWFJ+0xNcnmDrQft2hRWpIIsPIq3mPc5LhEaDMpTPL9kXecetrVWxbeIr5oxZHVnyiSJi+ZEFvT32OiLO8SQ=; 24:Hrytbq+t1GlcLt/qcdFsmEdmBuoHyY/FFulRLQhB++HxYco6mHqZUCKhEvN29VZs2kq7n7Nc8BQplho87y5oxsRZb0+5vUlmwSVxrJlSYkI= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; CY4PR0701MB3747; 7:7xWU8XuJeP6rM3Tdq0OWHQLKl6pkM74nz4fYCU9m3OMRuGwDiec0YbGhHqbDh7YOIlr4/Yn2FsoZ6SzIF+O1P+3WPp/MR6QCjAwiXBDiXHsnf9orYqtGIvM/LjwTgp5VbliLwenNahyFjlcBJNRxvkp4x6+EXa5Jd/fnNBTNAv72hIoCyUkAEhj037jdIr0s5gjoa7/ode1EOhJIiC/fjl//m0mWFVshGELQJCAJmS4QCH9Q4YZB1sJ9ptSXCyq1 X-OriginatorOrg: cavium.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Jun 2018 13:23:57.8980 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 902bbb6f-6d01-4a6f-a52b-08d5dcfa6855 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 711e4ccf-2e9b-4bcf-a551-4094005b6194 X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY4PR0701MB3747 X-Greylist: Sender passed SPF test, Sender IP whitelisted by DNSRBL, ACL 207 matched, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.40]); Thu, 28 Jun 2018 13:24:00 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.40]); Thu, 28 Jun 2018 13:24:00 +0000 (UTC) for IP:'104.47.32.41' DOMAIN:'mail-sn1nam01on0041.outbound.protection.outlook.com' HELO:'NAM01-SN1-obe.outbound.protection.outlook.com' FROM:'JaiSingh.Rana@cavium.com' RCPT:'' X-RedHat-Spam-Score: -0.022 (DKIM_SIGNED, DKIM_VALID, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS, SPF_PASS, T_DKIMWL_WL_MED) 104.47.32.41 mail-sn1nam01on0041.outbound.protection.outlook.com 104.47.32.41 mail-sn1nam01on0041.outbound.protection.outlook.com X-Scanned-By: MIMEDefang 2.84 on 10.5.110.40 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-loop: libvir-list@redhat.com X-Mailman-Approved-At: Thu, 28 Jun 2018 09:50:20 -0400 Cc: jai.rana@gmail.com, Jai Singh Rana Subject: [libvirt] [PATCH v4 2/6] util: Add generic API to fetch network stats from procfs X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.48]); Thu, 28 Jun 2018 13:50:23 +0000 (UTC) X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" This patch introduces virNetDevGetProcNetdevStats API for linux which returns stats for the given interface from /proc/net/dev by properly mapping stats entries in probed column to column header. Tap and hostdev network devices will now be using this API. Currently function virNetDevTapInterfaceStats which earlier fetched stats for tap devies is modified to use above API accordingly. Signed-off-by: Jai Singh Rana --- src/libvirt_private.syms | 1 + src/util/virnetdev.c | 202 +++++++++++++++++++++++++++++++++++++++++++= +++- src/util/virnetdev.h | 5 ++ src/util/virnetdevtap.c | 71 +---------------- 4 files changed, 208 insertions(+), 71 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 272e7426dd..0ba8cd2a14 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2289,6 +2289,7 @@ virNetDevGetName; virNetDevGetOnline; virNetDevGetPhysicalFunction; virNetDevGetPhysPortID; +virNetDevGetProcNetdevStats; virNetDevGetPromiscuous; virNetDevGetRcvAllMulti; virNetDevGetRcvMulti; diff --git a/src/util/virnetdev.c b/src/util/virnetdev.c index b250af9e2c..69875c2e04 100644 --- a/src/util/virnetdev.c +++ b/src/util/virnetdev.c @@ -1541,6 +1541,198 @@ virNetDevGetVirtualFunctionInfo(const char *vfname,= char **pfname, return ret; } =20 + +/** + * virNetDevGetProcNetdevStats: + * @ifname: interface + * @stats: where to store statistics + * @swapped: whether to swap RX/TX fields + * + * Fetch RX/TX statistics for given named interface (@ifname) and + * store them at @stats. The returned statistics are always from + * domain POV. Because in some cases this means swapping RX/TX in + * the stats and in others this means no swapping (consider TAP + * vs macvtap) caller might choose if the returned stats should + * be @swapped or not. + * + * Returns 0 on success, -1 otherwise (with error reported). + */ + +int +virNetDevGetProcNetdevStats(const char *ifname, + virDomainInterfaceStatsPtr stats, + bool swapped) +{ + int ifname_len; + FILE *fp; + char line[256]; + size_t i; + char *hdr1 =3D NULL; + char *hdr2 =3D NULL; + char *stats_row =3D NULL; + char **components_hdr1 =3D NULL; + char **components_hdr2 =3D NULL; + char **components_stats =3D NULL; + size_t ncomponents_hdr1 =3D 0; + size_t ncomponents_hdr2 =3D 0; + size_t ncomponents_stats =3D 0; + char **rx_hdr =3D NULL; + char **tx_hdr =3D NULL; + size_t rx_nentries, tx_nentries; + int rx_bytes_index =3D 0; + int rx_packets_index =3D 0; + int rx_drop_index =3D 0; + int rx_errs_index =3D 0; + int tx_bytes_index =3D 0; + int tx_packets_index =3D 0; + int tx_drop_index =3D 0; + int tx_errs_index =3D 0; + int tx_offset =3D 0; + int rx_offset =3D 0; + int ret =3D -1; + + fp =3D fopen("/proc/net/dev", "r"); + if (!fp) { + virReportSystemError(errno, "%s", + _("Could not open /proc/net/dev")); + return ret; + } + + ifname_len =3D strlen(ifname); + + /* First two lines contains headers. + * Process headers to match with correspondings stats. + */ + if (!fgets(line, sizeof(line), fp)) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Interface %s not found in /proc/net/dev"), ifnam= e); + VIR_FORCE_FCLOSE(fp); + return ret; + } + + if (!(hdr1 =3D virStringCleanExtraSpaces(line))) + goto cleanup; + + if (!(components_hdr1 =3D virStringSplitCount(hdr1, "|", 0, + &ncomponents_hdr1))) + goto cleanup; + + if (!fgets(line, sizeof(line), fp)) + goto cleanup; + + if (!(hdr2 =3D virStringCleanExtraSpaces(line))) + goto cleanup; + + if (!(components_hdr2 =3D virStringSplitCount(hdr2, "|", 0, + &ncomponents_hdr2))) + goto cleanup; + + if (!(rx_hdr =3D virStringSplitCount(components_hdr2[1], " ", 0, + &rx_nentries))) + goto cleanup; + + if (!(tx_hdr =3D virStringSplitCount(components_hdr2[2], " ", 0, + &tx_nentries))) + goto cleanup; + + if (STREQ(components_hdr1[1], "Receive")) { + rx_offset =3D 0; + tx_offset =3D rx_nentries; + } else { + rx_offset =3D tx_nentries; + tx_offset =3D 0; + } + + for (i =3D 0; i < rx_nentries; i++) { + if (STREQ(rx_hdr[i], "bytes")) + rx_bytes_index =3D i + rx_offset; + else if (STREQ(rx_hdr[i], "packets")) + rx_packets_index =3D i + rx_offset; + else if (STREQ(rx_hdr[i], "errs")) + rx_errs_index =3D i + rx_offset; + else if (STREQ(rx_hdr[i], "drop")) + rx_drop_index =3D i + rx_offset; + } + + for (i =3D 0; i < tx_nentries; i++) { + if (STREQ(tx_hdr[i], "bytes")) + tx_bytes_index =3D i + tx_offset; + else if (STREQ(tx_hdr[i], "packets")) + tx_packets_index =3D i + tx_offset; + else if (STREQ(tx_hdr[i], "errs")) + tx_errs_index =3D i + tx_offset; + else if (STREQ(tx_hdr[i], "drop")) + tx_drop_index =3D i + tx_offset; + } + + while (fgets(line, sizeof(line), fp)) { + long long *stats_entries; + + /* The stats line looks like: + * "eth0:..." + */ + + VIR_FREE(stats_row); + if (!(stats_row =3D virStringCleanExtraSpaces(line))) + goto cleanup; + + virStringListFree(components_stats); + if (!(components_stats =3D virStringSplitCount(stats_row, " ", 0, + &ncomponents_stats))) + goto cleanup; + + if (STREQLEN(components_stats[0], ifname, ifname_len)) { + if (VIR_ALLOC_N(stats_entries, rx_nentries + tx_nentries) < 0) + goto cleanup; + + for (i =3D 1; i < (rx_nentries + tx_nentries); i++) { + if (virStrToLong_ll(components_stats[i], NULL, 10, + (stats_entries + i -1)) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Cannot parse %s stat position at '%= zu'"), + components_stats[i], i); + goto cleanup; + } + } + + if (swapped) { + stats->rx_bytes =3D stats_entries[tx_bytes_index]; + stats->rx_packets =3D stats_entries[tx_packets_index]; + stats->rx_errs =3D stats_entries[tx_errs_index]; + stats->rx_drop =3D stats_entries[tx_drop_index]; + stats->tx_bytes =3D stats_entries[rx_bytes_index]; + stats->tx_packets =3D stats_entries[rx_packets_index]; + stats->tx_errs =3D stats_entries[rx_errs_index]; + stats->tx_drop =3D stats_entries[rx_drop_index]; + } else { + stats->rx_bytes =3D stats_entries[rx_bytes_index]; + stats->rx_packets =3D stats_entries[rx_packets_index]; + stats->rx_errs =3D stats_entries[rx_errs_index]; + stats->rx_drop =3D stats_entries[rx_drop_index]; + stats->tx_bytes =3D stats_entries[tx_bytes_index]; + stats->tx_packets =3D stats_entries[tx_packets_index]; + stats->tx_errs =3D stats_entries[tx_errs_index]; + stats->tx_drop =3D stats_entries[tx_drop_index]; + } + VIR_FREE(stats_entries); + ret =3D 0; + break; + } + } + cleanup: + VIR_FORCE_FCLOSE(fp); + VIR_FREE(hdr1); + VIR_FREE(hdr2); + VIR_FREE(stats_row); + virStringListFree(components_hdr1); + virStringListFree(components_hdr2); + virStringListFree(components_stats); + virStringListFree(rx_hdr); + virStringListFree(tx_hdr); + + return ret; +} + #else /* !__linux__ */ int virNetDevGetPhysPortID(const char *ifname ATTRIBUTE_UNUSED, @@ -1622,7 +1814,15 @@ virNetDevSysfsFile(char **pf_sysfs_device_link ATTRI= BUTE_UNUSED, return -1; } =20 - +int +virNetDevGetProcNetdevStats(const char *ifname ATTRIBUTE_UNUSED, + virDomainInterfaceStatsPtr stats ATTRIBUTE_UNUS= ED, + bool swapped ATTRIBUTE_UNUSED) +{ + virReportError(VIR_ERR_OPERATION_INVALID, "%s", + _("interface stats not implemented on this platform")); + return -1; +} #endif /* !__linux__ */ #if defined(__linux__) && defined(HAVE_LIBNL) && defined(IFLA_VF_MAX) =20 diff --git a/src/util/virnetdev.h b/src/util/virnetdev.h index 71eaf45e30..4fb22562bb 100644 --- a/src/util/virnetdev.h +++ b/src/util/virnetdev.h @@ -266,6 +266,11 @@ int virNetDevGetVirtualFunctionInfo(const char *vfname= , char **pfname, int *vf) ATTRIBUTE_NONNULL(1); =20 +int virNetDevGetProcNetdevStats(const char *ifname, + virDomainInterfaceStatsPtr stats, + bool swapped) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK; + int virNetDevGetFeatures(const char *ifname, virBitmapPtr *out) ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK; diff --git a/src/util/virnetdevtap.c b/src/util/virnetdevtap.c index bd0710ad2e..f0bce5ed34 100644 --- a/src/util/virnetdevtap.c +++ b/src/util/virnetdevtap.c @@ -687,76 +687,7 @@ virNetDevTapInterfaceStats(const char *ifname, virDomainInterfaceStatsPtr stats, bool swapped) { - int ifname_len; - FILE *fp; - char line[256], *colon; - - fp =3D fopen("/proc/net/dev", "r"); - if (!fp) { - virReportSystemError(errno, "%s", - _("Could not open /proc/net/dev")); - return -1; - } - - ifname_len =3D strlen(ifname); - - while (fgets(line, sizeof(line), fp)) { - long long dummy; - long long rx_bytes; - long long rx_packets; - long long rx_errs; - long long rx_drop; - long long tx_bytes; - long long tx_packets; - long long tx_errs; - long long tx_drop; - - /* The line looks like: - * " eth0:..." - * Split it at the colon. - */ - colon =3D strchr(line, ':'); - if (!colon) continue; - *colon =3D '\0'; - if (colon-ifname_len >=3D line && - STREQ(colon-ifname_len, ifname)) { - if (sscanf(colon+1, - "%lld %lld %lld %lld %lld %lld %lld %lld %lld %lld = %lld %lld %lld %lld %lld %lld", - &rx_bytes, &rx_packets, &rx_errs, &rx_drop, - &dummy, &dummy, &dummy, &dummy, - &tx_bytes, &tx_packets, &tx_errs, &tx_drop, - &dummy, &dummy, &dummy, &dummy) !=3D 16) - continue; - - if (swapped) { - stats->rx_bytes =3D tx_bytes; - stats->rx_packets =3D tx_packets; - stats->rx_errs =3D tx_errs; - stats->rx_drop =3D tx_drop; - stats->tx_bytes =3D rx_bytes; - stats->tx_packets =3D rx_packets; - stats->tx_errs =3D rx_errs; - stats->tx_drop =3D rx_drop; - } else { - stats->rx_bytes =3D rx_bytes; - stats->rx_packets =3D rx_packets; - stats->rx_errs =3D rx_errs; - stats->rx_drop =3D rx_drop; - stats->tx_bytes =3D tx_bytes; - stats->tx_packets =3D tx_packets; - stats->tx_errs =3D tx_errs; - stats->tx_drop =3D tx_drop; - } - - VIR_FORCE_FCLOSE(fp); - return 0; - } - } - VIR_FORCE_FCLOSE(fp); - - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("/proc/net/dev: Interface not found")); - return -1; + return virNetDevGetProcNetdevStats(ifname, stats, swapped); } #elif defined(HAVE_GETIFADDRS) && defined(AF_LINK) int --=20 2.13.7 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list