xref: /openbmc/qemu/include/io/channel-websock.h (revision 9a2ea4f4a7230fe224dee91d9adf2ef872c3d226)
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