[Libguestfs] [PATCH nbdkit v2] protocol: Implement NBD_OPT_GO.
Eric Blake
eblake at redhat.com
Mon Aug 6 14:02:14 UTC 2018
On 08/06/2018 07:03 AM, Richard W.M. Jones wrote:
> Actually I was wrong, there *is* one substantive change over v1, which
> is this:
>
>> + /* The client is buggy. The last option must be NBD_OPT_GO or
>> + * NBD_OPT_EXPORT_NAME.
>> + */
>> + else {
>> + nbdkit_error ("client options list didn't finish with NBD_OPT_GO "
>> + "or NBD_OPT_EXPORT_NAME");
>> + return -1;
>> + }
As I pointed out in the other mail, this else clause is unreachable.
>> +
>> return 0;
>
> Current behaviour in nbdkit is that if the last requested option is a
> recognized option, but is not NBD_OPT_EXPORT_NAME then nbdkit will
> send the handshake_finish struct and continue to transport mode.
In the current code, there is no such thing as a last option except for
EXPORT_NAME - you are in a for loop that is only broken when you exceed
too many options (in which case you kill the connection) or when you
encountered EXPORT_NAME.
>
> However I don't think nbdkit is currently behaving correctly.
>
> In any case the proposed behaviour (above) is that in this case we
> will close the connection abruptly and record an error in the log.
> (There's no way to return an error back to the client when we get into
> this situation.)
And how can we get in that situation in the first place?
>
> I am not certain if this is correct or not, but I believe it is: the
> NBD protocol says the only way to exit option mode and enter
> transmission mode is:
>
> "Transmission mode can be entered (by the client sending
> NBD_OPT_EXPORT_NAME or by the server responding to an NBD_OPT_GO
> with NBD_REP_ACK)."
>
> (The other two ways mentioned in that section are about terminating
> the connection completely).
>
You are correct that if EXPORT_NAME fails, or that if you don't think
the client is reaching a successful GO fast enough, then your only
recourse is to hang up on the client (preferably after sending a
last-ditch error message to the client explaining why, when that is
still permitted).
> This also implies that the number of options must never be zero, which
> the spec does say in passing:
>
> "At this point, we move on to option haggling, during which point
> the client can send one or (in fixed newstyle) more options to the
> ~~~
> server."
>
> The current nbdkit code assumes this, so we're OK there.
Indeed - if the client hangs up without having ever sent GO or
EXPORT_NAME, then they gave up on negotiation first, and we have nothing
further to say to them.
--
Eric Blake, Principal Software Engineer
Red Hat, Inc. +1-919-301-3266
Virtualization: qemu.org | libvirt.org
More information about the Libguestfs
mailing list