5 typedef unsigned short u_short
;
12 char hwaddr
[6] = { 0x08, 0x00, 0x20, 0x0b, 0xb7, 0xbb };
17 unsigned long TCP_IPIdentification
;
19 #define MAX_DG_SIZE 0x10000
20 #define TI_DbgPrint(x,y) printf y
22 std::list
<std::string
> output_packets
;
24 typedef struct _CONNECTION_ENDPOINT
{
26 } CONNECTION_ENDPOINT
, *PCONNECTION_ENDPOINT
;
28 int TCPSocketState(void *ClientData
,
30 void *WhichConnection
,
32 PCONNECTION_ENDPOINT Connection
= (PCONNECTION_ENDPOINT
)WhichConnection
;
35 TI_DbgPrint(MID_TRACE
,("Called: NewState %x\n", NewState
));
38 TI_DbgPrint(MID_TRACE
,("Socket closing.\n"));
42 if( (NewState
& SEL_CONNECT
) &&
43 !(Connection
->State
& SEL_CONNECT
) ) {
44 } else if( (NewState
& SEL_READ
) || (NewState
& SEL_FIN
) ) {
50 #define STRINGIFY(x) #x
52 char hdr
[14] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
53 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
56 int TCPPacketSend(void *ClientData
, OSK_PCHAR data
, OSK_UINT len
) {
57 output_packets
.push_back( std::string( hdr
, 14 ) +
58 std::string( (char *)data
, (int)len
) );
62 struct ifaddr
*TCPFindInterface( void *ClientData
,
65 struct sockaddr
*ReqAddr
) {
66 static struct sockaddr_in ifa
= { AF_INET
}, nm
= { AF_INET
};
67 static struct ifaddr a
= {
68 (struct sockaddr
*)&ifa
,
70 (struct sockaddr
*)&nm
,
76 ifa
.sin_addr
.s_addr
= inet_addr( "10.10.2.115" );
77 nm
.sin_addr
.s_addr
= inet_addr( "255.255.255.0" );
81 void *TCPMalloc( void *ClientData
,
82 OSK_UINT Bytes
, OSK_PCHAR File
, OSK_UINT Line
) {
83 void *v
= malloc( Bytes
);
84 fprintf( stderr
, "(%s:%d) malloc( %d ) => %x\n", File
, Line
, Bytes
, v
);
88 void TCPFree( void *ClientData
,
89 void *data
, OSK_PCHAR File
, OSK_UINT Line
) {
90 fprintf( stderr
, "(%s:%d) free( %x )\n", File
, Line
, data
);
94 int TCPSleep( void *ClientData
, void *token
, int priority
, char *msg
,
97 PSLEEPING_THREAD SleepingThread
;
99 TI_DbgPrint(MID_TRACE
,
100 ("Called TSLEEP: tok = %x, pri = %d, wmesg = %s, tmio = %x\n",
101 token
, priority
, msg
, tmio
));
103 SleepingThread
= ExAllocatePool( NonPagedPool
, sizeof( *SleepingThread
) );
104 if( SleepingThread
) {
105 KeInitializeEvent( &SleepingThread
->Event
, NotificationEvent
, FALSE
);
106 SleepingThread
->SleepToken
= token
;
108 ExAcquireFastMutex( &SleepingThreadsLock
);
109 InsertTailList( &SleepingThreadsList
, &SleepingThread
->Entry
);
110 ExReleaseFastMutex( &SleepingThreadsLock
);
112 TI_DbgPrint(MID_TRACE
,("Waiting on %x\n", token
));
113 KeWaitForSingleObject( &SleepingThread
->Event
,
119 ExAcquireFastMutex( &SleepingThreadsLock
);
120 RemoveEntryList( &SleepingThread
->Entry
);
121 ExReleaseFastMutex( &SleepingThreadsLock
);
123 ExFreePool( SleepingThread
);
125 TI_DbgPrint(MID_TRACE
,("Waiting finished: %x\n", token
));
130 void TCPWakeup( void *ClientData
, void *token
) {
133 PSLEEPING_THREAD SleepingThread
;
135 ExAcquireFastMutex( &SleepingThreadsLock
);
136 Entry
= SleepingThreadsList
.Flink
;
137 while( Entry
!= &SleepingThreadsList
) {
138 SleepingThread
= CONTAINING_RECORD(Entry
, SLEEPING_THREAD
, Entry
);
139 TI_DbgPrint(MID_TRACE
,("Sleeper @ %x\n", SleepingThread
));
140 if( SleepingThread
->SleepToken
== token
) {
141 TI_DbgPrint(MID_TRACE
,("Setting event to wake %x\n", token
));
142 KeSetEvent( &SleepingThread
->Event
, IO_NETWORK_INCREMENT
, FALSE
);
144 Entry
= Entry
->Flink
;
146 ExReleaseFastMutex( &SleepingThreadsLock
);
150 OSKITTCP_EVENT_HANDLERS EventHandlers
= {
161 void display_row( char *data
, int off
, int len
) {
164 printf( "%08x:", off
);
165 for( i
= off
; i
< len
&& i
< off
+ 16; i
++ ) {
166 printf( " %02x", data
[i
] & 0xff );
171 for( i
= off
; i
< len
&& i
< off
+ 16; i
++ ) {
172 printf( "%c", (data
[i
] >= ' ') ? data
[i
] : '.' );
178 int main( int argc
, char **argv
) {
179 int asock
= INVALID_SOCKET
, selret
, dgrecv
, fromsize
, err
, port
= 5001;
180 char datagram
[MAX_DG_SIZE
];
184 struct sockaddr_in addr_from
= { AF_INET
}, addr_to
;
185 std::list
<std::string
>::iterator i
;
188 WSAStartup( 0x101, &wsadata
);
190 if( argc
> 1 ) port
= atoi(argv
[1]);
192 RegisterOskitTCPEventHandlers( &EventHandlers
);
195 asock
= socket( AF_INET
, SOCK_DGRAM
, 0 );
197 addr_from
.sin_port
= htons( port
);
199 if( bind( asock
, (struct sockaddr
*)&addr_from
, sizeof( addr_from
) ) ) {
200 printf( "Bind error\n" );
206 FD_SET( asock
, &readf
);
209 selret
= select( asock
+ 1, &readf
, NULL
, NULL
, &tv
);
211 if( FD_ISSET( asock
, &readf
) ) {
212 fromsize
= sizeof( addr_from
);
213 dgrecv
= recvfrom( asock
, datagram
, sizeof(datagram
), 0,
214 (struct sockaddr
*)&addr_from
, &fromsize
);
216 if( datagram
[0] == 'C' && datagram
[1] == 'M' &&
217 datagram
[2] == 'D' && datagram
[3] == ' ' ) {
218 int theport
, bytes
, recvret
, off
, bytin
;
219 struct sockaddr_in nam
;
220 std::string faddr
, word
;
222 cmdin( std::string( datagram
+ 4, dgrecv
- 4 ) );
226 if( word
== "socket" ) {
227 cmdin
>> faddr
>> theport
;
229 nam
.sin_family
= AF_INET
;
230 nam
.sin_addr
.s_addr
= inet_addr(faddr
.c_str());
231 nam
.sin_port
= htons(theport
);
233 if( (err
= OskitTCPSocket( NULL
, &conn
, AF_INET
,
234 SOCK_STREAM
, 0 )) != 0 ) {
235 fprintf( stderr
, "OskitTCPSocket: error %d\n", err
);
238 if( (err
= OskitTCPConnect( conn
, NULL
, &nam
,
239 sizeof(nam
) )) != 0 ) {
240 fprintf( stderr
, "OskitTCPConnect: error %d\n", err
);
242 printf( "Socket created\n" );
244 } else if( word
== "recv" ) {
247 if( (err
= OskitTCPRecv( conn
, (OSK_PCHAR
)datagram
,
249 (unsigned int *)&bytin
, 0 )) != 0 ) {
250 fprintf( stderr
, "OskitTCPRecv: error %d\n", err
);
252 for( off
= 0; off
< bytin
; off
+= 16 ) {
253 display_row( datagram
, off
, bytin
);
257 } else if( word
== "send" ) {
259 while( cmdin
>> word
) {
261 atoi( (std::string("0x") + word
).c_str() );
264 if( (err
= OskitTCPSend( conn
, (OSK_PCHAR
)datagram
,
265 off
, (OSK_UINT
*)&bytin
, 0 ))
267 fprintf( stderr
, "OskitTCPConnect: error %d\n", err
);
269 printf( "wrote %d bytes\n", bytin
);
271 } else if( word
== "close" ) {
272 OskitTCPClose( conn
);
274 } else if( dgrecv
> 14 ) {
277 if( datagram
[12] == 8 && datagram
[13] == 6 ) {
278 /* Answer arp query */
280 /* Mark patch as to the previous sender */
281 memcpy( datagram
+ 32, datagram
+ 6, 6 );
282 memcpy( datagram
, datagram
+ 6, 6 );
283 /* Mark packet as from us */
284 memcpy( datagram
+ 22, hwaddr
, 6 );
285 memcpy( datagram
+ 6, hwaddr
, 6 );
286 /* Swap inet addresses */
287 memcpy( laddr
, datagram
+ 28, 4 );
288 memcpy( datagram
+ 28, datagram
+ 38, 4 );
289 memcpy( datagram
+ 38, laddr
, 4 );
290 /* Set reply opcode */
293 err
= sendto( asock
, datagram
, dgrecv
, 0,
294 (struct sockaddr
*)&addr_to
,
298 printf( "sendto: %d\n", err
);
300 memcpy( hdr
, datagram
+ 6, 6 );
301 memcpy( hdr
+ 6, datagram
, 6 );
302 memcpy( hdr
+ 12, datagram
+ 12, 2 );
303 OskitTCPReceiveDatagram
304 ( (unsigned char *)datagram
+ 14,
312 for( i
= output_packets
.begin(); i
!= output_packets
.end(); i
++ ) {
313 err
= sendto( asock
, i
->c_str(), i
->size(), 0,
314 (struct sockaddr
*)&addr_to
, sizeof(addr_to
) );
316 fprintf( stderr
, "** SENDING PACKET %d bytes **\n", i
->size() );
319 printf( "sendto: %d\n", err
);
322 output_packets
.clear();