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 9*c8198bd5SChetan Pant * version 2.1 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" 27db1015e9SEduardo Habkost #include "qom/object.h" 282d1d0e70SDaniel P. Berrange 292d1d0e70SDaniel P. Berrange #define TYPE_QIO_CHANNEL_WEBSOCK "qio-channel-websock" 308063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(QIOChannelWebsock, QIO_CHANNEL_WEBSOCK) 312d1d0e70SDaniel P. Berrange 322d1d0e70SDaniel P. Berrange typedef union QIOChannelWebsockMask QIOChannelWebsockMask; 332d1d0e70SDaniel P. Berrange 342d1d0e70SDaniel P. Berrange union QIOChannelWebsockMask { 352d1d0e70SDaniel P. Berrange char c[4]; 362d1d0e70SDaniel P. Berrange uint32_t u; 372d1d0e70SDaniel P. Berrange }; 382d1d0e70SDaniel P. Berrange 392d1d0e70SDaniel P. Berrange /** 402d1d0e70SDaniel P. Berrange * QIOChannelWebsock 412d1d0e70SDaniel P. Berrange * 422d1d0e70SDaniel P. Berrange * The QIOChannelWebsock class provides a channel wrapper which 432d1d0e70SDaniel P. Berrange * can transparently run the HTTP websockets protocol. This is 442d1d0e70SDaniel P. Berrange * usually used over a TCP socket, but there is actually no 452d1d0e70SDaniel P. Berrange * technical restriction on which type of master channel is 462d1d0e70SDaniel P. Berrange * used as the transport. 472d1d0e70SDaniel P. Berrange * 482d1d0e70SDaniel P. Berrange * This channel object is currently only capable of running as 492d1d0e70SDaniel P. Berrange * a websocket server and is a pretty crude implementation 502d1d0e70SDaniel P. Berrange * of it, not supporting the full websockets protocol feature 512d1d0e70SDaniel P. Berrange * set. It is sufficient to use with a simple websockets 522d1d0e70SDaniel P. Berrange * client for encapsulating VNC for noVNC in-browser client. 532d1d0e70SDaniel P. Berrange */ 542d1d0e70SDaniel P. Berrange 552d1d0e70SDaniel P. Berrange struct QIOChannelWebsock { 562d1d0e70SDaniel P. Berrange QIOChannel parent; 572d1d0e70SDaniel P. Berrange QIOChannel *master; 582d1d0e70SDaniel P. Berrange Buffer encinput; 592d1d0e70SDaniel P. Berrange Buffer encoutput; 602d1d0e70SDaniel P. Berrange Buffer rawinput; 612d1d0e70SDaniel P. Berrange size_t payload_remain; 6257b0cdf1SDaniel P. Berrange size_t pong_remain; 632d1d0e70SDaniel P. Berrange QIOChannelWebsockMask mask; 642d1d0e70SDaniel P. Berrange guint io_tag; 652d1d0e70SDaniel P. Berrange Error *io_err; 662d1d0e70SDaniel P. Berrange gboolean io_eof; 67ff1300e6SBrandon Carpenter uint8_t opcode; 682d1d0e70SDaniel P. Berrange }; 692d1d0e70SDaniel P. Berrange 702d1d0e70SDaniel P. Berrange /** 712d1d0e70SDaniel P. Berrange * qio_channel_websock_new_server: 722d1d0e70SDaniel P. Berrange * @master: the underlying channel object 732d1d0e70SDaniel P. Berrange * 742d1d0e70SDaniel P. Berrange * Create a new websockets channel that runs the server 752d1d0e70SDaniel P. Berrange * side of the protocol. 762d1d0e70SDaniel P. Berrange * 772d1d0e70SDaniel P. Berrange * After creating the channel, it is mandatory to call 782d1d0e70SDaniel P. Berrange * the qio_channel_websock_handshake() method before attempting 792d1d0e70SDaniel P. Berrange * todo any I/O on the channel. 802d1d0e70SDaniel P. Berrange * 812d1d0e70SDaniel P. Berrange * Once the handshake has completed, all I/O should be done 822d1d0e70SDaniel P. Berrange * via the new websocket channel object and not the original 832d1d0e70SDaniel P. Berrange * master channel 842d1d0e70SDaniel P. Berrange * 852d1d0e70SDaniel P. Berrange * Returns: the new websockets channel object 862d1d0e70SDaniel P. Berrange */ 872d1d0e70SDaniel P. Berrange QIOChannelWebsock * 882d1d0e70SDaniel P. Berrange qio_channel_websock_new_server(QIOChannel *master); 892d1d0e70SDaniel P. Berrange 902d1d0e70SDaniel P. Berrange /** 912d1d0e70SDaniel P. Berrange * qio_channel_websock_handshake: 922d1d0e70SDaniel P. Berrange * @ioc: the websocket channel object 932d1d0e70SDaniel P. Berrange * @func: the callback to invoke when completed 942d1d0e70SDaniel P. Berrange * @opaque: opaque data to pass to @func 952d1d0e70SDaniel P. Berrange * @destroy: optional callback to free @opaque 962d1d0e70SDaniel P. Berrange * 972d1d0e70SDaniel P. Berrange * Perform the websocket handshake. This method 982d1d0e70SDaniel P. Berrange * will return immediately and the handshake will 992d1d0e70SDaniel P. Berrange * continue in the background, provided the main 1002d1d0e70SDaniel P. Berrange * loop is running. When the handshake is complete, 1012d1d0e70SDaniel P. Berrange * or fails, the @func callback will be invoked. 1022d1d0e70SDaniel P. Berrange */ 1032d1d0e70SDaniel P. Berrange void qio_channel_websock_handshake(QIOChannelWebsock *ioc, 1042d1d0e70SDaniel P. Berrange QIOTaskFunc func, 1052d1d0e70SDaniel P. Berrange gpointer opaque, 1062d1d0e70SDaniel P. Berrange GDestroyNotify destroy); 1072d1d0e70SDaniel P. Berrange 1082a6a4076SMarkus Armbruster #endif /* QIO_CHANNEL_WEBSOCK_H */ 109