mirror of
https://github.com/reactos/reactos.git
synced 2025-02-22 16:36:33 +00:00
[MSAFD]
- 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:
parent
9e363e0bca
commit
e1499f3b9e
6 changed files with 50 additions and 7 deletions
|
@ -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))
|
||||
{
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in a new issue