13 unsigned long TCP_IPIdentification
;
15 #define MAX_DG_SIZE 0x10000
16 #define TI_DbgPrint(x,y) printf y
18 std::list
<std::string
> output_packets
;
20 typedef struct _CONNECTION_ENDPOINT
{
22 } CONNECTION_ENDPOINT
, *PCONNECTION_ENDPOINT
;
24 int TCPSocketState(void *ClientData
,
26 void *WhichConnection
,
28 PCONNECTION_ENDPOINT Connection
= (PCONNECTION_ENDPOINT
)WhichConnection
;
31 TI_DbgPrint(MID_TRACE
,("Called: NewState %x\n", NewState
));
34 TI_DbgPrint(MID_TRACE
,("Socket closing.\n"));
38 if( (NewState
& SEL_CONNECT
) &&
39 !(Connection
->State
& SEL_CONNECT
) ) {
40 } else if( (NewState
& SEL_READ
) || (NewState
& SEL_FIN
) ) {
46 #define STRINGIFY(x) #x
48 int TCPPacketSend(void *ClientData
, OSK_PCHAR data
, OSK_UINT len
) {
49 output_packets
.push_back( std::string( (char *)data
, (int)len
) );
53 struct ifaddr
*TCPFindInterface( void *ClientData
,
56 struct sockaddr
*ReqAddr
) {
60 void *TCPMalloc( void *ClientData
,
61 OSK_UINT Bytes
, OSK_PCHAR File
, OSK_UINT Line
) {
62 return malloc( Bytes
);
65 void TCPFree( void *ClientData
,
66 void *data
, OSK_PCHAR File
, OSK_UINT Line
) {
70 int TCPSleep( void *ClientData
, void *token
, int priority
, char *msg
,
73 PSLEEPING_THREAD SleepingThread
;
75 TI_DbgPrint(MID_TRACE
,
76 ("Called TSLEEP: tok = %x, pri = %d, wmesg = %s, tmio = %x\n",
77 token
, priority
, msg
, tmio
));
79 SleepingThread
= ExAllocatePool( NonPagedPool
, sizeof( *SleepingThread
) );
80 if( SleepingThread
) {
81 KeInitializeEvent( &SleepingThread
->Event
, NotificationEvent
, FALSE
);
82 SleepingThread
->SleepToken
= token
;
84 ExAcquireFastMutex( &SleepingThreadsLock
);
85 InsertTailList( &SleepingThreadsList
, &SleepingThread
->Entry
);
86 ExReleaseFastMutex( &SleepingThreadsLock
);
88 TI_DbgPrint(MID_TRACE
,("Waiting on %x\n", token
));
89 KeWaitForSingleObject( &SleepingThread
->Event
,
95 ExAcquireFastMutex( &SleepingThreadsLock
);
96 RemoveEntryList( &SleepingThread
->Entry
);
97 ExReleaseFastMutex( &SleepingThreadsLock
);
99 ExFreePool( SleepingThread
);
101 TI_DbgPrint(MID_TRACE
,("Waiting finished: %x\n", token
));
106 void TCPWakeup( void *ClientData
, void *token
) {
109 PSLEEPING_THREAD SleepingThread
;
111 ExAcquireFastMutex( &SleepingThreadsLock
);
112 Entry
= SleepingThreadsList
.Flink
;
113 while( Entry
!= &SleepingThreadsList
) {
114 SleepingThread
= CONTAINING_RECORD(Entry
, SLEEPING_THREAD
, Entry
);
115 TI_DbgPrint(MID_TRACE
,("Sleeper @ %x\n", SleepingThread
));
116 if( SleepingThread
->SleepToken
== token
) {
117 TI_DbgPrint(MID_TRACE
,("Setting event to wake %x\n", token
));
118 KeSetEvent( &SleepingThread
->Event
, IO_NETWORK_INCREMENT
, FALSE
);
120 Entry
= Entry
->Flink
;
122 ExReleaseFastMutex( &SleepingThreadsLock
);
126 OSKITTCP_EVENT_HANDLERS EventHandlers
= {
137 int main( int argc
, char **argv
) {
138 int asock
= INVALID_SOCKET
, selret
, dgrecv
, fromsize
, err
, port
= 5000;
139 char datagram
[MAX_DG_SIZE
];
142 struct sockaddr_in addr_from
= { AF_INET
};
143 std::list
<std::string
>::iterator i
;
145 if( argc
> 1 ) port
= atoi(argv
[1]);
147 RegisterOskitTCPEventHandlers( &EventHandlers
);
150 asock
= socket( AF_INET
, SOCK_DGRAM
, 0 );
152 addr_from
.sin_port
= htons( port
);
154 if( bind( asock
, (struct sockaddr
*)&addr_from
, sizeof( addr_from
) ) ) {
155 printf( "Bind error\n" );
161 FD_SET( asock
, &readf
);
164 selret
= select( asock
+ 1, &readf
, NULL
, NULL
, &tv
);
166 if( FD_ISSET( asock
, &readf
) ) {
167 fromsize
= sizeof( addr_from
);
168 dgrecv
= recvfrom( asock
, datagram
, sizeof(datagram
), 0,
169 (struct sockaddr
*)&addr_from
, &fromsize
);
172 OskitTCPReceiveDatagram( (unsigned char *)datagram
,
175 printf( "OskitTCPReceiveDatagram: %d\n", err
);
181 for( i
= output_packets
.begin(); i
!= output_packets
.end(); i
++ ) {
182 err
= sendto( asock
, i
->c_str(), i
->size(), 0,
183 (struct sockaddr
*)&addr_from
, sizeof(addr_from
) );
186 printf( "sendto: %d\n", err
);
189 output_packets
.clear();