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);
|
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))
|
||||||
{
|
{
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue