2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: drivers/net/afd/afd/bind.c
5 * PURPOSE: Ancillary functions driver
6 * PROGRAMMER: Art Yerkes (ayerkes@speakeasy.net)
12 #include "tdi_proto.h"
16 NTSTATUS
WarmSocketForBind( PAFD_FCB FCB
) {
19 AFD_DbgPrint(MID_TRACE
,("Called (AF %d)\n",
20 FCB
->LocalAddress
->Address
[0].AddressType
));
22 if( !FCB
->TdiDeviceName
.Length
|| !FCB
->TdiDeviceName
.Buffer
) {
23 AFD_DbgPrint(MID_TRACE
,("Null Device\n"));
24 return STATUS_NO_SUCH_DEVICE
;
26 if( !FCB
->LocalAddress
) {
27 AFD_DbgPrint(MID_TRACE
,("No local address\n"));
28 return STATUS_INVALID_PARAMETER
;
31 Status
= TdiOpenAddressFile(&FCB
->TdiDeviceName
,
33 &FCB
->AddressFile
.Handle
,
34 &FCB
->AddressFile
.Object
);
35 if (!NT_SUCCESS(Status
))
38 if (FCB
->Flags
& AFD_ENDPOINT_CONNECTIONLESS
)
40 Status
= TdiQueryMaxDatagramLength(FCB
->AddressFile
.Object
,
42 if (NT_SUCCESS(Status
))
44 FCB
->Recv
.Window
= ExAllocatePool(PagedPool
, FCB
->Recv
.Size
);
45 if (!FCB
->Recv
.Window
)
46 Status
= STATUS_NO_MEMORY
;
50 AFD_DbgPrint(MID_TRACE
,("Returning %x\n", Status
));
56 AfdBindSocket(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
57 PIO_STACK_LOCATION IrpSp
) {
58 NTSTATUS Status
= STATUS_SUCCESS
;
59 PFILE_OBJECT FileObject
= IrpSp
->FileObject
;
60 PAFD_FCB FCB
= FileObject
->FsContext
;
61 PAFD_BIND_DATA BindReq
;
63 AFD_DbgPrint(MID_TRACE
,("Called\n"));
65 if( !SocketAcquireStateLock( FCB
) ) return LostSocket( Irp
);
66 if( !(BindReq
= LockRequest( Irp
, IrpSp
)) )
67 return UnlockAndMaybeComplete( FCB
, STATUS_NO_MEMORY
,
70 if( FCB
->LocalAddress
) ExFreePool( FCB
->LocalAddress
);
71 FCB
->LocalAddress
= TaCopyTransportAddress( &BindReq
->Address
);
73 if( FCB
->LocalAddress
)
74 TdiBuildConnectionInfo( &FCB
->AddressFrom
,
77 if( FCB
->AddressFrom
)
78 Status
= WarmSocketForBind( FCB
);
79 else return UnlockAndMaybeComplete(FCB
, STATUS_NO_MEMORY
, Irp
, 0);
81 AFD_DbgPrint(MID_TRACE
,("FCB->Flags %x\n", FCB
->Flags
));
83 if( FCB
->Flags
& AFD_ENDPOINT_CONNECTIONLESS
) {
84 AFD_DbgPrint(MID_TRACE
,("Calling TdiReceiveDatagram\n"));
86 Status
= TdiReceiveDatagram
87 ( &FCB
->ReceiveIrp
.InFlightRequest
,
88 FCB
->AddressFile
.Object
,
93 &FCB
->ReceiveIrp
.Iosb
,
94 PacketSocketRecvComplete
,
97 /* We don't want to wait for this read to complete. */
98 if( Status
== STATUS_PENDING
) Status
= STATUS_SUCCESS
;
101 if (NT_SUCCESS(Status
))
102 FCB
->State
= SOCKET_STATE_BOUND
;
104 /* MSAFD relies on us returning the address file handle in the IOSB */
105 return UnlockAndMaybeComplete( FCB
, Status
, Irp
, (ULONG_PTR
)FCB
->AddressFile
.Handle
);