cr_protocol.h revision b0d3e712c0bf759a686c718a55896f19804cfa75
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync/* Copyright (c) 2001, Stanford University
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync * All rights reserved.
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync *
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync * See the file LICENSE.txt for information on redistributing this software.
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync */
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#ifndef CR_PROTOCOL_H
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define CR_PROTOCOL_H
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#include <iprt/cdefs.h>
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#ifdef __cplusplus
b9a21c3c91c47e090316e28d759194e46628ed49vboxsyncextern "C" {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#endif
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync/*For now guest is allowed to connect host opengl service if protocol version matches exactly*/
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync/*Note: that after any change to this file, or glapi_parser\apispec.txt version should be changed*/
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define CR_PROTOCOL_VERSION_MAJOR 9
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define CR_PROTOCOL_VERSION_MINOR 1
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsynctypedef enum {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync /* first message types is 'wGL\001', so we can immediately
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync recognize bad message types */
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CR_MESSAGE_OPCODES = 0x77474c01,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CR_MESSAGE_WRITEBACK,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CR_MESSAGE_READBACK,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CR_MESSAGE_READ_PIXELS,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CR_MESSAGE_MULTI_BODY,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CR_MESSAGE_MULTI_TAIL,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CR_MESSAGE_FLOW_CONTROL,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CR_MESSAGE_OOB,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CR_MESSAGE_NEWCLIENT,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CR_MESSAGE_GATHER,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CR_MESSAGE_ERROR,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CR_MESSAGE_CRUT,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CR_MESSAGE_REDIR_PTR
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync} CRMessageType;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsynctypedef union {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync /* pointers are usually 4 bytes, but on 64-bit machines (Alpha,
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync * SGI-n64, etc.) they are 8 bytes. Pass network pointers around
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync * as an opaque array of bytes, since the interpretation & size of
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync * the pointer only matter to the machine which emitted the
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync * pointer (and will eventually receive the pointer back again) */
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync unsigned int ptrAlign[2];
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync unsigned char ptrSize[8];
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync /* hack to make this packet big */
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync /* unsigned int junk[512]; */
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync} CRNetworkPointer;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#ifdef DEBUG_misha
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define CRDBGPTR_SETZ(_p) crMemset((_p), 0, sizeof (CRNetworkPointer))
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define CRDBGPTR_CHECKZ(_p) do { \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CRNetworkPointer _ptr = {0}; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync Assert(!crMemcmp((_p), &_ptr, sizeof (CRNetworkPointer))); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync } while (0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define CRDBGPTR_CHECKNZ(_p) do { \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CRNetworkPointer _ptr = {0}; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync Assert(crMemcmp((_p), &_ptr, sizeof (CRNetworkPointer))); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync } while (0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync# if 0
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync# define _CRDBGPTR_PRINT(_tStr, _id, _p) do { \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync crDebug(_tStr "%d:0x%08x%08x", (_id), (_p)->ptrAlign[1], (_p)->ptrAlign[0]); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync } while (0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync# else
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync# define _CRDBGPTR_PRINT(_tStr, _id, _p) do { } while (0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync# endif
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define CRDBGPTR_PRINTWB(_id, _p) _CRDBGPTR_PRINT("wbptr:", _id, _p)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define CRDBGPTR_PRINTRB(_id, _p) _CRDBGPTR_PRINT("rbptr:", _id, _p)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#else
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define CRDBGPTR_SETZ(_p) do { } while (0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define CRDBGPTR_CHECKZ(_p) do { } while (0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define CRDBGPTR_CHECKNZ(_p) do { } while (0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define CRDBGPTR_PRINTWB(_id, _p) do { } while (0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define CRDBGPTR_PRINTRB(_id, _p) do { } while (0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#endif
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#ifdef VBOX_WITH_CRHGSMI
b9a21c3c91c47e090316e28d759194e46628ed49vboxsynctypedef struct CRVBOXHGSMI_CMDDATA {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync struct VBOXVDMACMD_CHROMIUM_CMD *pCmd;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int *pCmdRc;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync char *pWriteback;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync unsigned int *pcbWriteback;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync unsigned int cbWriteback;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync} CRVBOXHGSMI_CMDDATA, *PCRVBOXHGSMI_CMDDATA;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#ifdef DEBUG
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync# define CRVBOXHGSMI_CMDDATA_ASSERT_CONSISTENT(_pData) do { \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CRASSERT(!(_pData)->pCmd == !(_pData)->pCmdRc); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CRASSERT(!(_pData)->pWriteback == !(_pData)->pcbWriteback); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CRASSERT(!(_pData)->pWriteback == !(_pData)->cbWriteback); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync if ((_pData)->pWriteback) \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync { \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CRASSERT((_pData)->pCmd); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync } \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync } while (0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync# define CRVBOXHGSMI_CMDDATA_ASSERT_CLEANED(_pData) do { \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CRASSERT(!(_pData)->pCmd); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CRASSERT(!(_pData)->pCmdRc); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CRASSERT(!(_pData)->pWriteback); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CRASSERT(!(_pData)->pcbWriteback); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CRASSERT(!(_pData)->cbWriteback); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync } while (0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync# define CRVBOXHGSMI_CMDDATA_ASSERT_ISSET(_pData) do { \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CRVBOXHGSMI_CMDDATA_ASSERT_CONSISTENT(_pData); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CRASSERT(CRVBOXHGSMI_CMDDATA_IS_SET(_pData)); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync } while (0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync# define CRVBOXHGSMI_CMDDATA_ASSERT_ISSETWB(_pData) do { \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CRVBOXHGSMI_CMDDATA_ASSERT_CONSISTENT(_pData); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CRASSERT(CRVBOXHGSMI_CMDDATA_IS_SETWB(_pData)); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync } while (0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#else
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync# define CRVBOXHGSMI_CMDDATA_ASSERT_CONSISTENT(_pData) do { } while (0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync# define CRVBOXHGSMI_CMDDATA_ASSERT_CLEANED(_pData) do { } while (0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync# define CRVBOXHGSMI_CMDDATA_ASSERT_ISSET(_pData) do { } while (0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync# define CRVBOXHGSMI_CMDDATA_ASSERT_ISSETWB(_pData) do { } while (0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#endif
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define CRVBOXHGSMI_CMDDATA_IS_SET(_pData) (!!(_pData)->pCmd)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define CRVBOXHGSMI_CMDDATA_IS_SETWB(_pData) (!!(_pData)->pWriteback)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define CRVBOXHGSMI_CMDDATA_CLEANUP(_pData) do { \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync crMemset(_pData, 0, sizeof (CRVBOXHGSMI_CMDDATA)); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CRVBOXHGSMI_CMDDATA_ASSERT_CLEANED(_pData); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CRVBOXHGSMI_CMDDATA_ASSERT_CONSISTENT(_pData); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync } while (0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define CRVBOXHGSMI_CMDDATA_SET(_pData, _pCmd, _pHdr) do { \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CRVBOXHGSMI_CMDDATA_ASSERT_CLEANED(_pData); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync (_pData)->pCmd = (_pCmd); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync (_pData)->pCmdRc = &(_pHdr)->result; \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CRVBOXHGSMI_CMDDATA_ASSERT_CONSISTENT(_pData); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync } while (0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define CRVBOXHGSMI_CMDDATA_SETWB(_pData, _pCmd, _pHdr, _pWb, _cbWb, _pcbWb) do { \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CRVBOXHGSMI_CMDDATA_SET(_pData, _pCmd, _pHdr); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync (_pData)->pWriteback = (_pWb); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync (_pData)->pcbWriteback = (_pcbWb); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync (_pData)->cbWriteback = (_cbWb); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CRVBOXHGSMI_CMDDATA_ASSERT_CONSISTENT(_pData); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync } while (0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#define CRVBOXHGSMI_CMDDATA_RC(_pData, _rc) do { \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync *(_pData)->pCmdRc = (_rc); \
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync } while (0)
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#endif
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsynctypedef struct {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CRMessageType type;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync unsigned int conn_id;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync} CRMessageHeader;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsynctypedef struct CRMessageOpcodes {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CRMessageHeader header;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync unsigned int numOpcodes;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync} CRMessageOpcodes;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsynctypedef struct CRMessageRedirPtr {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CRMessageHeader header;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CRMessageHeader* pMessage;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#ifdef VBOX_WITH_CRHGSMI
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CRVBOXHGSMI_CMDDATA CmdData;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#endif
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync} CRMessageRedirPtr;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsynctypedef struct CRMessageWriteback {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CRMessageHeader header;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CRNetworkPointer writeback_ptr;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync} CRMessageWriteback;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsynctypedef struct CRMessageReadback {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CRMessageHeader header;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CRNetworkPointer writeback_ptr;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CRNetworkPointer readback_ptr;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync} CRMessageReadback;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsynctypedef struct CRMessageMulti {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CRMessageHeader header;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync} CRMessageMulti;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsynctypedef struct CRMessageFlowControl {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CRMessageHeader header;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync unsigned int credits;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync} CRMessageFlowControl;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsynctypedef struct CRMessageReadPixels {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CRMessageHeader header;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int width, height;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync unsigned int bytes_per_row;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync unsigned int stride;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int alignment;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int skipRows;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int skipPixels;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int rowLength;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int format;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int type;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CRNetworkPointer pixels;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync} CRMessageReadPixels;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsynctypedef struct CRMessageNewClient {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CRMessageHeader header;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync} CRMessageNewClient;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsynctypedef struct CRMessageGather {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CRMessageHeader header;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync unsigned long offset;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync unsigned long len;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync} CRMessageGather;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsynctypedef union {
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CRMessageHeader header;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CRMessageOpcodes opcodes;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CRMessageRedirPtr redirptr;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CRMessageWriteback writeback;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CRMessageReadback readback;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CRMessageReadPixels readPixels;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CRMessageMulti multi;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CRMessageFlowControl flowControl;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CRMessageNewClient newclient;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync CRMessageGather gather;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync} CRMessage;
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsyncDECLEXPORT(void) crNetworkPointerWrite( CRNetworkPointer *dst, void *src );
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#ifdef __cplusplus
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync}
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#endif
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#endif /* CR_PROTOCOL_H */
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync