From nobody Tue Oct 28 17:47:26 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; arc=pass (i=1 dmarc=pass fromdomain=cyberus-technology.de); dmarc=pass(p=none dis=none) header.from=cyberus-technology.de ARC-Seal: i=2; a=rsa-sha256; t=1759764360; cv=pass; d=zohomail.com; s=zohoarc; b=R4vnpux9RYRRA2ki37c1a6AQWEF/KJSz6zZo1JSBoYyvfIq4zFwosMSpZHcxOg0DU6dmJgD0ss2c2QfmavL658q+t6uGS8/t1M27cLuxmqOP2hE2/Mutv7WrevYQsny0g/ymD1lzseUUBbdoN22iKpO3NzUvbf9olo2zuLm2kk0= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1759764360; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=kOU1ldOIwyvL4keDNWzL/jifIPJ9vbsUuipJFyqBIkg=; b=CHCFPiZuPzdvkPkHcmuXrYUV3ZpO+ntYswn29jsQXsWJyHwi9sf/RWcGobTKW/0YujeVp0FX9Zh1um2Vj93A9Pua0tr/WYR18DAMWXOLUZC8So+6oLn0Ozx8JmP0n/u0+F8pN/q4/HtHH4uL6tkTHUFm+6thqFAe5lE2U/DrXzU= ARC-Authentication-Results: i=2; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; arc=pass (i=1 dmarc=pass fromdomain=cyberus-technology.de); dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1759764360482178.55936888675797; Mon, 6 Oct 2025 08:26:00 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 8AD613FCAD; Mon, 6 Oct 2025 11:25:59 -0400 (EDT) Received: from [172.19.199.17] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id 9A64B4443C; Mon, 6 Oct 2025 11:20:00 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 74C6B41BD9; Mon, 6 Oct 2025 11:18:26 -0400 (EDT) Received: from FR5P281CU006.outbound.protection.outlook.com (mail-germanywestcentralazon11022089.outbound.protection.outlook.com [40.107.149.89]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 59E0241CEB for ; Mon, 6 Oct 2025 11:18:22 -0400 (EDT) Received: from BEZP281MB1973.DEUP281.PROD.OUTLOOK.COM (2603:10a6:b10:46::5) by BEYP281MB5624.DEUP281.PROD.OUTLOOK.COM (2603:10a6:b10:e3::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9182.20; Mon, 6 Oct 2025 15:18:18 +0000 Received: from BEZP281MB1973.DEUP281.PROD.OUTLOOK.COM ([fe80::7272:f32d:eb8d:e401]) by BEZP281MB1973.DEUP281.PROD.OUTLOOK.COM ([fe80::7272:f32d:eb8d:e401%3]) with mapi id 15.20.9182.017; Mon, 6 Oct 2025 15:18:18 +0000 X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-3.4 required=5.0 tests=ARC_SIGNED,ARC_VALID, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_PASS autolearn=unavailable autolearn_force=no version=4.0.1 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ma3/ZC1mUMiNJAUUa4DXkz1eRo57xrJ47JQBt4JlDbB7pcTnCVcZvksXjHXQKg72dlu2zlfrQY18TwhAWLvIx4Mbql86Dan0BvPCRIHrhPdMN2gzM+VXGUkXVRXNKCd/m8OYGUerUgo+Qato7sIYrK5eyr5NGn12wD3o+TgDdUD9+JATgJefS7ZkYAHRDjEL+Ts5h3wvy6fi2YRIyGCTMrV5GBe9YprwSedlHQndyM9ogduyoRix188rzuYpDCyO8VrvzaL3DQQ85XCWeSvp7M1eqtxUGAW1ouiOGhsNoLKkc14Q4ZTU4/4Dl030XA9Sm7Xx1LK2W20PGAyRwqrwxg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=kOU1ldOIwyvL4keDNWzL/jifIPJ9vbsUuipJFyqBIkg=; b=ym6I4kDp0mAE35HfjrKRj5sWa8up9VdkbQFqeKYyM9tUJPorcssR3ZsWBzcYmr/6IcvYpYrUt5L1vsVBC9Ia3ZGztOIZj/74gKbNtYRP4KxxXvvZtmnsgOY0j3IquL6lLORcvLodjuOyvlUkaX1alwoSQXpVSkOqWOIrLvATMW2oG4upJmoqAeQ+T7gnPJIfVY9ilvCCOHdVVRcApH1ffRr7yj1uJjMtlEMFLNk+y94u8GpbmR1nVLv/pCxnW7JIInoCJlmRExjt2reJ7vMywHA//IHN1Y+QCXwHveaxNId3HcbpX2IdUDlWvF9O0iqvxm3F/ZBhq6F9uUSZGnPr/w== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=cyberus-technology.de; dmarc=pass action=none header.from=cyberus-technology.de; dkim=pass header.d=cyberus-technology.de; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cyberus-technology.de; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=kOU1ldOIwyvL4keDNWzL/jifIPJ9vbsUuipJFyqBIkg=; b=TI5qzVgclFy780oqf+onOeAQZ4p6gX1Mgtkx6drY67dL9IbAooK8MZ5zCKynCvsbVxqXKEhDs4AeAZbBZhtJNBHgxZn8+1vlSNvX9FMN7sM0lwoixINZmhKnmoSEFg4N+kv1u85pvXcAihDcTiMLLSaVJHwFROueNAmANAhUdQSQ6Urcspa28WGwvA6a+NCXcJ4W9ykn5WiP0xWk3Hg1VlzNPmUy5NJUDoMz6TWK2Hs0s0K+iks7KZRXJ9jvyJ2iUp9IO9/na0KPxj/a60ibYJfc+T5DLhnY4ysPS416Vdsy0Hxps4888wZvwwvRSelvWUyaoJmMWicemTeBrW5Lng== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=cyberus-technology.de; From: Stefan Kober To: devel@lists.libvirt.org Subject: [PATCH 3/5] ch: implement network device hot attach Date: Mon, 6 Oct 2025 17:18:09 +0200 Message-ID: <20251006151811.244611-4-stefan.kober@cyberus-technology.de> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20251006151811.244611-1-stefan.kober@cyberus-technology.de> References: <20251006151811.244611-1-stefan.kober@cyberus-technology.de> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: FR3P281CA0046.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:4a::12) To BEZP281MB1973.DEUP281.PROD.OUTLOOK.COM (2603:10a6:b10:46::5) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BEZP281MB1973:EE_|BEYP281MB5624:EE_ X-MS-Office365-Filtering-Correlation-Id: 9e913247-3fb3-4034-58ba-08de04eb9454 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|10070799003|376014|366016|1800799024; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?mnEcoJgsKboJYVOcFLE/dL3FHQ6DEB3BFIcgzorvSxfsGTLwgYiE5Zlu54ri?= =?us-ascii?Q?iFRSptm0ZxqnsRsrh4nn6QTEDkBHlzo9ZkRGT+UIi2nprvZAf/Xvn9g1Dpkg?= =?us-ascii?Q?sZTOa+zdt8mY5CdIayDaYwpkLn8JfmjgumiIONCwdkeqIg0jg5qy1BwVqJhd?= =?us-ascii?Q?EOROxrUiwOcqubp8u/3ySpqb29c+z7IJn42cLm5GUR3M4hXeRz+6SzmFZWN2?= =?us-ascii?Q?okwRtKefOFntjpTE7Amr4n8I6a2JMZXqx+A7wGIWtuqfM3fLKZwXQd85WP5w?= =?us-ascii?Q?RWSuE5uMVWOkSeq1f47uqper26hKBRzpHS7iA/DJk0VaGTNvnGxezjhTfeqg?= =?us-ascii?Q?oqEsIsB+B14eL/Txlu+TRo7wTxSeinqob3254VEi6s5xTOQdL5ZIrkGAXCaI?= =?us-ascii?Q?XwDgbjKC+pLnxUvILSfj05C8P0Fs8NbNF+ZaU0SyaZj4mYK0mdl2Wgk5xXJS?= =?us-ascii?Q?g7IUZ9XyuK0MHFfbY8BEKPzSsa6YMMXg4m42xJ5HgXUzbk71/3J1kIJcns5A?= =?us-ascii?Q?RGAyNip83xINLNh5QyoADgTN1BN2iXAjhEScwzUWzybbATdDl8hbh09Vnci7?= =?us-ascii?Q?YQ3QP4wp9RnX5wYtyl6+bU5KlLwj7+8HwF8x8yGzVRVXDvjRsa5lQgdmgtLK?= =?us-ascii?Q?uhopQoSiPyfKObmiaTAhLjn8NrE5W1UF8R38dSPhz8iJnDBDhFAtNEZd1yfF?= =?us-ascii?Q?ObugPgWj0qUSh4sQ6qg9CREcu7N3/n3fUHnTt6d3Q+RxRWSC8Lygga9YTvHg?= =?us-ascii?Q?qeolaVaIK4ILGbJkIb5y2ibvswWQ0FOe6GVeZM+9uX3vU6qJqIeJVhLiEehN?= =?us-ascii?Q?AI41ub23d3FYD7Y32NUROVzKUKRRLtdAvNtBbPxOtQiEp+snooSwKibRJSf4?= =?us-ascii?Q?nOLFHo0fR8mYNyCMFDvuYmquM6X/odKMbOcx/bJiBNVJVz7IM4yoflr9hXEX?= =?us-ascii?Q?6SsjignAGu5haulO+LfXXZ8qVVZrgAWrZEeMXVJBB/fJPuPdwa8aCbmIPTXE?= =?us-ascii?Q?VEn7PxBYYKbGeDdQJz+PLnelL8FRnNbEeVQg1MmhUb3ji6NIonHmqLCAYTpw?= =?us-ascii?Q?SGHO8qbAoDY6nscmricICzMWQdc2hLyYNA8fBKCzoCi9lIdJDfG5Ev5BhGuD?= =?us-ascii?Q?C8vO9Z7RmXK5KfcLI5IdEm+fgDrUQEXteRG9mXY3ubTkOkF73SRPTEfqvbxj?= =?us-ascii?Q?GSf1nF4d8sl7nI9uiTpAoqrGEIUqU+qg9ptsXt5BJ31KblxBTh9k1/HBOnD3?= =?us-ascii?Q?EtHBBUVkBuL87f4cRLwiDKmjHDkZIIwOXUb59L76X1kT6egXlLIt7LMs3CvN?= =?us-ascii?Q?3PmyCNHQsJQNF/ZaOtxsr0bHMiDot+Rj9RrAbGLOJ8AwiVSPgicGrPHtPe3s?= =?us-ascii?Q?BlYB/K/Rgh7DEW7dO6riInGf0dnbbi+g2oEWeyn6CeAyEg6FflBEd3Pb2oXo?= =?us-ascii?Q?DPL42bgcclAxyvplIRnyieIb1VQe/Ed8?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:BEZP281MB1973.DEUP281.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(10070799003)(376014)(366016)(1800799024);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?F1auUPZumGreqCbtjS5O4aRlDCbpr7jQA9InfR1KfI+p+HMMcR/1hSSU6EQ6?= =?us-ascii?Q?EocriXVZwnSjhnQkozAGItfRY1hbZDKCMaRFsZuDsSFKFbpGRyKz8J9K2M1N?= =?us-ascii?Q?HSvBC7vTlU7X3yb5QG2RWCDLOzBWFRHkuT3ae50vN1rgs3mCnSCJ9ZiAGsDj?= =?us-ascii?Q?7sSpppj06CGs5WnR3sppmcHkhONyugKmZxIcFwHXn1m7bc01DCctfLjM6DQJ?= =?us-ascii?Q?EU2DFSRz6eoRUjnl9543f40Jy6OVav2tcWZBbH7gc0nGDcOAnsKD6fTz+8Ko?= =?us-ascii?Q?4oNgp8qlL9SPDG5+d2o1hc2yDUPUKA1QaVe/Hspw4WbiuxBurzHYQptsmKe3?= =?us-ascii?Q?XSUt5FSK2jve8hkaa1H8NIYX7X57zfrevPY7UCvhyC0h+2k2HRjqA+661YAo?= =?us-ascii?Q?rEXQr9+hRkBKoU0vyqTIwn0BMNEeg+SXpZRAyMHG/Eeq5uqTtjUpLhoX1cdy?= =?us-ascii?Q?PM72RanInBiHdu3AQfS75l4ub9VGUS9gPg9b7opu8d2ckgyzAjXkfeEmfiIb?= =?us-ascii?Q?fsegqNtfsJlOEm/Z/+iOWrgQl2BR+TqNeF+H25TV9Hb1y+AoHSemGXAa/U5m?= =?us-ascii?Q?LXvImalX+5O8eThDHExxxjn0sO0pT5nztz0+RZK+ygOotc9myUJ5Te5osgFR?= =?us-ascii?Q?0bfKSS1jDvx3LBZvjOMZI+9rXuWVxLSU3I2ucwyB5wDN+jgPcfpvu2DlHJBK?= =?us-ascii?Q?0IBboccobFM/6NjHXYjnMiD+iIuxRl7LFwdjyMue6zP8EImoJNArXGFJXhzf?= =?us-ascii?Q?8X5cYKxl88BeJ1OtOydvJzmAlWr3GZJesx/CReGardu+gBEKlO3V87/P4QyG?= =?us-ascii?Q?HOwWggnuYReyPh2gNlv4CTc1DeYyXvetMCBvk+4p4JV0gpr+ihHiW1FUETbx?= =?us-ascii?Q?EWwn97k+Q8LgqD6AXJqGv6J+kNFQkEbaKo5n1gIlMfh3tInFnkwgGFxueHK6?= =?us-ascii?Q?AqYUPiwDMywjpJCeRkDTbiTeDi3RJiaeO5M9JgznYB7xPYiVk8ITWFVwu33v?= =?us-ascii?Q?5TeOkSW0tPPUT4s4A10f1JKw42OoHrDDIEMOQug3asqmfjgb7QDBcRnrfgUL?= =?us-ascii?Q?Zbobq5im5D5EBxVr1LGu7Fvt+wLHGOsBE6IO+gr5KDZo4OL4nMqv6OsNhlbz?= =?us-ascii?Q?97TBEx4G/FlBm4ZfoXTe3/+tyqmkBL2t+6jXhEEgsJjFGU79Dds4q5TE4F4B?= =?us-ascii?Q?PY8PRqLY8k9hJxm7RzB/6KIQ3Tgdh21GVY6yDMkWuBTWJ7xtLa5xnTaxuf7I?= =?us-ascii?Q?elHM854ji8AgkooR1j7E50BGTSu3riZljHEjQnGlZ4qOqqRCmmqLYZ2TQk2b?= =?us-ascii?Q?cckUctCZHGG0lIwRXI5TmC39JuXTe/YN+3UPZBvxSbreqpJgninoKqx5GVu5?= =?us-ascii?Q?1ryFGEFrjcBcFJs6e5dHcPHDYis2l1xV3nFneP3J9uU2B/e9JirxPNj+DcRN?= =?us-ascii?Q?kXR3bdc3ScvMiSOgZ5T98CW3+cVdo7qivS9du1rfO5Ewwx9E2gbfuQm63kjF?= =?us-ascii?Q?77f9Z6cO+2zCdT/LZWdXT0FtANlBBCh5sGw2buh1aKH6OkrmOa8s/DmZ7hg4?= =?us-ascii?Q?iHXEM93z1/3r1HB7CQFzauiZxs/xpduWXxS74ci8ZQ/0VcLrAFnLSXN13/SY?= =?us-ascii?Q?Ig4j8mcFjrTG8Zd21pTZBj3XqWRVBEC9E4DlRHoeeTP5?= X-OriginatorOrg: cyberus-technology.de X-MS-Exchange-CrossTenant-Network-Message-Id: 9e913247-3fb3-4034-58ba-08de04eb9454 X-MS-Exchange-CrossTenant-AuthSource: BEZP281MB1973.DEUP281.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Oct 2025 15:18:18.6504 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: f4e0f4e0-9d68-4bd6-a95b-0cba36dbac2e X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: fe7DKEqJDzodQ6CLNR5A7pHOlhhtN0gZ4groQIj+C1zn+dERpJbyxX3VCm472ZXw45bfWTIQpctd1qw/a7QabFrQ/mTeOqv2olfbejC7wn6d2IfH0IWcAfYp7Ak9Gqbj X-MS-Exchange-Transport-CrossTenantHeadersStamped: BEYP281MB5624 Message-ID-Hash: ZAY2PM2334FDH7D5DZ4QLM7ZJDLXGSZF X-Message-ID-Hash: ZAY2PM2334FDH7D5DZ4QLM7ZJDLXGSZF X-MailFrom: stefan.kober@cyberus-technology.de X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: Stefan Kober X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: X-ZohoMail-DKIM: pass (identity @cyberus-technology.de) X-ZM-MESSAGEID: 1759764363974116600 Content-Type: text/plain; charset="utf-8" On-behalf-of: SAP stefan.kober@sap.com Signed-off-by: Stefan Kober --- src/ch/ch_hotplug.c | 10 +++ src/ch/ch_monitor.c | 5 +- src/ch/ch_monitor.h | 1 - src/ch/ch_process.c | 163 +++++++++++++++++++++++++------------------- src/ch/ch_process.h | 8 +++ 5 files changed, 111 insertions(+), 76 deletions(-) diff --git a/src/ch/ch_hotplug.c b/src/ch/ch_hotplug.c index 902eab839b..25058e08f3 100644 --- a/src/ch/ch_hotplug.c +++ b/src/ch/ch_hotplug.c @@ -75,6 +75,16 @@ chDomainAttachDeviceLive(virCHDriver *driver, break; =20 case VIR_DOMAIN_DEVICE_NET: + if (chProcessAddNetworkDevice(driver, mon, vm->def, dev->data.net, + NULL, NULL) < 0) { + break; + } + + virDomainNetInsert(vm->def, dev->data.net); + + dev->data.net =3D NULL; + ret =3D 0; + break; case VIR_DOMAIN_DEVICE_LEASE: case VIR_DOMAIN_DEVICE_FS: case VIR_DOMAIN_DEVICE_INPUT: diff --git a/src/ch/ch_monitor.c b/src/ch/ch_monitor.c index 65dc89cfd1..46b31acc76 100644 --- a/src/ch/ch_monitor.c +++ b/src/ch/ch_monitor.c @@ -379,7 +379,6 @@ virCHMonitorBuildRngJson(virJSONValue *content, virDoma= inDef *vmdef) /** * virCHMonitorBuildNetJson: * @net: pointer to a guest network definition - * @netindex: index of the guest network definition * @jsonstr: returned network json * * Build net json to send to CH @@ -387,15 +386,13 @@ virCHMonitorBuildRngJson(virJSONValue *content, virDo= mainDef *vmdef) */ int virCHMonitorBuildNetJson(virDomainNetDef *net, - int netindex, char **jsonstr) { char macaddr[VIR_MAC_STRING_BUFLEN]; g_autoptr(virJSONValue) net_json =3D virJSONValueNewObject(); virDomainNetType actualType =3D virDomainNetGetActualType(net); =20 - g_autofree char *id =3D g_strdup_printf("%s_%d", CH_NET_ID_PREFIX, net= index); - if (virJSONValueObjectAppendString(net_json, "id", id) < 0) + if (virJSONValueObjectAppendString(net_json, "id", net->info.alias) < = 0) return -1; =20 if (actualType =3D=3D VIR_DOMAIN_NET_TYPE_ETHERNET && diff --git a/src/ch/ch_monitor.h b/src/ch/ch_monitor.h index e3fde06f88..a462630be0 100644 --- a/src/ch/ch_monitor.h +++ b/src/ch/ch_monitor.h @@ -138,7 +138,6 @@ int virCHMonitorGetIOThreads(virCHMonitor *mon, virDomainIOThreadInfo ***iothreads); int virCHMonitorBuildNetJson(virDomainNetDef *netdef, - int netindex, char **jsonstr); int virCHMonitorAddDisk(virCHMonitor* mon, diff --git a/src/ch/ch_process.c b/src/ch/ch_process.c index 54b21b0baf..a1f30f09e1 100644 --- a/src/ch/ch_process.c +++ b/src/ch/ch_process.c @@ -624,30 +624,24 @@ chCloseFDs(int *fds, size_t nfds) return 0; } =20 -/** - * chProcessAddNetworkDevices: - * @driver: pointer to ch driver object - * @mon: pointer to the monitor object - * @vmdef: pointer to domain definition - * @nicindexes: returned array of FDs of guest interfaces - * @nnicindexes: returned number of network indexes - * - * Send tap fds to CH process via AddNet api. Capture the network indexes = of - * guest interfaces in nicindexes. - * - * Returns 0 on success, -1 on error. - */ -static int -chProcessAddNetworkDevices(virCHDriver *driver, - virCHMonitor *mon, - virDomainDef *vmdef, - int **nicindexes, - size_t *nnicindexes) +int +chProcessAddNetworkDevice(virCHDriver *driver, + virCHMonitor *mon, + virDomainDef *vmdef, + virDomainNetDef *net, + int **nicindexes, + size_t *nnicindexes) { - size_t i; VIR_AUTOCLOSE mon_sockfd =3D -1; g_auto(virBuffer) buf =3D VIR_BUFFER_INITIALIZER; g_auto(virBuffer) http_headers =3D VIR_BUFFER_INITIALIZER; + g_autofree int *tapfds =3D NULL; + g_autofree char *payload =3D NULL; + g_autofree char *response =3D NULL; + size_t tapfd_len; + size_t payload_len; + int saved_errno; + int rc; =20 if (!virBitmapIsBitSet(driver->chCaps, CH_MULTIFD_IN_ADDNET)) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", @@ -655,73 +649,100 @@ chProcessAddNetworkDevices(virCHDriver *driver, return -1; } =20 - if ((mon_sockfd =3D chMonitorSocketConnect(mon)) < 0) + if ((mon_sockfd =3D chMonitorSocketConnect(mon)) < 0) { + VIR_WARN("chProcessAddNetworkDevices failed"); return -1; + } =20 virBufferAddLit(&http_headers, "PUT /api/v1/vm.add-net HTTP/1.1\r\n"); virBufferAddLit(&http_headers, "Host: localhost\r\n"); virBufferAddLit(&http_headers, "Content-Type: application/json\r\n"); =20 - for (i =3D 0; i < vmdef->nnets; i++) { - g_autofree int *tapfds =3D NULL; - g_autofree char *payload =3D NULL; - g_autofree char *response =3D NULL; - size_t tapfd_len; - size_t payload_len; - int saved_errno; - int rc; - - if (vmdef->nets[i]->driver.virtio.queues =3D=3D 0) { - /* "queues" here refers to queue pairs. When 0, initialize - * queue pairs to 1. - */ - vmdef->nets[i]->driver.virtio.queues =3D 1; - } - tapfd_len =3D vmdef->nets[i]->driver.virtio.queues; =20 - if (virCHDomainValidateActualNetDef(vmdef->nets[i]) < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("net definition failed validation")); - return -1; - } + if (net->driver.virtio.queues =3D=3D 0) { + /* "queues" here refers to queue pairs. When 0, initialize + * queue pairs to 1. + */ + net->driver.virtio.queues =3D 1; + } + tapfd_len =3D net->driver.virtio.queues; =20 - tapfds =3D g_new0(int, tapfd_len); - memset(tapfds, -1, (tapfd_len) * sizeof(int)); + if (virCHDomainValidateActualNetDef(net) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("net definition failed validation")); + return -1; + } =20 - /* Connect Guest interfaces */ - if (virCHConnetNetworkInterfaces(driver, vmdef, vmdef->nets[i], ta= pfds, - nicindexes, nnicindexes) < 0) - return -1; + tapfds =3D g_new0(int, tapfd_len); + memset(tapfds, -1, (tapfd_len) * sizeof(int)); =20 - if (virCHMonitorBuildNetJson(vmdef->nets[i], i, &payload) < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("Failed to build net json")); - return -1; - } + /* Connect Guest interfaces */ + if (virCHConnetNetworkInterfaces(driver, vmdef, net, tapfds, + nicindexes, nnicindexes) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Failed to connect network interfaces")); + return -1; + } =20 - VIR_DEBUG("payload sent with net-add request to CH =3D %s", payloa= d); + chAssignDeviceNetAlias(vmdef, net); + if (virCHMonitorBuildNetJson(net, &payload) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Failed to build net json")); + return -1; + } =20 - virBufferAsprintf(&buf, "%s", virBufferCurrentContent(&http_header= s)); - virBufferAsprintf(&buf, "Content-Length: %zu\r\n\r\n", strlen(payl= oad)); - virBufferAsprintf(&buf, "%s", payload); - payload_len =3D virBufferUse(&buf); - payload =3D virBufferContentAndReset(&buf); + virBufferAsprintf(&buf, "%s", virBufferCurrentContent(&http_headers)); + virBufferAsprintf(&buf, "Content-Length: %zu\r\n\r\n", strlen(payload)= ); + virBufferAsprintf(&buf, "%s", payload); + payload_len =3D virBufferUse(&buf); + payload =3D virBufferContentAndReset(&buf); =20 - rc =3D virSocketSendMsgWithFDs(mon_sockfd, payload, payload_len, - tapfds, tapfd_len); - saved_errno =3D errno; + rc =3D virSocketSendMsgWithFDs(mon_sockfd, payload, payload_len, + tapfds, tapfd_len); + saved_errno =3D errno; =20 - /* Close sent tap fds in Libvirt, as they have been dup()ed in CH = */ - chCloseFDs(tapfds, tapfd_len); + /* Close sent tap fds in Libvirt, as they have been dup()ed in CH */ + chCloseFDs(tapfds, tapfd_len); =20 - if (rc < 0) { - virReportSystemError(saved_errno, "%s", - _("Failed to send net-add request to CH")= ); - return -1; - } + if (rc < 0) { + virReportSystemError(saved_errno, "%s", + _("Failed to send net-add request to CH")); + return -1; + } =20 - if (chSocketProcessHttpResponse(mon_sockfd, true) < 0) - return -1; + if (chSocketProcessHttpResponse(mon_sockfd, true) < 0) + return -1; + + return 0; +} + +/** + * chProcessAddNetworkDevices: + * @driver: pointer to ch driver object + * @mon: pointer to the monitor object + * @vmdef: pointer to domain definition + * @nicindexes: returned array of FDs of guest interfaces + * @nnicindexes: returned number of network indexes + * + * Send tap fds to CH process via AddNet api. Capture the network indexes = of + * guest interfaces in nicindexes. + * + * Returns 0 on success, -1 on error. + */ +static int +chProcessAddNetworkDevices(virCHDriver *driver, + virCHMonitor *mon, + virDomainDef *vmdef, + int **nicindexes, + size_t *nnicindexes) +{ + size_t i =3D 0; + + for (i =3D 0; i < vmdef->nnets; i++) { + if (chProcessAddNetworkDevice(driver, mon, vmdef, vmdef->nets[i], + nicindexes, nnicindexes) < 0) { + return -1; + } } =20 return 0; diff --git a/src/ch/ch_process.h b/src/ch/ch_process.h index a22790bb5c..e9b1f559d9 100644 --- a/src/ch/ch_process.h +++ b/src/ch/ch_process.h @@ -41,3 +41,11 @@ int virCHProcessStartRestore(virCHDriver *driver, const char *from); =20 int virCHProcessUpdateInfo(virDomainObj *vm); + +int +chProcessAddNetworkDevice(virCHDriver *driver, + virCHMonitor *mon, + virDomainDef *vmdef, + virDomainNetDef *net, + int **nicindexes, + size_t *nnicindexes); --=20 2.51.0