From nobody Sun May 5 19:39:19 2024 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 1503308085506733.8572919554693; Mon, 21 Aug 2017 02:34:45 -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 884E5C058EA2; Mon, 21 Aug 2017 09:34:43 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 4712C6C525; Mon, 21 Aug 2017 09:34:43 +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 114DE3FC72; Mon, 21 Aug 2017 09:34:42 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v7L9YesA027658 for ; Mon, 21 Aug 2017 05:34:40 -0400 Received: by smtp.corp.redhat.com (Postfix) id A530F66A0C; Mon, 21 Aug 2017 09:34:40 +0000 (UTC) Received: from mx1.redhat.com (ext-mx10.extmail.prod.ext.phx2.redhat.com [10.5.110.39]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 9DEBD62662 for ; Mon, 21 Aug 2017 09:34:38 +0000 (UTC) Received: from EUR01-DB5-obe.outbound.protection.outlook.com (mail-db5eur01on0081.outbound.protection.outlook.com [104.47.2.81]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 5D3495AFC7 for ; Mon, 21 Aug 2017 09:34:30 +0000 (UTC) Received: from mellanox.com (193.47.165.251) by DB6PR0501MB2792.eurprd05.prod.outlook.com (2603:10a6:4:82::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1362.18; Mon, 21 Aug 2017 09:19:59 +0000 DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 884E5C058EA2 Authentication-Results: ext-mx08.extmail.prod.ext.phx2.redhat.com; dmarc=fail (p=none dis=none) header.from=mellanox.com Authentication-Results: ext-mx08.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=libvir-list-bounces@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 884E5C058EA2 Authentication-Results: mx1.redhat.com; dkim=fail reason="signature verification failed" (1024-bit key) header.d=Mellanox.com header.i=@Mellanox.com header.b="j3ZGOSsd" DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 5D3495AFC7 Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; dmarc=pass (p=none dis=none) header.from=mellanox.com Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=edand@mellanox.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 5D3495AFC7 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Mellanox.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=5Ea1jbWDpSP84emMO2PRgCmI+PSh/X9whwUcyGqbH/c=; b=j3ZGOSsdddIVUcupIngNEl6TM9i+oyKqpSojgQecu5wotXL2HBGV1Bte6mQhQu4QV/yt8NW1v1sqpk4fQvg0lLAxTFUi7cYLqihHLYdaZZYzBWlgpafmF69uQ0ECGZotFLQd9G8exQq8w3Uo2wrBn5qgd+QUo3HSoGcegkapj/k= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=edand@mellanox.com; From: Edan David To: libvir-list@redhat.com Date: Mon, 21 Aug 2017 05:19:53 -0400 Message-Id: <1503307193-41414-1-git-send-email-edand@mellanox.com> MIME-Version: 1.0 X-Originating-IP: [193.47.165.251] X-ClientProxiedBy: DB6PR0202CA0020.eurprd02.prod.outlook.com (2603:10a6:4:29::30) To DB6PR0501MB2792.eurprd05.prod.outlook.com (2603:10a6:4:82::20) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: ac00640b-1f45-4c03-e0bc-08d4e875cbf2 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(2017030254152)(300000503095)(300135400095)(48565401081)(201703131423075)(201703031133081)(201702281549075)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095); SRVR:DB6PR0501MB2792; X-Microsoft-Exchange-Diagnostics: 1; DB6PR0501MB2792; 3:+e82UhEmQW3IW+ufHFULs075JRmcvmsmkGlc/uDlHhmX90z3QDc+AesTK/OlBB/fy8VUg5zJCStvvyANES6juJPdMOQc/8Ft0rCWr7MTBLdEBEkasuMlJoj75TKQ0MbcDQACkp1CNbnjvBvxVqNuodmPEu2ooDeaeKalJaz+oA8QnueddYiegdWh3Z0iJmlDQPqkkjVPlIFxxGp4vhIR+coqseoRBlyEo6Q1arW3dje8x/QlUTQfOYJIb8DJDx5K; 25:tkvV+mAgsfY/tSuV0ub3dtle7mbrTnLVKB0HR5wLqUD1X+B55XFmB2Z7wXpLlXviylMJy+FVL5XPRinA0QDBZ+bh2/Hs6LOZpeSeggIspQwm9tdqLYIHRvCSJpd1+1k2bmopaj5jGKgxrWHVuOVCmk5wHDm08k4AZM9eLNMTgFzb06rhNX26oZhd1ai2d8a3O5jHItttAXYnu8XHafFKJmlU9hblPFvSR5rVKmNWRWeIug96uAdEVLXWhlELxE5eBQnfuRLM9uq14SMk783EW7UQRkOBuIeYQ5orDOoHZCm0i0V/qtTzsn5PlycSn9zS/y1sarjApG+cFTuohgkTYg==; 31:kEhCpzuHo1pimK827JS8DkXm8r0XeLD+x2GNcK+wX0Hpcb+Np9jDjXwpgZU2k1l/CBbgzcPzKLn22q6NHM4tGebP7xWEkGzZyM1smpyCSpKZvh0xIFJTYVhcc2kQeQGxUjoFbQGPTlCOnNZbNAHY/wv2nfXT5l8qarqsNI4cGRIYRPpCetKLOlgTij/tqK7iHUbtNCNpfAAaBSI1805url/unibmTSCrsU9GfPo4gto= X-MS-TrafficTypeDiagnostic: DB6PR0501MB2792: X-Microsoft-Exchange-Diagnostics: 1; DB6PR0501MB2792; 20:gloyMf4NvYYZDkxR5j0NtVs3fDtw/8Py0J5FdkRLj4YaDBscwzeDbynRVPvsrwPfD5Hqkx1OTLwQy3wj1EtCuiw2u4gDAD5mSPhcEgrpus6SBFZhsIS5fOwzfAz+CDmMrYboBXVlkW7gO56QOu1tV8l2RFMZjSDjdqlQ3a281KbbwQmBjV4y2IpjLjUBabUiqJzD4PFMglfQoD9zUHvU6nZwvgDxFF/i1Nn+jiyg6PTmpMJFArNdMAASBWI8KrLEJLRECO7qMN3R3OEZDR43129c5gySvtZHHvuK8YlnuTeZvFAT7mNpdN5HkWy8dlTPAbvLK9hAuKNK0i6iqnZan++v2RIabzB9E/ycXiXedi/7Gpi0pb/ImxRbvpousrjKVKCkr+eySdC4iPVmS3Q8j50L+l60E0DwrYKOCI/EUg9b8Hgc2RT71tBQGsK4olcw0QVdg5Frp5Y6XhLYIGoV7/1bEzVvFbzA2wTNqfnvmekMDOn8+cJp4YCI1bBh8gGP; 4:hxjDASdKKQNnyOUHoW5R3yUW/PsfyNivi7Umfrq4KryaUVVMlefjUjjBkJiu7BpFE38SRkGmOh86oS+Bw9wSu/JxBgZs/7YsipO6cgFtvNcmNGa5zkRjoNUL+wgdG2HXawCHFKwCqBLGt4GWWhcbXNEVxG0i8U4Fh1asuhZrqanvvksOnm1gI3A55zcE0+7NtUNARRBgxtHNqTS8Nw28lgGdPj0CkKJgsFlbQ6HIOsQI6JurpnvytVBZvg7Db9/k X-Exchange-Antispam-Report-Test: UriScan:; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(601004)(2401047)(5005006)(8121501046)(10201501046)(93006095)(93001095)(100000703101)(100105400095)(3002001)(6055026)(6041248)(20161123558100)(20161123555025)(20161123564025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123562025)(20161123560025)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:DB6PR0501MB2792; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:DB6PR0501MB2792; X-Forefront-PRVS: 040655413E X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(4630300001)(7370300001)(6009001)(39860400002)(199003)(189002)(6666003)(50226002)(47776003)(36756003)(81156014)(81166006)(8676002)(68736007)(66066001)(6916009)(97736004)(7350300001)(6116002)(86362001)(575784001)(478600001)(5003940100001)(110136004)(69596002)(3846002)(21086003)(42186005)(48376002)(2906002)(966005)(305945005)(33646002)(101416001)(50466002)(53936002)(5660300001)(189998001)(106356001)(105586002)(25786009)(2351001)(55016002)(2361001)(50986999)(7736002)(6306002); DIR:OUT; SFP:1101; SCL:1; SRVR:DB6PR0501MB2792; H:mellanox.com; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; 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: mellanox.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; DB6PR0501MB2792; 23:QXaE8OCjDCEGSyeYjuO7mDEfZLpBXkF0xN6boq4?= =?us-ascii?Q?SF4pqUwBz/DTUaUWNY+5vSJ/CMcaCSmVbnjAt4Hw6UrzvOsDIksKmIK6pImx?= =?us-ascii?Q?jd0Nua77xPopjUCnPpM3gibIBHbXSeNrei8RbS0NxsfqsrYAPQDY3ySjeqKL?= =?us-ascii?Q?00OpAwsUTCReTV5SfM4V8peH2lBdT+I2jQ4sQ8/UTa5hz9GVkJqxej7QvcJV?= =?us-ascii?Q?Dtn2A5nNAAhc4VigtVez9myZnCONt8txwPq7YhwrCpt3tE5M+h/WeLhynXlA?= =?us-ascii?Q?qcdC2cbD9udj+TTTbnS/Po2PsKzdbQh1SkwUEeK38IWkk6cgU5PCOJf3Heuh?= =?us-ascii?Q?BPs3wRM1hA3+eCB/CIpYPLAchEanrO2Pzw7JerkjjQdIkrInRKtU2NX79z5v?= =?us-ascii?Q?/r6ZF3hiRBcGASuuP1qGR6lM0bQ4FovfSTHtZZTwuCqaTfCNeuV4AVvKoCDN?= =?us-ascii?Q?TltPB6XqPsEYLsquRsnyJW/RTdF5Ip+JrIMZMg469ZWXPbfGPKQ4JnGvOBZm?= =?us-ascii?Q?WMozV3tfukD0pEdqRDOJq/QdGsatVVPCISxqVZFsLJxG/MQaterur+lWdil7?= =?us-ascii?Q?XNr9AWja3FUJOdK7nU6idZzLwT5NCWsmn40dE4rgNb1c7IzLKKRWXEfgujPc?= =?us-ascii?Q?rl2uG/SDd/Jo7xlNj2V2JuQEI+xRNmo1tXkdXgPH+KMwSFw70YjPVKZ/uI0v?= =?us-ascii?Q?TdRFvwa0Ho5JR4w2aPtR3AZdLnGVZdAa/1APSx1xpZuKFmGMtFV+ldJ43U0x?= =?us-ascii?Q?JkVAODNGUomZr+k5aPRB4um5mogqG4WGjqiXCjYl1qJ5GkEpzLuntpPf/FIf?= =?us-ascii?Q?ZlaREMOFiSpqJqdWyF9etnSXLy++6wfES7bbvzjI9WcC/4941BnfyXMTso+R?= =?us-ascii?Q?MNW5kZvsSnmFR6LCWQMm1Fcx7ZLc+NbFac8O0qWTWYzROhRiy1jSMjIlfTSi?= =?us-ascii?Q?+sovI/KPiADIWtkE2bAy6y6R0Y3jItk+WQK+l563P8LHBwkQJbYbD2qQx7nq?= =?us-ascii?Q?nAyd1YNaif411KRqGqNb7uxKOIwLosLSUy50q4vADQu97pkhaI0+5Y4IhxP+?= =?us-ascii?Q?30eAQ4TRysIYOwVTgbyEJvPVAd11ysvho1IjwYZ71iIEuFG/TTCgWy2ebvAq?= =?us-ascii?Q?KeWl9k4O/CxOzzjr6ddDZAmIbzT2gnWrm?= X-Microsoft-Exchange-Diagnostics: 1; DB6PR0501MB2792; 6:/P533b/CBVqFJS6vDrwihZKlwO8g4q0iQdTQiPCEjiEbZNGzNiK0xeD2XfTAJqqZ8JK8RvZQK3KxnSW2K7Lhh9KtZ/F0QyVXOPPAMtHDisDIx0LfSeBmtqUTIzQrokDT06gbel3P9aIIhA4BmvhDXEYATVqy395JVlAwP4ja1lnLQOmYOLbTYQ839Osft53rV0502tAIn0MmOPrdbxltSQqU99S+GAUB0doWv0ag6lAV27EQ04xeXL/EleECVwjLN94ErwMG1siSEHEUxE13zL4YqDrXoeyn9C/ku9UB+LJ/G1Kp79xMON4hAuqyS4qDFEP1wtxESchQejzTzRlnIg==; 5:FlnRgSZNvmVoKdGeaGx3gTuD8s/shF6YVv9iseOR7+ZD0Q9Pw0fha4qnvdaoU8MuXGmskoUM1+mPeqOEegYGyoaS8oFtwxoQLBS3TM+A3v8NOAPDRwLNMq4h1cOD8I++DPAwyqGoOngcZqb5HAokfg==; 24:SFRRn3eTj2st5or+rHo8He2qSwD9yERqk3veyotIBRlj414s4MVwqbz0qdNfg5bnr1uXQ4cX2R1s8GQAcKOXACdlDiylFGjUwvb2GjJFNdQ=; 7:/VrdHbYwbpVCfg61vZ5AR1o1X7GzDD03GylhIU2gH13A6Rxbk9E7A1uEUXDmV0CNipu6Zbh0lI+EGCL9ZfVyGulO0pWuW7tSzGYrWl8YvwcfmIc54xqjv+YPER5qt0JbImWNnxUN5Lpj9mM6GU0krsZjJMjN4nnUp8xyrk7UohAGxH6pLgaTNGhPy9B0Req7m1K1QWJWl9pfTfMCqaBDsNxjqxyn0R8mfHmXiXuZf9A= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: Mellanox.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Aug 2017 09:19:59.2998 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB6PR0501MB2792 X-Greylist: Delayed for 00:16:45 by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Mon, 21 Aug 2017 09:34:32 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Mon, 21 Aug 2017 09:34:32 +0000 (UTC) for IP:'104.47.2.81' DOMAIN:'mail-db5eur01on0081.outbound.protection.outlook.com' HELO:'EUR01-DB5-obe.outbound.protection.outlook.com' FROM:'edand@mellanox.com' RCPT:'' X-RedHat-Spam-Score: -0.132 (DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL, SPF_HELO_PASS, SPF_PASS) 104.47.2.81 mail-db5eur01on0081.outbound.protection.outlook.com 104.47.2.81 mail-db5eur01on0081.outbound.protection.outlook.com X-Scanned-By: MIMEDefang 2.78 on 10.5.110.39 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCHv2] nodedev: add switchdev to NIC capabilities 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.32]); Mon, 21 Aug 2017 09:34:44 +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" Adding functionality to libvirt that will allow querying the interface for the availability of switchdev Offloading NIC capabilities. The switchdev mode was introduced in kernel 4.8, the iproute2-devlink command to retrieve the swtichdev NIC feature, Command example: devlink dev eswitch show pci/0000:03:00.0 This feature is needed for Openstack so we can do a scheduling decision if the NIC is in Hardware Offload (switchdev) or regular SR-IOV (legacy) mo= de. And select the appropriate hypervisors with the requested capability see [1= ]. [1] - https://specs.openstack.org/openstack/nova-specs/specs/pike/approved/= enable-sriov-nic-features.html Reviewed-by: John Ferlan Reviewed-by: Laine Stump --- configure.ac | 13 ++ docs/formatnode.html.in | 1 + src/util/virnetdev.c | 187 ++++++++++++++++++= +++- src/util/virnetdev.h | 1 + tests/nodedevschemadata/net_00_13_02_b9_f9_d3.xml | 1 + tests/nodedevschemadata/net_00_15_58_2f_e9_55.xml | 1 + 6 files changed, 203 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index b12b7fa..c089798 100644 --- a/configure.ac +++ b/configure.ac @@ -627,6 +627,19 @@ if test "$with_linux" =3D "yes"; then AC_CHECK_HEADERS([linux/btrfs.h]) fi =20 +dnl +dnl check for kernel headers required by devlink +dnl +if test "$with_linux" =3D "yes"; then + AC_CHECK_HEADERS([linux/devlink.h]) + AC_CHECK_DECLS([DEVLINK_GENL_VERSION, DEVLINK_GENL_NAME, DEVLINK_ATTR_= MAX, DEVLINK_CMD_ESWITCH_GET, DEVLINK_ATTR_BUS_NAME, DEVLINK_ATTR_DEV_NAME,= DEVLINK_ATTR_ESWITCH_MODE, DEVLINK_ESWITCH_MODE_SWITCHDEV], + [AC_DEFINE([HAVE_DECL_DEVLINK], + [1], + [whether devlink declarations is available])= ], + [], + [[#include ]]) +fi + dnl Allow perl/python overrides AC_PATH_PROGS([PYTHON], [python2 python]) if test -z "$PYTHON"; then diff --git a/docs/formatnode.html.in b/docs/formatnode.html.in index 4d935b5..29244a8 100644 --- a/docs/formatnode.html.in +++ b/docs/formatnode.html.in @@ -227,6 +227,7 @@
rxhash
receive-hashing
rdma
remote-direct-memory-acc= ess
txudptnl
tx-udp-tunnel-segmen= tation
+
switchdev
kernel-forward-plan= e-offload
capability
diff --git a/src/util/virnetdev.c b/src/util/virnetdev.c index 51a6e42..fc7c961 100644 --- a/src/util/virnetdev.c +++ b/src/util/virnetdev.c @@ -59,6 +59,10 @@ # include #endif =20 +#if HAVE_DECL_DEVLINK +# include +#endif + #ifndef IFNAMSIZ # define IFNAMSIZ 16 #endif @@ -2481,7 +2485,8 @@ VIR_ENUM_IMPL(virNetDevFeature, "ntuple", "rxhash", "rdma", - "txudptnl") + "txudptnl", + "switchdev") =20 #ifdef __linux__ int @@ -2936,6 +2941,7 @@ int virNetDevGetRxFilter(const char *ifname, return ret; } =20 + #if defined(SIOCETHTOOL) && defined(HAVE_STRUCT_IFREQ) =20 /** @@ -3115,6 +3121,182 @@ virNetDevGetEthtoolFeatures(virBitmapPtr bitmap, } =20 =20 +#if HAVE_DECL_DEVLINK +/** + * virNetDevPutExtraHeader + * reserve and prepare room for an extra header + * This function sets to zero the room that is required to put the extra + * header after the initial Netlink header. This function also increases + * the nlmsg_len field. + * + * @nlh: pointer to Netlink header + * @size: size of the extra header that we want to put + * + * Returns pointer to the start of the extended header + */ +static void * +virNetDevPutExtraHeader(struct nlmsghdr *nlh, + size_t size) +{ + char *ptr =3D (char *)nlh + nlh->nlmsg_len; + size_t len =3D NLMSG_ALIGN(size); + nlh->nlmsg_len +=3D len; + memset(ptr, 0, len); + return ptr; +} + + +/** + * virNetDevGetFamilyId: + * This function supplies the devlink family id + * + * @family_name: the name of the family to query + * + * Returns family id or 0 on failure. + */ +static uint32_t +virNetDevGetFamilyId(const char *family_name) +{ + struct nl_msg *nl_msg =3D NULL; + struct nlmsghdr *resp =3D NULL; + struct genlmsghdr* gmsgh =3D NULL; + struct nlattr *tb[CTRL_ATTR_MAX + 1] =3D {NULL, }; + unsigned int recvbuflen; + uint32_t family_id =3D 0; + + if (!(nl_msg =3D nlmsg_alloc_simple(GENL_ID_CTRL, + NLM_F_REQUEST | NLM_F_ACK))) { + virReportOOMError(); + goto cleanup; + } + + if (!(gmsgh =3D virNetDevPutExtraHeader(nlmsg_hdr(nl_msg), sizeof(stru= ct genlmsghdr)))) + goto cleanup; + + gmsgh->cmd =3D CTRL_CMD_GETFAMILY; + gmsgh->version =3D DEVLINK_GENL_VERSION; + + if (nla_put_string(nl_msg, CTRL_ATTR_FAMILY_NAME, family_name) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("allocated netlink buffer is too small")); + goto cleanup; + } + + if (virNetlinkCommand(nl_msg, &resp, &recvbuflen, 0, 0, NETLINK_GENERI= C, 0) < 0) + goto cleanup; + + if (nlmsg_parse(resp, sizeof(struct nlmsghdr), tb, CTRL_CMD_MAX, NULL)= < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("malformed netlink response message")); + goto cleanup; + } + + if (tb[CTRL_ATTR_FAMILY_ID] =3D=3D NULL) + goto cleanup; + + family_id =3D *(uint32_t *)RTA_DATA(tb[CTRL_ATTR_FAMILY_ID]); + + cleanup: + nlmsg_free(nl_msg); + VIR_FREE(resp); + return family_id; +} + + +/** + * virNetDevSwitchdevFeature + * This function checks for the availability of Switchdev feature + * and add it to bitmap + * + * @ifname: name of the interface + * @out: add Switchdev feature if exist to bitmap + * + * Returns 0 on success, -1 on failure. + */ +static int +virNetDevSwitchdevFeature(const char *ifname, + virBitmapPtr *out) +{ + struct nl_msg *nl_msg =3D NULL; + struct nlmsghdr *resp =3D NULL; + unsigned int recvbuflen; + struct nlattr *tb[DEVLINK_ATTR_MAX + 1] =3D {NULL, }; + virPCIDevicePtr pci_device_ptr =3D NULL; + struct genlmsghdr* gmsgh =3D NULL; + const char *pci_name; + char *pfname =3D NULL; + int is_vf =3D -1; + int ret =3D -1; + uint32_t family_id; + + if ((family_id =3D virNetDevGetFamilyId(DEVLINK_GENL_NAME)) <=3D 0) + return ret; + + if ((is_vf =3D virNetDevIsVirtualFunction(ifname)) < 0) + return ret; + + if (is_vf =3D=3D 1 && virNetDevGetPhysicalFunction(ifname, &pfname) < = 0) + goto cleanup; + + if (!(nl_msg =3D nlmsg_alloc_simple(family_id, + NLM_F_REQUEST | NLM_F_ACK))) { + virReportOOMError(); + goto cleanup; + } + + if (!(gmsgh =3D virNetDevPutExtraHeader(nlmsg_hdr(nl_msg), sizeof(stru= ct genlmsghdr)))) + goto cleanup; + + gmsgh->cmd =3D DEVLINK_CMD_ESWITCH_GET; + gmsgh->version =3D DEVLINK_GENL_VERSION; + + pci_device_ptr =3D pfname ? virNetDevGetPCIDevice(pfname) : + virNetDevGetPCIDevice(ifname); + if (pci_device_ptr =3D=3D NULL) + goto cleanup; + + pci_name =3D virPCIDeviceGetName(pci_device_ptr); + + if (nla_put(nl_msg, DEVLINK_ATTR_BUS_NAME, strlen("pci")+1, "pci") < 0= || + nla_put(nl_msg, DEVLINK_ATTR_DEV_NAME, strlen(pci_name)+1, pci_nam= e) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("allocated netlink buffer is too small")); + goto cleanup; + } + + if (virNetlinkCommand(nl_msg, &resp, &recvbuflen, 0, 0, NETLINK_GENERI= C, 0) < 0) + goto cleanup; + + if (nlmsg_parse(resp, sizeof(struct genlmsghdr), tb, DEVLINK_ATTR_MAX,= NULL) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("malformed netlink response message")); + goto cleanup; + } + + if (tb[DEVLINK_ATTR_ESWITCH_MODE] && + *(int *)RTA_DATA(tb[DEVLINK_ATTR_ESWITCH_MODE]) =3D=3D DEVLINK_ESW= ITCH_MODE_SWITCHDEV) { + ignore_value(virBitmapSetBit(*out, VIR_NET_DEV_FEAT_SWITCHDEV)); + } + + ret =3D 0; + + cleanup: + nlmsg_free(nl_msg); + virPCIDeviceFree(pci_device_ptr); + VIR_FREE(resp); + VIR_FREE(pfname); + return ret; +} +#else +static int +virNetDevSwitchdevFeature(const char *ifname ATTRIBUTE_UNUSED, + virBitmapPtr *out ATTRIBUTE_UNUSED) +{ + return 0; +} +#endif + + # if HAVE_DECL_ETHTOOL_GFEATURES /** * virNetDevGFeatureAvailable @@ -3315,6 +3497,9 @@ virNetDevGetFeatures(const char *ifname, if (virNetDevRDMAFeature(ifname, out) < 0) goto cleanup; =20 + if (virNetDevSwitchdevFeature(ifname, out) < 0) + goto cleanup; + ret =3D 0; cleanup: VIR_FORCE_CLOSE(fd); diff --git a/src/util/virnetdev.h b/src/util/virnetdev.h index 9205c0e..71eaf45 100644 --- a/src/util/virnetdev.h +++ b/src/util/virnetdev.h @@ -112,6 +112,7 @@ typedef enum { VIR_NET_DEV_FEAT_RXHASH, VIR_NET_DEV_FEAT_RDMA, VIR_NET_DEV_FEAT_TXUDPTNL, + VIR_NET_DEV_FEAT_SWITCHDEV, VIR_NET_DEV_FEAT_LAST } virNetDevFeature; =20 diff --git a/tests/nodedevschemadata/net_00_13_02_b9_f9_d3.xml b/tests/node= devschemadata/net_00_13_02_b9_f9_d3.xml index d4c96e8..88252e6 100644 --- a/tests/nodedevschemadata/net_00_13_02_b9_f9_d3.xml +++ b/tests/nodedevschemadata/net_00_13_02_b9_f9_d3.xml @@ -15,6 +15,7 @@ + diff --git a/tests/nodedevschemadata/net_00_15_58_2f_e9_55.xml b/tests/node= devschemadata/net_00_15_58_2f_e9_55.xml index 71bf90e..f77dfcc 100644 --- a/tests/nodedevschemadata/net_00_15_58_2f_e9_55.xml +++ b/tests/nodedevschemadata/net_00_15_58_2f_e9_55.xml @@ -15,6 +15,7 @@ + --=20 2.1.4 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list