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
);
36 AFD_DbgPrint(MID_TRACE
,("Returning %x\n", Status
));
42 AfdBindSocket(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
43 PIO_STACK_LOCATION IrpSp
) {
44 NTSTATUS Status
= STATUS_SUCCESS
;
45 PFILE_OBJECT FileObject
= IrpSp
->FileObject
;
46 PAFD_FCB FCB
= FileObject
->FsContext
;
47 PAFD_BIND_DATA BindReq
;
49 AFD_DbgPrint(MID_TRACE
,("Called\n"));
51 if( !SocketAcquireStateLock( FCB
) ) return LostSocket( Irp
);
52 if( !(BindReq
= LockRequest( Irp
, IrpSp
)) )
53 return UnlockAndMaybeComplete( FCB
, STATUS_NO_MEMORY
,
56 FCB
->LocalAddress
= TaCopyTransportAddress( &BindReq
->Address
);
58 if( FCB
->LocalAddress
)
59 Status
= WarmSocketForBind( FCB
);
60 else Status
= STATUS_NO_MEMORY
;
62 if( NT_SUCCESS(Status
) )
63 FCB
->State
= SOCKET_STATE_BOUND
;
64 else return UnlockAndMaybeComplete( FCB
, Status
, Irp
, 0, NULL
);
66 AFD_DbgPrint(MID_TRACE
,("FCB->Flags %x\n", FCB
->Flags
));
68 if( FCB
->Flags
& SGID_CONNECTIONLESS
) {
69 /* This will be the from address for subsequent recvfrom calls */
70 TdiBuildConnectionInfo( &FCB
->AddressFrom
,
73 AFD_DbgPrint(MID_TRACE
,("Calling TdiReceiveDatagram\n"));
75 Status
= TdiReceiveDatagram
76 ( &FCB
->ReceiveIrp
.InFlightRequest
,
77 FCB
->AddressFile
.Object
,
82 &FCB
->ReceiveIrp
.Iosb
,
83 PacketSocketRecvComplete
,
86 /* We don't want to wait for this read to complete. */
87 if( Status
== STATUS_PENDING
) Status
= STATUS_SUCCESS
;
90 return UnlockAndMaybeComplete( FCB
, Status
, Irp
, 0, NULL
);