Chunyan Liu wrote:
2012/3/15 Jim Fehlig <jfehlig(a)suse.com <mailto:jfehlig@suse.com>>
> + /* Create socket connection to receive migration data */
> + if (!uri_in) {
> + hostname = virGetHostname(dconn);
> + if (hostname == NULL)
> + goto cleanup;
> +
> + port = libxlFindFreeMigPort(driver,
LIBXL_MIGRATION_MIN_PORT);
>
I think you should reserve the port in libxlFindFreeMigPort(), similar
to libxlNextFreeVncPort(). In fact, you could probably generalize
libxlNextFreeVncPort(), e.g. libxlNextFreePort(virBitmapPtr
bitmap, int
start_port, int stop_port) and use it to find available VNC and
migration ports.
There is some difference to handle Migration ports and VNC ports:
VNC port always find a free port from VNC ports range and use it, but
migration port could be pointed by user or if not pointed find a free
port to use it. There are two places need to set bitmap maybe:
1. The port pointed by user could be a port in default migration ports
range, we should set bitmap so that next time finding free port could
avoid that port.
If the user is specifying the port, we should just use it and be done.
That is how the VNC port is handled too. If user has specified a vnc
port, then we just use it. Otherwise, call libxlNextFreeVncPort to find
a free one.
2. No port pointed by user, then find a free migration port from
default migration ports range, and set bitmap.
Besides, with port pointed, we need to create socket and bind to the
port too. libxlFindFreeVNCPort creates socket and binds port and set
bitmap in the function, if FindFreeMigPort also does that, then to
user pointed port, we need to do same work again.
libxlFindFreeVNCPort only binds to the port to see if it is in use. If
not in use, it closes the socket, sets the corresponding bit in the
bitmap, and returns the port. Caller then knows the port is free and
available for use, e.g. binding, listening, connecting, or whatever it
pleases to do with the port.
IMO, we could have
static int libxlNextFreePort(virtBitmapPtr bitmap, int startPort, int
numPorts)
which is functionally equivalent to libxlNextFreeVncPort(), but examines
startPort through startPort+numPorts.
Thanks,
Jim