- 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);
break;
case SO_EXCLUSIVEADDRUSE:
BoolBuffer = (Socket->SharedData.ExclusiveAddressUse != 0);
Buffer = &BoolBuffer;
BufferSize = sizeof(BOOL);
break;
case SO_ERROR:
/* HACK: This needs to be properly tracked */
IntBuffer = 0;
@ -2230,6 +2236,24 @@ WSPSetSockOpt(
Socket->SharedData.LingerData.l_onoff = (*optval != 0) ? 0 : 1;
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:
if (optlen < sizeof(struct linger))
{

View file

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

View file

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

View file

@ -89,6 +89,7 @@ static NTSTATUS TdiOpenDevice(
PUNICODE_STRING DeviceName,
ULONG EaLength,
PFILE_FULL_EA_INFORMATION EaInfo,
ULONG ShareType,
PHANDLE Handle,
PFILE_OBJECT *Object)
/*
@ -106,8 +107,21 @@ static NTSTATUS TdiOpenDevice(
OBJECT_ATTRIBUTES Attr;
IO_STATUS_BLOCK Iosb;
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 */
DeviceName, /* Device name */
@ -122,7 +136,7 @@ static NTSTATUS TdiOpenDevice(
&Iosb, /* IO status */
0, /* Initial allocation size */
FILE_ATTRIBUTE_NORMAL, /* File attributes */
0, /* Share access */
ShareAccess, /* Share access */
FILE_OPEN_IF, /* Create disposition */
0, /* Create options */
EaInfo, /* EA buffer */
@ -156,6 +170,7 @@ static NTSTATUS TdiOpenDevice(
NTSTATUS TdiOpenAddressFile(
PUNICODE_STRING DeviceName,
PTRANSPORT_ADDRESS Name,
ULONG ShareType,
PHANDLE AddressHandle,
PFILE_OBJECT *AddressObject)
/*
@ -199,6 +214,7 @@ NTSTATUS TdiOpenAddressFile(
Status = TdiOpenDevice(DeviceName,
EaLength,
EaInfo,
ShareType,
AddressHandle,
AddressObject);
ExFreePool(EaInfo);
@ -300,6 +316,7 @@ NTSTATUS TdiOpenConnectionEndpointFile(
Status = TdiOpenDevice(DeviceName,
EaLength,
EaInfo,
AFD_SHARE_UNIQUE,
ConnectionHandle,
ConnectionObject);
ExFreePool(EaInfo);

View file

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

View file

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