[RFC PATCH 2/3] remote: Implement domain inject launch secret API

Jim Fehlig jfehlig at suse.com
Wed Nov 17 02:23:53 UTC 2021


Signed-off-by: Jim Fehlig <jfehlig at suse.com>
---
 src/remote/remote_daemon_dispatch.c | 27 ++++++++++++++++++++++++
 src/remote/remote_driver.c          | 32 +++++++++++++++++++++++++++++
 src/remote/remote_protocol.x        | 16 ++++++++++++++-
 src/remote_protocol-structs         |  8 ++++++++
 4 files changed, 82 insertions(+), 1 deletion(-)

diff --git a/src/remote/remote_daemon_dispatch.c b/src/remote/remote_daemon_dispatch.c
index 689001889e..f2f7b35f53 100644
--- a/src/remote/remote_daemon_dispatch.c
+++ b/src/remote/remote_daemon_dispatch.c
@@ -3451,6 +3451,33 @@ remoteDispatchDomainGetLaunchSecurityInfo(virNetServer *server G_GNUC_UNUSED,
     return rv;
 }
 
+static int
+remoteDispatchDomainInjectLaunchSecret(virNetServer *server G_GNUC_UNUSED,
+                                       virNetServerClient *client,
+                                       virNetMessage *msg G_GNUC_UNUSED,
+                                       struct virNetMessageError *rerr,
+                                       remote_domain_inject_launch_secret_args *args)
+{
+    int rv = -1;
+    virConnectPtr conn = remoteGetHypervisorConn(client);
+    virDomainPtr dom = NULL;
+
+    if (!conn)
+        goto cleanup;
+
+    if (!(dom = get_nonnull_domain(conn, args->dom)))
+        goto cleanup;
+
+    rv = virDomainInjectLaunchSecret(dom, args->secrethdr, args->secret,
+                                     args->injectaddr, args->flags);
+
+ cleanup:
+    if (rv < 0)
+        virNetMessageSaveError(rerr);
+    virObjectUnref(dom);
+    return rv;
+}
+
 static int
 remoteDispatchDomainGetPerfEvents(virNetServer *server G_GNUC_UNUSED,
                                   virNetServerClient *client,
diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
index 235c406a5a..4fbb3c5bad 100644
--- a/src/remote/remote_driver.c
+++ b/src/remote/remote_driver.c
@@ -1893,6 +1893,37 @@ remoteDomainGetLaunchSecurityInfo(virDomainPtr domain,
     return rv;
 }
 
+static int
+remoteDomainInjectLaunchSecret(virDomainPtr domain,
+                               const char *secrethdr,
+                               const char *secret,
+                               unsigned long long injectaddr,
+                               unsigned int flags)
+{
+    int rv = -1;
+    struct private_data *priv = domain->conn->privateData;
+    remote_domain_inject_launch_secret_args args;
+
+    remoteDriverLock(priv);
+
+    make_nonnull_domain(&args.dom, domain);
+    args.secrethdr = (char *) secrethdr;
+    args.secret = (char *) secret;
+    args.injectaddr = injectaddr;
+    args.flags = flags;
+
+    if (call(domain->conn, priv, 0, REMOTE_PROC_DOMAIN_INJECT_LAUNCH_SECRET,
+             (xdrproc_t) xdr_remote_domain_inject_launch_secret_args, (char *) &args,
+             (xdrproc_t) xdr_void, (char *) NULL) == -1)
+        goto done;
+
+    rv = 0;
+
+ done:
+    remoteDriverUnlock(priv);
+    return rv;
+}
+
 static int
 remoteDomainGetPerfEvents(virDomainPtr domain,
                           virTypedParameterPtr *params,
@@ -8574,6 +8605,7 @@ static virHypervisorDriver hypervisor_driver = {
     .domainAuthorizedSSHKeysSet = remoteDomainAuthorizedSSHKeysSet, /* 6.10.0 */
     .domainGetMessages = remoteDomainGetMessages, /* 7.1.0 */
     .domainStartDirtyRateCalc = remoteDomainStartDirtyRateCalc, /* 7.2.0 */
+    .domainInjectLaunchSecret = remoteDomainInjectLaunchSecret, /* 7.10.0 */
 };
 
 static virNetworkDriver network_driver = {
diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x
index 60010778ca..fb0da81e9a 100644
--- a/src/remote/remote_protocol.x
+++ b/src/remote/remote_protocol.x
@@ -3900,6 +3900,14 @@ struct remote_domain_event_memory_device_size_change_msg {
     unsigned hyper size;
 };
 
+struct remote_domain_inject_launch_secret_args {
+    remote_nonnull_domain dom;
+    remote_nonnull_string secrethdr;
+    remote_nonnull_string secret;
+    unsigned hyper injectaddr;
+    unsigned int flags;
+};
+
 /*----- Protocol. -----*/
 
 /* Define the program number, protocol version and procedure numbers here. */
@@ -6905,5 +6913,11 @@ enum remote_procedure {
      * @generate: both
      * @acl: none
      */
-    REMOTE_PROC_DOMAIN_EVENT_MEMORY_DEVICE_SIZE_CHANGE = 438
+    REMOTE_PROC_DOMAIN_EVENT_MEMORY_DEVICE_SIZE_CHANGE = 438,
+
+    /**
+     * @generate: none
+     * @acl: domain:write
+     */
+    REMOTE_PROC_DOMAIN_INJECT_LAUNCH_SECRET = 439
 };
diff --git a/src/remote_protocol-structs b/src/remote_protocol-structs
index dbef4ace79..c9e26b0ce1 100644
--- a/src/remote_protocol-structs
+++ b/src/remote_protocol-structs
@@ -3241,6 +3241,13 @@ struct remote_domain_event_memory_device_size_change_msg {
         remote_nonnull_string      alias;
         uint64_t                   size;
 };
+struct remote_domain_inject_launch_secret_args {
+        remote_nonnull_domain      dom;
+        remote_nonnull_string      secrethdr;
+        remote_nonnull_string      secret;
+        uint64_t                   injectaddr;
+        u_int                      flags;
+};
 enum remote_procedure {
         REMOTE_PROC_CONNECT_OPEN = 1,
         REMOTE_PROC_CONNECT_CLOSE = 2,
@@ -3680,4 +3687,5 @@ enum remote_procedure {
         REMOTE_PROC_NODE_DEVICE_IS_ACTIVE = 436,
         REMOTE_PROC_NETWORK_CREATE_XML_FLAGS = 437,
         REMOTE_PROC_DOMAIN_EVENT_MEMORY_DEVICE_SIZE_CHANGE = 438,
+        REMOTE_PROC_DOMAIN_INJECT_LAUNCH_SECRET = 439,
 };
-- 
2.33.0





More information about the libvir-list mailing list