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 virtio_console_control cpkt, *gcpkt;
|
||||
uint8_t *buffer;
|
||||
size_t buffer_len;
|
||||
|
||||
gcpkt = buf;
|
||||
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);
|
||||
}
|
||||
|
||||
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) {
|
||||
send_control_event(port, VIRTIO_CONSOLE_PORT_OPEN, 1);
|
||||
}
|
||||
|
@ -100,6 +100,7 @@ static VirtIOSerialPortInfo virtconsole_info = {
|
||||
.qdev.props = (Property[]) {
|
||||
DEFINE_PROP_UINT8("is_console", VirtConsole, port.is_console, 1),
|
||||
DEFINE_PROP_CHR("chardev", VirtConsole, chr),
|
||||
DEFINE_PROP_STRING("name", VirtConsole, port.name),
|
||||
DEFINE_PROP_END_OF_LIST(),
|
||||
},
|
||||
};
|
||||
|
@ -50,6 +50,7 @@ struct virtio_console_control {
|
||||
#define VIRTIO_CONSOLE_CONSOLE_PORT 1
|
||||
#define VIRTIO_CONSOLE_RESIZE 2
|
||||
#define VIRTIO_CONSOLE_PORT_OPEN 3
|
||||
#define VIRTIO_CONSOLE_PORT_NAME 4
|
||||
|
||||
/* == In-qemu interface == */
|
||||
|
||||
@ -83,6 +84,13 @@ struct VirtIOSerialPort {
|
||||
|
||||
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.
|
||||
* The guest sends a "header" with this id with each data packet
|
||||
|
Loading…
Reference in New Issue
Block a user