[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 13/18] nbd: Support shorter handshake
From: |
Alex Bligh |
Subject: |
Re: [Qemu-devel] [PATCH 13/18] nbd: Support shorter handshake |
Date: |
Sat, 9 Apr 2016 11:42:21 +0100 |
On 8 Apr 2016, at 23:05, Eric Blake <address@hidden> wrote:
> The NBD Protocol allows the server and client to mutually agree
> on a shorter handshake (omit the 124 bytes of reserved 0), via
> the server advertising NBD_FLAG_NO_ZEROES and the client
> acknowledging with NBD_FLAG_C_NO_ZEROES (only possible in
> newstyle, whether or not it is fixed newstyle). It doesn't
> shave much off the wire, but we might as well implement it.
>
> Signed-off-by: Eric Blake <address@hidden>
Reviewed-by: Alex Bligh <address@hidden>
thanks - that was annoying me.
> ---
> include/block/nbd.h | 6 ++++--
> nbd/client.c | 8 +++++++-
> nbd/server.c | 15 +++++++++++----
> 3 files changed, 22 insertions(+), 7 deletions(-)
>
> diff --git a/include/block/nbd.h b/include/block/nbd.h
> index 155196e..35c0ea3 100644
> --- a/include/block/nbd.h
> +++ b/include/block/nbd.h
> @@ -73,11 +73,13 @@ typedef struct nbd_reply nbd_reply;
>
> /* New-style handshake (global) flags, sent from server to client, and
> control what will happen during handshake phase. */
> -#define NBD_FLAG_FIXED_NEWSTYLE (1 << 0) /* Fixed newstyle protocol.
> */
> +#define NBD_FLAG_FIXED_NEWSTYLE (1 << 0) /* Fixed newstyle protocol. */
> +#define NBD_FLAG_NO_ZEROES (1 << 1) /* End handshake without zeroes.
> */
>
> /* New-style client flags, sent from client to server to control what happens
> during handshake phase. */
> -#define NBD_FLAG_C_FIXED_NEWSTYLE (1 << 0) /* Fixed newstyle protocol.
> */
> +#define NBD_FLAG_C_FIXED_NEWSTYLE (1 << 0) /* Fixed newstyle protocol. */
> +#define NBD_FLAG_C_NO_ZEROES (1 << 1) /* End handshake without zeroes.
> */
>
> /* Reply types. */
> #define NBD_REP_ACK (1) /* Data sending finished. */
> diff --git a/nbd/client.c b/nbd/client.c
> index d4e37d5..507ddc1 100644
> --- a/nbd/client.c
> +++ b/nbd/client.c
> @@ -409,6 +409,7 @@ int nbd_receive_negotiate(QIOChannel *ioc, const char
> *name, uint32_t *flags,
> char buf[256];
> uint64_t magic, s;
> int rc;
> + bool zeroes = true;
>
> TRACE("Receiving negotiation tlscreds=%p hostname=%s.",
> tlscreds, hostname ? hostname : "<null>");
> @@ -475,6 +476,11 @@ int nbd_receive_negotiate(QIOChannel *ioc, const char
> *name, uint32_t *flags,
> TRACE("Server supports fixed new style");
> clientflags |= NBD_FLAG_C_FIXED_NEWSTYLE;
> }
> + if (globalflags & NBD_FLAG_NO_ZEROES) {
> + zeroes = false;
> + TRACE("Server supports no zeroes");
> + clientflags |= NBD_FLAG_C_NO_ZEROES;
> + }
> /* client requested flags */
> clientflags = cpu_to_be32(clientflags);
> if (write_sync(ioc, &clientflags, sizeof(clientflags)) !=
> @@ -558,7 +564,7 @@ int nbd_receive_negotiate(QIOChannel *ioc, const char
> *name, uint32_t *flags,
> goto fail;
> }
>
> - if (drop_sync(ioc, 124) != 124) {
> + if (zeroes && drop_sync(ioc, 124) != 124) {
> error_setg(errp, "Failed to read reserved block");
> goto fail;
> }
> diff --git a/nbd/server.c b/nbd/server.c
> index 69724c9..379df8c 100644
> --- a/nbd/server.c
> +++ b/nbd/server.c
> @@ -78,6 +78,7 @@ struct NBDClient {
> int refcount;
> void (*close)(NBDClient *client);
>
> + bool no_zeroes;
> NBDExport *exp;
> QCryptoTLSCreds *tlscreds;
> char *tlsaclname;
> @@ -396,6 +397,11 @@ static int nbd_negotiate_options(NBDClient *client)
> fixedNewstyle = true;
> flags &= ~NBD_FLAG_C_FIXED_NEWSTYLE;
> }
> + if (flags & NBD_FLAG_C_NO_ZEROES) {
> + TRACE("Client supports no zeroes at handshake end");
> + client->no_zeroes = true;
> + flags &= ~NBD_FLAG_C_NO_ZEROES;
> + }
> if (flags != 0) {
> TRACE("Unknown client flags 0x%" PRIx32 " received", flags);
> return -EIO;
> @@ -527,6 +533,7 @@ static coroutine_fn int nbd_negotiate(NBDClientNewData
> *data)
> const uint16_t myflags = (NBD_FLAG_HAS_FLAGS | NBD_FLAG_SEND_TRIM |
> NBD_FLAG_SEND_FLUSH | NBD_FLAG_SEND_FUA);
> bool oldStyle;
> + size_t len;
>
> /* Old style negotiation header without options
> [ 0 .. 7] passwd ("NBDMAGIC")
> @@ -543,7 +550,7 @@ static coroutine_fn int nbd_negotiate(NBDClientNewData
> *data)
> ....options sent....
> [18 .. 25] size
> [26 .. 27] export flags
> - [28 .. 151] reserved (0)
> + [28 .. 151] reserved (0, omit if no_zeroes)
> */
>
> qio_channel_set_blocking(client->ioc, false, NULL);
> @@ -560,7 +567,7 @@ static coroutine_fn int nbd_negotiate(NBDClientNewData
> *data)
> stw_be_p(buf + 26, client->exp->nbdflags | myflags);
> } else {
> stq_be_p(buf + 8, NBD_OPTS_MAGIC);
> - stw_be_p(buf + 16, NBD_FLAG_FIXED_NEWSTYLE);
> + stw_be_p(buf + 16, NBD_FLAG_FIXED_NEWSTYLE | NBD_FLAG_NO_ZEROES);
> }
>
> if (oldStyle) {
> @@ -585,8 +592,8 @@ static coroutine_fn int nbd_negotiate(NBDClientNewData
> *data)
>
> stq_be_p(buf + 18, client->exp->size);
> stw_be_p(buf + 26, client->exp->nbdflags | myflags);
> - if (nbd_negotiate_write(client->ioc, buf + 18, sizeof(buf) - 18) !=
> - sizeof(buf) - 18) {
> + len = client->no_zeroes ? 10 : sizeof(buf) - 18;
> + if (nbd_negotiate_write(client->ioc, buf + 18, len) != len) {
> LOG("write failed");
> goto fail;
> }
> --
> 2.5.5
>
>
--
Alex Bligh
- [Qemu-devel] [PATCH 01/18] nbd: Don't kill server on client that doesn't request TLS, (continued)
- [Qemu-devel] [PATCH 01/18] nbd: Don't kill server on client that doesn't request TLS, Eric Blake, 2016/04/08
- [Qemu-devel] [PATCH 08/18] nbd: Limit nbdflags to 16 bits, Eric Blake, 2016/04/08
- [Qemu-devel] [PATCH 12/18] nbd: Less allocation during NBD_OPT_LIST, Eric Blake, 2016/04/08
- [Qemu-devel] [PATCH 15/18] nbd: Implement NBD_OPT_GO on server, Eric Blake, 2016/04/08
- [Qemu-devel] [PATCH 13/18] nbd: Support shorter handshake, Eric Blake, 2016/04/08
- Re: [Qemu-devel] [PATCH 13/18] nbd: Support shorter handshake,
Alex Bligh <=
- [Qemu-devel] [PATCH 07/18] nbd: Treat flags vs. command type as separate fields, Eric Blake, 2016/04/08
- [Qemu-devel] [RFC PATCH 17/18] nbd: Implement NBD_CMD_WRITE_ZEROES on server, Eric Blake, 2016/04/08
- [Qemu-devel] [PATCH 06/18] nbd: Avoid magic number for NBD max name size, Eric Blake, 2016/04/08
- [Qemu-devel] [RFC PATCH 18/18] nbd: Implement NBD_CMD_WRITE_ZEROES on client, Eric Blake, 2016/04/08