1 /**
2  * \file
3  * System.Net.Sockets.Socket support
4  *
5  * Author:
6  *	Dick Porter (dick@ximian.com)
7  *
8  * (C) 2001 Ximian, Inc.
9  */
10 
11 #ifndef _MONO_METADATA_W32SOCKET_H_
12 #define _MONO_METADATA_W32SOCKET_H_
13 
14 #include <config.h>
15 #include <glib.h>
16 
17 #include <mono/metadata/object-internals.h>
18 
19 #ifndef HOST_WIN32
20 #define INVALID_SOCKET ((SOCKET)(guint32)(~0))
21 #define SOCKET_ERROR (-1)
22 
23 typedef gint SOCKET;
24 
25 typedef struct {
26 	guint32 len;
27 	gpointer buf;
28 } WSABUF, *LPWSABUF;
29 #endif
30 
31 /* This is a copy of System.Net.Sockets.SocketType */
32 typedef enum {
33 	SocketType_Stream=1,
34 	SocketType_Dgram=2,
35 	SocketType_Raw=3,
36 	SocketType_Rdm=4,
37 	SocketType_Seqpacket=5,
38 	SocketType_Unknown=-1
39 } MonoSocketType;
40 
41 /* This is a copy of System.Net.Sockets.AddressFamily */
42 typedef enum {
43 	AddressFamily_Unknown=-1,
44 	AddressFamily_Unspecified=0,
45 	AddressFamily_Unix=1,
46 	AddressFamily_InterNetwork=2,
47 	AddressFamily_ImpLink=3,
48 	AddressFamily_Pup=4,
49 	AddressFamily_Chaos=5,
50 	AddressFamily_NS=6,
51 	AddressFamily_Ipx=6,
52 	AddressFamily_Iso=7,
53 	AddressFamily_Osi=7,
54 	AddressFamily_Ecma=8,
55 	AddressFamily_DataKit=9,
56 	AddressFamily_Ccitt=10,
57 	AddressFamily_Sna=11,
58 	AddressFamily_DecNet=12,
59 	AddressFamily_DataLink=13,
60 	AddressFamily_Lat=14,
61 	AddressFamily_HyperChannel=15,
62 	AddressFamily_AppleTalk=16,
63 	AddressFamily_NetBios=17,
64 	AddressFamily_VoiceView=18,
65 	AddressFamily_FireFox=19,
66 	AddressFamily_Banyan=21,
67 	AddressFamily_Atm=22,
68 	AddressFamily_InterNetworkV6=23,
69 	AddressFamily_Cluster=24,
70 	AddressFamily_Ieee12844=25,
71 	AddressFamily_Irda=26,
72 	AddressFamily_NetworkDesigners=28
73 } MonoAddressFamily;
74 
75 /* This is a copy of System.Net.Sockets.ProtocolType */
76 typedef enum {
77 	ProtocolType_IP=0,
78 	ProtocolType_Icmp=1,
79 	ProtocolType_Igmp=2,
80 	ProtocolType_Ggp=3,
81 	ProtocolType_Tcp=6,
82 	ProtocolType_Pup=12,
83 	ProtocolType_Udp=17,
84 	ProtocolType_Idp=22,
85 	ProtocolType_IPv6=41,
86 	ProtocolType_ND=77,
87 	ProtocolType_Raw=255,
88 	ProtocolType_Unspecified=0,
89 	ProtocolType_Ipx=1000,
90 	ProtocolType_Spx=1256,
91 	ProtocolType_SpxII=1257,
92 	ProtocolType_Unknown=-1
93 } MonoProtocolType;
94 
95 /* This is a copy of System.Net.Sockets.SocketOptionLevel */
96 typedef enum {
97 	SocketOptionLevel_Socket=65535,
98 	SocketOptionLevel_IP=0,
99 	SocketOptionLevel_IPv6=41,
100 	SocketOptionLevel_Tcp=6,
101 	SocketOptionLevel_Udp=17
102 } MonoSocketOptionLevel;
103 
104 /* This is a copy of System.Net.Sockets.SocketOptionName */
105 typedef enum {
106 	SocketOptionName_Debug=1,
107 	SocketOptionName_AcceptConnection=2,
108 	SocketOptionName_ReuseAddress=4,
109 	SocketOptionName_KeepAlive=8,
110 	SocketOptionName_DontRoute=16,
111 	SocketOptionName_IPProtectionLevel = 23,
112 	SocketOptionName_IPv6Only = 27,
113 	SocketOptionName_Broadcast=32,
114 	SocketOptionName_UseLoopback=64,
115 	SocketOptionName_Linger=128,
116 	SocketOptionName_OutOfBandInline=256,
117 	SocketOptionName_DontLinger= -129,
118 	SocketOptionName_ExclusiveAddressUse= -5,
119 	SocketOptionName_SendBuffer= 4097,
120 	SocketOptionName_ReceiveBuffer=4098,
121 	SocketOptionName_SendLowWater=4099,
122 	SocketOptionName_ReceiveLowWater=4100,
123 	SocketOptionName_SendTimeout=4101,
124 	SocketOptionName_ReceiveTimeout=4102,
125 	SocketOptionName_Error=4103,
126 	SocketOptionName_Type=4104,
127 	SocketOptionName_MaxConnections=2147483647,
128 	SocketOptionName_IPOptions=1,
129 	SocketOptionName_HeaderIncluded=2,
130 	SocketOptionName_TypeOfService=3,
131 	SocketOptionName_IpTimeToLive=4,
132 	SocketOptionName_MulticastInterface=9,
133 	SocketOptionName_MulticastTimeToLive=10,
134 	SocketOptionName_MulticastLoopback=11,
135 	SocketOptionName_AddMembership=12,
136 	SocketOptionName_DropMembership=13,
137 	SocketOptionName_DontFragment=14,
138 	SocketOptionName_AddSourceMembership=15,
139 	SocketOptionName_DropSourceMembership=16,
140 	SocketOptionName_BlockSource=17,
141 	SocketOptionName_UnblockSource=18,
142 	SocketOptionName_PacketInformation=19,
143 	SocketOptionName_NoDelay=1,
144 	SocketOptionName_BsdUrgent=2,
145 	SocketOptionName_Expedited=2,
146 	SocketOptionName_NoChecksum=1,
147 	SocketOptionName_ChecksumCoverage=20,
148 	SocketOptionName_HopLimit=21,
149 
150 	/* This is Mono-specific, keep it in sync with
151 	 * Mono.Posix/PeerCred.cs
152 	 */
153 	SocketOptionName_PeerCred=10001
154 } MonoSocketOptionName;
155 
156 /* This is a copy of System.Net.Sockets.SocketFlags */
157 typedef enum {
158 	SocketFlags_None = 0x0000,
159 	SocketFlags_OutOfBand = 0x0001,
160 	SocketFlags_MaxIOVectorLength = 0x0010,
161 	SocketFlags_Peek = 0x0002,
162 	SocketFlags_DontRoute = 0x0004,
163 	SocketFlags_Partial = 0x8000
164 } MonoSocketFlags;
165 
166 typedef struct
167 {
168 	MonoObject obj;
169 	gint pid;
170 	gint uid;
171 	gint gid;
172 } MonoPeerCredData;
173 
174 /* Safely access Mono.Posix.PeerCredData from native code */
175 TYPED_HANDLE_DECL (MonoPeerCredData);
176 
177 gpointer
178 ves_icall_System_Net_Sockets_Socket_Socket_internal (MonoObjectHandle this_obj, gint32 family, gint32 type,
179 						     gint32 proto, gint32 *werror, MonoError *error);
180 
181 void
182 ves_icall_System_Net_Sockets_Socket_Close_internal (gsize sock, gint32 *werror, MonoError *error);
183 
184 gint32
185 ves_icall_System_Net_Sockets_SocketException_WSAGetLastError_internal (void);
186 
187 gint32
188 ves_icall_System_Net_Sockets_Socket_Available_internal (gsize sock, gint32 *werror, MonoError *error);
189 
190 void
191 ves_icall_System_Net_Sockets_Socket_Blocking_internal (gsize sock, gboolean block, gint32 *werror, MonoError *error);
192 
193 gpointer
194 ves_icall_System_Net_Sockets_Socket_Accept_internal (gsize sock, gint32 *werror, gboolean blocking, MonoError *error);
195 
196 void
197 ves_icall_System_Net_Sockets_Socket_Listen_internal (gsize sock, guint32 backlog, gint32 *werror, MonoError *error);
198 
199 MonoObjectHandle
200 ves_icall_System_Net_Sockets_Socket_LocalEndPoint_internal (gsize sock, gint32 af, gint32 *werror, MonoError *error);
201 
202 MonoObjectHandle
203 ves_icall_System_Net_Sockets_Socket_RemoteEndPoint_internal (gsize sock, gint32 af, gint32 *werror, MonoError *error);
204 
205 void
206 ves_icall_System_Net_Sockets_Socket_Bind_internal (gsize sock, MonoObjectHandle sockaddr, gint32 *werror, MonoError *error);
207 
208 void
209 ves_icall_System_Net_Sockets_Socket_Connect_internal (gsize sock, MonoObjectHandle sockaddr, gint32 *werror, gboolean blocking, MonoError *error);
210 
211 gint32
212 ves_icall_System_Net_Sockets_Socket_Receive_internal (gsize sock, gchar *buffer, gint32 count,
213 						      gint32 flags, gint32 *werror, gboolean blocking, MonoError *error);
214 
215 gint32
216 ves_icall_System_Net_Sockets_Socket_Receive_array_internal (gsize sock, WSABUF *buffers, gint32 count, gint32 flags,
217 							    gint32 *werror, gboolean blocking, MonoError *error);
218 
219 gint32
220 ves_icall_System_Net_Sockets_Socket_ReceiveFrom_internal (gsize sock, gchar *buffer, gint32 count,
221 							  gint32 flags, MonoObjectHandle sockaddr, gint32 *werror, gboolean blocking, MonoError *error);
222 
223 
224 gint32
225 ves_icall_System_Net_Sockets_Socket_Send_internal (gsize sock, gchar *buffer, gint32 count,
226 						   gint32 flags, gint32 *werror, gboolean blocking, MonoError *error);
227 
228 gint32
229 ves_icall_System_Net_Sockets_Socket_Send_array_internal (gsize sock, WSABUF *buffers, gint32 count, gint32 flags,
230 							 gint32 *werror, gboolean blocking, MonoError *error);
231 
232 gint32
233 ves_icall_System_Net_Sockets_Socket_SendTo_internal (gsize sock, gchar *buffer, gint32 count,
234 						     gint32 flags, MonoObjectHandle sockaddr, gint32 *werror,
235 						     gboolean blocking, MonoError *error);
236 
237 void
238 ves_icall_System_Net_Sockets_Socket_Select_internal (MonoArrayHandle sockets, gint32 timeout, gint32 *werror, MonoError *error);
239 
240 void
241 ves_icall_System_Net_Sockets_Socket_Shutdown_internal (gsize sock, gint32 how, gint32 *werror, MonoError *error);
242 
243 void
244 ves_icall_System_Net_Sockets_Socket_GetSocketOption_obj_internal (gsize sock, gint32 level, gint32 name,
245 								  MonoObjectHandle obj_val, gint32 *werror,
246 								  MonoError *error);
247 
248 void
249 ves_icall_System_Net_Sockets_Socket_GetSocketOption_arr_internal (gsize sock, gint32 level, gint32 name,
250 								  MonoArrayHandle byte_val, gint32 *werror,
251 								  MonoError *error);
252 
253 void
254 ves_icall_System_Net_Sockets_Socket_SetSocketOption_internal (gsize sock, gint32 level, gint32 name,
255 							      MonoObjectHandle obj_val, MonoArrayHandle byte_val,
256 							      gint32 int_val, gint32 *werror, MonoError *error);
257 
258 int
259 ves_icall_System_Net_Sockets_Socket_IOControl_internal (gsize sock, gint32 code,
260 							MonoArrayHandle input, MonoArrayHandle output,
261 							gint32 *werror, MonoError *error);
262 
263 MonoBoolean
264 ves_icall_System_Net_Dns_GetHostByName_internal (MonoStringHandle host, MonoStringHandleOut h_name,
265 						 MonoArrayHandleOut h_aliases, MonoArrayHandleOut h_addr_list,
266 						 gint32 hint, MonoError *error);
267 
268 MonoBoolean
269 ves_icall_System_Net_Dns_GetHostByAddr_internal (MonoStringHandle addr, MonoStringHandleOut h_name,
270 						 MonoArrayHandleOut h_aliases, MonoArrayHandleOut h_addr_list,
271 						 gint32 hint, MonoError *error);
272 
273 MonoBoolean
274 ves_icall_System_Net_Dns_GetHostName_internal (MonoStringHandleOut h_name, MonoError *error);
275 
276 MonoBoolean
277 ves_icall_System_Net_Sockets_Socket_Poll_internal (gsize sock, gint mode, gint timeout, gint32 *werror, MonoError *error);
278 
279 void
280 ves_icall_System_Net_Sockets_Socket_Disconnect_internal (gsize sock, MonoBoolean reuse, gint32 *werror, MonoError *error);
281 
282 MonoBoolean
283 ves_icall_System_Net_Sockets_Socket_Duplicate_internal (gpointer handle, gint32 targetProcessId, gpointer *duplicate_handle, gint32 *werror, MonoError *error);
284 
285 gboolean
286 ves_icall_System_Net_Sockets_Socket_SendFile_internal (gsize sock, MonoStringHandle filename,
287 						       MonoArrayHandle pre_buffer, MonoArrayHandle post_buffer,
288 						       gint flags, gint32 *werror, gboolean blocking, MonoError *error);
289 
290 void
291 icall_cancel_blocking_socket_operation (MonoThreadObjectHandle thread, MonoError *error);
292 
293 gboolean
294 ves_icall_System_Net_Sockets_Socket_SupportPortReuse (MonoProtocolType proto, MonoError *error);
295 
296 void
297 mono_network_init(void);
298 
299 void
300 mono_network_cleanup(void);
301 
302 #endif /* _MONO_METADATA_W32SOCKET_H_ */
303