summaryrefslogtreecommitdiffstats
path: root/src/VBox/GuestHost/OpenGL/include/cr_net.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/VBox/GuestHost/OpenGL/include/cr_net.h')
-rw-r--r--src/VBox/GuestHost/OpenGL/include/cr_net.h360
1 files changed, 360 insertions, 0 deletions
diff --git a/src/VBox/GuestHost/OpenGL/include/cr_net.h b/src/VBox/GuestHost/OpenGL/include/cr_net.h
new file mode 100644
index 00000000..b95b4268
--- /dev/null
+++ b/src/VBox/GuestHost/OpenGL/include/cr_net.h
@@ -0,0 +1,360 @@
+/* Copyright (c) 2001, Stanford University
+ * All rights reserved.
+ *
+ * See the file LICENSE.txt for information on redistributing this software.
+ */
+
+#ifndef CR_NET_H
+#define CR_NET_H
+
+#ifdef WINDOWS
+#define WIN32_LEAN_AND_MEAN
+# ifndef VBOX
+#pragma warning( push, 3 ) /* shut up about warnings in YOUR OWN HEADER FILES!!! */
+#include <winsock.h>
+# else
+# include <iprt/win/winsock.h>
+# endif /* VBOX */
+#endif
+
+#include <stdio.h>
+
+#ifndef WINDOWS
+#include <sys/socket.h>
+#ifndef DARWIN
+#ifdef AF_INET6
+/* getaddrinfo & co appeared with ipv6 */
+#define ADDRINFO
+#endif
+#endif
+#include <netinet/in.h>
+#endif
+
+#ifdef SunOS
+#include <sys/types.h>
+#endif
+
+#include "cr_protocol.h"
+#include "cr_threads.h"
+
+#include <iprt/types.h>
+#include <iprt/thread.h>
+#include <iprt/list.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define DEFAULT_SERVER_PORT 7000
+
+/* If you change this, update DefaultMothershipPort in mothership.py */
+#define DEFAULT_MOTHERSHIP_PORT 10000
+
+typedef struct CRConnection CRConnection;
+
+typedef enum {
+ CR_NO_CONNECTION,
+ CR_SDP,
+ CR_TCPIP,
+ CR_UDPTCPIP,
+ CR_FILE,
+ CR_GM,
+ CR_IB,
+ CR_TEAC,
+ CR_TCSCOMM,
+ CR_VBOXHGCM,
+ CR_DROP_PACKETS
+} CRConnectionType;
+
+#if defined(WINDOWS)
+typedef SOCKET CRSocket;
+#else
+typedef int CRSocket;
+#endif
+
+typedef void (*CRVoidFunc)( void );
+typedef int (*CRNetReceiveFunc)( CRConnection *conn, CRMessage *msg, unsigned int len );
+typedef int (*CRNetConnectFunc)( CRConnection *conn );
+typedef void (*CRNetCloseFunc)( unsigned int sender_id );
+
+typedef struct __recvFuncList {
+ CRNetReceiveFunc recv;
+ struct __recvFuncList *next;
+} CRNetReceiveFuncList;
+
+typedef struct __closeFuncList {
+ CRNetCloseFunc close;
+ struct __closeFuncList *next;
+} CRNetCloseFuncList;
+
+typedef struct __messageListNode {
+ CRMessage *mesg; /* the actual message (header + payload) */
+ unsigned int len; /* length of message (header + payload) */
+ CRConnection *conn; /* some messages are assoc. with specific connections*/
+ struct __messageListNode *next; /* next in list */
+} CRMessageListNode;
+
+typedef struct {
+ CRMessageListNode *head, *tail;
+ int numMessages;
+ CRmutex lock;
+ CRcondition nonEmpty;
+} CRMessageList;
+
+
+/**
+ * Used to accumulate CR_MESSAGE_MULTI_BODY/TAIL chunks into one big buffer.
+ */
+typedef struct CRMultiBuffer {
+ unsigned int len; /* current length (<= max) (with sizeof_buffer_header) */
+ unsigned int max; /* size in bytes of data buffer */
+ void *buf; /* data buffer */
+} CRMultiBuffer;
+
+#ifdef VBOX_WITH_CRHGSMI
+# ifdef IN_GUEST
+typedef struct CRVBOXHGSMI_CLIENT {
+ struct VBOXUHGSMI *pHgsmi;
+ struct VBOXUHGSMI_BUFFER *pCmdBuffer;
+ struct VBOXUHGSMI_BUFFER *pHGBuffer;
+ void *pvHGBuffer;
+ struct CRBufferPool_t *bufpool;
+} CRVBOXHGSMI_CLIENT, *PCRVBOXHGSMI_CLIENT;
+#endif /* IN_GUEST */
+#endif /* #ifdef VBOX_WITH_CRHGSMI */
+/**
+ * Chromium network connection (bidirectional).
+ */
+struct CRConnection {
+ int ignore;
+ CRConnectionType type;
+ unsigned int id; /* obtained from the mothership (if brokered) */
+
+ /* List of messages that we've received on the network connection but
+ * nobody has yet consumed.
+ */
+ CRMessageList messageList;
+
+ CRMultiBuffer multi;
+
+ unsigned int mtu; /* max transmission unit size (in bytes) */
+ unsigned int buffer_size;
+ unsigned int krecv_buf_size;
+ int broker; /* is connection brokered through mothership? */
+ int threaded; /* is this a threaded connection? */
+ int endianness, swap;
+ int actual_network; /* is this a real network? */
+
+ unsigned char *userbuf;
+ int userbuf_len;
+
+ char *hostname;
+ int port;
+
+ /* To allocate a data buffer of size conn->buffer_size bytes */
+ void *(*Alloc)( CRConnection *conn );
+ /* To indicate the client's done with a data buffer */
+ void (*Free)( CRConnection *conn, void *buf );
+ /* To send a data buffer. If bufp is non-null, it must have been obtained
+ * from Alloc() and it'll be freed when Send() returns.
+ */
+ void (*Send)( CRConnection *conn, void **buf, const void *start, unsigned int len );
+ /* To send a data buffer than can optionally be dropped on the floor */
+ void (*Barf)( CRConnection *conn, void **buf, const void *start, unsigned int len );
+ /* To send 'len' bytes from buffer at 'start', no funny business */
+ void (*SendExact)( CRConnection *conn, const void *start, unsigned int len );
+ /* To receive data. 'len' bytes will be placed into 'buf'. */
+ void (*Recv)( CRConnection *conn, void *buf, unsigned int len );
+ /* To receive one message on the connection */
+ void (*RecvMsg)( CRConnection *conn );
+ /* What's this??? */
+ void (*InstantReclaim)( CRConnection *conn, CRMessage *mess );
+ /* Called when a full CR_MESSAGE_MULTI_HEAD/TAIL message has been received */
+ void (*HandleNewMessage)( CRConnection *conn, CRMessage *mess, unsigned int len );
+ /* To accept a new connection from a client */
+ void (*Accept)( CRConnection *conn, const char *hostname, unsigned short port );
+ /* To connect to a server (return 0 if error, 1 if success) */
+ int (*Connect)( CRConnection *conn );
+ /* To disconnect from a server */
+ void (*Disconnect)( CRConnection *conn );
+
+ unsigned int sizeof_buffer_header;
+
+ /* logging */
+ int total_bytes_sent;
+ int total_bytes_recv;
+ int recv_count;
+ int opcodes_count;
+
+ /* credits for flow control */
+ int send_credits;
+ int recv_credits;
+
+ /* TCP/IP */
+ CRSocket tcp_socket;
+ int index;
+
+ CRSocket sdp_socket;
+
+ /* UDP/IP */
+ CRSocket udp_socket;
+#ifndef ADDRINFO
+ struct sockaddr_in remoteaddr;
+#else
+ struct sockaddr_storage remoteaddr;
+#endif
+
+ /* UDP/TCP/IP */
+ unsigned int seq;
+ unsigned int ack;
+ void *udp_packet;
+ int udp_packetlen;
+
+ /* FILE Tracing */
+ enum { CR_FILE_WRITE, CR_FILE_READ } file_direction;
+ char *filename;
+ int fd;
+
+ /* Myrinet GM */
+ unsigned int gm_node_id;
+ unsigned int gm_port_num;
+
+ /* Mellanox IB */
+ unsigned int ib_node_id;
+ unsigned int ib_port_num;
+
+ /* Quadrics Elan3 (teac) */
+ int teac_id;
+ int teac_rank;
+
+ /* Quadrics Elan3 (tcscomm) */
+ int tcscomm_id;
+ int tcscomm_rank;
+
+ /* VBox HGCM */
+ uint32_t u32ClientID;
+ uint8_t *pBuffer;
+ uint32_t cbBuffer;
+ uint8_t *pHostBuffer;
+ uint32_t cbHostBufferAllocated;
+ uint32_t cbHostBuffer;
+#ifdef IN_GUEST
+ uint32_t u32InjectClientID;
+# ifdef VBOX_WITH_CRHGSMI
+ CRVBOXHGSMI_CLIENT HgsmiClient;
+ struct VBOXUHGSMI *pExternalHgsmi;
+# endif
+#else
+# ifdef VBOX_WITH_CRHGSMI
+ struct _crclient *pClient; /* back reference, just for simplicity */
+ CRVBOXHGSMI_CMDDATA CmdData;
+# endif
+ RTLISTANCHOR PendingMsgList;
+#endif
+ /* Used on host side to indicate that we are not allowed to store above pointers for later use
+ * in crVBoxHGCMReceiveMessage. As those messages are going to be processed after the corresponding
+ * HGCM call is finished and memory is freed. So we have to store a copy.
+ * This happens when message processing for client associated with this connection
+ * is blocked by another client, which has send us glBegin call and we're waiting to receive glEnd.
+ */
+ uint8_t allow_redir_ptr;
+
+ uint32_t vMajor, vMinor; /*Protocol version*/
+};
+
+
+/*
+ * Network functions
+ */
+extern DECLEXPORT(int) crGetHostname( char *buf, unsigned int len );
+
+extern DECLEXPORT(void) crNetInit( CRNetReceiveFunc recvFunc, CRNetCloseFunc closeFunc );
+extern DECLEXPORT(void) crNetTearDown(void);
+
+extern DECLEXPORT(void) *crNetAlloc( CRConnection *conn );
+extern DECLEXPORT(void) crNetFree( CRConnection *conn, void *buf );
+
+extern DECLEXPORT(void) crNetAccept( CRConnection *conn, const char *hostname, unsigned short port );
+extern DECLEXPORT(int) crNetConnect( CRConnection *conn );
+extern DECLEXPORT(void) crNetDisconnect( CRConnection *conn );
+extern DECLEXPORT(void) crNetFreeConnection( CRConnection *conn );
+extern DECLEXPORT(void) crCloseSocket( CRSocket sock );
+
+extern DECLEXPORT(void) crNetSend( CRConnection *conn, void **bufp, const void *start, unsigned int len );
+extern DECLEXPORT(void) crNetBarf( CRConnection *conn, void **bufp, const void *start, unsigned int len );
+extern DECLEXPORT(void) crNetSendExact( CRConnection *conn, const void *start, unsigned int len );
+extern DECLEXPORT(void) crNetSingleRecv( CRConnection *conn, void *buf, unsigned int len );
+extern DECLEXPORT(unsigned int) crNetGetMessage( CRConnection *conn, CRMessage **message );
+extern DECLEXPORT(unsigned int) crNetPeekMessage( CRConnection *conn, CRMessage **message );
+extern DECLEXPORT(int) crNetNumMessages(CRConnection *conn);
+extern DECLEXPORT(void) crNetReadline( CRConnection *conn, void *buf );
+extern DECLEXPORT(int) crNetRecv(
+#if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST)
+ CRConnection *conn
+#else
+ void
+#endif
+ );
+#if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST)
+#define CR_WRITEBACK_WAIT(_conn, _writeback) do { \
+ while (_writeback) { \
+ RTThreadYield(); \
+ crNetRecv(_conn); \
+ } \
+ } while (0)
+#else
+#define CR_WRITEBACK_WAIT(_conn, _writeback) do { \
+ while (_writeback) { \
+ RTThreadYield(); \
+ crNetRecv(); \
+ } \
+ } while (0)
+
+#endif
+#ifdef IN_GUEST
+extern DECLEXPORT(uint32_t) crNetHostCapsGet(void);
+#endif
+extern DECLEXPORT(void) crNetDefaultRecv( CRConnection *conn, CRMessage *msg, unsigned int len );
+extern DECLEXPORT(void) crNetDispatchMessage( CRNetReceiveFuncList *rfl, CRConnection *conn, CRMessage *msg, unsigned int len );
+
+extern DECLEXPORT(CRConnection *) crNetConnectToServer( const char *server, unsigned short default_port, int mtu, int broker
+#if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST)
+ , struct VBOXUHGSMI *pHgsmi
+#endif
+);
+extern DECLEXPORT(CRConnection *) crNetAcceptClient( const char *protocol, const char *hostname, unsigned short port, unsigned int mtu, int broker );
+
+
+extern DECLEXPORT(void) crInitMessageList(CRMessageList *list);
+extern DECLEXPORT(void) crEnqueueMessage(CRMessageList *list, CRMessage *msg, unsigned int len, CRConnection *conn);
+extern DECLEXPORT(void) crDequeueMessage(CRMessageList *list, CRMessage **msg, unsigned int *len, CRConnection **conn);
+
+extern DECLEXPORT(void) crNetRecvReadPixels( const CRMessageReadPixels *rp, unsigned int len );
+
+
+/*
+ * Quadrics stuff
+ */
+#define CR_QUADRICS_DEFAULT_LOW_CONTEXT 32
+#define CR_QUADRICS_DEFAULT_HIGH_CONTEXT 35
+
+extern DECLEXPORT(void) crNetSetRank( int my_rank );
+extern DECLEXPORT(void) crNetSetContextRange( int low_context, int high_context );
+extern DECLEXPORT(void) crNetSetNodeRange( const char *low_node, const char *high_node );
+extern DECLEXPORT(void) crNetSetKey( const unsigned char* key, const int keyLength );
+
+
+/*
+ * Socket callback facility
+ */
+#define CR_SOCKET_CREATE 1
+#define CR_SOCKET_DESTROY 2
+typedef void (*CRSocketCallbackProc)(int mode, int socket);
+extern DECLEXPORT(void) crRegisterSocketCallback(int mode, CRSocketCallbackProc proc);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* CR_NET_H */