2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS NDIS User I/O driver
5 * PURPOSE: Protocol stuff
6 * PROGRAMMERS: Cameron Gutman (cameron.gutman@reactos.org)
14 PNDIS_MEDIUM SupportedMedia
= {NdisMedium802_3
};
18 NduOpenAdapterComplete(NDIS_HANDLE ProtocolBindingContext
,
20 NDIS_STATUS OpenStatus
)
22 PNDISUIO_ADAPTER_CONTEXT AdapterContext
= ProtocolBindingContext
;
24 DPRINT("Asynchronous adapter open completed\n");
26 /* Store the final status and signal the event */
27 AdapterContext
->AsyncStatus
= Status
;
28 KeSetEvent(&AdapterContext
->AsyncEvent
, IO_NO_INCREMENT
, FALSE
);
33 NduCloseAdapterComplete(NDIS_HANDLE ProtocolBindingContext
,
36 PNDISUIO_ADAPTER_CONTEXT AdapterContext
= ProtocolBindingContext
;
38 DPRINT("Asynchronous adapter close completed\n");
40 /* Store the final status and signal the event */
41 AdapterContext
->AsyncStatus
= Status
;
42 KeSetEvent(&AdapterContext
->AsyncEvent
, IO_NO_INCREMENT
, FALSE
);
47 NduSendComplete(NDIS_HANDLE ProtocolBindingContext
,
51 /* FIXME: Implement send/receive */
56 NduTransferDataComplete(NDIS_HANDLE ProtocolBindingContext
,
59 UINT BytesTransferred
)
61 /* FIXME: Implement send/receive */
66 NduResetComplete(NDIS_HANDLE ProtocolBindingContext
,
69 PNDISUIO_ADAPTER_CONTEXT AdapterContext
= ProtocolBindingContext
;
71 DPRINT("Asynchronous adapter reset completed\n");
73 /* Store the final status and signal the event */
74 AdapterContext
->AsyncStatus
= Status
;
75 KeSetEvent(&AdapterContext
->AsyncEvent
, IO_NO_INCREMENT
, FALSE
);
80 NduRequestComplete(NDIS_HANDLE ProtocolBindingContext
,
81 PNDIS_REQUEST NdisRequest
,
84 PNDISUIO_ADAPTER_CONTEXT AdapterContext
= ProtocolBindingContext
;
86 DPRINT("Asynchronous adapter request completed\n");
88 /* Store the final status and signal the event */
89 AdapterContext
->AsyncStatus
= Status
;
90 KeSetEvent(&AdapterContext
->AsyncEvent
, IO_NO_INCREMENT
, FALSE
);
95 NduReceive(NDIS_HANDLE ProtocolBindingContext
,
96 NDIS_HANDLE MacReceiveContext
,
98 UINT HeaderBufferSize
,
99 PVOID LookAheadBuffer
,
100 UINT LookaheadBufferSize
,
103 /* FIXME: Implement send/receive */
104 return NDIS_STATUS_NOT_ACCEPTED
;
109 NduReceiveComplete(NDIS_HANDLE ProtocolBindingContext
)
116 NduStatus(NDIS_HANDLE ProtocolBindingContext
,
117 NDIS_STATUS GeneralStatus
,
119 UINT StatusBufferSize
)
121 /* FIXME: Implement status tracking */
126 NduStatusComplete(NDIS_HANDLE ProtocolBindingContext
)
128 /* FIXME: Implement status tracking */
132 UnbindAdapterByContext(PNDISUIO_ADAPTER_CONTEXT AdapterContext
)
135 PLIST_ENTRY CurrentOpenEntry
;
136 PNDISUIO_OPEN_ENTRY OpenEntry
;
138 /* Remove the adapter context from the global list */
139 KeAcquireSpinLock(&GlobalAdapterListLock
, &OldIrql
);
140 RemoveEntryList(&AdapterContext
->ListEntry
);
141 KeReleaseSpinLock(&GlobalAdapterListLock
, OldIrql
);
143 /* Invalidate all handles to this adapter */
144 CurrentOpenEntry
= AdapterContext
->OpenEntryList
.Flink
;
145 while (CurrentOpenEntry
!= &AdapterContext
->OpenEntryList
)
147 OpenEntry
= CONTAINING_RECORD(CurrentOpenEntry
, NDISUIO_OPEN_ENTRY
, ListEntry
);
149 /* Make sure the entry is sane */
150 ASSERT(OpenEntry
->FileObject
);
152 /* Remove the adapter context pointer */
153 ASSERT(AdapterContext
== OpenEntry
->FileObject
->FsContext
);
154 OpenEntry
->FileObject
->FsContext
= NULL
;
155 AdapterContext
->OpenCount
--;
157 /* Remove the open entry pointer */
158 ASSERT(OpenEntry
== OpenEntry
->FileObject
->FsContext2
);
159 OpenEntry
->FileObject
->FsContext2
= NULL
;
161 /* Move to the next entry */
162 CurrentOpenEntry
= CurrentOpenEntry
->Flink
;
164 /* Free the open entry */
165 ExFreePool(OpenEntry
);
168 /* If this fails, we have a refcount mismatch somewhere */
169 ASSERT(AdapterContext
->OpenCount
== 0);
171 /* Send the close request */
172 NdisCloseAdapter(Status
,
173 AdapterContext
->BindingHandle
);
175 /* Wait for a pending close */
176 if (*Status
== NDIS_STATUS_PENDING
)
178 KeWaitForSingleObject(&AdapterContext
->AsyncEvent
,
183 *Status
= AdapterContext
->AsyncStatus
;
186 /* Free the context */
187 ExFreePool(AdapterContext
);
192 BindAdapterByName(PNDIS_STRING DeviceName
, PNDISUIO_ADAPTER_CONTEXT
*Context
)
194 NDIS_STATUS OpenErrorStatus
;
195 PNDISUIO_ADAPTER_CONTEXT AdapterContext
;
199 /* Allocate the adapter context */
200 AdapterContext
= ExAllocatePool(NonPagedPool
, sizeof(*AdapterContext
));
203 return NDIS_STATUS_RESOURCES
;
206 /* Set up the adapter context */
207 RtlZeroMemory(AdapterContext
, sizeof(*AdapterContext
));
208 KeInitializeEvent(&AdapterContext
->AsyncEvent
, SynchronizationEvent
, FALSE
);
209 KeInitializeSpinLock(&AdapterContext
->Spinlock
);
210 InitializeListHead(&AdapterContext
->PacketList
);
211 InitializeListHead(&AdapterContext
->OpenEntryList
);
212 AdapterContext
->OpenCount
= 0;
214 /* Send the open request */
215 NdisOpenAdapter(&Status
,
217 &AdapterContext
->BindingHandle
,
220 sizeof(SupportedMedia
),
221 GlobalProtocolHandle
,
227 /* Wait for a pending open */
228 if (Status
== NDIS_STATUS_PENDING
)
230 KeWaitForSingleObject(&AdapterContext
->AsyncEvent
,
235 Status
= AdapterContext
->AsyncStatus
;
238 /* Check the final status */
239 if (Status
!= NDIS_STATUS_SUCCESS
)
241 DPRINT1("Failed to open adapter for bind with status 0x%x\n", *Status
);
242 ExFreePool(AdapterContext
);
246 /* Add the adapter context to the global list */
247 ExInterlockedInsertTailList(&GlobalAdapterList
,
248 &AdapterContext
->ListEntry
,
249 &GlobalAdapterListLock
);
251 /* Return the context */
252 *Context
= AdapterContext
;
253 return STATUS_SUCCESS
;
258 NduBindAdapter(PNDIS_STATUS Status
,
259 NDIS_HANDLE BindContext
,
260 PNDIS_STRING DeviceName
,
261 PVOID SystemSpecific1
,
262 PVOID SystemSpecific2
)
264 /* Use our helper function to create a context for this adapter */
265 *Status
= BindAdapterByName(DeviceName
);
270 NduUnbindAdapter(PNDIS_STATUS Status
,
271 NDIS_HANDLE ProtocolBindingContext
,
272 NDIS_HANDLE UnbindContext
)
274 /* This is forced unbind. UnbindAdapterByContext() will take care of
275 * invalidating file handles pointer to this adapter for us */
276 *Status
= UnbindAdapterByContext(ProtocolBindingContext
);