mirror of
https://github.com/reactos/reactos.git
synced 2024-06-15 17:11:52 +00:00
- Update AFD's shared header
- Add entity type check for IF_MIB_STATS_ID - Sort out some confusion with TDI entities - Implement IOCTL_AFD_GET_CONTEXT_SIZE - Enable debug prints for unimplemented ioctls - Add kernel-mode support for setting TTL svn path=/trunk/; revision=43767
This commit is contained in:
parent
85cbe2887b
commit
79e704337b
|
@ -1230,7 +1230,7 @@ WSPAccept(SOCKET Handle,
|
|||
NULL);
|
||||
|
||||
/* Set up the Accept Structure */
|
||||
AcceptData.ListenHandle = AcceptSocket;
|
||||
AcceptData.ListenHandle = (HANDLE)AcceptSocket;
|
||||
AcceptData.SequenceNumber = ListenReceiveData->SequenceNumber;
|
||||
|
||||
/* Send IOCTL to Accept */
|
||||
|
|
|
@ -561,8 +561,8 @@ WSPSendTo(SOCKET Handle,
|
|||
SendInfo.BufferArray = (PAFD_WSABUF)lpBuffers;
|
||||
SendInfo.AfdFlags = Socket->SharedData.NonBlocking ? AFD_IMMEDIATE : 0;
|
||||
SendInfo.BufferCount = dwBufferCount;
|
||||
SendInfo.RemoteAddress = RemoteAddress;
|
||||
SendInfo.SizeOfRemoteAddress = Socket->HelperData->MaxTDIAddressLength;
|
||||
SendInfo.TdiConnection.RemoteAddress = RemoteAddress;
|
||||
SendInfo.TdiConnection.RemoteAddressLength = Socket->HelperData->MaxTDIAddressLength;
|
||||
|
||||
/* Verifiy if we should use APC */
|
||||
if (lpOverlapped == NULL)
|
||||
|
|
|
@ -33,9 +33,28 @@ AfdGetContext( PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
|||
|
||||
AFD_DbgPrint(MID_TRACE,("Returning %x\n", Status));
|
||||
|
||||
return UnlockAndMaybeComplete( FCB, Status, Irp, 0 );
|
||||
return UnlockAndMaybeComplete( FCB, Status, Irp, ContextSize );
|
||||
}
|
||||
|
||||
NTSTATUS NTAPI
|
||||
AfdGetContextSize( PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||
PIO_STACK_LOCATION IrpSp )
|
||||
{
|
||||
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
||||
PAFD_FCB FCB = FileObject->FsContext;
|
||||
|
||||
if( !SocketAcquireStateLock( FCB ) ) return LostSocket( Irp );
|
||||
|
||||
if (IrpSp->Parameters.DeviceIoControl.OutputBufferLength < sizeof(ULONG))
|
||||
return UnlockAndMaybeComplete(FCB, STATUS_BUFFER_TOO_SMALL, Irp, sizeof(ULONG));
|
||||
|
||||
RtlCopyMemory(Irp->UserBuffer,
|
||||
&FCB->ContextSize,
|
||||
sizeof(ULONG));
|
||||
|
||||
return UnlockAndMaybeComplete(FCB, STATUS_SUCCESS, Irp, sizeof(ULONG));
|
||||
}
|
||||
|
||||
NTSTATUS NTAPI
|
||||
AfdSetContext( PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||
PIO_STACK_LOCATION IrpSp ) {
|
||||
|
|
|
@ -392,7 +392,7 @@ NTSTATUS AfdAccept( PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
|||
RemoveEntryList( PendingConn );
|
||||
|
||||
Status = ObReferenceObjectByHandle
|
||||
( (HANDLE)AcceptData->ListenHandle,
|
||||
( AcceptData->ListenHandle,
|
||||
FILE_ALL_ACCESS,
|
||||
NULL,
|
||||
KernelMode,
|
||||
|
|
|
@ -354,7 +354,7 @@ static NTSTATUS NTAPI
|
|||
AfdDispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp)
|
||||
{
|
||||
PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
|
||||
NTSTATUS Status = STATUS_SUCCESS;
|
||||
NTSTATUS Status = STATUS_NOT_IMPLEMENTED;
|
||||
#if DBG
|
||||
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
||||
#endif
|
||||
|
@ -431,6 +431,9 @@ AfdDispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp)
|
|||
case IOCTL_AFD_SET_INFO:
|
||||
return AfdSetInfo( DeviceObject, Irp, IrpSp );
|
||||
|
||||
case IOCTL_AFD_GET_CONTEXT_SIZE:
|
||||
return AfdGetContextSize( DeviceObject, Irp, IrpSp );
|
||||
|
||||
case IOCTL_AFD_GET_CONTEXT:
|
||||
return AfdGetContext( DeviceObject, Irp, IrpSp );
|
||||
|
||||
|
@ -453,70 +456,73 @@ AfdDispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp)
|
|||
return AfdGetPeerName( DeviceObject, Irp, IrpSp );
|
||||
|
||||
case IOCTL_AFD_GET_TDI_HANDLES:
|
||||
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_GET_TDI_HANDLES\n"));
|
||||
DbgPrint("IOCTL_AFD_GET_TDI_HANDLES is UNIMPLEMENTED!\n");
|
||||
break;
|
||||
|
||||
case IOCTL_AFD_SET_CONNECT_DATA:
|
||||
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_SET_CONNECT_DATA\n"));
|
||||
DbgPrint("IOCTL_AFD_SET_CONNECT_DATA is UNIMPLEMENTED!\n");
|
||||
break;
|
||||
|
||||
case IOCTL_AFD_SET_CONNECT_OPTIONS:
|
||||
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_SET_CONNECT_OPTIONS\n"));
|
||||
DbgPrint("IOCTL_AFD_SET_CONNECT_OPTIONS is UNIMPLEMENTED!\n");
|
||||
break;
|
||||
|
||||
case IOCTL_AFD_SET_DISCONNECT_DATA:
|
||||
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_SET_DISCONNECT_DATA\n"));
|
||||
DbgPrint("IOCTL_AFD_SET_DISCONNECT_DATA is UNIMPLEMENTED!\n");
|
||||
break;
|
||||
|
||||
case IOCTL_AFD_SET_DISCONNECT_OPTIONS:
|
||||
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_SET_DISCONNECT_OPTIONS\n"));
|
||||
DbgPrint("IOCTL_AFD_SET_DISCONNECT_OPTIONS is UNIMPLEMENTED!\n");
|
||||
break;
|
||||
|
||||
case IOCTL_AFD_GET_CONNECT_DATA:
|
||||
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_GET_CONNECT_DATA\n"));
|
||||
DbgPrint("IOCTL_AFD_GET_CONNECT_DATA is UNIMPLEMENTED!\n");
|
||||
break;
|
||||
|
||||
case IOCTL_AFD_GET_CONNECT_OPTIONS:
|
||||
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_GET_CONNECT_OPTIONS\n"));
|
||||
DbgPrint("IOCTL_AFD_GET_CONNECT_OPTIONS is UNIMPLEMENTED!\n");
|
||||
break;
|
||||
|
||||
case IOCTL_AFD_GET_DISCONNECT_DATA:
|
||||
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_GET_DISCONNECT_DATA\n"));
|
||||
DbgPrint("IOCTL_AFD_GET_DISCONNECT_DATA is UNIMPLEMENTED!\n");
|
||||
break;
|
||||
|
||||
case IOCTL_AFD_GET_DISCONNECT_OPTIONS:
|
||||
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_GET_DISCONNECT_OPTIONS\n"));
|
||||
DbgPrint("IOCTL_AFD_GET_DISCONNECT_OPTIONS is UNIMPLEMENTED!\n");
|
||||
break;
|
||||
|
||||
case IOCTL_AFD_SET_CONNECT_DATA_SIZE:
|
||||
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_SET_CONNECT_DATA_SIZE\n"));
|
||||
DbgPrint("IOCTL_AFD_SET_CONNECT_DATA_SIZE is UNIMPLEMENTED!\n");
|
||||
break;
|
||||
|
||||
case IOCTL_AFD_SET_CONNECT_OPTIONS_SIZE:
|
||||
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_SET_CONNECT_OPTIONS_SIZE\n"));
|
||||
DbgPrint("IOCTL_AFD_SET_CONNECT_OPTIONS_SIZE is UNIMPLEMENTED!\n");
|
||||
break;
|
||||
|
||||
case IOCTL_AFD_SET_DISCONNECT_DATA_SIZE:
|
||||
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_SET_DISCONNECT_DATA_SIZE\n"));
|
||||
DbgPrint("IOCTL_AFD_SET_DISCONNECT_DATA_SIZE is UNIMPLEMENTED!\n");
|
||||
break;
|
||||
|
||||
case IOCTL_AFD_SET_DISCONNECT_OPTIONS_SIZE:
|
||||
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_SET_DISCONNECT_OPTIONS_SIZE\n"));
|
||||
DbgPrint("IOCTL_AFD_SET_DISCONNECT_OPTIONS_SIZE is UNIMPLEMENTED!\n");
|
||||
break;
|
||||
|
||||
case IOCTL_AFD_DEFER_ACCEPT:
|
||||
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_DEFER_ACCEPT\n"));
|
||||
DbgPrint("IOCTL_AFD_DEFER_ACCEPT is UNIMPLEMENTED!\n");
|
||||
break;
|
||||
|
||||
case IOCTL_AFD_GET_PENDING_CONNECT_DATA:
|
||||
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_GET_PENDING_CONNECT_DATA\n"));
|
||||
DbgPrint("IOCTL_AFD_GET_PENDING_CONNECT_DATA is UNIMPLEMENTED!\n");
|
||||
break;
|
||||
|
||||
case IOCTL_AFD_VALIDATE_GROUP:
|
||||
DbgPrint("IOCTL_AFD_VALIDATE_GROUP is UNIMPLEMENTED!\n");
|
||||
break;
|
||||
|
||||
default:
|
||||
Status = STATUS_NOT_IMPLEMENTED;
|
||||
AFD_DbgPrint(MIN_TRACE, ("Unknown IOCTL (0x%x)\n",
|
||||
IrpSp->Parameters.DeviceIoControl.
|
||||
IoControlCode));
|
||||
Status = STATUS_NOT_SUPPORTED;
|
||||
DbgPrint("Unknown IOCTL (0x%x)\n",
|
||||
IrpSp->Parameters.DeviceIoControl.IoControlCode);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
|
|
@ -416,13 +416,13 @@ AfdPacketSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
|||
|
||||
AFD_DbgPrint
|
||||
(MID_TRACE,("RemoteAddress #%d Type %d\n",
|
||||
((PTRANSPORT_ADDRESS)SendReq->RemoteAddress)->
|
||||
((PTRANSPORT_ADDRESS)SendReq->TdiConnection.RemoteAddress)->
|
||||
TAAddressCount,
|
||||
((PTRANSPORT_ADDRESS)SendReq->RemoteAddress)->
|
||||
((PTRANSPORT_ADDRESS)SendReq->TdiConnection.RemoteAddress)->
|
||||
Address[0].AddressType));
|
||||
|
||||
TdiBuildConnectionInfo( &TargetAddress,
|
||||
((PTRANSPORT_ADDRESS)SendReq->RemoteAddress) );
|
||||
((PTRANSPORT_ADDRESS)SendReq->TdiConnection.RemoteAddress) );
|
||||
|
||||
/* Check the size of the Address given ... */
|
||||
|
||||
|
|
|
@ -226,6 +226,9 @@ NTSTATUS NTAPI
|
|||
AfdGetContext( PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||
PIO_STACK_LOCATION IrpSp );
|
||||
NTSTATUS NTAPI
|
||||
AfdGetContextSize( PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||
PIO_STACK_LOCATION IrpSp );
|
||||
NTSTATUS NTAPI
|
||||
AfdSetContext( PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||
PIO_STACK_LOCATION IrpSp );
|
||||
|
||||
|
|
|
@ -173,10 +173,27 @@ TDI_STATUS InfoTdiQueryGetArptableMIB(TDIEntityID ID,
|
|||
PNDIS_BUFFER Buffer,
|
||||
PUINT BufferSize);
|
||||
|
||||
/* Insert and remove interface entities */
|
||||
TDI_STATUS SetAddressFileInfo(TDIObjectID *ID,
|
||||
PADDRESS_FILE AddrFile,
|
||||
PVOID Buffer,
|
||||
UINT BufferSize);
|
||||
|
||||
TDI_STATUS GetAddressFileInfo(TDIObjectID *ID,
|
||||
PADDRESS_FILE AddrFile,
|
||||
PVOID Buffer,
|
||||
PUINT BufferSize);
|
||||
|
||||
/* Insert and remove entities */
|
||||
VOID InsertTDIInterfaceEntity( PIP_INTERFACE Interface );
|
||||
|
||||
VOID RemoveTDIInterfaceEntity( PIP_INTERFACE Interface );
|
||||
|
||||
VOID AddEntity(ULONG EntityType,
|
||||
PVOID Context,
|
||||
ULONG Flags);
|
||||
|
||||
VOID RemoveEntityByContext(PVOID Context);
|
||||
|
||||
#endif /* __INFO_H */
|
||||
|
||||
/* EOF */
|
||||
|
|
|
@ -25,6 +25,7 @@ NTSTATUS RawIPShutdown(
|
|||
VOID);
|
||||
|
||||
NTSTATUS AddGenericHeaderIPv4(
|
||||
PADDRESS_FILE AddrFile,
|
||||
PIP_ADDRESS RemoteAddress,
|
||||
USHORT RemotePort,
|
||||
PIP_ADDRESS LocalAddress,
|
||||
|
|
|
@ -158,6 +158,7 @@ typedef struct _ADDRESS_FILE {
|
|||
USHORT Family; /* Address family */
|
||||
USHORT Protocol; /* Protocol number */
|
||||
USHORT Port; /* Network port (network byte order) */
|
||||
UCHAR TTL; /* Time to live stored in packets sent from this address file */
|
||||
WORK_QUEUE_ITEM WorkItem; /* Work queue item handle */
|
||||
DATAGRAM_COMPLETION_ROUTINE Complete; /* Completion routine for delete request */
|
||||
PVOID Context; /* Delete request context */
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
<file>recmutex.c</file>
|
||||
</directory>
|
||||
<directory name="tcpip">
|
||||
<file>ainfo.c</file>
|
||||
<file>buffer.c</file>
|
||||
<file>dispatch.c</file>
|
||||
<file>fileobjs.c</file>
|
||||
|
|
|
@ -201,6 +201,9 @@ NTSTATUS FileOpenAddress(
|
|||
|
||||
AddrFile->Free = AddrFileFree;
|
||||
|
||||
/* Set our default TTL */
|
||||
AddrFile->TTL = 128;
|
||||
|
||||
/* Make sure address is a local unicast address or 0 */
|
||||
/* FIXME: IPv4 only */
|
||||
AddrFile->Family = Address->Address[0].AddressType;
|
||||
|
@ -231,6 +234,8 @@ NTSTATUS FileOpenAddress(
|
|||
return STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
AddEntity(CO_TL_ENTITY, AddrFile, CO_TL_TCP);
|
||||
|
||||
AddrFile->Send = NULL; /* TCPSendData */
|
||||
break;
|
||||
|
||||
|
@ -250,18 +255,27 @@ NTSTATUS FileOpenAddress(
|
|||
TI_DbgPrint(MID_TRACE,("Setting port %d (wanted %d)\n",
|
||||
AddrFile->Port,
|
||||
Address->Address[0].Address[0].sin_port));
|
||||
|
||||
AddEntity(CL_TL_ENTITY, AddrFile, CL_TL_UDP);
|
||||
|
||||
AddrFile->Send = UDPSendDatagram;
|
||||
break;
|
||||
|
||||
case IPPROTO_ICMP:
|
||||
AddrFile->Port = 0;
|
||||
AddrFile->Send = ICMPSendDatagram;
|
||||
|
||||
/* FIXME: Verify this */
|
||||
AddEntity(ER_ENTITY, AddrFile, ER_ICMP);
|
||||
break;
|
||||
|
||||
default:
|
||||
/* Use raw IP for all other protocols */
|
||||
AddrFile->Port = 0;
|
||||
AddrFile->Send = RawIPSendDatagram;
|
||||
|
||||
/* FIXME: Verify this */
|
||||
AddEntity(CL_TL_ENTITY, AddrFile, 0);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -380,6 +394,8 @@ NTSTATUS FileCloseAddress(
|
|||
break;
|
||||
}
|
||||
|
||||
RemoveEntityByContext(AddrFile);
|
||||
|
||||
(*AddrFile->Free)(AddrFile);
|
||||
|
||||
TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));
|
||||
|
|
|
@ -160,105 +160,17 @@ TDI_STATUS InfoTdiSetArptableMIB(PIP_INTERFACE IF, PVOID Buffer, UINT BufferSize
|
|||
}
|
||||
|
||||
VOID InsertTDIInterfaceEntity( PIP_INTERFACE Interface ) {
|
||||
KIRQL OldIrql;
|
||||
UINT IFCount = 0, CLNLCount = 0, CLTLCount = 0, COTLCount = 0, ATCount = 0, ERCount = 0, i;
|
||||
AddEntity(IF_ENTITY, Interface, IF_MIB);
|
||||
|
||||
TI_DbgPrint(DEBUG_INFO,
|
||||
("Inserting interface %08x (%d entities already)\n",
|
||||
Interface, EntityCount));
|
||||
AddEntity(AT_ENTITY, Interface,
|
||||
(Interface != Loopback) ? AT_ARP : AT_NULL);
|
||||
|
||||
TcpipAcquireSpinLock( &EntityListLock, &OldIrql );
|
||||
|
||||
/* Count IP Entities */
|
||||
for( i = 0; i < EntityCount; i++ )
|
||||
switch( EntityList[i].tei_entity )
|
||||
{
|
||||
case IF_ENTITY:
|
||||
IFCount++;
|
||||
break;
|
||||
|
||||
case CL_NL_ENTITY:
|
||||
CLNLCount++;
|
||||
break;
|
||||
|
||||
case CL_TL_ENTITY:
|
||||
CLTLCount++;
|
||||
break;
|
||||
|
||||
case CO_TL_ENTITY:
|
||||
COTLCount++;
|
||||
break;
|
||||
|
||||
case AT_ENTITY:
|
||||
ATCount++;
|
||||
break;
|
||||
|
||||
case ER_ENTITY:
|
||||
ERCount++;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
EntityList[EntityCount].tei_entity = IF_ENTITY;
|
||||
EntityList[EntityCount].tei_instance = IFCount;
|
||||
EntityList[EntityCount].context = Interface;
|
||||
EntityList[EntityCount].flags = IF_MIB;
|
||||
EntityCount++;
|
||||
EntityList[EntityCount].tei_entity = CL_NL_ENTITY;
|
||||
EntityList[EntityCount].tei_instance = CLNLCount;
|
||||
EntityList[EntityCount].context = Interface;
|
||||
EntityList[EntityCount].flags = CL_NL_IP;
|
||||
EntityCount++;
|
||||
EntityList[EntityCount].tei_entity = CL_TL_ENTITY;
|
||||
EntityList[EntityCount].tei_instance = CLTLCount;
|
||||
EntityList[EntityCount].context = Interface;
|
||||
EntityList[EntityCount].flags = CL_TL_UDP;
|
||||
EntityCount++;
|
||||
EntityList[EntityCount].tei_entity = CO_TL_ENTITY;
|
||||
EntityList[EntityCount].tei_instance = COTLCount;
|
||||
EntityList[EntityCount].context = Interface;
|
||||
EntityList[EntityCount].flags = CO_TL_TCP;
|
||||
EntityCount++;
|
||||
EntityList[EntityCount].tei_entity = ER_ENTITY;
|
||||
EntityList[EntityCount].tei_instance = ERCount;
|
||||
EntityList[EntityCount].context = Interface;
|
||||
EntityList[EntityCount].flags = ER_ICMP;
|
||||
EntityCount++;
|
||||
EntityList[EntityCount].tei_entity = AT_ENTITY;
|
||||
EntityList[EntityCount].tei_instance = ATCount;
|
||||
EntityList[EntityCount].context = Interface;
|
||||
EntityList[EntityCount].flags = (Interface != Loopback) ? AT_ARP : AT_NULL;
|
||||
EntityCount++;
|
||||
|
||||
TcpipReleaseSpinLock( &EntityListLock, OldIrql );
|
||||
/* FIXME: This is probably wrong */
|
||||
AddEntity(CL_NL_ENTITY, Interface, CL_NL_IP);
|
||||
}
|
||||
|
||||
VOID RemoveTDIInterfaceEntity( PIP_INTERFACE Interface ) {
|
||||
KIRQL OldIrql;
|
||||
UINT i;
|
||||
|
||||
TI_DbgPrint(DEBUG_INFO,("Removing TDI entry 0x%x\n", Interface));
|
||||
|
||||
TcpipAcquireSpinLock( &EntityListLock, &OldIrql );
|
||||
|
||||
/* Remove entities that have this interface as context
|
||||
* In the future, this might include AT_ENTITY types, too
|
||||
*/
|
||||
for( i = 0; i < EntityCount; i++ ) {
|
||||
TI_DbgPrint(DEBUG_INFO,("--> examining TDI entry 0x%x\n", EntityList[i].context));
|
||||
if( EntityList[i].context == Interface ) {
|
||||
if( i != EntityCount-1 ) {
|
||||
memcpy( &EntityList[i],
|
||||
&EntityList[--EntityCount],
|
||||
sizeof(EntityList[i]) );
|
||||
} else {
|
||||
EntityCount--;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TcpipReleaseSpinLock( &EntityListLock, OldIrql );
|
||||
/* This removes all of them */
|
||||
RemoveEntityByContext(Interface);
|
||||
}
|
||||
|
||||
|
|
|
@ -12,6 +12,48 @@
|
|||
#include <debug.h>
|
||||
#include <route.h>
|
||||
|
||||
VOID AddEntity(ULONG EntityType, PVOID Context, ULONG Flags)
|
||||
{
|
||||
KIRQL OldIrql;
|
||||
ULONG i, Count = 0;
|
||||
|
||||
TcpipAcquireSpinLock(&EntityListLock, &OldIrql);
|
||||
|
||||
for (i = 0; i < EntityCount; i++)
|
||||
if (EntityList[i].tei_entity == EntityType)
|
||||
Count++;
|
||||
|
||||
EntityList[EntityCount].tei_entity = EntityType;
|
||||
EntityList[EntityCount].tei_instance = Count;
|
||||
EntityList[EntityCount].context = Context;
|
||||
EntityList[EntityCount].flags = Flags;
|
||||
EntityCount++;
|
||||
|
||||
TcpipReleaseSpinLock(&EntityListLock, OldIrql);
|
||||
}
|
||||
|
||||
VOID RemoveEntityByContext(PVOID Context)
|
||||
{
|
||||
ULONG i;
|
||||
KIRQL OldIrql;
|
||||
|
||||
TcpipAcquireSpinLock(&EntityListLock, &OldIrql);
|
||||
|
||||
for (i = 0; i < EntityCount; i++) {
|
||||
if( EntityList[i].context == Context ) {
|
||||
if( i != EntityCount - 1 ) {
|
||||
memcpy( &EntityList[i],
|
||||
&EntityList[--EntityCount],
|
||||
sizeof(EntityList[i]) );
|
||||
} else {
|
||||
EntityCount--;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TcpipReleaseSpinLock(&EntityListLock, OldIrql);
|
||||
}
|
||||
|
||||
PVOID GetContext(TDIEntityID ID)
|
||||
{
|
||||
UINT i;
|
||||
|
@ -178,9 +220,20 @@ TDI_STATUS InfoTdiQueryInformationEx(
|
|||
}
|
||||
|
||||
case INFO_CLASS_PROTOCOL:
|
||||
if (ID->toi_type == INFO_TYPE_ADDRESS_OBJECT)
|
||||
{
|
||||
if ((EntityListContext = GetContext(ID->toi_entity)))
|
||||
return GetAddressFileInfo(ID, EntityListContext, Buffer, BufferSize);
|
||||
else
|
||||
return TDI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
switch (ID->toi_id)
|
||||
{
|
||||
case IF_MIB_STATS_ID:
|
||||
if (ID->toi_type != INFO_TYPE_PROVIDER)
|
||||
return TDI_INVALID_PARAMETER;
|
||||
|
||||
if (ID->toi_entity.tei_entity == IF_ENTITY)
|
||||
if ((EntityListContext = GetContext(ID->toi_entity)))
|
||||
return InfoTdiQueryGetInterfaceMIB(ID->toi_entity, EntityListContext, Buffer, BufferSize);
|
||||
|
@ -262,6 +315,14 @@ TDI_STATUS InfoTdiSetInformationEx
|
|||
switch (ID->toi_class)
|
||||
{
|
||||
case INFO_CLASS_PROTOCOL:
|
||||
if (ID->toi_type == INFO_TYPE_ADDRESS_OBJECT)
|
||||
{
|
||||
if ((EntityListContext = GetContext(ID->toi_entity)))
|
||||
return SetAddressFileInfo(ID, EntityListContext, Buffer, BufferSize);
|
||||
else
|
||||
return TDI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
switch (ID->toi_id)
|
||||
{
|
||||
case IP_MIB_ARPTABLE_ENTRY_ID:
|
||||
|
|
|
@ -30,6 +30,7 @@ typedef struct _AFD_INFO {
|
|||
union {
|
||||
ULONG Ulong;
|
||||
LARGE_INTEGER LargeInteger;
|
||||
BOOLEAN Boolean;
|
||||
} Information;
|
||||
ULONG Padding;
|
||||
} AFD_INFO, *PAFD_INFO;
|
||||
|
@ -61,7 +62,7 @@ typedef struct _AFD_POLL_INFO {
|
|||
typedef struct _AFD_ACCEPT_DATA {
|
||||
ULONG UseSAN;
|
||||
ULONG SequenceNumber;
|
||||
ULONG ListenHandle;
|
||||
HANDLE ListenHandle;
|
||||
} AFD_ACCEPT_DATA, *PAFD_ACCEPT_DATA;
|
||||
|
||||
typedef struct _AFD_RECEIVED_ACCEPT_DATA {
|
||||
|
@ -107,9 +108,8 @@ typedef struct _AFD_SEND_INFO_UDP {
|
|||
PAFD_WSABUF BufferArray;
|
||||
ULONG BufferCount;
|
||||
ULONG AfdFlags;
|
||||
ULONG Padding[9];
|
||||
ULONG SizeOfRemoteAddress;
|
||||
PVOID RemoteAddress;
|
||||
TDI_REQUEST_SEND_DATAGRAM TdiRequest;
|
||||
TDI_CONNECTION_INFORMATION TdiConnection;
|
||||
} AFD_SEND_INFO_UDP, *PAFD_SEND_INFO_UDP;
|
||||
|
||||
typedef struct _AFD_CONNECT_INFO {
|
||||
|
@ -135,6 +135,18 @@ typedef struct _AFD_DISCONNECT_INFO {
|
|||
LARGE_INTEGER Timeout;
|
||||
} AFD_DISCONNECT_INFO, *PAFD_DISCONNECT_INFO;
|
||||
|
||||
typedef struct _AFD_VALIDATE_GROUP_DATA
|
||||
{
|
||||
LONG GroupId;
|
||||
TRANSPORT_ADDRESS Address;
|
||||
} AFD_VALIDATE_GROUP_DATA, *PAFD_VALIDATE_GROUP_DATA;
|
||||
|
||||
typedef struct _AFD_TDI_HANDLE_DATA
|
||||
{
|
||||
HANDLE TdiAddressHandle;
|
||||
HANDLE TdiConnectionHandle;
|
||||
} AFD_TDI_HANDLE_DATA, *PAFD_TDI_HANDLE_DATA;
|
||||
|
||||
/* AFD Packet Endpoint Flags */
|
||||
#define AFD_ENDPOINT_CONNECTIONLESS 0x1
|
||||
#define AFD_ENDPOINT_MESSAGE_ORIENTED 0x10
|
||||
|
@ -143,9 +155,31 @@ typedef struct _AFD_DISCONNECT_INFO {
|
|||
#define AFD_ENDPOINT_C_ROOT 0x10000
|
||||
#define AFD_ENDPOINT_D_ROOT 0x100000
|
||||
|
||||
/* AFD TDI Query Flags */
|
||||
#define AFD_ADDRESS_HANDLE 0x1L
|
||||
#define AFD_CONNECTION_HANDLE 0x2L
|
||||
|
||||
/* AFD event bits */
|
||||
#define AFD_EVENT_RECEIVE_BIT 0
|
||||
#define AFD_EVENT_OOB_RECEIVE_BIT 1
|
||||
#define AFD_EVENT_SEND_BIT 2
|
||||
#define AFD_EVENT_DISCONNECT_BIT 3
|
||||
#define AFD_EVENT_ABORT_BIT 4
|
||||
#define AFD_EVENT_CLOSE_BIT 5
|
||||
#define AFD_EVENT_CONNECT_BIT 6
|
||||
#define AFD_EVENT_ACCEPT_BIT 7
|
||||
#define AFD_EVENT_CONNECT_FAIL_BIT 8
|
||||
#define AFD_EVENT_QOS_BIT 9
|
||||
#define AFD_EVENT_GROUP_QOS_BIT 10
|
||||
#define AFD_EVENT_ROUTING_INTERFACE_CHANGE_BIT 11
|
||||
#define AFD_EVENT_ADDRESS_LIST_CHANGE_BIT 12
|
||||
#define AFD_MAX_EVENT 13
|
||||
#define AFD_ALL_EVENTS ((1 << AFD_MAX_EVENT) - 1)
|
||||
|
||||
/* AFD Info Flags */
|
||||
#define AFD_INFO_INLINING_MODE 0x01L
|
||||
#define AFD_INFO_BLOCKING_MODE 0x02L
|
||||
#define AFD_INFO_SENDS_IN_PROGRESS 0x04L
|
||||
#define AFD_INFO_SENDS_IN_PROGRESS 0x04L
|
||||
#define AFD_INFO_RECEIVE_WINDOW_SIZE 0x06L
|
||||
#define AFD_INFO_SEND_WINDOW_SIZE 0x07L
|
||||
#define AFD_INFO_GROUP_ID_TYPE 0x10L
|
||||
|
@ -160,20 +194,23 @@ typedef struct _AFD_DISCONNECT_INFO {
|
|||
/* AFD Disconnect Flags */
|
||||
#define AFD_DISCONNECT_SEND 0x01L
|
||||
#define AFD_DISCONNECT_RECV 0x02L
|
||||
#define AFD_DISCONNECT_ABORT 0x04L
|
||||
#define AFD_DISCONNECT_ABORT 0x04L
|
||||
#define AFD_DISCONNECT_DATAGRAM 0x08L
|
||||
|
||||
/* AFD Event Flags */
|
||||
#define AFD_EVENT_RECEIVE 0x1L
|
||||
#define AFD_EVENT_OOB_RECEIVE 0x2L
|
||||
#define AFD_EVENT_SEND 0x4L
|
||||
#define AFD_EVENT_DISCONNECT 0x8L
|
||||
#define AFD_EVENT_ABORT 0x10L
|
||||
#define AFD_EVENT_CLOSE 0x20L
|
||||
#define AFD_EVENT_CONNECT 0x40L
|
||||
#define AFD_EVENT_ACCEPT 0x80L
|
||||
#define AFD_EVENT_CONNECT_FAIL 0x100L
|
||||
#define AFD_EVENT_QOS 0x200L
|
||||
#define AFD_EVENT_GROUP_QOS 0x400L
|
||||
#define AFD_EVENT_RECEIVE (1 << AFD_EVENT_RECEIVE_BIT)
|
||||
#define AFD_EVENT_OOB_RECEIVE (1 << AFD_EVENT_OOB_RECEIVE_BIT)
|
||||
#define AFD_EVENT_SEND (1 << AFD_EVENT_SEND_BIT)
|
||||
#define AFD_EVENT_DISCONNECT (1 << AFD_EVENT_DISCONNECT_BIT)
|
||||
#define AFD_EVENT_ABORT (1 << AFD_EVENT_ABORT_BIT)
|
||||
#define AFD_EVENT_CLOSE (1 << AFD_EVENT_CLOSE_BIT)
|
||||
#define AFD_EVENT_CONNECT (1 << AFD_EVENT_CONNECT_BIT)
|
||||
#define AFD_EVENT_ACCEPT (1 << AFD_EVENT_ACCEPT_BIT)
|
||||
#define AFD_EVENT_CONNECT_FAIL (1 << AFD_EVENT_CONNECT_FAIL_BIT)
|
||||
#define AFD_EVENT_QOS (1 << AFD_EVENT_QOS_BIT)
|
||||
#define AFD_EVENT_GROUP_QOS (1 << AFD_EVENT_GROUP_QOS_BIT)
|
||||
#define AFD_EVENT_ROUTING_INTERFACE_CHANGE (1 << AFD_EVENT_ROUTING_INTERFACE_CHANGE_BIT)
|
||||
#define AFD_EVENT_ADDRESS_LIST_CHANGE (1 << AFD_EVENT_ADDRESS_LIST_CHANGE_BIT)
|
||||
|
||||
/* AFD SEND/RECV Flags */
|
||||
#define AFD_SKIP_FIO 0x1L
|
||||
|
@ -201,6 +238,7 @@ typedef struct _AFD_DISCONNECT_INFO {
|
|||
#define AFD_GET_PEER_NAME 12
|
||||
#define AFD_GET_TDI_HANDLES 13
|
||||
#define AFD_SET_INFO 14
|
||||
#define AFD_GET_CONTEXT_SIZE 15
|
||||
#define AFD_GET_CONTEXT 16
|
||||
#define AFD_SET_CONTEXT 17
|
||||
#define AFD_SET_CONNECT_DATA 18
|
||||
|
@ -220,6 +258,7 @@ typedef struct _AFD_DISCONNECT_INFO {
|
|||
#define AFD_ENUM_NETWORK_EVENTS 34
|
||||
#define AFD_DEFER_ACCEPT 35
|
||||
#define AFD_GET_PENDING_CONNECT_DATA 41
|
||||
#define AFD_VALIDATE_GROUP 42
|
||||
|
||||
/* AFD IOCTLs */
|
||||
|
||||
|
@ -253,6 +292,8 @@ typedef struct _AFD_DISCONNECT_INFO {
|
|||
_AFD_CONTROL_CODE(AFD_GET_TDI_HANDLES, METHOD_NEITHER)
|
||||
#define IOCTL_AFD_SET_INFO \
|
||||
_AFD_CONTROL_CODE(AFD_SET_INFO, METHOD_NEITHER)
|
||||
#define IOCTL_AFD_GET_CONTEXT_SIZE \
|
||||
_AFD_CONTROL_CODE(AFD_GET_CONTEXT_SIZE, METHOD_NEITHER)
|
||||
#define IOCTL_AFD_GET_CONTEXT \
|
||||
_AFD_CONTROL_CODE(AFD_GET_CONTEXT, METHOD_NEITHER)
|
||||
#define IOCTL_AFD_SET_CONTEXT \
|
||||
|
@ -291,6 +332,8 @@ typedef struct _AFD_DISCONNECT_INFO {
|
|||
_AFD_CONTROL_CODE(AFD_GET_PENDING_CONNECT_DATA, METHOD_NEITHER)
|
||||
#define IOCTL_AFD_ENUM_NETWORK_EVENTS \
|
||||
_AFD_CONTROL_CODE(AFD_ENUM_NETWORK_EVENTS, METHOD_NEITHER)
|
||||
#define IOCTL_AFD_VALIDATE_GROUP \
|
||||
_AFD_CONTROL_CODE(AFD_VALIDATE_GROUP, METHOD_NEITHER)
|
||||
|
||||
typedef struct _AFD_SOCKET_INFORMATION {
|
||||
BOOL CommandChannel;
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#include "precomp.h"
|
||||
|
||||
NTSTATUS AddGenericHeaderIPv4(
|
||||
PADDRESS_FILE AddrFile,
|
||||
PIP_ADDRESS RemoteAddress,
|
||||
USHORT RemotePort,
|
||||
PIP_ADDRESS LocalAddress,
|
||||
|
@ -62,9 +63,9 @@ NTSTATUS AddGenericHeaderIPv4(
|
|||
IPHeader->Id = (USHORT)Random();
|
||||
/* One fragment at offset 0 */
|
||||
IPHeader->FlagsFragOfs = 0;
|
||||
/* Time-to-Live is 128 */
|
||||
IPHeader->Ttl = 128;
|
||||
/* User Datagram Protocol */
|
||||
/* Time-to-Live */
|
||||
IPHeader->Ttl = AddrFile->TTL;
|
||||
/* Protocol */
|
||||
IPHeader->Protocol = Protocol;
|
||||
/* Checksum is 0 (for later calculation of this) */
|
||||
IPHeader->Checksum = 0;
|
||||
|
@ -82,6 +83,7 @@ NTSTATUS AddGenericHeaderIPv4(
|
|||
|
||||
|
||||
NTSTATUS BuildRawIpPacket(
|
||||
PADDRESS_FILE AddrFile,
|
||||
PIP_PACKET Packet,
|
||||
PIP_ADDRESS RemoteAddress,
|
||||
USHORT RemotePort,
|
||||
|
@ -124,9 +126,9 @@ NTSTATUS BuildRawIpPacket(
|
|||
switch (RemoteAddress->Type) {
|
||||
case IP_ADDRESS_V4:
|
||||
Status = AddGenericHeaderIPv4
|
||||
(RemoteAddress, RemotePort,
|
||||
(AddrFile, RemoteAddress, RemotePort,
|
||||
LocalAddress, LocalPort, Packet, DataLen,
|
||||
IPPROTO_RAW,
|
||||
AddrFile->Protocol,
|
||||
0, (PVOID *)&Payload );
|
||||
break;
|
||||
case IP_ADDRESS_V6:
|
||||
|
@ -225,7 +227,8 @@ NTSTATUS RawIPSendDatagram(
|
|||
LocalAddress = NCE->Interface->Unicast;
|
||||
}
|
||||
|
||||
Status = BuildRawIpPacket( &Packet,
|
||||
Status = BuildRawIpPacket( AddrFile,
|
||||
&Packet,
|
||||
&RemoteAddress,
|
||||
RemotePort,
|
||||
&LocalAddress,
|
||||
|
|
|
@ -14,6 +14,7 @@ BOOLEAN UDPInitialized = FALSE;
|
|||
PORT_SET UDPPorts;
|
||||
|
||||
NTSTATUS AddUDPHeaderIPv4(
|
||||
PADDRESS_FILE AddrFile,
|
||||
PIP_ADDRESS RemoteAddress,
|
||||
USHORT RemotePort,
|
||||
PIP_ADDRESS LocalAddress,
|
||||
|
@ -39,7 +40,7 @@ NTSTATUS AddUDPHeaderIPv4(
|
|||
IPPacket, IPPacket->NdisPacket));
|
||||
|
||||
Status = AddGenericHeaderIPv4
|
||||
( RemoteAddress, RemotePort,
|
||||
( AddrFile, RemoteAddress, RemotePort,
|
||||
LocalAddress, LocalPort,
|
||||
IPPacket, DataLength, IPPROTO_UDP,
|
||||
sizeof(UDP_HEADER), (PVOID *)&UDPHeader );
|
||||
|
@ -75,6 +76,7 @@ NTSTATUS AddUDPHeaderIPv4(
|
|||
|
||||
|
||||
NTSTATUS BuildUDPPacket(
|
||||
PADDRESS_FILE AddrFile,
|
||||
PIP_PACKET Packet,
|
||||
PIP_ADDRESS RemoteAddress,
|
||||
USHORT RemotePort,
|
||||
|
@ -115,7 +117,7 @@ NTSTATUS BuildUDPPacket(
|
|||
|
||||
switch (RemoteAddress->Type) {
|
||||
case IP_ADDRESS_V4:
|
||||
Status = AddUDPHeaderIPv4(RemoteAddress, RemotePort,
|
||||
Status = AddUDPHeaderIPv4(AddrFile, RemoteAddress, RemotePort,
|
||||
LocalAddress, LocalPort, Packet, DataBuffer, DataLen);
|
||||
break;
|
||||
case IP_ADDRESS_V6:
|
||||
|
@ -201,7 +203,8 @@ NTSTATUS UDPSendDatagram(
|
|||
LocalAddress = NCE->Interface->Unicast;
|
||||
}
|
||||
|
||||
Status = BuildUDPPacket( &Packet,
|
||||
Status = BuildUDPPacket( AddrFile,
|
||||
&Packet,
|
||||
&RemoteAddress,
|
||||
RemotePort,
|
||||
&LocalAddress,
|
||||
|
|
Loading…
Reference in a new issue