io: simplify websocket ping reply handling
commit57b0cdf152b7266e68bfa3e84635d4bdb64ef2cd
authorDaniel P. Berrange <berrange@redhat.com>
Mon, 9 Oct 2017 14:34:06 +0000 (9 15:34 +0100)
committerDaniel P. Berrange <berrange@redhat.com>
Mon, 16 Oct 2017 15:57:08 +0000 (16 16:57 +0100)
treea8159682a8e0665cfa813eb2d176724727cc49af
parenta7b20a8efa28e5f22c26c06cd06c2f12bc863493
io: simplify websocket ping reply handling

We must ensure we don't get flooded with ping replies if the outbound
channel is slow. Currently we do this by keeping the ping reply in a
separate temporary buffer and only writing it if the encoutput buffer
is completely empty. This is overly pessimistic, as it is reasonable
to add a ping reply to the encoutput buffer even if it has previous
data in it, as long as that previous data doesn't include a ping
reply.

To track this better, put the ping reply directly into the encoutput
buffer, and then record the size of encoutput at this time in
pong_remain. As we write encoutput to the underlying channel, we
can decrement the pong_remain counter. Once it hits zero, we can
accept further ping replies for transmission.

Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
include/io/channel-websock.h
io/channel-websock.c