12d1d0e70SDaniel P. Berrange /* 22d1d0e70SDaniel P. Berrange * QEMU I/O channels driver websockets 32d1d0e70SDaniel P. Berrange * 42d1d0e70SDaniel P. Berrange * Copyright (c) 2015 Red Hat, Inc. 52d1d0e70SDaniel P. Berrange * 62d1d0e70SDaniel P. Berrange * This library is free software; you can redistribute it and/or 72d1d0e70SDaniel P. Berrange * modify it under the terms of the GNU Lesser General Public 82d1d0e70SDaniel P. Berrange * License as published by the Free Software Foundation; either 92d1d0e70SDaniel P. Berrange * version 2 of the License, or (at your option) any later version. 102d1d0e70SDaniel P. Berrange * 112d1d0e70SDaniel P. Berrange * This library is distributed in the hope that it will be useful, 122d1d0e70SDaniel P. Berrange * but WITHOUT ANY WARRANTY; without even the implied warranty of 132d1d0e70SDaniel P. Berrange * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 142d1d0e70SDaniel P. Berrange * Lesser General Public License for more details. 152d1d0e70SDaniel P. Berrange * 162d1d0e70SDaniel P. Berrange * You should have received a copy of the GNU Lesser General Public 172d1d0e70SDaniel P. Berrange * License along with this library; if not, see <http://www.gnu.org/licenses/>. 182d1d0e70SDaniel P. Berrange * 192d1d0e70SDaniel P. Berrange */ 202d1d0e70SDaniel P. Berrange 212a6a4076SMarkus Armbruster #ifndef QIO_CHANNEL_WEBSOCK_H 222a6a4076SMarkus Armbruster #define QIO_CHANNEL_WEBSOCK_H 232d1d0e70SDaniel P. Berrange 242d1d0e70SDaniel P. Berrange #include "io/channel.h" 252d1d0e70SDaniel P. Berrange #include "qemu/buffer.h" 262d1d0e70SDaniel P. Berrange #include "io/task.h" 272d1d0e70SDaniel P. Berrange 282d1d0e70SDaniel P. Berrange #define TYPE_QIO_CHANNEL_WEBSOCK "qio-channel-websock" 292d1d0e70SDaniel P. Berrange #define QIO_CHANNEL_WEBSOCK(obj) \ 302d1d0e70SDaniel P. Berrange OBJECT_CHECK(QIOChannelWebsock, (obj), TYPE_QIO_CHANNEL_WEBSOCK) 312d1d0e70SDaniel P. Berrange 322d1d0e70SDaniel P. Berrange typedef struct QIOChannelWebsock QIOChannelWebsock; 332d1d0e70SDaniel P. Berrange typedef union QIOChannelWebsockMask QIOChannelWebsockMask; 342d1d0e70SDaniel P. Berrange 352d1d0e70SDaniel P. Berrange union QIOChannelWebsockMask { 362d1d0e70SDaniel P. Berrange char c[4]; 372d1d0e70SDaniel P. Berrange uint32_t u; 382d1d0e70SDaniel P. Berrange }; 392d1d0e70SDaniel P. Berrange 402d1d0e70SDaniel P. Berrange /** 412d1d0e70SDaniel P. Berrange * QIOChannelWebsock 422d1d0e70SDaniel P. Berrange * 432d1d0e70SDaniel P. Berrange * The QIOChannelWebsock class provides a channel wrapper which 442d1d0e70SDaniel P. Berrange * can transparently run the HTTP websockets protocol. This is 452d1d0e70SDaniel P. Berrange * usually used over a TCP socket, but there is actually no 462d1d0e70SDaniel P. Berrange * technical restriction on which type of master channel is 472d1d0e70SDaniel P. Berrange * used as the transport. 482d1d0e70SDaniel P. Berrange * 492d1d0e70SDaniel P. Berrange * This channel object is currently only capable of running as 502d1d0e70SDaniel P. Berrange * a websocket server and is a pretty crude implementation 512d1d0e70SDaniel P. Berrange * of it, not supporting the full websockets protocol feature 522d1d0e70SDaniel P. Berrange * set. It is sufficient to use with a simple websockets 532d1d0e70SDaniel P. Berrange * client for encapsulating VNC for noVNC in-browser client. 542d1d0e70SDaniel P. Berrange */ 552d1d0e70SDaniel P. Berrange 562d1d0e70SDaniel P. Berrange struct QIOChannelWebsock { 572d1d0e70SDaniel P. Berrange QIOChannel parent; 582d1d0e70SDaniel P. Berrange QIOChannel *master; 592d1d0e70SDaniel P. Berrange Buffer encinput; 602d1d0e70SDaniel P. Berrange Buffer encoutput; 612d1d0e70SDaniel P. Berrange Buffer rawinput; 622d1d0e70SDaniel P. Berrange Buffer rawoutput; 632d1d0e70SDaniel P. Berrange size_t payload_remain; 642d1d0e70SDaniel P. Berrange QIOChannelWebsockMask mask; 652d1d0e70SDaniel P. Berrange guint io_tag; 662d1d0e70SDaniel P. Berrange Error *io_err; 672d1d0e70SDaniel P. Berrange gboolean io_eof; 68*ff1300e6SBrandon Carpenter uint8_t opcode; 692d1d0e70SDaniel P. Berrange }; 702d1d0e70SDaniel P. Berrange 712d1d0e70SDaniel P. Berrange /** 722d1d0e70SDaniel P. Berrange * qio_channel_websock_new_server: 732d1d0e70SDaniel P. Berrange * @master: the underlying channel object 742d1d0e70SDaniel P. Berrange * 752d1d0e70SDaniel P. Berrange * Create a new websockets channel that runs the server 762d1d0e70SDaniel P. Berrange * side of the protocol. 772d1d0e70SDaniel P. Berrange * 782d1d0e70SDaniel P. Berrange * After creating the channel, it is mandatory to call 792d1d0e70SDaniel P. Berrange * the qio_channel_websock_handshake() method before attempting 802d1d0e70SDaniel P. Berrange * todo any I/O on the channel. 812d1d0e70SDaniel P. Berrange * 822d1d0e70SDaniel P. Berrange * Once the handshake has completed, all I/O should be done 832d1d0e70SDaniel P. Berrange * via the new websocket channel object and not the original 842d1d0e70SDaniel P. Berrange * master channel 852d1d0e70SDaniel P. Berrange * 862d1d0e70SDaniel P. Berrange * Returns: the new websockets channel object 872d1d0e70SDaniel P. Berrange */ 882d1d0e70SDaniel P. Berrange QIOChannelWebsock * 892d1d0e70SDaniel P. Berrange qio_channel_websock_new_server(QIOChannel *master); 902d1d0e70SDaniel P. Berrange 912d1d0e70SDaniel P. Berrange /** 922d1d0e70SDaniel P. Berrange * qio_channel_websock_handshake: 932d1d0e70SDaniel P. Berrange * @ioc: the websocket channel object 942d1d0e70SDaniel P. Berrange * @func: the callback to invoke when completed 952d1d0e70SDaniel P. Berrange * @opaque: opaque data to pass to @func 962d1d0e70SDaniel P. Berrange * @destroy: optional callback to free @opaque 972d1d0e70SDaniel P. Berrange * 982d1d0e70SDaniel P. Berrange * Perform the websocket handshake. This method 992d1d0e70SDaniel P. Berrange * will return immediately and the handshake will 1002d1d0e70SDaniel P. Berrange * continue in the background, provided the main 1012d1d0e70SDaniel P. Berrange * loop is running. When the handshake is complete, 1022d1d0e70SDaniel P. Berrange * or fails, the @func callback will be invoked. 1032d1d0e70SDaniel P. Berrange */ 1042d1d0e70SDaniel P. Berrange void qio_channel_websock_handshake(QIOChannelWebsock *ioc, 1052d1d0e70SDaniel P. Berrange QIOTaskFunc func, 1062d1d0e70SDaniel P. Berrange gpointer opaque, 1072d1d0e70SDaniel P. Berrange GDestroyNotify destroy); 1082d1d0e70SDaniel P. Berrange 1092a6a4076SMarkus Armbruster #endif /* QIO_CHANNEL_WEBSOCK_H */ 110