mirror of
https://github.com/reactos/reactos.git
synced 2025-07-05 04:11:22 +00:00
afd/connect.c:
- only pend the irp if we got a pending return from tcpip. afd/info.c: - info stub for blocking mode info. afd/main.c: - added disconnect plumbing. - some reformatting, add break after each inactive case. afd/read.c: - early return for already closed socket. - function to correctly complete pending recv irps on a closed socket. - fixed read completion bug, content properly zeroed before buffer is replenished. - only attempt to fulfill read irps if we got data back. - call ProcessClose in the no data case. - major changes to AfdConnectedSocketRead due to connection close. we now recognize the case where the request to tcpip returns zero bytes immediately and take action, doing processclose. afd/tdi.c: - Added TdiDisconnect. route.c: - router: fixed routing bug. we used to reject the default route if the address didn't match at least one bit of the target network, even if the netmask is zero. if.c: - change RouterGetRoute to RouteGetRouteToDestination tcp.c: - simplify TCPReceiveData by removing eof clause. not needed. - added SEL_FIN branch in signalling. - added TCPTranslateError to TCPConnect - added TCPDisconnect dispatch.c: - Implement disconnect ip_output.c: - Make a contiguous area from each output packet. We need to streamline this. msafd: - Added MsafdReturnWithErrno - streamlined function returns with standardize errno selection. svn path=/trunk/; revision=11933
This commit is contained in:
parent
b0145a85fe
commit
e6c94e606c
22 changed files with 496 additions and 279 deletions
|
@ -250,7 +250,7 @@ PNEIGHBOR_CACHE_ENTRY RouterGetRoute(PIP_ADDRESS Destination)
|
||||||
TI_DbgPrint(DEBUG_ROUTER,("This-Route: %s (Sharing %d bits)\n",
|
TI_DbgPrint(DEBUG_ROUTER,("This-Route: %s (Sharing %d bits)\n",
|
||||||
A2S(&NCE->Address), Length));
|
A2S(&NCE->Address), Length));
|
||||||
|
|
||||||
if(Length >= MaskLength && Length > BestLength) {
|
if(Length >= MaskLength && (Length > BestLength || !BestLength)) {
|
||||||
/* This seems to be a better router */
|
/* This seems to be a better router */
|
||||||
BestNCE = NCE;
|
BestNCE = NCE;
|
||||||
BestLength = Length;
|
BestLength = Length;
|
||||||
|
@ -308,7 +308,7 @@ PNEIGHBOR_CACHE_ENTRY RouteGetRouteToDestination(PIP_ADDRESS Destination)
|
||||||
}
|
}
|
||||||
|
|
||||||
if( NCE )
|
if( NCE )
|
||||||
TI_DbgPrint(MID_TRACE,("Interface->MTU: %d\n", NCE->Interface->MTU));
|
TI_DbgPrint(DEBUG_ROUTER,("Interface->MTU: %d\n", NCE->Interface->MTU));
|
||||||
|
|
||||||
return NCE;
|
return NCE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -66,14 +66,17 @@ int TCPPacketSend(void *ClientData, OSK_PCHAR data, OSK_UINT len ) {
|
||||||
RemoteAddress.Type = IP_ADDRESS_V4;
|
RemoteAddress.Type = IP_ADDRESS_V4;
|
||||||
RemoteAddress.Address.IPv4Address = Header->DstAddr;
|
RemoteAddress.Address.IPv4Address = Header->DstAddr;
|
||||||
} else {
|
} else {
|
||||||
DbgPrint("Don't currently handle IPv6\n");
|
TI_DbgPrint(MIN_TRACE,("Outgoing packet is not IPv4\n"));
|
||||||
KeBugCheck(4);
|
OskitDumpBuffer( data, len );
|
||||||
|
return OSK_EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
RemoteAddress.Type = LocalAddress.Type = IP_ADDRESS_V4;
|
RemoteAddress.Type = LocalAddress.Type = IP_ADDRESS_V4;
|
||||||
|
|
||||||
if(!(NCE = RouteGetRouteToDestination( &RemoteAddress )))
|
if(!(NCE = RouteGetRouteToDestination( &RemoteAddress ))) {
|
||||||
|
TI_DbgPrint(MIN_TRACE,("No route to %s\n", A2S(&RemoteAddress)));
|
||||||
return OSK_EADDRNOTAVAIL;
|
return OSK_EADDRNOTAVAIL;
|
||||||
|
}
|
||||||
|
|
||||||
NdisStatus = AllocatePacketWithBuffer( &Packet.NdisPacket, NULL,
|
NdisStatus = AllocatePacketWithBuffer( &Packet.NdisPacket, NULL,
|
||||||
MaxLLHeaderSize + len );
|
MaxLLHeaderSize + len );
|
||||||
|
|
|
@ -38,7 +38,7 @@ PVOID TCPPrepareInterface( PIP_INTERFACE IF ) {
|
||||||
struct sockaddr_in *dstaddr_in = (struct sockaddr_in *)&addr_in[1];
|
struct sockaddr_in *dstaddr_in = (struct sockaddr_in *)&addr_in[1];
|
||||||
if( !ifaddr ) return NULL;
|
if( !ifaddr ) return NULL;
|
||||||
|
|
||||||
TI_DbgPrint(MID_TRACE,("Called\n"));
|
TI_DbgPrint(DEBUG_TCPIF,("Called\n"));
|
||||||
|
|
||||||
ifaddr->ifa_dstaddr = (struct sockaddr *)dstaddr_in;
|
ifaddr->ifa_dstaddr = (struct sockaddr *)dstaddr_in;
|
||||||
/* XXX - Point-to-point interfaces not supported yet */
|
/* XXX - Point-to-point interfaces not supported yet */
|
||||||
|
@ -52,7 +52,7 @@ PVOID TCPPrepareInterface( PIP_INTERFACE IF ) {
|
||||||
if( !NT_SUCCESS(Status) )
|
if( !NT_SUCCESS(Status) )
|
||||||
addr_in->sin_addr.s_addr = 0;
|
addr_in->sin_addr.s_addr = 0;
|
||||||
|
|
||||||
TI_DbgPrint(MID_TRACE,("Prepare interface %x : addr %x\n",
|
TI_DbgPrint(DEBUG_TCPIF,("Prepare interface %x : addr %x\n",
|
||||||
IF, addr_in->sin_addr.s_addr));
|
IF, addr_in->sin_addr.s_addr));
|
||||||
|
|
||||||
ifaddr->ifa_flags = 0; /* XXX what goes here? */
|
ifaddr->ifa_flags = 0; /* XXX what goes here? */
|
||||||
|
@ -60,7 +60,7 @@ PVOID TCPPrepareInterface( PIP_INTERFACE IF ) {
|
||||||
ifaddr->ifa_metric = 1; /* We can get it like in ninfo.c, if we want */
|
ifaddr->ifa_metric = 1; /* We can get it like in ninfo.c, if we want */
|
||||||
ifaddr->ifa_mtu = IF->MTU;
|
ifaddr->ifa_mtu = IF->MTU;
|
||||||
|
|
||||||
TI_DbgPrint(MID_TRACE,("Leaving\n"));
|
TI_DbgPrint(DEBUG_TCPIF,("Leaving\n"));
|
||||||
|
|
||||||
return ifaddr;
|
return ifaddr;
|
||||||
}
|
}
|
||||||
|
@ -74,34 +74,34 @@ POSK_IFADDR TCPFindInterface( void *ClientData,
|
||||||
IP_ADDRESS Destination;
|
IP_ADDRESS Destination;
|
||||||
struct sockaddr_in *addr_in = (struct sockaddr_in *)ReqAddr;
|
struct sockaddr_in *addr_in = (struct sockaddr_in *)ReqAddr;
|
||||||
|
|
||||||
TI_DbgPrint(MID_TRACE,("called for type %d\n", FindType));
|
TI_DbgPrint(DEBUG_TCPIF,("called for type %d\n", FindType));
|
||||||
|
|
||||||
if( !ReqAddr ) {
|
if( !ReqAddr ) {
|
||||||
TI_DbgPrint(MID_TRACE,("no addr or no ifaddr (%x)\n", ReqAddr));
|
TI_DbgPrint(DEBUG_TCPIF,("no addr or no ifaddr (%x)\n", ReqAddr));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
Destination.Type = IP_ADDRESS_V4;
|
Destination.Type = IP_ADDRESS_V4;
|
||||||
Destination.Address.IPv4Address = addr_in->sin_addr.s_addr;
|
Destination.Address.IPv4Address = addr_in->sin_addr.s_addr;
|
||||||
|
|
||||||
TI_DbgPrint(MID_TRACE,("Address is %x\n", addr_in->sin_addr.s_addr));
|
TI_DbgPrint(DEBUG_TCPIF,("Address is %x\n", addr_in->sin_addr.s_addr));
|
||||||
|
|
||||||
NCE = RouterGetRoute(&Destination);
|
NCE = RouteGetRouteToDestination(&Destination);
|
||||||
|
|
||||||
if( !NCE || !NCE->Interface ) {
|
if( !NCE || !NCE->Interface ) {
|
||||||
TI_DbgPrint(MID_TRACE,("no neighbor cache or no interface (%x %x)\n",
|
TI_DbgPrint(DEBUG_TCPIF,("no neighbor cache or no interface (%x %x)\n",
|
||||||
NCE, NCE ? NCE->Interface : 0));
|
NCE, NCE ? NCE->Interface : 0));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
TI_DbgPrint(MID_TRACE,("NCE: %x\n", NCE));
|
TI_DbgPrint(DEBUG_TCPIF,("NCE: %x\n", NCE));
|
||||||
TI_DbgPrint(MID_TRACE,("NCE->Interface: %x\n", NCE->Interface));
|
TI_DbgPrint(DEBUG_TCPIF,("NCE->Interface: %x\n", NCE->Interface));
|
||||||
TI_DbgPrint(MID_TRACE,("NCE->Interface->TCPContext: %x\n",
|
TI_DbgPrint(DEBUG_TCPIF,("NCE->Interface->TCPContext: %x\n",
|
||||||
NCE->Interface->TCPContext));
|
NCE->Interface->TCPContext));
|
||||||
|
|
||||||
addr_in = (struct sockaddr_in *)
|
addr_in = (struct sockaddr_in *)
|
||||||
((POSK_IFADDR)NCE->Interface->TCPContext)->ifa_addr;
|
((POSK_IFADDR)NCE->Interface->TCPContext)->ifa_addr;
|
||||||
TI_DbgPrint(MID_TRACE,("returning addr %x\n", addr_in->sin_addr.s_addr));
|
TI_DbgPrint(DEBUG_TCPIF,("returning addr %x\n", addr_in->sin_addr.s_addr));
|
||||||
|
|
||||||
return NCE->Interface->TCPContext;
|
return NCE->Interface->TCPContext;
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,7 +24,9 @@ static VOID HandleSignalledConnection( PCONNECTION_ENDPOINT Connection,
|
||||||
PTCP_COMPLETION_ROUTINE Complete;
|
PTCP_COMPLETION_ROUTINE Complete;
|
||||||
PTDI_BUCKET Bucket;
|
PTDI_BUCKET Bucket;
|
||||||
PLIST_ENTRY Entry;
|
PLIST_ENTRY Entry;
|
||||||
|
BOOLEAN CompletedOne = FALSE;
|
||||||
|
|
||||||
|
/* Things that can happen when we try the initial connection */
|
||||||
if( ((NewState & SEL_CONNECT) || (NewState & SEL_FIN)) &&
|
if( ((NewState & SEL_CONNECT) || (NewState & SEL_FIN)) &&
|
||||||
|
|
||||||
!(Connection->State & (SEL_CONNECT | SEL_FIN)) ) {
|
!(Connection->State & (SEL_CONNECT | SEL_FIN)) ) {
|
||||||
|
@ -41,8 +43,10 @@ static VOID HandleSignalledConnection( PCONNECTION_ENDPOINT Connection,
|
||||||
PoolFreeBuffer( Bucket );
|
PoolFreeBuffer( Bucket );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if( (NewState & SEL_READ) || (NewState & SEL_FIN) ) {
|
|
||||||
TI_DbgPrint(DEBUG_TCP,("Readable (or closed): irp list %s\n",
|
/* Things that happen after we're connected */
|
||||||
|
if( (NewState & SEL_READ) ) {
|
||||||
|
TI_DbgPrint(DEBUG_TCP,("Readable: irp list %s\n",
|
||||||
IsListEmpty(&Connection->ReceiveRequest) ?
|
IsListEmpty(&Connection->ReceiveRequest) ?
|
||||||
"empty" : "nonempty"));
|
"empty" : "nonempty"));
|
||||||
|
|
||||||
|
@ -72,29 +76,23 @@ static VOID HandleSignalledConnection( PCONNECTION_ENDPOINT Connection,
|
||||||
TI_DbgPrint(DEBUG_TCP,
|
TI_DbgPrint(DEBUG_TCP,
|
||||||
("Reading %d bytes to %x\n", RecvLen, RecvBuffer));
|
("Reading %d bytes to %x\n", RecvLen, RecvBuffer));
|
||||||
|
|
||||||
if( (NewState & SEL_FIN) && !RecvLen ) {
|
TI_DbgPrint(DEBUG_TCP, ("Connection: %x\n", Connection));
|
||||||
TI_DbgPrint(DEBUG_TCP, ("EOF From socket\n"));
|
TI_DbgPrint
|
||||||
Status = STATUS_END_OF_FILE;
|
(DEBUG_TCP,
|
||||||
Received = 0;
|
("Connection->SocketContext: %x\n",
|
||||||
} else {
|
Connection->SocketContext));
|
||||||
TI_DbgPrint(DEBUG_TCP, ("Connection: %x\n", Connection));
|
TI_DbgPrint(DEBUG_TCP, ("RecvBuffer: %x\n", RecvBuffer));
|
||||||
TI_DbgPrint
|
|
||||||
(DEBUG_TCP,
|
|
||||||
("Connection->SocketContext: %x\n",
|
|
||||||
Connection->SocketContext));
|
|
||||||
TI_DbgPrint(DEBUG_TCP, ("RecvBuffer: %x\n", RecvBuffer));
|
|
||||||
|
|
||||||
Status = TCPTranslateError
|
Status = TCPTranslateError
|
||||||
( OskitTCPRecv( Connection->SocketContext,
|
( OskitTCPRecv( Connection->SocketContext,
|
||||||
RecvBuffer,
|
RecvBuffer,
|
||||||
RecvLen,
|
RecvLen,
|
||||||
&Received,
|
&Received,
|
||||||
0 ) );
|
0 ) );
|
||||||
}
|
|
||||||
|
|
||||||
TI_DbgPrint(DEBUG_TCP,("TCP Bytes: %d\n", Received));
|
TI_DbgPrint(DEBUG_TCP,("TCP Bytes: %d\n", Received));
|
||||||
|
|
||||||
if( Status == STATUS_SUCCESS && Received != 0 ) {
|
if( Status == STATUS_SUCCESS ) {
|
||||||
TI_DbgPrint(DEBUG_TCP,("Received %d bytes with status %x\n",
|
TI_DbgPrint(DEBUG_TCP,("Received %d bytes with status %x\n",
|
||||||
Received, Status));
|
Received, Status));
|
||||||
|
|
||||||
|
@ -104,8 +102,8 @@ static VOID HandleSignalledConnection( PCONNECTION_ENDPOINT Connection,
|
||||||
|
|
||||||
Complete( Bucket->Request.RequestContext,
|
Complete( Bucket->Request.RequestContext,
|
||||||
STATUS_SUCCESS, Received );
|
STATUS_SUCCESS, Received );
|
||||||
} else if( Status == STATUS_PENDING ||
|
CompletedOne = TRUE;
|
||||||
(Status == STATUS_SUCCESS && Received == 0) ) {
|
} else if( Status == STATUS_PENDING ) {
|
||||||
InsertHeadList( &Connection->ReceiveRequest,
|
InsertHeadList( &Connection->ReceiveRequest,
|
||||||
&Bucket->Entry );
|
&Bucket->Entry );
|
||||||
break;
|
break;
|
||||||
|
@ -114,9 +112,21 @@ static VOID HandleSignalledConnection( PCONNECTION_ENDPOINT Connection,
|
||||||
("Completing Receive request: %x %x\n",
|
("Completing Receive request: %x %x\n",
|
||||||
Bucket->Request, Status));
|
Bucket->Request, Status));
|
||||||
Complete( Bucket->Request.RequestContext, Status, 0 );
|
Complete( Bucket->Request.RequestContext, Status, 0 );
|
||||||
|
CompletedOne = TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if( NewState & SEL_FIN ) {
|
||||||
|
TI_DbgPrint(DEBUG_TCP, ("EOF From socket\n"));
|
||||||
|
|
||||||
|
while( !IsListEmpty( &Connection->ReceiveRequest ) ) {
|
||||||
|
Entry = RemoveHeadList( &Connection->ReceiveRequest );
|
||||||
|
Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry );
|
||||||
|
Complete = Bucket->Request.RequestNotifyObject;
|
||||||
|
|
||||||
|
Complete( Bucket->Request.RequestContext, STATUS_SUCCESS, 0 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Connection->Signalled = FALSE;
|
Connection->Signalled = FALSE;
|
||||||
}
|
}
|
||||||
|
@ -404,10 +414,11 @@ NTSTATUS TCPConnect
|
||||||
sizeof(AddressToConnect.sin_addr) );
|
sizeof(AddressToConnect.sin_addr) );
|
||||||
AddressToConnect.sin_port = RemotePort;
|
AddressToConnect.sin_port = RemotePort;
|
||||||
|
|
||||||
Status = OskitTCPConnect(Connection->SocketContext,
|
Status = TCPTranslateError
|
||||||
Connection,
|
( OskitTCPConnect( Connection->SocketContext,
|
||||||
&AddressToConnect,
|
Connection,
|
||||||
sizeof(AddressToConnect));
|
&AddressToConnect,
|
||||||
|
sizeof(AddressToConnect) ) );
|
||||||
|
|
||||||
TcpipRecursiveMutexLeave( &TCPLock );
|
TcpipRecursiveMutexLeave( &TCPLock );
|
||||||
|
|
||||||
|
@ -417,6 +428,44 @@ NTSTATUS TCPConnect
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NTSTATUS TCPDisconnect
|
||||||
|
( PCONNECTION_ENDPOINT Connection,
|
||||||
|
UINT Flags,
|
||||||
|
PTDI_CONNECTION_INFORMATION ConnInfo,
|
||||||
|
PTDI_CONNECTION_INFORMATION ReturnInfo,
|
||||||
|
PTCP_COMPLETION_ROUTINE Complete,
|
||||||
|
PVOID Context ) {
|
||||||
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
TI_DbgPrint(DEBUG_TCP,("started\n"));
|
||||||
|
|
||||||
|
TcpipRecursiveMutexEnter( &TCPLock, TRUE );
|
||||||
|
|
||||||
|
switch( Flags & (TDI_DISCONNECT_ABORT | TDI_DISCONNECT_RELEASE) ) {
|
||||||
|
case 0:
|
||||||
|
case TDI_DISCONNECT_ABORT:
|
||||||
|
Flags = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TDI_DISCONNECT_ABORT | TDI_DISCONNECT_RELEASE:
|
||||||
|
Flags = 2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TDI_DISCONNECT_RELEASE:
|
||||||
|
Flags = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = TCPTranslateError
|
||||||
|
( OskitTCPShutdown( Connection->SocketContext, Flags ) );
|
||||||
|
|
||||||
|
TcpipRecursiveMutexLeave( &TCPLock );
|
||||||
|
|
||||||
|
TI_DbgPrint(DEBUG_TCP,("finished %x\n", Status));
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
NTSTATUS TCPClose
|
NTSTATUS TCPClose
|
||||||
( PCONNECTION_ENDPOINT Connection ) {
|
( PCONNECTION_ENDPOINT Connection ) {
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
@ -509,8 +558,7 @@ NTSTATUS TCPReceiveData
|
||||||
TI_DbgPrint(DEBUG_TCP,("OskitTCPReceive: %x, %d\n", Status, Received));
|
TI_DbgPrint(DEBUG_TCP,("OskitTCPReceive: %x, %d\n", Status, Received));
|
||||||
|
|
||||||
/* Keep this request around ... there was no data yet */
|
/* Keep this request around ... there was no data yet */
|
||||||
if( Status == STATUS_PENDING ||
|
if( Status == STATUS_PENDING ) {
|
||||||
(Status == STATUS_SUCCESS && Received == 0) ) {
|
|
||||||
/* Freed in TCPSocketState */
|
/* Freed in TCPSocketState */
|
||||||
Bucket = ExAllocatePool( NonPagedPool, sizeof(*Bucket) );
|
Bucket = ExAllocatePool( NonPagedPool, sizeof(*Bucket) );
|
||||||
if( !Bucket ) {
|
if( !Bucket ) {
|
||||||
|
|
|
@ -107,6 +107,7 @@ extern void InitOskitTCP();
|
||||||
extern void DeinitOskitTCP();
|
extern void DeinitOskitTCP();
|
||||||
extern void TimerOskitTCP();
|
extern void TimerOskitTCP();
|
||||||
extern void OskitDumpBuffer( OSK_PCHAR Data, OSK_UINT Len );
|
extern void OskitDumpBuffer( OSK_PCHAR Data, OSK_UINT Len );
|
||||||
|
extern int OskitTCPShutdown( void *socket, int disconn_type );
|
||||||
extern int OskitTCPSocket( void *Connection, void **ConnectionContext,
|
extern int OskitTCPSocket( void *Connection, void **ConnectionContext,
|
||||||
int Af, int Type, int Proto );
|
int Af, int Type, int Proto );
|
||||||
extern void RegisterOskitTCPEventHandlers
|
extern void RegisterOskitTCPEventHandlers
|
||||||
|
|
|
@ -257,6 +257,11 @@ done:
|
||||||
return (error);
|
return (error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int OskitTCPShutdown( void *socket, int disconn_type ) {
|
||||||
|
struct socket *so = socket;
|
||||||
|
return soshutdown( socket, disconn_type );
|
||||||
|
}
|
||||||
|
|
||||||
int OskitTCPClose( void *socket ) {
|
int OskitTCPClose( void *socket ) {
|
||||||
struct socket *so = socket;
|
struct socket *so = socket;
|
||||||
so->so_connection = 0;
|
so->so_connection = 0;
|
||||||
|
@ -333,9 +338,6 @@ void OskitTCPSetAddress( void *socket,
|
||||||
inp->inp_lport = LocalPort;
|
inp->inp_lport = LocalPort;
|
||||||
inp->inp_faddr.s_addr = RemoteAddress;
|
inp->inp_faddr.s_addr = RemoteAddress;
|
||||||
inp->inp_fport = RemotePort;
|
inp->inp_fport = RemotePort;
|
||||||
DbgPrint("OSKIT: SET ADDR %x:%x -> %x:%x\n",
|
|
||||||
LocalAddress, LocalPort,
|
|
||||||
RemoteAddress, RemotePort);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void OskitTCPGetAddress( void *socket,
|
void OskitTCPGetAddress( void *socket,
|
||||||
|
@ -350,9 +352,6 @@ void OskitTCPGetAddress( void *socket,
|
||||||
*LocalPort = inp->inp_lport;
|
*LocalPort = inp->inp_lport;
|
||||||
*RemoteAddress = inp->inp_faddr.s_addr;
|
*RemoteAddress = inp->inp_faddr.s_addr;
|
||||||
*RemotePort = inp->inp_fport;
|
*RemotePort = inp->inp_fport;
|
||||||
DbgPrint("OSKIT: GET ADDR %x:%x -> %x:%x\n",
|
|
||||||
*LocalAddress, *LocalPort,
|
|
||||||
*RemoteAddress, *RemotePort);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -361,9 +361,14 @@ sendit:
|
||||||
ip->ip_sum = in_cksum(m, hlen);
|
ip->ip_sum = in_cksum(m, hlen);
|
||||||
#ifdef __REACTOS__
|
#ifdef __REACTOS__
|
||||||
if( OtcpEvent.PacketSend ) {
|
if( OtcpEvent.PacketSend ) {
|
||||||
OS_DbgPrint(OSK_MID_TRACE,("Mark\n"));
|
struct mbuf *new_m;
|
||||||
|
MGET( new_m, M_DONTWAIT, 0 );
|
||||||
|
MCLGET( new_m, M_DONTWAIT );
|
||||||
|
m_copydata( m, 0, htons(ip->ip_len), new_m->m_data );
|
||||||
|
new_m->m_len = htons(ip->ip_len);
|
||||||
error = OtcpEvent.PacketSend( OtcpEvent.ClientData,
|
error = OtcpEvent.PacketSend( OtcpEvent.ClientData,
|
||||||
m->m_data, m->m_len );
|
new_m->m_data, new_m->m_len );
|
||||||
|
m_free( new_m );
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
@ -485,9 +490,15 @@ sendorfree:
|
||||||
m_freem(m);
|
m_freem(m);
|
||||||
#else
|
#else
|
||||||
if( error == 0 && OtcpEvent.PacketSend ) {
|
if( error == 0 && OtcpEvent.PacketSend ) {
|
||||||
OS_DbgPrint(OSK_MID_TRACE,("Mark\n"));
|
struct mbuf *new_m;
|
||||||
|
MGET( new_m, M_DONTWAIT, 0 );
|
||||||
|
MCLGET( new_m, M_DONTWAIT );
|
||||||
|
m_copydata( m, 0, htons(ip->ip_len), new_m->m_data );
|
||||||
|
new_m->m_len = htons(ip->ip_len);
|
||||||
error = OtcpEvent.PacketSend( OtcpEvent.ClientData,
|
error = OtcpEvent.PacketSend( OtcpEvent.ClientData,
|
||||||
m->m_data, m->m_len );
|
new_m->m_data, new_m->m_len );
|
||||||
|
m_free( new_m );
|
||||||
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
OS_DbgPrint(OSK_MID_TRACE,("Error from upper layer: %d\n", error));
|
OS_DbgPrint(OSK_MID_TRACE,("Error from upper layer: %d\n", error));
|
||||||
|
|
|
@ -576,7 +576,6 @@ send:
|
||||||
else
|
else
|
||||||
ti->ti_seq = htonl(tp->snd_max);
|
ti->ti_seq = htonl(tp->snd_max);
|
||||||
ti->ti_ack = htonl(tp->rcv_nxt);
|
ti->ti_ack = htonl(tp->rcv_nxt);
|
||||||
printf("ti->ti_ack = %d\n", ti->ti_ack);
|
|
||||||
|
|
||||||
if (optlen) {
|
if (optlen) {
|
||||||
(void)memcpy(ti + 1, opt, optlen);
|
(void)memcpy(ti + 1, opt, optlen);
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: connect.c,v 1.6 2004/11/30 04:49:50 arty Exp $
|
/* $Id: connect.c,v 1.7 2004/12/04 23:29:54 arty Exp $
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
* FILE: drivers/net/afd/afd/connect.c
|
* FILE: drivers/net/afd/afd/connect.c
|
||||||
|
@ -204,7 +204,8 @@ AfdStreamSocketConnect(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
|
|
||||||
AFD_DbgPrint(MID_TRACE,("Queueing IRP %x\n", Irp));
|
AFD_DbgPrint(MID_TRACE,("Queueing IRP %x\n", Irp));
|
||||||
|
|
||||||
return LeaveIrpUntilLater( FCB, Irp, FUNCTION_CONNECT );
|
if( Status == STATUS_PENDING )
|
||||||
|
return LeaveIrpUntilLater( FCB, Irp, FUNCTION_CONNECT );
|
||||||
} else Status = STATUS_NO_MEMORY;
|
} else Status = STATUS_NO_MEMORY;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: info.c,v 1.4 2004/07/29 04:09:06 arty Exp $
|
/* $Id: info.c,v 1.5 2004/12/04 23:29:54 arty Exp $
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
* FILE: drivers/net/afd/afd/info.c
|
* FILE: drivers/net/afd/afd/info.c
|
||||||
|
@ -41,6 +41,10 @@ AfdGetInfo( PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
InfoReq->Information.Ulong = 0; /* What is group id */
|
InfoReq->Information.Ulong = 0; /* What is group id */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case AFD_INFO_BLOCKING_MODE:
|
||||||
|
InfoReq->Information.Ulong = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
AFD_DbgPrint(MID_TRACE,("Unknown info id %x\n",
|
AFD_DbgPrint(MID_TRACE,("Unknown info id %x\n",
|
||||||
InfoReq->InformationClass));
|
InfoReq->InformationClass));
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: main.c,v 1.14 2004/11/30 04:49:50 arty Exp $
|
/* $Id: main.c,v 1.15 2004/12/04 23:29:54 arty Exp $
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
* FILE: drivers/net/afd/afd/main.c
|
* FILE: drivers/net/afd/afd/main.c
|
||||||
|
@ -226,6 +226,49 @@ AfdCloseSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NTSTATUS STDCALL
|
||||||
|
AfdDisconnect(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
|
PIO_STACK_LOCATION IrpSp) {
|
||||||
|
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
||||||
|
PAFD_FCB FCB = FileObject->FsContext;
|
||||||
|
PAFD_DISCONNECT_INFO DisReq;
|
||||||
|
IO_STATUS_BLOCK Iosb;
|
||||||
|
PTDI_CONNECTION_INFORMATION ConnInfo;
|
||||||
|
NTSTATUS Status;
|
||||||
|
USHORT Flags = 0;
|
||||||
|
|
||||||
|
if( !SocketAcquireStateLock( FCB ) ) return LostSocket( Irp, FALSE );
|
||||||
|
|
||||||
|
if( !(DisReq = LockRequest( Irp, IrpSp )) )
|
||||||
|
return UnlockAndMaybeComplete( FCB, STATUS_NO_MEMORY,
|
||||||
|
Irp, 0, NULL, FALSE );
|
||||||
|
|
||||||
|
Status = TdiBuildNullConnectionInfo
|
||||||
|
( &ConnInfo, FCB->RemoteAddress->Address[0].AddressType );
|
||||||
|
|
||||||
|
if( !NT_SUCCESS(Status) || !ConnInfo )
|
||||||
|
return UnlockAndMaybeComplete( FCB, STATUS_NO_MEMORY,
|
||||||
|
Irp, 0, NULL, TRUE );
|
||||||
|
|
||||||
|
if( DisReq->DisconnectType & AFD_DISCONNECT_SEND )
|
||||||
|
Flags |= TDI_DISCONNECT_RELEASE;
|
||||||
|
if( DisReq->DisconnectType & AFD_DISCONNECT_RECV )
|
||||||
|
Flags |= TDI_DISCONNECT_ABORT;
|
||||||
|
|
||||||
|
Status = TdiDisconnect( FCB->Connection.Object,
|
||||||
|
&DisReq->Timeout,
|
||||||
|
Flags,
|
||||||
|
&Iosb,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
FCB->AddressFrom,
|
||||||
|
ConnInfo);
|
||||||
|
|
||||||
|
ExFreePool( ConnInfo );
|
||||||
|
|
||||||
|
return UnlockAndMaybeComplete( FCB, Status, Irp, 0, NULL, TRUE );
|
||||||
|
}
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
NTSTATUS STDCALL
|
||||||
AfdDispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp)
|
AfdDispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp)
|
||||||
{
|
{
|
||||||
|
@ -305,44 +348,81 @@ AfdDispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp)
|
||||||
case IOCTL_AFD_SET_CONTEXT:
|
case IOCTL_AFD_SET_CONTEXT:
|
||||||
return AfdSetContext( DeviceObject, Irp, IrpSp );
|
return AfdSetContext( DeviceObject, Irp, IrpSp );
|
||||||
|
|
||||||
case IOCTL_AFD_WAIT_FOR_LISTEN:
|
case IOCTL_AFD_WAIT_FOR_LISTEN:
|
||||||
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_WAIT_FOR_LISTEN\n"));
|
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_WAIT_FOR_LISTEN\n"));
|
||||||
case IOCTL_AFD_ACCEPT:
|
break;
|
||||||
|
|
||||||
|
case IOCTL_AFD_ACCEPT:
|
||||||
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_ACCEPT\n"));
|
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_ACCEPT\n"));
|
||||||
case IOCTL_AFD_DISCONNECT:
|
break;
|
||||||
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_DISCONNECT\n"));
|
|
||||||
case IOCTL_AFD_GET_TDI_HANDLES:
|
case IOCTL_AFD_DISCONNECT:
|
||||||
|
return AfdDisconnect( DeviceObject, Irp, IrpSp );
|
||||||
|
|
||||||
|
case IOCTL_AFD_GET_TDI_HANDLES:
|
||||||
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_GET_TDI_HANDLES\n"));
|
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_GET_TDI_HANDLES\n"));
|
||||||
case IOCTL_AFD_SET_INFO:
|
break;
|
||||||
|
|
||||||
|
case IOCTL_AFD_SET_INFO:
|
||||||
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_SET_INFO\n"));
|
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_SET_INFO\n"));
|
||||||
case IOCTL_AFD_SET_CONNECT_DATA:
|
break;
|
||||||
|
|
||||||
|
case IOCTL_AFD_SET_CONNECT_DATA:
|
||||||
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_SET_CONNECT_DATA\n"));
|
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_SET_CONNECT_DATA\n"));
|
||||||
case IOCTL_AFD_SET_CONNECT_OPTIONS:
|
break;
|
||||||
|
|
||||||
|
case IOCTL_AFD_SET_CONNECT_OPTIONS:
|
||||||
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_SET_CONNECT_OPTIONS\n"));
|
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_SET_CONNECT_OPTIONS\n"));
|
||||||
case IOCTL_AFD_SET_DISCONNECT_DATA:
|
break;
|
||||||
|
|
||||||
|
case IOCTL_AFD_SET_DISCONNECT_DATA:
|
||||||
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_SET_DISCONNECT_DATA\n"));
|
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_SET_DISCONNECT_DATA\n"));
|
||||||
case IOCTL_AFD_SET_DISCONNECT_OPTIONS:
|
break;
|
||||||
|
|
||||||
|
case IOCTL_AFD_SET_DISCONNECT_OPTIONS:
|
||||||
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_SET_DISCONNECT_OPTIONS\n"));
|
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_SET_DISCONNECT_OPTIONS\n"));
|
||||||
case IOCTL_AFD_GET_CONNECT_DATA:
|
break;
|
||||||
|
|
||||||
|
case IOCTL_AFD_GET_CONNECT_DATA:
|
||||||
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_GET_CONNECT_DATA\n"));
|
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_GET_CONNECT_DATA\n"));
|
||||||
case IOCTL_AFD_GET_CONNECT_OPTIONS:
|
break;
|
||||||
|
|
||||||
|
case IOCTL_AFD_GET_CONNECT_OPTIONS:
|
||||||
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_GET_CONNECT_OPTIONS\n"));
|
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_GET_CONNECT_OPTIONS\n"));
|
||||||
case IOCTL_AFD_GET_DISCONNECT_DATA:
|
break;
|
||||||
|
|
||||||
|
case IOCTL_AFD_GET_DISCONNECT_DATA:
|
||||||
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_GET_DISCONNECT_DATA\n"));
|
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_GET_DISCONNECT_DATA\n"));
|
||||||
case IOCTL_AFD_GET_DISCONNECT_OPTIONS:
|
break;
|
||||||
|
|
||||||
|
case IOCTL_AFD_GET_DISCONNECT_OPTIONS:
|
||||||
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_GET_DISCONNECT_OPTIONS\n"));
|
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_GET_DISCONNECT_OPTIONS\n"));
|
||||||
case IOCTL_AFD_SET_CONNECT_DATA_SIZE:
|
break;
|
||||||
|
|
||||||
|
case IOCTL_AFD_SET_CONNECT_DATA_SIZE:
|
||||||
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_SET_CONNECT_DATA_SIZE\n"));
|
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_SET_CONNECT_DATA_SIZE\n"));
|
||||||
case IOCTL_AFD_SET_CONNECT_OPTIONS_SIZE:
|
break;
|
||||||
|
|
||||||
|
case IOCTL_AFD_SET_CONNECT_OPTIONS_SIZE:
|
||||||
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_SET_CONNECT_OPTIONS_SIZE\n"));
|
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_SET_CONNECT_OPTIONS_SIZE\n"));
|
||||||
case IOCTL_AFD_SET_DISCONNECT_DATA_SIZE:
|
break;
|
||||||
|
|
||||||
|
case IOCTL_AFD_SET_DISCONNECT_DATA_SIZE:
|
||||||
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_SET_DISCONNECT_DATA_SIZE\n"));
|
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_SET_DISCONNECT_DATA_SIZE\n"));
|
||||||
case IOCTL_AFD_SET_DISCONNECT_OPTIONS_SIZE:
|
break;
|
||||||
|
|
||||||
|
case IOCTL_AFD_SET_DISCONNECT_OPTIONS_SIZE:
|
||||||
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_SET_DISCONNECT_OPTIONS_SIZE\n"));
|
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_SET_DISCONNECT_OPTIONS_SIZE\n"));
|
||||||
case IOCTL_AFD_DEFER_ACCEPT:
|
break;
|
||||||
|
|
||||||
|
case IOCTL_AFD_DEFER_ACCEPT:
|
||||||
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_DEFER_ACCEPT\n"));
|
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_DEFER_ACCEPT\n"));
|
||||||
case IOCTL_AFD_GET_PENDING_CONNECT_DATA:
|
break;
|
||||||
|
|
||||||
|
case IOCTL_AFD_GET_PENDING_CONNECT_DATA:
|
||||||
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_GET_PENDING_CONNECT_DATA\n"));
|
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_GET_PENDING_CONNECT_DATA\n"));
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
Status = STATUS_NOT_IMPLEMENTED;
|
Status = STATUS_NOT_IMPLEMENTED;
|
||||||
Irp->IoStatus.Information = 0;
|
Irp->IoStatus.Information = 0;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: read.c,v 1.13 2004/11/30 04:49:50 arty Exp $
|
/* $Id: read.c,v 1.14 2004/12/04 23:29:54 arty Exp $
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
* FILE: drivers/net/afd/afd/read.c
|
* FILE: drivers/net/afd/afd/read.c
|
||||||
|
@ -23,6 +23,10 @@ NTSTATUS TryToSatisfyRecvRequestFromBuffer( PAFD_FCB FCB,
|
||||||
*TotalBytesCopied = 0;
|
*TotalBytesCopied = 0;
|
||||||
PAFD_MAPBUF Map;
|
PAFD_MAPBUF Map;
|
||||||
|
|
||||||
|
AFD_DbgPrint(MID_TRACE,("Called, BytesAvailable = %d\n",
|
||||||
|
BytesAvailable));
|
||||||
|
|
||||||
|
if( FCB->PollState & AFD_EVENT_CLOSE ) return STATUS_SUCCESS;
|
||||||
if( !BytesAvailable ) return STATUS_PENDING;
|
if( !BytesAvailable ) return STATUS_PENDING;
|
||||||
|
|
||||||
Map = (PAFD_MAPBUF)(RecvReq->BufferArray + RecvReq->BufferCount);
|
Map = (PAFD_MAPBUF)(RecvReq->BufferArray + RecvReq->BufferCount);
|
||||||
|
@ -64,6 +68,31 @@ NTSTATUS TryToSatisfyRecvRequestFromBuffer( PAFD_FCB FCB,
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VOID ProcessClose( PAFD_FCB FCB ) {
|
||||||
|
PLIST_ENTRY NextIrpEntry;
|
||||||
|
PIRP NextIrp;
|
||||||
|
|
||||||
|
AFD_DbgPrint(MID_TRACE,("Socket shutdown from remote side\n"));
|
||||||
|
|
||||||
|
/* Kill remaining recv irps */
|
||||||
|
while( !IsListEmpty( &FCB->PendingIrpList[FUNCTION_RECV] ) ) {
|
||||||
|
NextIrpEntry =
|
||||||
|
RemoveHeadList(&FCB->PendingIrpList[FUNCTION_RECV]);
|
||||||
|
NextIrp =
|
||||||
|
CONTAINING_RECORD(NextIrpEntry, IRP, Tail.Overlay.ListEntry);
|
||||||
|
AFD_DbgPrint(MID_TRACE,("Completing recv %x (%x)\n",
|
||||||
|
NextIrp, STATUS_END_OF_FILE));
|
||||||
|
NextIrp->IoStatus.Status = STATUS_SUCCESS;
|
||||||
|
NextIrp->IoStatus.Information = 0;
|
||||||
|
IoCompleteRequest( NextIrp, IO_NETWORK_INCREMENT );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Handle closing signal */
|
||||||
|
FCB->PollState |= AFD_EVENT_CLOSE;
|
||||||
|
|
||||||
|
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
||||||
|
}
|
||||||
|
|
||||||
NTSTATUS DDKAPI ReceiveComplete
|
NTSTATUS DDKAPI ReceiveComplete
|
||||||
( PDEVICE_OBJECT DeviceObject,
|
( PDEVICE_OBJECT DeviceObject,
|
||||||
PIRP Irp,
|
PIRP Irp,
|
||||||
|
@ -84,6 +113,8 @@ NTSTATUS DDKAPI ReceiveComplete
|
||||||
if( !SocketAcquireStateLock( FCB ) ) return Status;
|
if( !SocketAcquireStateLock( FCB ) ) return Status;
|
||||||
|
|
||||||
FCB->ReceiveIrp.InFlightRequest = NULL;
|
FCB->ReceiveIrp.InFlightRequest = NULL;
|
||||||
|
FCB->Recv.Content = Irp->IoStatus.Information;
|
||||||
|
FCB->Recv.BytesUsed = 0;
|
||||||
|
|
||||||
if( FCB->State == SOCKET_STATE_CLOSED ) {
|
if( FCB->State == SOCKET_STATE_CLOSED ) {
|
||||||
SocketStateUnlock( FCB );
|
SocketStateUnlock( FCB );
|
||||||
|
@ -91,10 +122,8 @@ NTSTATUS DDKAPI ReceiveComplete
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( NT_SUCCESS(Irp->IoStatus.Status) ) {
|
if( NT_SUCCESS(Irp->IoStatus.Status) &&
|
||||||
/* Update the receive window */
|
Irp->IoStatus.Information ) {
|
||||||
FCB->Recv.Content = Irp->IoStatus.Information;
|
|
||||||
FCB->Recv.BytesUsed = 0;
|
|
||||||
/* Kick the user that receive would be possible now */
|
/* Kick the user that receive would be possible now */
|
||||||
/* XXX Not implemented yet */
|
/* XXX Not implemented yet */
|
||||||
|
|
||||||
|
@ -135,8 +164,7 @@ NTSTATUS DDKAPI ReceiveComplete
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( NT_SUCCESS(Status) && FCB->Recv.Window && !FCB->Recv.Content &&
|
if( FCB->Recv.Window && !FCB->Recv.Content ) {
|
||||||
NT_SUCCESS(Irp->IoStatus.Status) ) {
|
|
||||||
AFD_DbgPrint(MID_TRACE,
|
AFD_DbgPrint(MID_TRACE,
|
||||||
("Exhausted our buffer. Requesting new: %x\n", FCB));
|
("Exhausted our buffer. Requesting new: %x\n", FCB));
|
||||||
|
|
||||||
|
@ -151,25 +179,15 @@ NTSTATUS DDKAPI ReceiveComplete
|
||||||
ReceiveComplete,
|
ReceiveComplete,
|
||||||
FCB );
|
FCB );
|
||||||
|
|
||||||
SocketCalloutLeave( FCB );
|
if( Status == STATUS_SUCCESS &&
|
||||||
} else
|
!FCB->ReceiveIrp.Iosb.Information ) {
|
||||||
FCB->PollState |= AFD_EVENT_RECEIVE;
|
ProcessClose( FCB );
|
||||||
} else {
|
}
|
||||||
/* Kill remaining recv irps */
|
|
||||||
while( !IsListEmpty( &FCB->PendingIrpList[FUNCTION_RECV] ) ) {
|
|
||||||
NextIrpEntry =
|
|
||||||
RemoveHeadList(&FCB->PendingIrpList[FUNCTION_RECV]);
|
|
||||||
NextIrp =
|
|
||||||
CONTAINING_RECORD(NextIrpEntry, IRP, Tail.Overlay.ListEntry);
|
|
||||||
AFD_DbgPrint(MID_TRACE,("Completing recv %x (%x)\n",
|
|
||||||
NextIrp, Status));
|
|
||||||
Irp->IoStatus.Status = Status;
|
|
||||||
Irp->IoStatus.Information = 0;
|
|
||||||
IoCompleteRequest( Irp, IO_NETWORK_INCREMENT );
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Handle closing signal */
|
SocketCalloutLeave( FCB );
|
||||||
FCB->PollState |= AFD_EVENT_CLOSE;
|
} else Status = STATUS_SUCCESS;
|
||||||
|
} else {
|
||||||
|
ProcessClose( FCB );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( FCB->Recv.Content ) {
|
if( FCB->Recv.Content ) {
|
||||||
|
@ -215,41 +233,70 @@ AfdConnectedSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
|
|
||||||
/* Launch a new recv request if we have no data */
|
/* Launch a new recv request if we have no data */
|
||||||
|
|
||||||
if( FCB->Recv.Window && !(FCB->Recv.Content - FCB->Recv.BytesUsed) &&
|
if( !(FCB->PollState & AFD_EVENT_CLOSE ) ) {
|
||||||
!FCB->ReceiveIrp.InFlightRequest ) {
|
AFD_DbgPrint(MID_TRACE,("Not EOF yet\n"));
|
||||||
|
if( FCB->Recv.Window && !(FCB->Recv.Content - FCB->Recv.BytesUsed) &&
|
||||||
|
!FCB->ReceiveIrp.InFlightRequest ) {
|
||||||
|
FCB->Recv.Content = 0;
|
||||||
|
FCB->Recv.BytesUsed = 0;
|
||||||
|
AFD_DbgPrint(MID_TRACE,("Replenishing buffer\n"));
|
||||||
|
|
||||||
|
SocketCalloutEnter( FCB );
|
||||||
|
|
||||||
|
Status = TdiReceive( &FCB->ReceiveIrp.InFlightRequest,
|
||||||
|
FCB->Connection.Object,
|
||||||
|
TDI_RECEIVE_NORMAL,
|
||||||
|
FCB->Recv.Window,
|
||||||
|
FCB->Recv.Size,
|
||||||
|
&FCB->ReceiveIrp.Iosb,
|
||||||
|
ReceiveComplete,
|
||||||
|
FCB );
|
||||||
|
|
||||||
|
if( Status == STATUS_SUCCESS ) {
|
||||||
|
if( !FCB->ReceiveIrp.Iosb.Information ) {
|
||||||
|
AFD_DbgPrint(MID_TRACE,("Looks like an EOF\n"));
|
||||||
|
ProcessClose( FCB );
|
||||||
|
}
|
||||||
|
FCB->Recv.Content = FCB->ReceiveIrp.Iosb.Information;
|
||||||
|
}
|
||||||
|
|
||||||
|
SocketCalloutLeave( FCB );
|
||||||
|
} else {
|
||||||
|
AFD_DbgPrint(MID_TRACE,("There is probably more data here\n"));
|
||||||
|
if( FCB->ReceiveIrp.InFlightRequest ) {
|
||||||
|
AFD_DbgPrint(MID_TRACE,("We're waiting on a previous irp\n"));
|
||||||
|
Status = STATUS_PENDING;
|
||||||
|
} else {
|
||||||
|
AFD_DbgPrint(MID_TRACE,("The buffer is likely not empty\n"));
|
||||||
|
Status = STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
AFD_DbgPrint(MID_TRACE,("EOF Happened already\n"));
|
||||||
FCB->Recv.Content = 0;
|
FCB->Recv.Content = 0;
|
||||||
FCB->Recv.BytesUsed = 0;
|
FCB->Recv.BytesUsed = 0;
|
||||||
AFD_DbgPrint(MID_TRACE,("Replenishing buffer\n"));
|
Status = STATUS_SUCCESS;
|
||||||
|
|
||||||
SocketCalloutEnter( FCB );
|
ProcessClose( FCB );
|
||||||
|
}
|
||||||
|
|
||||||
Status = TdiReceive( &FCB->ReceiveIrp.InFlightRequest,
|
if( NT_SUCCESS(Status) ) {
|
||||||
FCB->Connection.Object,
|
AFD_DbgPrint(MID_TRACE,("TryToSatisfy\n"));
|
||||||
TDI_RECEIVE_NORMAL,
|
Status = TryToSatisfyRecvRequestFromBuffer
|
||||||
FCB->Recv.Window,
|
( FCB, RecvReq, &TotalBytesCopied );
|
||||||
FCB->Recv.Size,
|
}
|
||||||
&FCB->ReceiveIrp.Iosb,
|
|
||||||
ReceiveComplete,
|
|
||||||
FCB );
|
|
||||||
|
|
||||||
SocketCalloutLeave( FCB );
|
|
||||||
} else Status = STATUS_SUCCESS;
|
|
||||||
|
|
||||||
if( NT_SUCCESS(Status) )
|
|
||||||
Status = TryToSatisfyRecvRequestFromBuffer
|
|
||||||
( FCB, RecvReq, &TotalBytesCopied );
|
|
||||||
|
|
||||||
if( Status != STATUS_PENDING || RecvReq->AfdFlags & AFD_IMMEDIATE ) {
|
if( Status != STATUS_PENDING || RecvReq->AfdFlags & AFD_IMMEDIATE ) {
|
||||||
if( Status == STATUS_PENDING ) {
|
if( Status == STATUS_PENDING ) {
|
||||||
AFD_DbgPrint(MID_TRACE,("Nonblocking\n"));
|
AFD_DbgPrint(MID_TRACE,("Nonblocking\n"));
|
||||||
Status = STATUS_CANT_WAIT;
|
Status = STATUS_CANT_WAIT;
|
||||||
TotalBytesCopied = 0;
|
TotalBytesCopied = 0;
|
||||||
}
|
}
|
||||||
UnlockBuffers( RecvReq->BufferArray, RecvReq->BufferCount, FALSE );
|
UnlockBuffers( RecvReq->BufferArray, RecvReq->BufferCount, FALSE );
|
||||||
return UnlockAndMaybeComplete( FCB, Status, Irp,
|
return UnlockAndMaybeComplete( FCB, Status, Irp,
|
||||||
TotalBytesCopied, NULL, TRUE );
|
TotalBytesCopied, NULL, TRUE );
|
||||||
} else {
|
} else {
|
||||||
return LeaveIrpUntilLater( FCB, Irp, FUNCTION_RECV );
|
return LeaveIrpUntilLater( FCB, Irp, FUNCTION_RECV );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1086,4 +1086,58 @@ NTSTATUS TdiSendDatagram(
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NTSTATUS TdiDisconnect(
|
||||||
|
PFILE_OBJECT TransportObject,
|
||||||
|
PLARGE_INTEGER Time,
|
||||||
|
USHORT Flags,
|
||||||
|
PIO_STATUS_BLOCK Iosb,
|
||||||
|
PIO_COMPLETION_ROUTINE CompletionRoutine,
|
||||||
|
PVOID CompletionContext,
|
||||||
|
PTDI_CONNECTION_INFORMATION RequestConnectionInfo,
|
||||||
|
PTDI_CONNECTION_INFORMATION ReturnConnectionInfo) {
|
||||||
|
PDEVICE_OBJECT DeviceObject;
|
||||||
|
NTSTATUS Status;
|
||||||
|
KEVENT Event;
|
||||||
|
PIRP Irp;
|
||||||
|
|
||||||
|
DeviceObject = IoGetRelatedDeviceObject(TransportObject);
|
||||||
|
|
||||||
|
KeInitializeEvent(&Event, NotificationEvent, FALSE);
|
||||||
|
|
||||||
|
AFD_DbgPrint(MID_TRACE,("Called(TransportObject %x)\n", TransportObject));
|
||||||
|
|
||||||
|
DeviceObject = IoGetRelatedDeviceObject(TransportObject);
|
||||||
|
if (!DeviceObject) {
|
||||||
|
AFD_DbgPrint(MIN_TRACE, ("Bad device object.\n"));
|
||||||
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
|
Irp = TdiBuildInternalDeviceControlIrp
|
||||||
|
( TDI_SEND_DATAGRAM, /* Sub function */
|
||||||
|
DeviceObject, /* Device object */
|
||||||
|
TransportObject, /* File object */
|
||||||
|
&Event, /* Event */
|
||||||
|
Iosb ); /* Status */
|
||||||
|
|
||||||
|
if (!Irp) {
|
||||||
|
AFD_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
|
||||||
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
}
|
||||||
|
|
||||||
|
TdiBuildDisconnect
|
||||||
|
(Irp, /* I/O Request Packet */
|
||||||
|
DeviceObject, /* Device object */
|
||||||
|
TransportObject, /* File object */
|
||||||
|
CompletionRoutine, /* Completion routine */
|
||||||
|
CompletionContext, /* Completion context */
|
||||||
|
Time, /* Time */
|
||||||
|
Flags, /* Disconnect flags */
|
||||||
|
RequestConnectionInfo, /* Indication of who to disconnect */
|
||||||
|
ReturnConnectionInfo); /* Indication of who disconnected */
|
||||||
|
|
||||||
|
Status = TdiCall(Irp, DeviceObject, &Event, Iosb);
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
|
@ -14,4 +14,14 @@ NTSTATUS TdiOpenConnectionEndpointFile(PUNICODE_STRING DeviceName,
|
||||||
NTSTATUS TdiCloseDevice(HANDLE Handle,
|
NTSTATUS TdiCloseDevice(HANDLE Handle,
|
||||||
PFILE_OBJECT FileObject);
|
PFILE_OBJECT FileObject);
|
||||||
|
|
||||||
|
NTSTATUS TdiDisconnect
|
||||||
|
( PFILE_OBJECT TransportObject,
|
||||||
|
PLARGE_INTEGER Time,
|
||||||
|
USHORT Flags,
|
||||||
|
PIO_STATUS_BLOCK Iosb,
|
||||||
|
PIO_COMPLETION_ROUTINE CompletionRoutine,
|
||||||
|
PVOID CompletionContext,
|
||||||
|
PTDI_CONNECTION_INFORMATION RequestConnectionInfo,
|
||||||
|
PTDI_CONNECTION_INFORMATION ReturnConnectionInfo );
|
||||||
|
|
||||||
#endif/*_TDI_PROTO_H*/
|
#endif/*_TDI_PROTO_H*/
|
||||||
|
|
|
@ -228,8 +228,6 @@ VOID STDCALL LanReceiveWorker( PVOID Context ) {
|
||||||
IPPacket.ContigSize, IPPacket.TotalSize,
|
IPPacket.ContigSize, IPPacket.TotalSize,
|
||||||
BytesTransferred));
|
BytesTransferred));
|
||||||
|
|
||||||
/*OskitDumpBuffer( IPPacket.Header, IPPacket.TotalSize );*/
|
|
||||||
|
|
||||||
PacketType = PC(IPPacket.NdisPacket)->PacketType;
|
PacketType = PC(IPPacket.NdisPacket)->PacketType;
|
||||||
IPPacket.Position = 0;
|
IPPacket.Position = 0;
|
||||||
|
|
||||||
|
@ -575,8 +573,6 @@ VOID LANTransmit(
|
||||||
((PCHAR)LinkAddress)[5] & 0xff));
|
((PCHAR)LinkAddress)[5] & 0xff));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*OskitDumpBuffer( Data, Size );*/
|
|
||||||
|
|
||||||
TcpipAcquireSpinLock( &Adapter->Lock, &OldIrql );
|
TcpipAcquireSpinLock( &Adapter->Lock, &OldIrql );
|
||||||
TI_DbgPrint(MID_TRACE, ("NdisSend\n"));
|
TI_DbgPrint(MID_TRACE, ("NdisSend\n"));
|
||||||
NdisSend(&NdisStatus, Adapter->NdisHandle, NdisPacket);
|
NdisSend(&NdisStatus, Adapter->NdisHandle, NdisPacket);
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
#define DEBUG_MEMORY 0x00000200
|
#define DEBUG_MEMORY 0x00000200
|
||||||
#define DEBUG_PBUFFER 0x00000400
|
#define DEBUG_PBUFFER 0x00000400
|
||||||
#define DEBUG_IRP 0x00000800
|
#define DEBUG_IRP 0x00000800
|
||||||
#define DEBUG_REFCOUNT 0x00001000
|
#define DEBUG_TCPIF 0x00001000
|
||||||
#define DEBUG_ADDRFILE 0x00002000
|
#define DEBUG_ADDRFILE 0x00002000
|
||||||
#define DEBUG_DATALINK 0x00004000
|
#define DEBUG_DATALINK 0x00004000
|
||||||
#define DEBUG_ARP 0x00008000
|
#define DEBUG_ARP 0x00008000
|
||||||
|
|
|
@ -113,6 +113,14 @@ NTSTATUS TCPConnect(
|
||||||
PTCP_COMPLETION_ROUTINE Complete,
|
PTCP_COMPLETION_ROUTINE Complete,
|
||||||
PVOID Context);
|
PVOID Context);
|
||||||
|
|
||||||
|
NTSTATUS TCPDisconnect(
|
||||||
|
PCONNECTION_ENDPOINT Connection,
|
||||||
|
UINT Flags,
|
||||||
|
PTDI_CONNECTION_INFORMATION ConnInfo,
|
||||||
|
PTDI_CONNECTION_INFORMATION ReturnInfo,
|
||||||
|
PTCP_COMPLETION_ROUTINE Complete,
|
||||||
|
PVOID Context);
|
||||||
|
|
||||||
NTSTATUS TCPListen(
|
NTSTATUS TCPListen(
|
||||||
PCONNECTION_ENDPOINT Connection,
|
PCONNECTION_ENDPOINT Connection,
|
||||||
UINT Backlog,
|
UINT Backlog,
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS TCP/IP protocol driver
|
* PROJECT: ReactOS TCP/IP protocol driver
|
||||||
|
@ -411,14 +412,18 @@ NTSTATUS DispTdiDisconnect(
|
||||||
* Status of operation
|
* Status of operation
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
PTDI_REQUEST_KERNEL_QUERY_INFORMATION Parameters;
|
NTSTATUS Status;
|
||||||
|
PTDI_REQUEST_KERNEL_DISCONNECT DisReq;
|
||||||
|
PCONNECTION_ENDPOINT Connection;
|
||||||
PTRANSPORT_CONTEXT TranContext;
|
PTRANSPORT_CONTEXT TranContext;
|
||||||
PIO_STACK_LOCATION IrpSp;
|
PIO_STACK_LOCATION IrpSp;
|
||||||
|
|
||||||
TI_DbgPrint(DEBUG_IRP, ("Called.\n"));
|
TI_DbgPrint(DEBUG_IRP, ("Called.\n"));
|
||||||
|
|
||||||
IrpSp = IoGetCurrentIrpStackLocation(Irp);
|
IrpSp = IoGetCurrentIrpStackLocation(Irp);
|
||||||
Parameters = (PTDI_REQUEST_KERNEL_QUERY_INFORMATION)&IrpSp->Parameters;
|
DisReq = (PTDI_REQUEST_KERNEL_DISCONNECT)&IrpSp->Parameters;
|
||||||
|
|
||||||
|
/* Get associated connection endpoint file object. Quit if none exists */
|
||||||
|
|
||||||
TranContext = IrpSp->FileObject->FsContext;
|
TranContext = IrpSp->FileObject->FsContext;
|
||||||
if (!TranContext) {
|
if (!TranContext) {
|
||||||
|
@ -426,56 +431,23 @@ NTSTATUS DispTdiDisconnect(
|
||||||
return STATUS_INVALID_CONNECTION;
|
return STATUS_INVALID_CONNECTION;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (Parameters->QueryType)
|
Connection = (PCONNECTION_ENDPOINT)TranContext->Handle.ConnectionContext;
|
||||||
{
|
if (!Connection) {
|
||||||
case TDI_QUERY_ADDRESS_INFO:
|
TI_DbgPrint(MID_TRACE, ("No connection endpoint file object.\n"));
|
||||||
{
|
return STATUS_INVALID_CONNECTION;
|
||||||
PTDI_ADDRESS_INFO AddressInfo;
|
|
||||||
PADDRESS_FILE AddrFile;
|
|
||||||
PTA_IP_ADDRESS Address;
|
|
||||||
|
|
||||||
AddressInfo = (PTDI_ADDRESS_INFO)MmGetSystemAddressForMdl(Irp->MdlAddress);
|
|
||||||
|
|
||||||
switch ((ULONG)IrpSp->FileObject->FsContext2) {
|
|
||||||
case TDI_TRANSPORT_ADDRESS_FILE:
|
|
||||||
AddrFile = (PADDRESS_FILE)TranContext->Handle.AddressHandle;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TDI_CONNECTION_FILE:
|
|
||||||
AddrFile = ((PCONNECTION_ENDPOINT)TranContext->Handle.ConnectionContext)->AddressFile;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
TI_DbgPrint(MIN_TRACE, ("Invalid transport context\n"));
|
|
||||||
return STATUS_INVALID_PARAMETER;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!AddrFile) {
|
|
||||||
TI_DbgPrint(MID_TRACE, ("No address file object.\n"));
|
|
||||||
return STATUS_INVALID_PARAMETER;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (MmGetMdlByteCount(Irp->MdlAddress) <
|
|
||||||
(sizeof(TDI_ADDRESS_INFO) + sizeof(TDI_ADDRESS_IP))) {
|
|
||||||
TI_DbgPrint(MID_TRACE, ("MDL buffer too small.\n"));
|
|
||||||
return STATUS_BUFFER_OVERFLOW;
|
|
||||||
}
|
|
||||||
|
|
||||||
Address = (PTA_IP_ADDRESS)&AddressInfo->Address;
|
|
||||||
Address->TAAddressCount = 1;
|
|
||||||
Address->Address[0].AddressLength = TDI_ADDRESS_LENGTH_IP;
|
|
||||||
Address->Address[0].AddressType = TDI_ADDRESS_TYPE_IP;
|
|
||||||
Address->Address[0].Address[0].sin_port = AddrFile->Port;
|
|
||||||
Address->Address[0].Address[0].in_addr = AddrFile->Address.Address.IPv4Address;
|
|
||||||
RtlZeroMemory(
|
|
||||||
&Address->Address[0].Address[0].sin_zero,
|
|
||||||
sizeof(Address->Address[0].Address[0].sin_zero));
|
|
||||||
|
|
||||||
return STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
Status = TCPDisconnect(
|
||||||
|
TranContext->Handle.ConnectionContext,
|
||||||
|
DisReq->RequestFlags,
|
||||||
|
DisReq->RequestConnectionInformation,
|
||||||
|
DisReq->ReturnConnectionInformation,
|
||||||
|
DispDataRequestComplete,
|
||||||
|
Irp );
|
||||||
|
|
||||||
|
TI_DbgPrint(MAX_TRACE, ("TCP Connect returned %08x\n", Status));
|
||||||
|
|
||||||
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -12,9 +12,9 @@
|
||||||
#define NDEBUG
|
#define NDEBUG
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
DWORD DebugTraceLevel = DEBUG_TCP;
|
DWORD DebugTraceLevel = DEBUG_ULTRA;
|
||||||
#else
|
#else
|
||||||
DWORD DebugTraceLevel = 0; /*DEBUG_IP | DEBUG_PBUFFER | DEBUG_DATALINK;*/
|
DWORD DebugTraceLevel = 0;
|
||||||
#endif /* NDEBUG */
|
#endif /* NDEBUG */
|
||||||
|
|
||||||
PDEVICE_OBJECT TCPDeviceObject = NULL;
|
PDEVICE_OBJECT TCPDeviceObject = NULL;
|
||||||
|
|
|
@ -460,6 +460,9 @@ VOID SockProcessQueuedAsyncSelect(
|
||||||
PIO_STATUS_BLOCK IoStatusBlock
|
PIO_STATUS_BLOCK IoStatusBlock
|
||||||
);
|
);
|
||||||
|
|
||||||
|
DWORD MsafdReturnWithErrno( NTSTATUS Status, LPINT Errno, DWORD Received,
|
||||||
|
LPDWORD ReturnedBytes );
|
||||||
|
|
||||||
typedef VOID (*PASYNC_COMPLETION_ROUTINE)(PVOID Context, PIO_STATUS_BLOCK IoStatusBlock);
|
typedef VOID (*PASYNC_COMPLETION_ROUTINE)(PVOID Context, PIO_STATUS_BLOCK IoStatusBlock);
|
||||||
|
|
||||||
#endif /* __MSAFD_H */
|
#endif /* __MSAFD_H */
|
||||||
|
|
|
@ -259,6 +259,24 @@ error:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DWORD MsafdReturnWithErrno( NTSTATUS Status, LPINT Errno, DWORD Received,
|
||||||
|
LPDWORD ReturnedBytes ) {
|
||||||
|
switch (Status) {
|
||||||
|
case STATUS_CANT_WAIT: *Errno = WSAEWOULDBLOCK; break;
|
||||||
|
case STATUS_TIMEOUT:
|
||||||
|
case STATUS_SUCCESS:
|
||||||
|
/* Return Number of bytes Read */
|
||||||
|
if( ReturnedBytes ) *ReturnedBytes = Received; break;
|
||||||
|
case STATUS_PENDING: *Errno = WSA_IO_PENDING; break;
|
||||||
|
case STATUS_BUFFER_OVERFLOW: *Errno = WSAEMSGSIZE; break;
|
||||||
|
default: *Errno = WSAEINVAL; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Success */
|
||||||
|
return Status == STATUS_SUCCESS ? 0 : SOCKET_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
INT
|
INT
|
||||||
WSPAPI
|
WSPAPI
|
||||||
WSPCloseSocket(
|
WSPCloseSocket(
|
||||||
|
@ -357,7 +375,8 @@ WSPBind(
|
||||||
|
|
||||||
NtClose( SockEvent );
|
NtClose( SockEvent );
|
||||||
|
|
||||||
return 0;
|
return MsafdReturnWithErrno
|
||||||
|
( IOSB.Status, lpErrno, IOSB.Information, NULL );
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -403,7 +422,8 @@ WSPListen(
|
||||||
|
|
||||||
NtClose( SockEvent );
|
NtClose( SockEvent );
|
||||||
|
|
||||||
return 0;
|
return MsafdReturnWithErrno
|
||||||
|
( IOSB.Status, lpErrno, IOSB.Information, NULL );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -430,7 +450,7 @@ WSPSelect(
|
||||||
Status = NtCreateEvent( &SockEvent, GENERIC_READ | GENERIC_WRITE,
|
Status = NtCreateEvent( &SockEvent, GENERIC_READ | GENERIC_WRITE,
|
||||||
NULL, 1, FALSE );
|
NULL, 1, FALSE );
|
||||||
|
|
||||||
if( !NT_SUCCESS(Status) ) return -1;
|
if( !NT_SUCCESS(Status) ) return SOCKET_ERROR;
|
||||||
|
|
||||||
/* Find out how many sockets we have, and how large the buffer needs
|
/* Find out how many sockets we have, and how large the buffer needs
|
||||||
* to be */
|
* to be */
|
||||||
|
@ -544,6 +564,7 @@ WSPSelect(
|
||||||
}
|
}
|
||||||
|
|
||||||
NtClose( SockEvent );
|
NtClose( SockEvent );
|
||||||
|
|
||||||
switch( IOSB.Status ) {
|
switch( IOSB.Status ) {
|
||||||
case STATUS_SUCCESS:
|
case STATUS_SUCCESS:
|
||||||
case STATUS_TIMEOUT: *lpErrno = 0; break;
|
case STATUS_TIMEOUT: *lpErrno = 0; break;
|
||||||
|
@ -914,7 +935,7 @@ WSPConnect(
|
||||||
|
|
||||||
NtClose( SockEvent );
|
NtClose( SockEvent );
|
||||||
|
|
||||||
return Status;
|
return MsafdReturnWithErrno( IOSB.Status, lpErrno, 0, NULL );
|
||||||
}
|
}
|
||||||
int
|
int
|
||||||
WSPAPI
|
WSPAPI
|
||||||
|
@ -983,7 +1004,7 @@ WSPShutdown(
|
||||||
|
|
||||||
NtClose( SockEvent );
|
NtClose( SockEvent );
|
||||||
|
|
||||||
return 0;
|
return MsafdReturnWithErrno( IOSB.Status, lpErrno, 0, NULL );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1033,13 +1054,13 @@ WSPIoctl(
|
||||||
|
|
||||||
switch( dwIoControlCode ) {
|
switch( dwIoControlCode ) {
|
||||||
case FIONBIO:
|
case FIONBIO:
|
||||||
if( cbInBuffer < sizeof(INT) ) return -1;
|
if( cbInBuffer < sizeof(INT) ) return SOCKET_ERROR;
|
||||||
Socket->SharedData.NonBlocking = *((PINT)lpvInBuffer) ? 1 : 0;
|
Socket->SharedData.NonBlocking = *((PINT)lpvInBuffer) ? 1 : 0;
|
||||||
AFD_DbgPrint(MID_TRACE,("[%x] Set nonblocking %d\n",
|
AFD_DbgPrint(MID_TRACE,("[%x] Set nonblocking %d\n",
|
||||||
Handle, Socket->SharedData.NonBlocking));
|
Handle, Socket->SharedData.NonBlocking));
|
||||||
return 0;
|
return 0;
|
||||||
default:
|
default:
|
||||||
return -1;
|
return SOCKET_ERROR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,9 +10,11 @@
|
||||||
* Alex 16/07/2004 - Complete Rewrite
|
* Alex 16/07/2004 - Complete Rewrite
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define DBG
|
||||||
#include <roscfg.h>
|
#include <roscfg.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <msafd.h>
|
#include <msafd.h>
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
INT
|
INT
|
||||||
WSPAPI
|
WSPAPI
|
||||||
|
@ -102,6 +104,7 @@ WSPRecv(
|
||||||
HANDLE SockEvent;
|
HANDLE SockEvent;
|
||||||
PSOCKET_INFORMATION Socket;
|
PSOCKET_INFORMATION Socket;
|
||||||
|
|
||||||
|
AFD_DbgPrint(MID_TRACE,("Called\n"));
|
||||||
|
|
||||||
/* Get the Socket Structure associate to this Socket*/
|
/* Get the Socket Structure associate to this Socket*/
|
||||||
Socket = GetSocketStructure(Handle);
|
Socket = GetSocketStructure(Handle);
|
||||||
|
@ -185,45 +188,29 @@ WSPRecv(
|
||||||
|
|
||||||
/* Wait for completition of not overlapped */
|
/* Wait for completition of not overlapped */
|
||||||
if (Status == STATUS_PENDING && lpOverlapped == NULL) {
|
if (Status == STATUS_PENDING && lpOverlapped == NULL) {
|
||||||
WaitForSingleObject(SockEvent, 0); // BUGBUG, shouldn wait infintely for receive...
|
/* It's up to the protocol to time out recv. We must wait
|
||||||
Status = IOSB->Status;
|
* until the protocol decides it's had enough. */
|
||||||
|
WaitForSingleObject(SockEvent, INFINITE);
|
||||||
|
Status = IOSB->Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
NtClose( SockEvent );
|
NtClose( SockEvent );
|
||||||
|
|
||||||
/* Return the Flags */
|
AFD_DbgPrint(MID_TRACE,("Status %x Information %d\n",
|
||||||
*ReceiveFlags = 0;
|
Status, IOSB->Information));
|
||||||
|
|
||||||
|
/* Return the Flags */
|
||||||
|
*ReceiveFlags = 0;
|
||||||
|
|
||||||
switch (Status) {
|
switch (Status) {
|
||||||
case STATUS_CANT_WAIT:
|
case STATUS_RECEIVE_EXPEDITED: *ReceiveFlags = MSG_OOB; break;
|
||||||
return WSAEWOULDBLOCK;
|
case STATUS_RECEIVE_PARTIAL_EXPEDITED:
|
||||||
|
*ReceiveFlags = MSG_PARTIAL | MSG_OOB; break;
|
||||||
case STATUS_SUCCESS:
|
case STATUS_RECEIVE_PARTIAL: *ReceiveFlags = MSG_PARTIAL; break;
|
||||||
break;
|
|
||||||
|
|
||||||
case STATUS_PENDING :
|
|
||||||
return WSA_IO_PENDING;
|
|
||||||
|
|
||||||
case STATUS_BUFFER_OVERFLOW:
|
|
||||||
return WSAEMSGSIZE;
|
|
||||||
|
|
||||||
case STATUS_RECEIVE_EXPEDITED:
|
|
||||||
*ReceiveFlags = MSG_OOB;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case STATUS_RECEIVE_PARTIAL_EXPEDITED :
|
|
||||||
*ReceiveFlags = MSG_PARTIAL | MSG_OOB;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case STATUS_RECEIVE_PARTIAL :
|
|
||||||
*ReceiveFlags = MSG_PARTIAL;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return Number of bytes Read */
|
return MsafdReturnWithErrno
|
||||||
*lpNumberOfBytesRead = (DWORD)IOSB->Information;
|
( Status, lpErrno, IOSB->Information, lpNumberOfBytesRead );
|
||||||
|
|
||||||
/* Success */
|
|
||||||
return STATUS_SUCCESS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -341,39 +328,18 @@ WSPRecvFrom(
|
||||||
|
|
||||||
NtClose( SockEvent );
|
NtClose( SockEvent );
|
||||||
|
|
||||||
/* Return the Flags */
|
/* Return the Flags */
|
||||||
*ReceiveFlags = 0;
|
*ReceiveFlags = 0;
|
||||||
|
|
||||||
switch (Status) {
|
switch (Status) {
|
||||||
case STATUS_CANT_WAIT:
|
case STATUS_RECEIVE_EXPEDITED: *ReceiveFlags = MSG_OOB; break;
|
||||||
return WSAEWOULDBLOCK;
|
case STATUS_RECEIVE_PARTIAL_EXPEDITED:
|
||||||
|
*ReceiveFlags = MSG_PARTIAL | MSG_OOB; break;
|
||||||
|
case STATUS_RECEIVE_PARTIAL: *ReceiveFlags = MSG_PARTIAL; break;
|
||||||
|
}
|
||||||
|
|
||||||
case STATUS_SUCCESS:
|
return MsafdReturnWithErrno
|
||||||
break;
|
( Status, lpErrno, IOSB->Information, lpNumberOfBytesRead );
|
||||||
|
|
||||||
case STATUS_PENDING :
|
|
||||||
return WSA_IO_PENDING;
|
|
||||||
|
|
||||||
case STATUS_BUFFER_OVERFLOW:
|
|
||||||
return WSAEMSGSIZE;
|
|
||||||
|
|
||||||
case STATUS_RECEIVE_EXPEDITED:
|
|
||||||
*ReceiveFlags = MSG_OOB;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case STATUS_RECEIVE_PARTIAL_EXPEDITED :
|
|
||||||
*ReceiveFlags = MSG_PARTIAL | MSG_OOB;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case STATUS_RECEIVE_PARTIAL :
|
|
||||||
*ReceiveFlags = MSG_PARTIAL;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Return Number of bytes Read */
|
|
||||||
*lpNumberOfBytesRead = (DWORD)IOSB->Information;
|
|
||||||
|
|
||||||
/* Success */
|
|
||||||
return STATUS_SUCCESS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -483,13 +449,10 @@ WSPSend(
|
||||||
return WSA_IO_PENDING;
|
return WSA_IO_PENDING;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return Number of bytes Sent */
|
|
||||||
*lpNumberOfBytesSent = (DWORD)IOSB->Information;
|
|
||||||
|
|
||||||
AFD_DbgPrint(MID_TRACE,("Leaving (Success, %d)\n", IOSB->Information));
|
AFD_DbgPrint(MID_TRACE,("Leaving (Success, %d)\n", IOSB->Information));
|
||||||
|
|
||||||
/* Success */
|
return MsafdReturnWithErrno
|
||||||
return STATUS_SUCCESS;
|
( Status, lpErrno, IOSB->Information, lpNumberOfBytesSent );
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -611,11 +574,8 @@ WSPSendTo(
|
||||||
return WSA_IO_PENDING;
|
return WSA_IO_PENDING;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return Number of bytes Sent */
|
return MsafdReturnWithErrno
|
||||||
*lpNumberOfBytesSent = (DWORD)IOSB->Information;
|
( Status, lpErrno, IOSB->Information, lpNumberOfBytesSent );
|
||||||
|
|
||||||
/* Success */
|
|
||||||
return STATUS_SUCCESS;
|
|
||||||
}
|
}
|
||||||
INT
|
INT
|
||||||
WSPAPI
|
WSPAPI
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue