mirror of
https://git.proxmox.com/git/qemu
synced 2025-08-09 16:57:48 +00:00
virtio-serial-bus: Add a port 'name' property for port discovery in guests
The port 'id' or number is internal state between the guest kernel and our bus implementation. This is invocation-dependent and isn't part of the guest-host ABI. To correcly enumerate and map ports between the host and the guest, the 'name' property is used. Example: -device virtserialport,name=org.qemu.port.0 This invocation will get us a char device in the guest at: /dev/virtio-ports/org.qemu.port.0 which can be a symlink to /dev/vport0p3 This 'name' property is exposed by the guest kernel in a sysfs attribute: /sys/kernel/virtio-ports/vport0p3/name A simple udev script can pick up this name and create the symlink mentioned above. Signed-off-by: Amit Shah <amit.shah@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
parent
6663a1956e
commit
160600fd13
@ -204,6 +204,8 @@ static void handle_control_message(VirtIOSerial *vser, void *buf)
|
|||||||
{
|
{
|
||||||
struct VirtIOSerialPort *port;
|
struct VirtIOSerialPort *port;
|
||||||
struct virtio_console_control cpkt, *gcpkt;
|
struct virtio_console_control cpkt, *gcpkt;
|
||||||
|
uint8_t *buffer;
|
||||||
|
size_t buffer_len;
|
||||||
|
|
||||||
gcpkt = buf;
|
gcpkt = buf;
|
||||||
port = find_port_by_id(vser, ldl_p(&gcpkt->id));
|
port = find_port_by_id(vser, ldl_p(&gcpkt->id));
|
||||||
@ -226,6 +228,21 @@ static void handle_control_message(VirtIOSerial *vser, void *buf)
|
|||||||
send_control_event(port, VIRTIO_CONSOLE_CONSOLE_PORT, 1);
|
send_control_event(port, VIRTIO_CONSOLE_CONSOLE_PORT, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (port->name) {
|
||||||
|
stw_p(&cpkt.event, VIRTIO_CONSOLE_PORT_NAME);
|
||||||
|
stw_p(&cpkt.value, 1);
|
||||||
|
|
||||||
|
buffer_len = sizeof(cpkt) + strlen(port->name) + 1;
|
||||||
|
buffer = qemu_malloc(buffer_len);
|
||||||
|
|
||||||
|
memcpy(buffer, &cpkt, sizeof(cpkt));
|
||||||
|
memcpy(buffer + sizeof(cpkt), port->name, strlen(port->name));
|
||||||
|
buffer[buffer_len - 1] = 0;
|
||||||
|
|
||||||
|
send_control_msg(port, buffer, buffer_len);
|
||||||
|
qemu_free(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
if (port->host_connected) {
|
if (port->host_connected) {
|
||||||
send_control_event(port, VIRTIO_CONSOLE_PORT_OPEN, 1);
|
send_control_event(port, VIRTIO_CONSOLE_PORT_OPEN, 1);
|
||||||
}
|
}
|
||||||
|
@ -100,6 +100,7 @@ static VirtIOSerialPortInfo virtconsole_info = {
|
|||||||
.qdev.props = (Property[]) {
|
.qdev.props = (Property[]) {
|
||||||
DEFINE_PROP_UINT8("is_console", VirtConsole, port.is_console, 1),
|
DEFINE_PROP_UINT8("is_console", VirtConsole, port.is_console, 1),
|
||||||
DEFINE_PROP_CHR("chardev", VirtConsole, chr),
|
DEFINE_PROP_CHR("chardev", VirtConsole, chr),
|
||||||
|
DEFINE_PROP_STRING("name", VirtConsole, port.name),
|
||||||
DEFINE_PROP_END_OF_LIST(),
|
DEFINE_PROP_END_OF_LIST(),
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
@ -50,6 +50,7 @@ struct virtio_console_control {
|
|||||||
#define VIRTIO_CONSOLE_CONSOLE_PORT 1
|
#define VIRTIO_CONSOLE_CONSOLE_PORT 1
|
||||||
#define VIRTIO_CONSOLE_RESIZE 2
|
#define VIRTIO_CONSOLE_RESIZE 2
|
||||||
#define VIRTIO_CONSOLE_PORT_OPEN 3
|
#define VIRTIO_CONSOLE_PORT_OPEN 3
|
||||||
|
#define VIRTIO_CONSOLE_PORT_NAME 4
|
||||||
|
|
||||||
/* == In-qemu interface == */
|
/* == In-qemu interface == */
|
||||||
|
|
||||||
@ -83,6 +84,13 @@ struct VirtIOSerialPort {
|
|||||||
|
|
||||||
VirtQueue *ivq, *ovq;
|
VirtQueue *ivq, *ovq;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This name is sent to the guest and exported via sysfs.
|
||||||
|
* The guest could create symlinks based on this information.
|
||||||
|
* The name is in the reverse fqdn format, like org.qemu.console.0
|
||||||
|
*/
|
||||||
|
char *name;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This id helps identify ports between the guest and the host.
|
* This id helps identify ports between the guest and the host.
|
||||||
* The guest sends a "header" with this id with each data packet
|
* The guest sends a "header" with this id with each data packet
|
||||||
|
Loading…
Reference in New Issue
Block a user