- Add support for getting and setting SO_EXCLUSIVEADDRUSE
- Add support for setting SO_REUSEADDR
[AFD]
- Implement proper TDI way of indicating a reusable address file
- More work remains in TCP/IP to support this

svn path=/trunk/; revision=57115
This commit is contained in:
Cameron Gutman 2012-08-20 05:48:52 +00:00
parent 9e363e0bca
commit e1499f3b9e
6 changed files with 50 additions and 7 deletions

View file

@ -2140,6 +2140,12 @@ WSPGetSockOpt(IN SOCKET Handle,
BufferSize = sizeof(BOOL); BufferSize = sizeof(BOOL);
break; break;
case SO_EXCLUSIVEADDRUSE:
BoolBuffer = (Socket->SharedData.ExclusiveAddressUse != 0);
Buffer = &BoolBuffer;
BufferSize = sizeof(BOOL);
break;
case SO_ERROR: case SO_ERROR:
/* HACK: This needs to be properly tracked */ /* HACK: This needs to be properly tracked */
IntBuffer = 0; IntBuffer = 0;
@ -2230,6 +2236,24 @@ WSPSetSockOpt(
Socket->SharedData.LingerData.l_onoff = (*optval != 0) ? 0 : 1; Socket->SharedData.LingerData.l_onoff = (*optval != 0) ? 0 : 1;
return 0; return 0;
case SO_REUSEADDR:
if (optlen < sizeof(BOOL))
{
*lpErrno = WSAEFAULT;
return SOCKET_ERROR;
}
Socket->SharedData.ReuseAddresses = (*optval != 0) ? 1 : 0;
return 0;
case SO_EXCLUSIVEADDRUSE:
if (optlen < sizeof(BOOL))
{
*lpErrno = WSAEFAULT;
return SOCKET_ERROR;
}
Socket->SharedData.ExclusiveAddressUse = (*optval != 0) ? 1 : 0;
return 0;
case SO_LINGER: case SO_LINGER:
if (optlen < sizeof(struct linger)) if (optlen < sizeof(struct linger))
{ {

View file

@ -10,7 +10,7 @@
#include "afd.h" #include "afd.h"
NTSTATUS WarmSocketForBind( PAFD_FCB FCB ) { NTSTATUS WarmSocketForBind( PAFD_FCB FCB, ULONG ShareType ) {
NTSTATUS Status; NTSTATUS Status;
AFD_DbgPrint(MID_TRACE,("Called (AF %d)\n", AFD_DbgPrint(MID_TRACE,("Called (AF %d)\n",
@ -27,6 +27,7 @@ NTSTATUS WarmSocketForBind( PAFD_FCB FCB ) {
Status = TdiOpenAddressFile(&FCB->TdiDeviceName, Status = TdiOpenAddressFile(&FCB->TdiDeviceName,
FCB->LocalAddress, FCB->LocalAddress,
ShareType,
&FCB->AddressFile.Handle, &FCB->AddressFile.Handle,
&FCB->AddressFile.Object ); &FCB->AddressFile.Object );
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
@ -92,7 +93,7 @@ AfdBindSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
FCB->LocalAddress ); FCB->LocalAddress );
if( NT_SUCCESS(Status) ) if( NT_SUCCESS(Status) )
Status = WarmSocketForBind( FCB ); Status = WarmSocketForBind( FCB, BindReq->ShareType );
AFD_DbgPrint(MID_TRACE,("FCB->Flags %x\n", FCB->Flags)); AFD_DbgPrint(MID_TRACE,("FCB->Flags %x\n", FCB->Flags));
if (NT_SUCCESS(Status)) if (NT_SUCCESS(Status))

View file

@ -445,7 +445,7 @@ AfdStreamSocketConnect(PDEVICE_OBJECT DeviceObject, PIRP Irp,
TaBuildNullTransportAddress( ConnectReq->RemoteAddress.Address[0].AddressType ); TaBuildNullTransportAddress( ConnectReq->RemoteAddress.Address[0].AddressType );
if( FCB->LocalAddress ) { if( FCB->LocalAddress ) {
Status = WarmSocketForBind( FCB ); Status = WarmSocketForBind( FCB, AFD_SHARE_WILDCARD );
if( NT_SUCCESS(Status) ) if( NT_SUCCESS(Status) )
FCB->State = SOCKET_STATE_BOUND; FCB->State = SOCKET_STATE_BOUND;

View file

@ -89,6 +89,7 @@ static NTSTATUS TdiOpenDevice(
PUNICODE_STRING DeviceName, PUNICODE_STRING DeviceName,
ULONG EaLength, ULONG EaLength,
PFILE_FULL_EA_INFORMATION EaInfo, PFILE_FULL_EA_INFORMATION EaInfo,
ULONG ShareType,
PHANDLE Handle, PHANDLE Handle,
PFILE_OBJECT *Object) PFILE_OBJECT *Object)
/* /*
@ -106,8 +107,21 @@ static NTSTATUS TdiOpenDevice(
OBJECT_ATTRIBUTES Attr; OBJECT_ATTRIBUTES Attr;
IO_STATUS_BLOCK Iosb; IO_STATUS_BLOCK Iosb;
NTSTATUS Status; NTSTATUS Status;
ULONG ShareAccess;
AFD_DbgPrint(MAX_TRACE, ("Called. DeviceName (%wZ)\n", DeviceName)); AFD_DbgPrint(MAX_TRACE, ("Called. DeviceName (%wZ, %d)\n", DeviceName, ShareType));
/* Determine the share access */
if (ShareType != AFD_SHARE_REUSE)
{
/* Exclusive access */
ShareAccess = 0;
}
else
{
/* Shared access */
ShareAccess = FILE_SHARE_READ | FILE_SHARE_WRITE;
}
InitializeObjectAttributes(&Attr, /* Attribute buffer */ InitializeObjectAttributes(&Attr, /* Attribute buffer */
DeviceName, /* Device name */ DeviceName, /* Device name */
@ -122,7 +136,7 @@ static NTSTATUS TdiOpenDevice(
&Iosb, /* IO status */ &Iosb, /* IO status */
0, /* Initial allocation size */ 0, /* Initial allocation size */
FILE_ATTRIBUTE_NORMAL, /* File attributes */ FILE_ATTRIBUTE_NORMAL, /* File attributes */
0, /* Share access */ ShareAccess, /* Share access */
FILE_OPEN_IF, /* Create disposition */ FILE_OPEN_IF, /* Create disposition */
0, /* Create options */ 0, /* Create options */
EaInfo, /* EA buffer */ EaInfo, /* EA buffer */
@ -156,6 +170,7 @@ static NTSTATUS TdiOpenDevice(
NTSTATUS TdiOpenAddressFile( NTSTATUS TdiOpenAddressFile(
PUNICODE_STRING DeviceName, PUNICODE_STRING DeviceName,
PTRANSPORT_ADDRESS Name, PTRANSPORT_ADDRESS Name,
ULONG ShareType,
PHANDLE AddressHandle, PHANDLE AddressHandle,
PFILE_OBJECT *AddressObject) PFILE_OBJECT *AddressObject)
/* /*
@ -199,6 +214,7 @@ NTSTATUS TdiOpenAddressFile(
Status = TdiOpenDevice(DeviceName, Status = TdiOpenDevice(DeviceName,
EaLength, EaLength,
EaInfo, EaInfo,
ShareType,
AddressHandle, AddressHandle,
AddressObject); AddressObject);
ExFreePool(EaInfo); ExFreePool(EaInfo);
@ -300,6 +316,7 @@ NTSTATUS TdiOpenConnectionEndpointFile(
Status = TdiOpenDevice(DeviceName, Status = TdiOpenDevice(DeviceName,
EaLength, EaLength,
EaInfo, EaInfo,
AFD_SHARE_UNIQUE,
ConnectionHandle, ConnectionHandle,
ConnectionObject); ConnectionObject);
ExFreePool(EaInfo); ExFreePool(EaInfo);

View file

@ -527,7 +527,7 @@ AfdPacketSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
Address[0].AddressType ); Address[0].AddressType );
if( FCB->LocalAddress ) { if( FCB->LocalAddress ) {
Status = WarmSocketForBind( FCB ); Status = WarmSocketForBind( FCB, AFD_SHARE_WILDCARD );
if( NT_SUCCESS(Status) ) if( NT_SUCCESS(Status) )
FCB->State = SOCKET_STATE_BOUND; FCB->State = SOCKET_STATE_BOUND;

View file

@ -223,7 +223,7 @@ typedef struct _AFD_FCB {
/* bind.c */ /* bind.c */
NTSTATUS WarmSocketForBind( PAFD_FCB FCB ); NTSTATUS WarmSocketForBind( PAFD_FCB FCB, ULONG ShareType );
NTSTATUS NTAPI NTSTATUS NTAPI
AfdBindSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp, AfdBindSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
PIO_STACK_LOCATION IrpSp); PIO_STACK_LOCATION IrpSp);
@ -367,6 +367,7 @@ VOID SignalSocket(
NTSTATUS TdiOpenAddressFile( NTSTATUS TdiOpenAddressFile(
PUNICODE_STRING DeviceName, PUNICODE_STRING DeviceName,
PTRANSPORT_ADDRESS Name, PTRANSPORT_ADDRESS Name,
ULONG ShareType,
PHANDLE AddressHandle, PHANDLE AddressHandle,
PFILE_OBJECT *AddressObject); PFILE_OBJECT *AddressObject);