[rshell]
[reactos.git] / drivers / network / ndis / ndis / efilter.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS NDIS library
4 * FILE: ndis/efilter.c
5 * PURPOSE: Ethernet filter functions
6 * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
7 * Vizzini (vizzini@plasmic.com)
8 * REVISIONS:
9 * CSH 01/08-2000 Created
10 */
11
12 #include "ndissys.h"
13
14 BOOLEAN
15 NTAPI
16 EthCreateFilter(
17 IN UINT MaximumMulticastAddresses,
18 IN PUCHAR AdapterAddress,
19 OUT PETH_FILTER * Filter)
20 /*
21 * FUNCTION: Construct an ethernet filter
22 * ARGUMENTS:
23 * MaximumMulticastAddresses: Maximum number of multicast adderesses.
24 * AdapterAddress: Current ethernet address of the adapter.
25 * Filter: The created filter on successful return.
26 * RETURNS:
27 * TRUE if the filter was created
28 * FALSE otherwise
29 * NOTE:
30 * - This function is no longer exported and intentionally doesn't
31 * follow the W2K prototype. It was deprecated since NDIS 4 so it
32 * shouldn't be problem.
33 */
34 {
35 PETHI_FILTER NewFilter;
36
37 NewFilter = ExAllocatePool(NonPagedPool, sizeof(ETHI_FILTER));
38 if (NewFilter != NULL)
39 {
40 RtlZeroMemory(NewFilter, sizeof(ETHI_FILTER));
41 NewFilter->MaxMulticastAddresses = MaximumMulticastAddresses;
42 RtlCopyMemory(NewFilter->AdapterAddress, AdapterAddress, ETH_LENGTH_OF_ADDRESS);
43 *Filter = (PETH_FILTER)NewFilter;
44 return TRUE;
45 }
46 else
47 {
48 NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources\n"));
49 *Filter = NULL;
50 return FALSE;
51 }
52 }
53
54
55 VOID
56 EXPORT
57 EthDeleteFilter(
58 IN PETH_FILTER Filter)
59 {
60 ExFreePool(Filter);
61 }
62
63
64 /*
65 * @implemented
66 */
67 VOID
68 EXPORT
69 EthFilterDprIndicateReceive(
70 IN PETH_FILTER Filter,
71 IN NDIS_HANDLE MacReceiveContext,
72 IN PCHAR Address,
73 IN PVOID HeaderBuffer,
74 IN UINT HeaderBufferSize,
75 IN PVOID LookaheadBuffer,
76 IN UINT LookaheadBufferSize,
77 IN UINT PacketSize)
78 /*
79 * FUNCTION: Receive indication function for Ethernet devices
80 * ARGUMENTS:
81 * MiniportAdapter = Miniport Adapter Handle (PLOGICAL_ADAPTER)
82 * MacReceiveContext = MAC receive context handle
83 * Address = Pointer to destination Ethernet address
84 * HeaderBuffer = Pointer to Ethernet header buffer
85 * HeaderBufferSize = Size of Ethernet header buffer
86 * LookaheadBuffer = Pointer to lookahead buffer
87 * LookaheadBufferSize = Size of lookahead buffer
88 * PacketSize = Total size of received packet
89 */
90 {
91 /* Not sure if this is a valid thing to do, but we do arrive here early
92 * in the boot process with Filter NULL. We need to investigate whether
93 * this should be handled or not allowed. */
94 if( !Filter ) {
95 NDIS_DbgPrint(MIN_TRACE, ("Filter is NULL\n"));
96 return;
97 }
98 MiniIndicateData((PLOGICAL_ADAPTER)((PETHI_FILTER)Filter)->Miniport,
99 MacReceiveContext,
100 HeaderBuffer,
101 HeaderBufferSize,
102 LookaheadBuffer,
103 LookaheadBufferSize,
104 PacketSize);
105 }
106
107
108 /*
109 * @implemented
110 */
111 VOID
112 EXPORT
113 EthFilterDprIndicateReceiveComplete(
114 IN PETH_FILTER Filter)
115 /*
116 * FUNCTION: Receive indication complete function for Ethernet devices
117 * ARGUMENTS:
118 * Filter = Pointer to Ethernet filter
119 */
120 {
121 PLIST_ENTRY CurrentEntry;
122 PLOGICAL_ADAPTER Adapter;
123 PADAPTER_BINDING AdapterBinding;
124
125 NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
126
127 if( !Filter ) {
128 NDIS_DbgPrint(MIN_TRACE, ("Filter is NULL\n"));
129 return;
130 }
131
132 Adapter = (PLOGICAL_ADAPTER)((PETHI_FILTER)Filter)->Miniport;
133
134 NDIS_DbgPrint(MAX_TRACE, ("acquiring miniport block lock\n"));
135 KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
136 {
137 CurrentEntry = Adapter->ProtocolListHead.Flink;
138
139 while (CurrentEntry != &Adapter->ProtocolListHead)
140 {
141 AdapterBinding = CONTAINING_RECORD(CurrentEntry, ADAPTER_BINDING, AdapterListEntry);
142
143 (*AdapterBinding->ProtocolBinding->Chars.ReceiveCompleteHandler)(
144 AdapterBinding->NdisOpenBlock.ProtocolBindingContext);
145
146 CurrentEntry = CurrentEntry->Flink;
147 }
148 }
149 KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
150 }
151
152 /* EOF */