提交 73d8b03c 编写于 作者: D Daniel P. Berrange

Remote driver client and server for virDomainOpenConsole

This provides an implementation of the virDomainOpenConsole
API for the remote driver client and server.

* daemon/remote.c: Server side impl
* src/remote/remote_driver.c: Client impl
* src/remote/remote_protocol.x: Wire definition
上级 88a9b382
...@@ -6907,6 +6907,58 @@ qemuDispatchMonitorCommand (struct qemud_server *server ATTRIBUTE_UNUSED, ...@@ -6907,6 +6907,58 @@ qemuDispatchMonitorCommand (struct qemud_server *server ATTRIBUTE_UNUSED,
} }
static int
remoteDispatchDomainOpenConsole(struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
virConnectPtr conn,
remote_message_header *hdr,
remote_error *rerr,
remote_domain_open_console_args *args,
void *ret ATTRIBUTE_UNUSED)
{
int r;
struct qemud_client_stream *stream;
virDomainPtr dom;
CHECK_CONN (client);
dom = get_nonnull_domain (conn, args->domain);
if (dom == NULL) {
remoteDispatchConnError(rerr, conn);
return -1;
}
stream = remoteCreateClientStream(conn, hdr);
if (!stream) {
virDomainFree(dom);
remoteDispatchOOMError(rerr);
return -1;
}
r = virDomainOpenConsole(dom,
args->devname ? *args->devname : NULL,
stream->st,
args->flags);
if (r == -1) {
virDomainFree(dom);
remoteFreeClientStream(client, stream);
remoteDispatchConnError(rerr, conn);
return -1;
}
if (remoteAddClientStream(client, stream, 1) < 0) {
virDomainFree(dom);
remoteDispatchConnError(rerr, conn);
virStreamAbort(stream->st);
remoteFreeClientStream(client, stream);
return -1;
}
virDomainFree(dom);
return 0;
}
/*----- Helpers. -----*/ /*----- Helpers. -----*/
/* get_nonnull_domain and get_nonnull_network turn an on-wire /* get_nonnull_domain and get_nonnull_network turn an on-wire
......
...@@ -169,3 +169,4 @@ ...@@ -169,3 +169,4 @@
remote_domain_get_memory_parameters_args val_remote_domain_get_memory_parameters_args; remote_domain_get_memory_parameters_args val_remote_domain_get_memory_parameters_args;
remote_domain_set_vcpus_flags_args val_remote_domain_set_vcpus_flags_args; remote_domain_set_vcpus_flags_args val_remote_domain_set_vcpus_flags_args;
remote_domain_get_vcpus_flags_args val_remote_domain_get_vcpus_flags_args; remote_domain_get_vcpus_flags_args val_remote_domain_get_vcpus_flags_args;
remote_domain_open_console_args val_remote_domain_open_console_args;
...@@ -466,6 +466,14 @@ static int remoteDispatchDomainMigrateSetMaxDowntime( ...@@ -466,6 +466,14 @@ static int remoteDispatchDomainMigrateSetMaxDowntime(
remote_error *err, remote_error *err,
remote_domain_migrate_set_max_downtime_args *args, remote_domain_migrate_set_max_downtime_args *args,
void *ret); void *ret);
static int remoteDispatchDomainOpenConsole(
struct qemud_server *server,
struct qemud_client *client,
virConnectPtr conn,
remote_message_header *hdr,
remote_error *err,
remote_domain_open_console_args *args,
void *ret);
static int remoteDispatchDomainPinVcpu( static int remoteDispatchDomainPinVcpu(
struct qemud_server *server, struct qemud_server *server,
struct qemud_client *client, struct qemud_client *client,
......
...@@ -1007,3 +1007,8 @@ ...@@ -1007,3 +1007,8 @@
.args_filter = (xdrproc_t) xdr_remote_domain_get_vcpus_flags_args, .args_filter = (xdrproc_t) xdr_remote_domain_get_vcpus_flags_args,
.ret_filter = (xdrproc_t) xdr_remote_domain_get_vcpus_flags_ret, .ret_filter = (xdrproc_t) xdr_remote_domain_get_vcpus_flags_ret,
}, },
{ /* DomainOpenConsole => 201 */
.fn = (dispatch_fn) remoteDispatchDomainOpenConsole,
.args_filter = (xdrproc_t) xdr_remote_domain_open_console_args,
.ret_filter = (xdrproc_t) xdr_void,
},
...@@ -8152,11 +8152,16 @@ remoteStreamEventTimerUpdate(struct private_stream_data *privst) ...@@ -8152,11 +8152,16 @@ remoteStreamEventTimerUpdate(struct private_stream_data *privst)
if (!privst->cb) if (!privst->cb)
return; return;
if (!privst->cbEvents) VIR_DEBUG("Check timer offset=%d %d", privst->incomingOffset, privst->cbEvents);
virEventUpdateTimeout(privst->cbTimer, -1); if ((privst->incomingOffset &&
else if (privst->incoming && (privst->cbEvents & VIR_STREAM_EVENT_READABLE)) ||
(privst->cbEvents & VIR_STREAM_EVENT_READABLE)) (privst->cbEvents & VIR_STREAM_EVENT_WRITABLE)) {
VIR_DEBUG0("Enabling event timer");
virEventUpdateTimeout(privst->cbTimer, 0); virEventUpdateTimeout(privst->cbTimer, 0);
} else {
VIR_DEBUG0("Disabling event timer");
virEventUpdateTimeout(privst->cbTimer, -1);
}
} }
...@@ -8422,24 +8427,33 @@ remoteStreamEventTimer(int timer ATTRIBUTE_UNUSED, void *opaque) ...@@ -8422,24 +8427,33 @@ remoteStreamEventTimer(int timer ATTRIBUTE_UNUSED, void *opaque)
virStreamPtr st = opaque; virStreamPtr st = opaque;
struct private_data *priv = st->conn->privateData; struct private_data *priv = st->conn->privateData;
struct private_stream_data *privst = st->privateData; struct private_stream_data *privst = st->privateData;
int events = 0;
remoteDriverLock(priv); remoteDriverLock(priv);
if (privst->cb && if (privst->cb &&
(privst->cbEvents & VIR_STREAM_EVENT_READABLE) && (privst->cbEvents & VIR_STREAM_EVENT_READABLE) &&
privst->incomingOffset) { privst->incomingOffset)
events |= VIR_STREAM_EVENT_READABLE;
if (privst->cb &&
(privst->cbEvents & VIR_STREAM_EVENT_WRITABLE))
events |= VIR_STREAM_EVENT_WRITABLE;
VIR_DEBUG("Got Timer dispatch %d %d offset=%d", events, privst->cbEvents, privst->incomingOffset);
if (events) {
virStreamEventCallback cb = privst->cb; virStreamEventCallback cb = privst->cb;
void *cbOpaque = privst->cbOpaque; void *cbOpaque = privst->cbOpaque;
virFreeCallback cbFree = privst->cbFree; virFreeCallback cbFree = privst->cbFree;
privst->cbDispatch = 1; privst->cbDispatch = 1;
remoteDriverUnlock(priv); remoteDriverUnlock(priv);
(cb)(st, VIR_STREAM_EVENT_READABLE, cbOpaque); (cb)(st, events, cbOpaque);
remoteDriverLock(priv); remoteDriverLock(priv);
privst->cbDispatch = 0; privst->cbDispatch = 0;
if (!privst->cb && cbFree) if (!privst->cb && cbFree)
(cbFree)(cbOpaque); (cbFree)(cbOpaque);
} }
remoteDriverUnlock(priv); remoteDriverUnlock(priv);
} }
...@@ -8465,12 +8479,6 @@ remoteStreamEventAddCallback(virStreamPtr st, ...@@ -8465,12 +8479,6 @@ remoteStreamEventAddCallback(virStreamPtr st,
remoteDriverLock(priv); remoteDriverLock(priv);
if (events & ~VIR_STREAM_EVENT_READABLE) {
remoteError(VIR_ERR_INTERNAL_ERROR,
_("unsupported stream events %d"), events);
goto cleanup;
}
if (privst->cb) { if (privst->cb) {
remoteError(VIR_ERR_INTERNAL_ERROR, remoteError(VIR_ERR_INTERNAL_ERROR,
_("multiple stream callbacks not supported")); _("multiple stream callbacks not supported"));
...@@ -8492,6 +8500,8 @@ remoteStreamEventAddCallback(virStreamPtr st, ...@@ -8492,6 +8500,8 @@ remoteStreamEventAddCallback(virStreamPtr st,
privst->cbFree = ff; privst->cbFree = ff;
privst->cbEvents = events; privst->cbEvents = events;
remoteStreamEventTimerUpdate(privst);
ret = 0; ret = 0;
cleanup: cleanup:
...@@ -8509,12 +8519,6 @@ remoteStreamEventUpdateCallback(virStreamPtr st, ...@@ -8509,12 +8519,6 @@ remoteStreamEventUpdateCallback(virStreamPtr st,
remoteDriverLock(priv); remoteDriverLock(priv);
if (events & ~VIR_STREAM_EVENT_READABLE) {
remoteError(VIR_ERR_INTERNAL_ERROR,
_("unsupported stream events %d"), events);
goto cleanup;
}
if (!privst->cb) { if (!privst->cb) {
remoteError(VIR_ERR_INTERNAL_ERROR, remoteError(VIR_ERR_INTERNAL_ERROR,
_("no stream callback registered")); _("no stream callback registered"));
...@@ -9196,6 +9200,46 @@ done: ...@@ -9196,6 +9200,46 @@ done:
} }
static int
remoteDomainOpenConsole(virDomainPtr dom,
const char *devname,
virStreamPtr st,
unsigned int flags)
{
struct private_data *priv = dom->conn->privateData;
struct private_stream_data *privst = NULL;
int rv = -1;
remote_domain_open_console_args args;
remoteDriverLock(priv);
if (!(privst = remoteStreamOpen(st, 1, REMOTE_PROC_DOMAIN_OPEN_CONSOLE, priv->counter)))
goto done;
st->driver = &remoteStreamDrv;
st->privateData = privst;
make_nonnull_domain (&args.domain, dom);
args.devname = devname ? (char **)&devname : NULL;
args.flags = flags;
if (call(dom->conn, priv, 0, REMOTE_PROC_DOMAIN_OPEN_CONSOLE,
(xdrproc_t) xdr_remote_domain_open_console_args, (char *) &args,
(xdrproc_t) xdr_void, NULL) == -1) {
remoteStreamRelease(st);
goto done;
}
rv = 0;
done:
remoteDriverUnlock(priv);
return rv;
}
/*----------------------------------------------------------------------*/ /*----------------------------------------------------------------------*/
static int static int
...@@ -10691,7 +10735,7 @@ static virDriver remote_driver = { ...@@ -10691,7 +10735,7 @@ static virDriver remote_driver = {
remoteQemuDomainMonitorCommand, /* qemuDomainMonitorCommand */ remoteQemuDomainMonitorCommand, /* qemuDomainMonitorCommand */
remoteDomainSetMemoryParameters, /* domainSetMemoryParameters */ remoteDomainSetMemoryParameters, /* domainSetMemoryParameters */
remoteDomainGetMemoryParameters, /* domainGetMemoryParameters */ remoteDomainGetMemoryParameters, /* domainGetMemoryParameters */
NULL, /* domainOpenConsole */ remoteDomainOpenConsole, /* domainOpenConsole */
}; };
static virNetworkDriver network_driver = { static virNetworkDriver network_driver = {
......
...@@ -3708,6 +3708,19 @@ xdr_remote_domain_snapshot_delete_args (XDR *xdrs, remote_domain_snapshot_delete ...@@ -3708,6 +3708,19 @@ xdr_remote_domain_snapshot_delete_args (XDR *xdrs, remote_domain_snapshot_delete
return TRUE; return TRUE;
} }
bool_t
xdr_remote_domain_open_console_args (XDR *xdrs, remote_domain_open_console_args *objp)
{
if (!xdr_remote_nonnull_domain (xdrs, &objp->domain))
return FALSE;
if (!xdr_remote_string (xdrs, &objp->devname))
return FALSE;
if (!xdr_u_int (xdrs, &objp->flags))
return FALSE;
return TRUE;
}
bool_t bool_t
xdr_remote_procedure (XDR *xdrs, remote_procedure *objp) xdr_remote_procedure (XDR *xdrs, remote_procedure *objp)
{ {
......
...@@ -2097,6 +2097,13 @@ struct remote_domain_snapshot_delete_args { ...@@ -2097,6 +2097,13 @@ struct remote_domain_snapshot_delete_args {
int flags; int flags;
}; };
typedef struct remote_domain_snapshot_delete_args remote_domain_snapshot_delete_args; typedef struct remote_domain_snapshot_delete_args remote_domain_snapshot_delete_args;
struct remote_domain_open_console_args {
remote_nonnull_domain domain;
remote_string devname;
u_int flags;
};
typedef struct remote_domain_open_console_args remote_domain_open_console_args;
#define REMOTE_PROGRAM 0x20008086 #define REMOTE_PROGRAM 0x20008086
#define REMOTE_PROTOCOL_VERSION 1 #define REMOTE_PROTOCOL_VERSION 1
...@@ -2301,6 +2308,7 @@ enum remote_procedure { ...@@ -2301,6 +2308,7 @@ enum remote_procedure {
REMOTE_PROC_DOMAIN_GET_MEMORY_PARAMETERS = 198, REMOTE_PROC_DOMAIN_GET_MEMORY_PARAMETERS = 198,
REMOTE_PROC_DOMAIN_SET_VCPUS_FLAGS = 199, REMOTE_PROC_DOMAIN_SET_VCPUS_FLAGS = 199,
REMOTE_PROC_DOMAIN_GET_VCPUS_FLAGS = 200, REMOTE_PROC_DOMAIN_GET_VCPUS_FLAGS = 200,
REMOTE_PROC_DOMAIN_OPEN_CONSOLE = 201,
}; };
typedef enum remote_procedure remote_procedure; typedef enum remote_procedure remote_procedure;
...@@ -2670,6 +2678,7 @@ extern bool_t xdr_remote_domain_snapshot_current_args (XDR *, remote_domain_sna ...@@ -2670,6 +2678,7 @@ extern bool_t xdr_remote_domain_snapshot_current_args (XDR *, remote_domain_sna
extern bool_t xdr_remote_domain_snapshot_current_ret (XDR *, remote_domain_snapshot_current_ret*); extern bool_t xdr_remote_domain_snapshot_current_ret (XDR *, remote_domain_snapshot_current_ret*);
extern bool_t xdr_remote_domain_revert_to_snapshot_args (XDR *, remote_domain_revert_to_snapshot_args*); extern bool_t xdr_remote_domain_revert_to_snapshot_args (XDR *, remote_domain_revert_to_snapshot_args*);
extern bool_t xdr_remote_domain_snapshot_delete_args (XDR *, remote_domain_snapshot_delete_args*); extern bool_t xdr_remote_domain_snapshot_delete_args (XDR *, remote_domain_snapshot_delete_args*);
extern bool_t xdr_remote_domain_open_console_args (XDR *, remote_domain_open_console_args*);
extern bool_t xdr_remote_procedure (XDR *, remote_procedure*); extern bool_t xdr_remote_procedure (XDR *, remote_procedure*);
extern bool_t xdr_remote_message_type (XDR *, remote_message_type*); extern bool_t xdr_remote_message_type (XDR *, remote_message_type*);
extern bool_t xdr_remote_message_status (XDR *, remote_message_status*); extern bool_t xdr_remote_message_status (XDR *, remote_message_status*);
...@@ -3013,6 +3022,7 @@ extern bool_t xdr_remote_domain_snapshot_current_args (); ...@@ -3013,6 +3022,7 @@ extern bool_t xdr_remote_domain_snapshot_current_args ();
extern bool_t xdr_remote_domain_snapshot_current_ret (); extern bool_t xdr_remote_domain_snapshot_current_ret ();
extern bool_t xdr_remote_domain_revert_to_snapshot_args (); extern bool_t xdr_remote_domain_revert_to_snapshot_args ();
extern bool_t xdr_remote_domain_snapshot_delete_args (); extern bool_t xdr_remote_domain_snapshot_delete_args ();
extern bool_t xdr_remote_domain_open_console_args ();
extern bool_t xdr_remote_procedure (); extern bool_t xdr_remote_procedure ();
extern bool_t xdr_remote_message_type (); extern bool_t xdr_remote_message_type ();
extern bool_t xdr_remote_message_status (); extern bool_t xdr_remote_message_status ();
......
...@@ -1853,6 +1853,11 @@ struct remote_domain_snapshot_delete_args { ...@@ -1853,6 +1853,11 @@ struct remote_domain_snapshot_delete_args {
int flags; int flags;
}; };
struct remote_domain_open_console_args {
remote_nonnull_domain domain;
remote_string devname;
unsigned int flags;
};
/*----- Protocol. -----*/ /*----- Protocol. -----*/
...@@ -2079,7 +2084,9 @@ enum remote_procedure { ...@@ -2079,7 +2084,9 @@ enum remote_procedure {
REMOTE_PROC_DOMAIN_SET_MEMORY_PARAMETERS = 197, REMOTE_PROC_DOMAIN_SET_MEMORY_PARAMETERS = 197,
REMOTE_PROC_DOMAIN_GET_MEMORY_PARAMETERS = 198, REMOTE_PROC_DOMAIN_GET_MEMORY_PARAMETERS = 198,
REMOTE_PROC_DOMAIN_SET_VCPUS_FLAGS = 199, REMOTE_PROC_DOMAIN_SET_VCPUS_FLAGS = 199,
REMOTE_PROC_DOMAIN_GET_VCPUS_FLAGS = 200 REMOTE_PROC_DOMAIN_GET_VCPUS_FLAGS = 200,
REMOTE_PROC_DOMAIN_OPEN_CONSOLE = 201
/* /*
* Notice how the entries are grouped in sets of 10 ? * Notice how the entries are grouped in sets of 10 ?
......
...@@ -1352,6 +1352,11 @@ struct remote_domain_snapshot_delete_args { ...@@ -1352,6 +1352,11 @@ struct remote_domain_snapshot_delete_args {
remote_nonnull_domain_snapshot snap; remote_nonnull_domain_snapshot snap;
int flags; int flags;
}; };
struct remote_domain_open_console_args {
remote_nonnull_domain domain;
remote_string devname;
u_int flags;
};
struct remote_message_header { struct remote_message_header {
u_int prog; u_int prog;
u_int vers; u_int vers;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册