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