cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

channel-websock.h (3392B)


      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"
     30OBJECT_DECLARE_SIMPLE_TYPE(QIOChannelWebsock, QIO_CHANNEL_WEBSOCK)
     31
     32typedef union QIOChannelWebsockMask QIOChannelWebsockMask;
     33
     34union 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
     55struct 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 io_tag;
     65    Error *io_err;
     66    gboolean io_eof;
     67    uint8_t opcode;
     68};
     69
     70/**
     71 * qio_channel_websock_new_server:
     72 * @master: the underlying channel object
     73 *
     74 * Create a new websockets channel that runs the server
     75 * side of the protocol.
     76 *
     77 * After creating the channel, it is mandatory to call
     78 * the qio_channel_websock_handshake() method before attempting
     79 * todo any I/O on the channel.
     80 *
     81 * Once the handshake has completed, all I/O should be done
     82 * via the new websocket channel object and not the original
     83 * master channel
     84 *
     85 * Returns: the new websockets channel object
     86 */
     87QIOChannelWebsock *
     88qio_channel_websock_new_server(QIOChannel *master);
     89
     90/**
     91 * qio_channel_websock_handshake:
     92 * @ioc: the websocket channel object
     93 * @func: the callback to invoke when completed
     94 * @opaque: opaque data to pass to @func
     95 * @destroy: optional callback to free @opaque
     96 *
     97 * Perform the websocket handshake. This method
     98 * will return immediately and the handshake will
     99 * continue in the background, provided the main
    100 * loop is running. When the handshake is complete,
    101 * or fails, the @func callback will be invoked.
    102 */
    103void qio_channel_websock_handshake(QIOChannelWebsock *ioc,
    104                                   QIOTaskFunc func,
    105                                   gpointer opaque,
    106                                   GDestroyNotify destroy);
    107
    108#endif /* QIO_CHANNEL_WEBSOCK_H */