[Spice-devel] [PATCH spice-server] reds: Send link replies with less chunks
Frediano Ziglio
fziglio at redhat.com
Mon Mar 6 16:36:16 UTC 2017
>
> On Mon, Mar 06, 2017 at 04:12:33PM +0000, Frediano Ziglio wrote:
> > Send header and reply together
>
> The log is missing a "Why?"
>
Potentially to safe up to 160 bytes!
> >
> > Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> > ---
> > server/reds.c | 56
> > +++++++++++++++++++++++++++++---------------------------
> > 1 file changed, 29 insertions(+), 27 deletions(-)
> >
> > diff --git a/server/reds.c b/server/reds.c
> > index fc720a3..e94d0c4 100644
> > --- a/server/reds.c
> > +++ b/server/reds.c
> > @@ -1459,8 +1459,10 @@ static bool red_link_info_test_capability(const
> > RedLinkInfo *link, uint32_t cap)
> >
> > static int reds_send_link_ack(RedsState *reds, RedLinkInfo *link)
> > {
> > - SpiceLinkHeader header;
> > - SpiceLinkReply ack;
> > + struct {
> > + SpiceLinkHeader header;
> > + SpiceLinkReply ack;
> > + } msg;
>
> I guess the compiler could decide to insert some padding between the 2
> structs? If this happens, is this going to break the client/server
> communication?
>
> Christophe
>
I can copy the same paranoid check:
SPICE_VERIFY(sizeof(msg) == sizeof(SpiceLinkHeader) + sizeof(SpiceLinkReply));
Note that these structures are packed ones so compiler would
break its ABI.
>
> > RedChannel *channel;
> > const RedChannelCapabilities *channel_caps;
> > BUF_MEM *bmBuf;
> > @@ -1468,12 +1470,12 @@ static int reds_send_link_ack(RedsState *reds,
> > RedLinkInfo *link)
> > int ret = FALSE;
> > size_t hdr_size;
> >
> > - header.magic = SPICE_MAGIC;
> > - hdr_size = sizeof(ack);
> > - header.major_version = GUINT32_TO_LE(SPICE_VERSION_MAJOR);
> > - header.minor_version = GUINT32_TO_LE(SPICE_VERSION_MINOR);
> > + msg.header.magic = SPICE_MAGIC;
> > + hdr_size = sizeof(msg.ack);
> > + msg.header.major_version = GUINT32_TO_LE(SPICE_VERSION_MAJOR);
> > + msg.header.minor_version = GUINT32_TO_LE(SPICE_VERSION_MINOR);
> >
> > - ack.error = GUINT32_TO_LE(SPICE_LINK_ERR_OK);
> > + msg.ack.error = GUINT32_TO_LE(SPICE_LINK_ERR_OK);
> >
> > channel = reds_find_channel(reds, link->link_mess->channel_type,
> > link->link_mess->channel_id);
> > @@ -1489,12 +1491,12 @@ static int reds_send_link_ack(RedsState *reds,
> > RedLinkInfo *link)
> > reds_channel_init_auth_caps(link, channel); /* make sure common caps
> > are set */
> >
> > channel_caps = red_channel_get_local_capabilities(channel);
> > - ack.num_common_caps = GUINT32_TO_LE(channel_caps->num_common_caps);
> > - ack.num_channel_caps = GUINT32_TO_LE(channel_caps->num_caps);
> > + msg.ack.num_common_caps =
> > GUINT32_TO_LE(channel_caps->num_common_caps);
> > + msg.ack.num_channel_caps = GUINT32_TO_LE(channel_caps->num_caps);
> > hdr_size += channel_caps->num_common_caps * sizeof(uint32_t);
> > hdr_size += channel_caps->num_caps * sizeof(uint32_t);
> > - header.size = GUINT32_TO_LE(hdr_size);
> > - ack.caps_offset = GUINT32_TO_LE(sizeof(SpiceLinkReply));
> > + msg.header.size = GUINT32_TO_LE(hdr_size);
> > + msg.ack.caps_offset = GUINT32_TO_LE(sizeof(SpiceLinkReply));
> > if (!reds->config->sasl_enabled
> > || !red_link_info_test_capability(link,
> > || SPICE_COMMON_CAP_AUTH_SASL)) {
> > if (!(link->tiTicketing.rsa = RSA_new())) {
> > @@ -1520,7 +1522,7 @@ static int reds_send_link_ack(RedsState *reds,
> > RedLinkInfo *link)
> >
> > i2d_RSA_PUBKEY_bio(bio, link->tiTicketing.rsa);
> > BIO_get_mem_ptr(bio, &bmBuf);
> > - memcpy(ack.pub_key, bmBuf->data, sizeof(ack.pub_key));
> > + memcpy(msg.ack.pub_key, bmBuf->data, sizeof(msg.ack.pub_key));
> > } else {
> > /* if the client sets the AUTH_SASL cap, it indicates that it
> > * supports SASL, and will use it if the server supports SASL as
> > @@ -1532,12 +1534,10 @@ static int reds_send_link_ack(RedsState *reds,
> > RedLinkInfo *link)
> > * will fail.
> > */
> > spice_warning("not initialising RSA key");
> > - memset(ack.pub_key, '\0', sizeof(ack.pub_key));
> > + memset(msg.ack.pub_key, '\0', sizeof(msg.ack.pub_key));
> > }
> >
> > - if (!reds_stream_write_all(link->stream, &header, sizeof(header)))
> > - goto end;
> > - if (!reds_stream_write_all(link->stream, &ack, sizeof(ack)))
> > + if (!reds_stream_write_all(link->stream, &msg, sizeof(msg)))
> > goto end;
> > for (unsigned int i = 0; i < channel_caps->num_common_caps; i++) {
> > guint32 cap = GUINT32_TO_LE(channel_caps->common_caps[i]);
> > @@ -1560,17 +1560,19 @@ end:
> >
> > static bool reds_send_link_error(RedLinkInfo *link, uint32_t error)
> > {
> > - SpiceLinkHeader header;
> > - SpiceLinkReply reply;
> > -
> > - header.magic = SPICE_MAGIC;
> > - header.size = GUINT32_TO_LE(sizeof(reply));
> > - header.major_version = GUINT32_TO_LE(SPICE_VERSION_MAJOR);
> > - header.minor_version = GUINT32_TO_LE(SPICE_VERSION_MINOR);
> > - memset(&reply, 0, sizeof(reply));
> > - reply.error = GUINT32_TO_LE(error);
> > - return reds_stream_write_all(link->stream, &header, sizeof(header)) &&
> > reds_stream_write_all(link->stream, &reply,
> > -
> > sizeof(reply));
> > + struct {
> > + SpiceLinkHeader header;
> > + SpiceLinkReply reply;
> > + } msg;
> > + SPICE_VERIFY(sizeof(msg) == sizeof(SpiceLinkHeader) +
> > sizeof(SpiceLinkReply));
> > +
> > + msg.header.magic = SPICE_MAGIC;
> > + msg.header.size = GUINT32_TO_LE(sizeof(msg.reply));
> > + msg.header.major_version = GUINT32_TO_LE(SPICE_VERSION_MAJOR);
> > + msg.header.minor_version = GUINT32_TO_LE(SPICE_VERSION_MINOR);
> > + memset(&msg.reply, 0, sizeof(msg.reply));
> > + msg.reply.error = GUINT32_TO_LE(error);
> > + return reds_stream_write_all(link->stream, &msg, sizeof(msg));
> > }
> >
> > static void reds_info_new_channel(RedLinkInfo *link, int connection_id)
Frediano
More information about the Spice-devel
mailing list