1*2d1d0e70SDaniel P. Berrange /* 2*2d1d0e70SDaniel P. Berrange * QEMU I/O channels driver websockets 3*2d1d0e70SDaniel P. Berrange * 4*2d1d0e70SDaniel P. Berrange * Copyright (c) 2015 Red Hat, Inc. 5*2d1d0e70SDaniel P. Berrange * 6*2d1d0e70SDaniel P. Berrange * This library is free software; you can redistribute it and/or 7*2d1d0e70SDaniel P. Berrange * modify it under the terms of the GNU Lesser General Public 8*2d1d0e70SDaniel P. Berrange * License as published by the Free Software Foundation; either 9*2d1d0e70SDaniel P. Berrange * version 2 of the License, or (at your option) any later version. 10*2d1d0e70SDaniel P. Berrange * 11*2d1d0e70SDaniel P. Berrange * This library is distributed in the hope that it will be useful, 12*2d1d0e70SDaniel P. Berrange * but WITHOUT ANY WARRANTY; without even the implied warranty of 13*2d1d0e70SDaniel P. Berrange * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14*2d1d0e70SDaniel P. Berrange * Lesser General Public License for more details. 15*2d1d0e70SDaniel P. Berrange * 16*2d1d0e70SDaniel P. Berrange * You should have received a copy of the GNU Lesser General Public 17*2d1d0e70SDaniel P. Berrange * License along with this library; if not, see <http://www.gnu.org/licenses/>. 18*2d1d0e70SDaniel P. Berrange * 19*2d1d0e70SDaniel P. Berrange */ 20*2d1d0e70SDaniel P. Berrange 21*2d1d0e70SDaniel P. Berrange #ifndef QIO_CHANNEL_WEBSOCK_H__ 22*2d1d0e70SDaniel P. Berrange #define QIO_CHANNEL_WEBSOCK_H__ 23*2d1d0e70SDaniel P. Berrange 24*2d1d0e70SDaniel P. Berrange #include "io/channel.h" 25*2d1d0e70SDaniel P. Berrange #include "qemu/buffer.h" 26*2d1d0e70SDaniel P. Berrange #include "io/task.h" 27*2d1d0e70SDaniel P. Berrange 28*2d1d0e70SDaniel P. Berrange #define TYPE_QIO_CHANNEL_WEBSOCK "qio-channel-websock" 29*2d1d0e70SDaniel P. Berrange #define QIO_CHANNEL_WEBSOCK(obj) \ 30*2d1d0e70SDaniel P. Berrange OBJECT_CHECK(QIOChannelWebsock, (obj), TYPE_QIO_CHANNEL_WEBSOCK) 31*2d1d0e70SDaniel P. Berrange 32*2d1d0e70SDaniel P. Berrange typedef struct QIOChannelWebsock QIOChannelWebsock; 33*2d1d0e70SDaniel P. Berrange typedef union QIOChannelWebsockMask QIOChannelWebsockMask; 34*2d1d0e70SDaniel P. Berrange 35*2d1d0e70SDaniel P. Berrange union QIOChannelWebsockMask { 36*2d1d0e70SDaniel P. Berrange char c[4]; 37*2d1d0e70SDaniel P. Berrange uint32_t u; 38*2d1d0e70SDaniel P. Berrange }; 39*2d1d0e70SDaniel P. Berrange 40*2d1d0e70SDaniel P. Berrange /** 41*2d1d0e70SDaniel P. Berrange * QIOChannelWebsock 42*2d1d0e70SDaniel P. Berrange * 43*2d1d0e70SDaniel P. Berrange * The QIOChannelWebsock class provides a channel wrapper which 44*2d1d0e70SDaniel P. Berrange * can transparently run the HTTP websockets protocol. This is 45*2d1d0e70SDaniel P. Berrange * usually used over a TCP socket, but there is actually no 46*2d1d0e70SDaniel P. Berrange * technical restriction on which type of master channel is 47*2d1d0e70SDaniel P. Berrange * used as the transport. 48*2d1d0e70SDaniel P. Berrange * 49*2d1d0e70SDaniel P. Berrange * This channel object is currently only capable of running as 50*2d1d0e70SDaniel P. Berrange * a websocket server and is a pretty crude implementation 51*2d1d0e70SDaniel P. Berrange * of it, not supporting the full websockets protocol feature 52*2d1d0e70SDaniel P. Berrange * set. It is sufficient to use with a simple websockets 53*2d1d0e70SDaniel P. Berrange * client for encapsulating VNC for noVNC in-browser client. 54*2d1d0e70SDaniel P. Berrange */ 55*2d1d0e70SDaniel P. Berrange 56*2d1d0e70SDaniel P. Berrange struct QIOChannelWebsock { 57*2d1d0e70SDaniel P. Berrange QIOChannel parent; 58*2d1d0e70SDaniel P. Berrange QIOChannel *master; 59*2d1d0e70SDaniel P. Berrange Buffer encinput; 60*2d1d0e70SDaniel P. Berrange Buffer encoutput; 61*2d1d0e70SDaniel P. Berrange Buffer rawinput; 62*2d1d0e70SDaniel P. Berrange Buffer rawoutput; 63*2d1d0e70SDaniel P. Berrange size_t payload_remain; 64*2d1d0e70SDaniel P. Berrange QIOChannelWebsockMask mask; 65*2d1d0e70SDaniel P. Berrange guint io_tag; 66*2d1d0e70SDaniel P. Berrange Error *io_err; 67*2d1d0e70SDaniel P. Berrange gboolean io_eof; 68*2d1d0e70SDaniel P. Berrange }; 69*2d1d0e70SDaniel P. Berrange 70*2d1d0e70SDaniel P. Berrange /** 71*2d1d0e70SDaniel P. Berrange * qio_channel_websock_new_server: 72*2d1d0e70SDaniel P. Berrange * @master: the underlying channel object 73*2d1d0e70SDaniel P. Berrange * 74*2d1d0e70SDaniel P. Berrange * Create a new websockets channel that runs the server 75*2d1d0e70SDaniel P. Berrange * side of the protocol. 76*2d1d0e70SDaniel P. Berrange * 77*2d1d0e70SDaniel P. Berrange * After creating the channel, it is mandatory to call 78*2d1d0e70SDaniel P. Berrange * the qio_channel_websock_handshake() method before attempting 79*2d1d0e70SDaniel P. Berrange * todo any I/O on the channel. 80*2d1d0e70SDaniel P. Berrange * 81*2d1d0e70SDaniel P. Berrange * Once the handshake has completed, all I/O should be done 82*2d1d0e70SDaniel P. Berrange * via the new websocket channel object and not the original 83*2d1d0e70SDaniel P. Berrange * master channel 84*2d1d0e70SDaniel P. Berrange * 85*2d1d0e70SDaniel P. Berrange * Returns: the new websockets channel object 86*2d1d0e70SDaniel P. Berrange */ 87*2d1d0e70SDaniel P. Berrange QIOChannelWebsock * 88*2d1d0e70SDaniel P. Berrange qio_channel_websock_new_server(QIOChannel *master); 89*2d1d0e70SDaniel P. Berrange 90*2d1d0e70SDaniel P. Berrange /** 91*2d1d0e70SDaniel P. Berrange * qio_channel_websock_handshake: 92*2d1d0e70SDaniel P. Berrange * @ioc: the websocket channel object 93*2d1d0e70SDaniel P. Berrange * @func: the callback to invoke when completed 94*2d1d0e70SDaniel P. Berrange * @opaque: opaque data to pass to @func 95*2d1d0e70SDaniel P. Berrange * @destroy: optional callback to free @opaque 96*2d1d0e70SDaniel P. Berrange * 97*2d1d0e70SDaniel P. Berrange * Perform the websocket handshake. This method 98*2d1d0e70SDaniel P. Berrange * will return immediately and the handshake will 99*2d1d0e70SDaniel P. Berrange * continue in the background, provided the main 100*2d1d0e70SDaniel P. Berrange * loop is running. When the handshake is complete, 101*2d1d0e70SDaniel P. Berrange * or fails, the @func callback will be invoked. 102*2d1d0e70SDaniel P. Berrange */ 103*2d1d0e70SDaniel P. Berrange void qio_channel_websock_handshake(QIOChannelWebsock *ioc, 104*2d1d0e70SDaniel P. Berrange QIOTaskFunc func, 105*2d1d0e70SDaniel P. Berrange gpointer opaque, 106*2d1d0e70SDaniel P. Berrange GDestroyNotify destroy); 107*2d1d0e70SDaniel P. Berrange 108*2d1d0e70SDaniel P. Berrange #endif /* QIO_CHANNEL_WEBSOCK_H__ */ 109