- Implement OskitTCPGetSocketError which retreives so->so_error
[reactos.git] / reactos / lib / drivers / oskittcp / include / oskittcp.h
1 #ifndef OSKITTCP_H
2 #define OSKITTCP_H
3
4 #ifdef linux
5 #include <netinet/in.h>
6 #endif
7
8 #ifdef KERNEL
9 #include <sys/param.h>
10 #include <sys/systm.h>
11 #include <sys/malloc.h>
12 #include <sys/mbuf.h>
13 #include <sys/protosw.h>
14 #include <sys/socket.h>
15 #include <sys/socketvar.h>
16 #include <sys/errno.h>
17 #include <sys/queue.h>
18 #include <sys/kernel.h>
19
20 #include <net/if.h>
21 #include <net/route.h>
22
23 #include <netinet/in.h>
24 #include <netinet/in_systm.h>
25 #include <netinet/ip.h>
26 #include <netinet/in_pcb.h>
27 #include <netinet/ip_var.h>
28 #include <netinet/tcp.h>
29 #include <netinet/tcp_fsm.h>
30 #include <netinet/tcp_seq.h>
31 #include <netinet/tcp_timer.h>
32 #include <netinet/tcp_var.h>
33 #include <netinet/tcpip.h>
34
35 struct connect_args {
36 int s;
37 caddr_t name;
38 int namelen;
39 };
40 #endif
41
42 #include <oskittypes.h>
43
44 #define IPHDR_SIZE 20
45 #define SEL_CONNECT 1
46 #define SEL_FIN 2
47 #define SEL_RST 4
48 #define SEL_ABRT 8
49 #define SEL_READ 16
50 #define SEL_WRITE 32
51 #define SEL_ACCEPT 64
52 #define SEL_OOB 128
53 #define SEL_ERROR 256
54 #define SEL_FINOUT 512
55
56 typedef int (*OSKITTCP_SOCKET_STATE)
57 ( void *ClientData,
58 void *WhichSocket,
59 void *WhichConnection,
60 OSK_UINT NewState );
61
62 typedef int (*OSKITTCP_SEND_PACKET)
63 ( void *ClientData,
64 OSK_PCHAR Data,
65 OSK_UINT Len );
66
67 typedef struct ifaddr *(*OSKITTCP_FIND_INTERFACE)
68 ( void *ClientData,
69 OSK_UINT AddrType,
70 OSK_UINT FindType,
71 struct sockaddr *ReqAddr );
72
73 typedef void *(*OSKITTCP_MALLOC)
74 ( void *ClientData,
75 OSK_UINT Bytes,
76 OSK_PCHAR File,
77 OSK_UINT Line );
78
79 typedef void (*OSKITTCP_FREE)
80 ( void *ClientData,
81 void *data,
82 OSK_PCHAR File,
83 OSK_UINT Line );
84
85 typedef int (*OSKITTCP_SLEEP)
86 ( void *ClientData, void *token, int priority, char *msg, int tmio );
87
88 typedef void (*OSKITTCP_WAKEUP)( void *ClientData, void *token );
89
90 typedef struct _OSKITTCP_EVENT_HANDLERS {
91 void *ClientData;
92 OSKITTCP_SOCKET_STATE SocketState;
93 OSKITTCP_SEND_PACKET PacketSend;
94 OSKITTCP_FIND_INTERFACE FindInterface;
95 OSKITTCP_MALLOC TCPMalloc;
96 OSKITTCP_FREE TCPFree;
97 OSKITTCP_SLEEP Sleep;
98 OSKITTCP_WAKEUP Wakeup;
99 } OSKITTCP_EVENT_HANDLERS, *POSKITTCP_EVENT_HANDLERS;
100
101 extern OSKITTCP_EVENT_HANDLERS OtcpEvent;
102
103 extern void InitOskitTCP();
104 extern void DeinitOskitTCP();
105 extern void TimerOskitTCP( int FastTimer, int SlowTimer );
106 extern void OskitDumpBuffer( OSK_PCHAR Data, OSK_UINT Len );
107 extern int OskitTCPShutdown( void *socket, int disconn_type );
108 extern int OskitTCPSocket( void *Connection, void **ConnectionContext,
109 int Af, int Type, int Proto );
110 extern void RegisterOskitTCPEventHandlers
111 ( POSKITTCP_EVENT_HANDLERS EventHandlers );
112 extern void OskitTCPReceiveDatagram( OSK_PCHAR Data, OSK_UINT Len,
113 OSK_UINT IpHeaderLen );
114 extern int OskitTCPReceive( void *socket,
115 void *Addr,
116 OSK_PCHAR Data,
117 OSK_UINT Len,
118 OSK_UINT *OutLen,
119 OSK_UINT Flags );
120 extern int OskitTCPSend( void *socket,
121 OSK_PCHAR Data,
122 OSK_UINT Len,
123 OSK_UINT *OutLen,
124 OSK_UINT Flags );
125
126 extern int OskitTCPConnect( void *socket,
127 void *nam, OSK_UINT namelen );
128 extern int OskitTCPClose( void *socket );
129
130 extern int OskitTCPBind( void *socket,
131 void *nam, OSK_UINT namelen );
132
133 extern int OskitTCPAccept( void *socket, void **new_socket,
134 void *context, void *addr_out,
135 OSK_UINT addr_len,
136 OSK_UINT *out_addr_len,
137 OSK_UINT finish_accept );
138
139 extern int OskitTCPListen( void *socket, int backlog );
140
141 extern int OskitTCPRecv( void *connection,
142 OSK_PCHAR Data,
143 OSK_UINT Len,
144 OSK_UINT *OutLen,
145 OSK_UINT Flags );
146
147 int OskitTCPGetAddress( void *socket,
148 OSK_UINT *LocalAddress,
149 OSK_UI16 *LocalPort,
150 OSK_UINT *RemoteAddress,
151 OSK_UI16 *RemotePort );
152
153 int OskitTCPGetSockOpt(void *socket,
154 int level,
155 int optname,
156 char *buffer,
157 int *size);
158
159 int OskitTCPSetSockOpt(void *socket,
160 int level,
161 int optname,
162 char *buffer,
163 int size);
164
165 int OskitTCPDisconnect(void *socket);
166
167 int OskitTCPGetSocketError(void *socket);
168
169 #undef errno
170
171 void *fbsd_malloc( unsigned int bytes, char *file, unsigned line, ... );
172 void fbsd_free( void *data, char *file, unsigned line, ... );
173 #if 0
174 #define malloc(x) fbsd_malloc(x,__FILE__,__LINE__)
175 #define free(x) fbsd_free(x,__FILE__,__LINE__)
176 #endif
177 #define kern_malloc(x,y,z) kern_malloc_needs_definition(x,y,z)
178 #define kern_free(x,y,z) kern_free_needs_definition(x,w,z)
179
180 /* Error codes */
181 #include <oskiterrno.h>
182
183 #define SOCK_MAXADDRLEN 255
184
185 #define OSK_MSG_OOB 0x01
186 #define OSK_MSG_PEEK 0x02
187 #define OSK_MSG_DONTWAIT 0x80
188
189 #define FREAD 0x0001
190 #define FWRITE 0x0002
191
192 /* Don't define this unless your are insane or aicom */
193 //#define LOCK_SPAM
194
195 #ifdef LOCK_SPAM
196 #define OSKLock() if (!KeTryToAcquireSpinLockAtDpcLevel(&OSKLock)) \
197 { \
198 DbgPrint("OSKLock WAIT (%s)\n", __FUNCTION__); \
199 KeAcquireSpinLockAtDpcLevel(&OSKLock); \
200 } \
201 DbgPrint("OSKLock >>>> (%s)\n", __FUNCTION__)
202
203 #define OSKUnlock() KeReleaseSpinLockFromDpcLevel(&OSKLock); \
204 DbgPrint("OSKLock <<<< (%s)\n", __FUNCTION__)
205 #else
206 #define OSKLock() KeAcquireSpinLockAtDpcLevel(&OSKLock)
207 #define OSKUnlock() KeReleaseSpinLockFromDpcLevel(&OSKLock)
208 #endif
209
210 #define OSKLockAndRaise(x) KeRaiseIrql(DISPATCH_LEVEL, x); \
211 OSKLock()
212 #define OSKUnlockAndLower(x) OSKUnlock(); \
213 KeLowerIrql(x)
214
215 #endif/*OSKITTCP_H*/