VirtualBox

source: vbox/trunk/src/VBox/GuestHost/OpenGL/include/cr_net.h@ 33540

最後變更 在這個檔案從33540是 33540,由 vboxsync 提交於 14 年 前

*: spelling fixes, thanks Timeless!

  • 屬性 svn:eol-style 設為 native
  • 屬性 svn:keywords 設為 Id
檔案大小: 9.5 KB
 
1/* Copyright (c) 2001, Stanford University
2 * All rights reserved.
3 *
4 * See the file LICENSE.txt for information on redistributing this software.
5 */
6
7#ifndef CR_NET_H
8#define CR_NET_H
9
10#ifdef WINDOWS
11#define WIN32_LEAN_AND_MEAN
12#pragma warning( push, 3 ) /* shut up about warnings in YOUR OWN HEADER FILES!!! */
13#include <winsock.h>
14#endif
15
16#include <stdio.h>
17
18#ifndef WINDOWS
19#include <sys/socket.h>
20#ifndef DARWIN
21#ifdef AF_INET6
22/* getaddrinfo & co appeared with ipv6 */
23#define ADDRINFO
24#endif
25#endif
26#include <netinet/in.h>
27#endif
28
29#ifdef SunOS
30#include <sys/types.h>
31#endif
32
33#include "cr_protocol.h"
34#include "cr_threads.h"
35
36#include <iprt/types.h>
37
38#ifdef __cplusplus
39extern "C" {
40#endif
41
42#define DEFAULT_SERVER_PORT 7000
43
44/* If you change this, update DefaultMothershipPort in mothership.py */
45#define DEFAULT_MOTHERSHIP_PORT 10000
46
47typedef struct CRConnection CRConnection;
48
49typedef enum {
50 CR_NO_CONNECTION,
51 CR_SDP,
52 CR_TCPIP,
53 CR_UDPTCPIP,
54 CR_FILE,
55 CR_GM,
56 CR_IB,
57 CR_TEAC,
58 CR_TCSCOMM,
59 CR_VBOXHGCM,
60 CR_DROP_PACKETS
61} CRConnectionType;
62
63#if defined(WINDOWS)
64typedef SOCKET CRSocket;
65#else
66typedef int CRSocket;
67#endif
68
69typedef void (*CRVoidFunc)( void );
70typedef int (*CRNetReceiveFunc)( CRConnection *conn, CRMessage *msg, unsigned int len );
71typedef int (*CRNetConnectFunc)( CRConnection *conn );
72typedef void (*CRNetCloseFunc)( unsigned int sender_id );
73
74typedef struct __recvFuncList {
75 CRNetReceiveFunc recv;
76 struct __recvFuncList *next;
77} CRNetReceiveFuncList;
78
79typedef struct __closeFuncList {
80 CRNetCloseFunc close;
81 struct __closeFuncList *next;
82} CRNetCloseFuncList;
83
84typedef struct __messageListNode {
85 CRMessage *mesg; /* the actual message (header + payload) */
86 unsigned int len; /* length of message (header + payload) */
87 CRConnection *conn; /* some messages are assoc. with specific connections*/
88 struct __messageListNode *next; /* next in list */
89} CRMessageListNode;
90
91typedef struct {
92 CRMessageListNode *head, *tail;
93 int numMessages;
94 CRmutex lock;
95 CRcondition nonEmpty;
96} CRMessageList;
97
98
99/**
100 * Used to accumulate CR_MESSAGE_MULTI_BODY/TAIL chunks into one big buffer.
101 */
102typedef struct CRMultiBuffer {
103 unsigned int len; /* current length (<= max) (with sizeof_buffer_header) */
104 unsigned int max; /* size in bytes of data buffer */
105 void *buf; /* data buffer */
106} CRMultiBuffer;
107
108/**
109 * Chromium network connection (bidirectional).
110 */
111struct CRConnection {
112 int ignore;
113 CRConnectionType type;
114 unsigned int id; /* obtained from the mothership (if brokered) */
115
116 /* List of messages that we've received on the network connection but
117 * nobody has yet consumed.
118 */
119 CRMessageList messageList;
120
121 CRMultiBuffer multi;
122
123 unsigned int mtu; /* max transmission unit size (in bytes) */
124 unsigned int buffer_size;
125 unsigned int krecv_buf_size;
126 int broker; /* is connection brokered through mothership? */
127 int threaded; /* is this a threaded connection? */
128 int endianness, swap;
129 int actual_network; /* is this a real network? */
130
131 unsigned char *userbuf;
132 int userbuf_len;
133
134 char *hostname;
135 int port;
136
137 /* To allocate a data buffer of size conn->buffer_size bytes */
138 void *(*Alloc)( CRConnection *conn );
139 /* To indicate the client's done with a data buffer */
140 void (*Free)( CRConnection *conn, void *buf );
141 /* To send a data buffer. If bufp is non-null, it must have been obtained
142 * from Alloc() and it'll be freed when Send() returns.
143 */
144 void (*Send)( CRConnection *conn, void **buf, const void *start, unsigned int len );
145 /* To send a data buffer than can optionally be dropped on the floor */
146 void (*Barf)( CRConnection *conn, void **buf, const void *start, unsigned int len );
147 /* To send 'len' bytes from buffer at 'start', no funny business */
148 void (*SendExact)( CRConnection *conn, const void *start, unsigned int len );
149 /* To receive data. 'len' bytes will be placed into 'buf'. */
150 void (*Recv)( CRConnection *conn, void *buf, unsigned int len );
151 /* To receive one message on the connection */
152 void (*RecvMsg)( CRConnection *conn );
153 /* What's this??? */
154 void (*InstantReclaim)( CRConnection *conn, CRMessage *mess );
155 /* Called when a full CR_MESSAGE_MULTI_HEAD/TAIL message has been received */
156 void (*HandleNewMessage)( CRConnection *conn, CRMessage *mess, unsigned int len );
157 /* To accept a new connection from a client */
158 void (*Accept)( CRConnection *conn, const char *hostname, unsigned short port );
159 /* To connect to a server (return 0 if error, 1 if success) */
160 int (*Connect)( CRConnection *conn );
161 /* To disconnect from a server */
162 void (*Disconnect)( CRConnection *conn );
163
164 unsigned int sizeof_buffer_header;
165
166 /* logging */
167 int total_bytes_sent;
168 int total_bytes_recv;
169 int recv_count;
170 int opcodes_count;
171
172 /* credits for flow control */
173 int send_credits;
174 int recv_credits;
175
176 /* TCP/IP */
177 CRSocket tcp_socket;
178 int index;
179
180 CRSocket sdp_socket;
181
182 /* UDP/IP */
183 CRSocket udp_socket;
184#ifndef ADDRINFO
185 struct sockaddr_in remoteaddr;
186#else
187 struct sockaddr_storage remoteaddr;
188#endif
189
190 /* UDP/TCP/IP */
191 unsigned int seq;
192 unsigned int ack;
193 void *udp_packet;
194 int udp_packetlen;
195
196 /* FILE Tracing */
197 enum { CR_FILE_WRITE, CR_FILE_READ } file_direction;
198 char *filename;
199 int fd;
200
201 /* Myrinet GM */
202 unsigned int gm_node_id;
203 unsigned int gm_port_num;
204
205 /* Mellanox IB */
206 unsigned int ib_node_id;
207 unsigned int ib_port_num;
208
209 /* Quadrics Elan3 (teac) */
210 int teac_id;
211 int teac_rank;
212
213 /* Quadrics Elan3 (tcscomm) */
214 int tcscomm_id;
215 int tcscomm_rank;
216
217 /* VBox HGCM */
218 uint32_t u32ClientID;
219 uint8_t *pBuffer;
220 uint32_t cbBuffer;
221 uint8_t *pHostBuffer;
222 uint32_t cbHostBufferAllocated;
223 uint32_t cbHostBuffer;
224#ifdef IN_GUEST
225 uint32_t u32InjectClientID;
226#endif
227 /* Used on host side to indicate that we are not allowed to store above pointers for later use
228 * in crVBoxHGCMReceiveMessage. As those messages are going to be processed after the corresponding
229 * HGCM call is finished and memory is freed. So we have to store a copy.
230 * This happens when message processing for client associated with this connection
231 * is blocked by another client, which has send us glBegin call and we're waiting to receive glEnd.
232 */
233 uint8_t allow_redir_ptr;
234
235 uint32_t vMajor, vMinor; /*Protocol version*/
236};
237
238
239/*
240 * Network functions
241 */
242extern DECLEXPORT(int) crGetHostname( char *buf, unsigned int len );
243
244extern DECLEXPORT(void) crNetInit( CRNetReceiveFunc recvFunc, CRNetCloseFunc closeFunc );
245extern DECLEXPORT(void) crNetTearDown();
246
247extern DECLEXPORT(void) *crNetAlloc( CRConnection *conn );
248extern DECLEXPORT(void) crNetFree( CRConnection *conn, void *buf );
249
250extern DECLEXPORT(void) crNetAccept( CRConnection *conn, const char *hostname, unsigned short port );
251extern DECLEXPORT(int) crNetConnect( CRConnection *conn );
252extern DECLEXPORT(void) crNetDisconnect( CRConnection *conn );
253extern DECLEXPORT(void) crNetFreeConnection( CRConnection *conn );
254extern DECLEXPORT(void) crCloseSocket( CRSocket sock );
255
256extern DECLEXPORT(void) crNetSend( CRConnection *conn, void **bufp, const void *start, unsigned int len );
257extern DECLEXPORT(void) crNetBarf( CRConnection *conn, void **bufp, const void *start, unsigned int len );
258extern DECLEXPORT(void) crNetSendExact( CRConnection *conn, const void *start, unsigned int len );
259extern DECLEXPORT(void) crNetSingleRecv( CRConnection *conn, void *buf, unsigned int len );
260extern DECLEXPORT(unsigned int) crNetGetMessage( CRConnection *conn, CRMessage **message );
261extern DECLEXPORT(unsigned int) crNetPeekMessage( CRConnection *conn, CRMessage **message );
262extern DECLEXPORT(int) crNetNumMessages(CRConnection *conn);
263extern DECLEXPORT(void) crNetReadline( CRConnection *conn, void *buf );
264extern DECLEXPORT(int) crNetRecv( void );
265extern DECLEXPORT(void) crNetDefaultRecv( CRConnection *conn, CRMessage *msg, unsigned int len );
266extern DECLEXPORT(void) crNetDispatchMessage( CRNetReceiveFuncList *rfl, CRConnection *conn, CRMessage *msg, unsigned int len );
267
268extern DECLEXPORT(CRConnection *) crNetConnectToServer( const char *server, unsigned short default_port, int mtu, int broker );
269extern DECLEXPORT(CRConnection *) crNetAcceptClient( const char *protocol, const char *hostname, unsigned short port, unsigned int mtu, int broker );
270
271
272extern DECLEXPORT(void) crInitMessageList(CRMessageList *list);
273extern DECLEXPORT(void) crEnqueueMessage(CRMessageList *list, CRMessage *msg, unsigned int len, CRConnection *conn);
274extern DECLEXPORT(void) crDequeueMessage(CRMessageList *list, CRMessage **msg, unsigned int *len, CRConnection **conn);
275
276extern DECLEXPORT(void) crNetRecvReadPixels( const CRMessageReadPixels *rp, unsigned int len );
277
278
279/*
280 * Quadrics stuff
281 */
282#define CR_QUADRICS_DEFAULT_LOW_CONTEXT 32
283#define CR_QUADRICS_DEFAULT_HIGH_CONTEXT 35
284
285extern DECLEXPORT(void) crNetSetRank( int my_rank );
286extern DECLEXPORT(void) crNetSetContextRange( int low_context, int high_context );
287extern DECLEXPORT(void) crNetSetNodeRange( const char *low_node, const char *high_node );
288extern DECLEXPORT(void) crNetSetKey( const unsigned char* key, const int keyLength );
289
290
291/*
292 * Socket callback facility
293 */
294#define CR_SOCKET_CREATE 1
295#define CR_SOCKET_DESTROY 2
296typedef void (*CRSocketCallbackProc)(int mode, int socket);
297extern DECLEXPORT(void) crRegisterSocketCallback(int mode, CRSocketCallbackProc proc);
298
299
300#ifdef __cplusplus
301}
302#endif
303
304#endif /* CR_NET_H */
注意: 瀏覽 TracBrowser 來幫助您使用儲存庫瀏覽器

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette