mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-09-09 09:14:57 +00:00
Convert libxl driver over to use virPortAllocator APIs
Replace the current libxl driver code for managing port reservations with the new virPortAllocator APIs.
This commit is contained in:
parent
dfb1022c72
commit
0995b00084
@ -64,60 +64,6 @@ static const char *xen_cap_re = "(xen|hvm)-[[:digit:]]+\\.[[:digit:]]+-(x86_32|x
|
||||
static regex_t xen_cap_rec;
|
||||
|
||||
|
||||
static int
|
||||
libxlNextFreeVncPort(libxlDriverPrivatePtr driver, int startPort)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = startPort ; i < LIBXL_VNC_PORT_MAX; i++) {
|
||||
int fd;
|
||||
int reuse = 1;
|
||||
struct sockaddr_in addr;
|
||||
bool used = false;
|
||||
|
||||
if (virBitmapGetBit(driver->reservedVNCPorts,
|
||||
i - LIBXL_VNC_PORT_MIN, &used) < 0)
|
||||
VIR_DEBUG("virBitmapGetBit failed on bit %d", i - LIBXL_VNC_PORT_MIN);
|
||||
|
||||
if (used)
|
||||
continue;
|
||||
|
||||
addr.sin_family = AF_INET;
|
||||
addr.sin_port = htons(i);
|
||||
addr.sin_addr.s_addr = htonl(INADDR_ANY);
|
||||
fd = socket(PF_INET, SOCK_STREAM, 0);
|
||||
if (fd < 0)
|
||||
return -1;
|
||||
|
||||
if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (void*)&reuse, sizeof(reuse)) < 0) {
|
||||
VIR_FORCE_CLOSE(fd);
|
||||
break;
|
||||
}
|
||||
|
||||
if (bind(fd, (struct sockaddr*)&addr, sizeof(addr)) == 0) {
|
||||
/* Not in use, lets grab it */
|
||||
VIR_FORCE_CLOSE(fd);
|
||||
/* Add port to bitmap of reserved ports */
|
||||
if (virBitmapSetBit(driver->reservedVNCPorts,
|
||||
i - LIBXL_VNC_PORT_MIN) < 0) {
|
||||
VIR_DEBUG("virBitmapSetBit failed on bit %d",
|
||||
i - LIBXL_VNC_PORT_MIN);
|
||||
}
|
||||
return i;
|
||||
}
|
||||
VIR_FORCE_CLOSE(fd);
|
||||
|
||||
if (errno == EADDRINUSE) {
|
||||
/* In use, try next */
|
||||
continue;
|
||||
}
|
||||
/* Some other bad failure, get out.. */
|
||||
break;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
static int libxlDefaultConsoleType(const char *ostype,
|
||||
virArch arch ATTRIBUTE_UNUSED)
|
||||
{
|
||||
@ -712,7 +658,7 @@ libxlMakeVfb(libxlDriverPrivatePtr driver,
|
||||
virDomainGraphicsDefPtr l_vfb,
|
||||
libxl_device_vfb *x_vfb)
|
||||
{
|
||||
int port;
|
||||
unsigned short port;
|
||||
const char *listenAddr;
|
||||
|
||||
switch (l_vfb->type) {
|
||||
@ -735,8 +681,10 @@ libxlMakeVfb(libxlDriverPrivatePtr driver,
|
||||
/* driver handles selection of free port */
|
||||
libxl_defbool_set(&x_vfb->vnc.findunused, 0);
|
||||
if (l_vfb->data.vnc.autoport) {
|
||||
port = libxlNextFreeVncPort(driver, LIBXL_VNC_PORT_MIN);
|
||||
if (port < 0) {
|
||||
|
||||
if (virPortAllocatorAcquire(driver->reservedVNCPorts, &port) < 0)
|
||||
return -1;
|
||||
if (port == 0) {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("Unable to find an unused VNC port"));
|
||||
return -1;
|
||||
|
@ -34,7 +34,7 @@
|
||||
# include "domain_event.h"
|
||||
# include "capabilities.h"
|
||||
# include "configmake.h"
|
||||
# include "virbitmap.h"
|
||||
# include "virportallocator.h"
|
||||
|
||||
|
||||
# define LIBXL_VNC_PORT_MIN 5900
|
||||
@ -60,7 +60,7 @@ struct _libxlDriverPrivate {
|
||||
/* libxl ctx for driver wide ops; getVersion, getNodeInfo, ... */
|
||||
libxl_ctx *ctx;
|
||||
|
||||
virBitmapPtr reservedVNCPorts;
|
||||
virPortAllocatorPtr reservedVNCPorts;
|
||||
|
||||
size_t nactive;
|
||||
virStateInhibitCallback inhibitCallback;
|
||||
|
@ -466,8 +466,8 @@ libxlVmCleanup(libxlDriverPrivatePtr driver,
|
||||
vm->def->graphics[0]->data.vnc.autoport) {
|
||||
vnc_port = vm->def->graphics[0]->data.vnc.port;
|
||||
if (vnc_port >= LIBXL_VNC_PORT_MIN) {
|
||||
if (virBitmapClearBit(driver->reservedVNCPorts,
|
||||
vnc_port - LIBXL_VNC_PORT_MIN) < 0)
|
||||
if (virPortAllocatorRelease(driver->reservedVNCPorts,
|
||||
vnc_port) < 0)
|
||||
VIR_DEBUG("Could not mark port %d as unused", vnc_port);
|
||||
}
|
||||
}
|
||||
@ -923,7 +923,7 @@ libxlShutdown(void)
|
||||
if (libxl_driver->logger_file)
|
||||
VIR_FORCE_FCLOSE(libxl_driver->logger_file);
|
||||
|
||||
virBitmapFree(libxl_driver->reservedVNCPorts);
|
||||
virObjectUnref(libxl_driver->reservedVNCPorts);
|
||||
|
||||
VIR_FREE(libxl_driver->configDir);
|
||||
VIR_FREE(libxl_driver->autostartDir);
|
||||
@ -979,9 +979,10 @@ libxlStartup(bool privileged,
|
||||
libxlDriverLock(libxl_driver);
|
||||
|
||||
/* Allocate bitmap for vnc port reservation */
|
||||
if ((libxl_driver->reservedVNCPorts =
|
||||
virBitmapNew(LIBXL_VNC_PORT_MAX - LIBXL_VNC_PORT_MIN)) == NULL)
|
||||
goto out_of_memory;
|
||||
if (!(libxl_driver->reservedVNCPorts =
|
||||
virPortAllocatorNew(LIBXL_VNC_PORT_MIN,
|
||||
LIBXL_VNC_PORT_MAX)))
|
||||
goto error;
|
||||
|
||||
if (virDomainObjListInit(&libxl_driver->domains) < 0)
|
||||
goto out_of_memory;
|
||||
|
Loading…
Reference in New Issue
Block a user