2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS TCP/IP protocol driver
5 * PURPOSE: TDI query and set information routines
6 * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
8 * CSH 01/08-2000 Created
15 VOID
AddEntity(ULONG EntityType
, PVOID Context
, ULONG Flags
)
20 TcpipAcquireSpinLock(&EntityListLock
, &OldIrql
);
22 for (i
= 0; i
< EntityCount
; i
++)
23 if (EntityList
[i
].tei_entity
== EntityType
)
26 EntityList
[EntityCount
].tei_entity
= EntityType
;
27 EntityList
[EntityCount
].tei_instance
= Count
;
28 EntityList
[EntityCount
].context
= Context
;
29 EntityList
[EntityCount
].flags
= Flags
;
32 TcpipReleaseSpinLock(&EntityListLock
, OldIrql
);
35 VOID
RemoveEntityByContext(PVOID Context
)
40 TcpipAcquireSpinLock(&EntityListLock
, &OldIrql
);
42 for (i
= 0; i
< EntityCount
; i
++) {
43 if( EntityList
[i
].context
== Context
) {
44 if( i
!= EntityCount
- 1 ) {
45 memcpy( &EntityList
[i
],
46 &EntityList
[--EntityCount
],
47 sizeof(EntityList
[i
]) );
54 TcpipReleaseSpinLock(&EntityListLock
, OldIrql
);
57 PVOID
GetContext(TDIEntityID ID
)
63 TcpipAcquireSpinLock(&EntityListLock
, &OldIrql
);
65 for (i
= 0; i
< EntityCount
; i
++)
67 if (EntityList
[i
].tei_entity
== ID
.tei_entity
&&
68 EntityList
[i
].tei_instance
== ID
.tei_instance
)
74 TcpipReleaseSpinLock(&EntityListLock
, OldIrql
);
75 DbgPrint("WARNING: Unable to get context for %d %d\n", ID
.tei_entity
, ID
.tei_instance
);
79 Context
= EntityList
[i
].context
;
81 TcpipReleaseSpinLock(&EntityListLock
, OldIrql
);
86 TDI_STATUS
InfoCopyOut( PCHAR DataOut
, UINT SizeOut
,
87 PNDIS_BUFFER ClientBuf
, PUINT ClientBufSize
) {
88 UINT RememberedCBSize
= *ClientBufSize
;
89 *ClientBufSize
= SizeOut
;
91 /* The driver returns success even when it couldn't fit every available
93 if( RememberedCBSize
< SizeOut
|| !ClientBuf
)
96 CopyBufferToBufferChain( ClientBuf
, 0, (PCHAR
)DataOut
, SizeOut
);
101 TDI_STATUS
InfoTdiQueryEntityType(TDIEntityID ID
,
108 TcpipAcquireSpinLock(&EntityListLock
, &OldIrql
);
110 for (i
= 0; i
< EntityCount
; i
++)
112 if (EntityList
[i
].tei_entity
== ID
.tei_entity
&&
113 EntityList
[i
].tei_instance
== ID
.tei_instance
)
117 if (i
== EntityCount
)
119 TcpipReleaseSpinLock(&EntityListLock
, OldIrql
);
120 return TDI_INVALID_PARAMETER
;
123 Flags
= EntityList
[i
].flags
;
125 InfoCopyOut((PCHAR
)&Flags
,
130 TcpipReleaseSpinLock(&EntityListLock
, OldIrql
);
135 TDI_STATUS
InfoTdiQueryListEntities(PNDIS_BUFFER Buffer
,
138 UINT Count
, Size
, BufSize
= *BufferSize
;
141 TI_DbgPrint(DEBUG_INFO
,("About to copy %d TDIEntityIDs to user\n",
144 TcpipAcquireSpinLock(&EntityListLock
, &OldIrql
);
146 Size
= EntityCount
* sizeof(TDIEntityID
);
149 TI_DbgPrint(DEBUG_INFO
,("BufSize: %d, NeededSize: %d\n", BufSize
, Size
));
151 if (BufSize
< Size
|| !Buffer
)
153 TcpipReleaseSpinLock( &EntityListLock
, OldIrql
);
154 /* The buffer is too small to contain requested data, but we return
155 * success anyway, as we did everything we wanted. */
159 /* Return entity list -- Copy only the TDIEntityID parts. */
160 for( Count
= 0; Count
< EntityCount
; Count
++ ) {
161 CopyBufferToBufferChain(Buffer
,
162 Count
* sizeof(TDIEntityID
),
163 (PCHAR
)&EntityList
[Count
],
164 sizeof(TDIEntityID
));
167 TcpipReleaseSpinLock(&EntityListLock
, OldIrql
);
172 TDI_STATUS
InfoTdiQueryInformationEx(
173 PTDI_REQUEST Request
,
179 * FUNCTION: Returns extended information
181 * Request = Pointer to TDI request structure for the request
183 * Buffer = Pointer to buffer with data to use
184 * BufferSize = Pointer to buffer with size of Buffer. On return
185 * this is filled with number of bytes returned
186 * Context = Pointer to context buffer
188 * Status of operation
191 PVOID EntityListContext
;
193 TI_DbgPrint(DEBUG_INFO
,
194 ("InfoEx Req: %x %x %x!%04x:%d\n",
198 ID
->toi_entity
.tei_entity
,
199 ID
->toi_entity
.tei_instance
));
201 switch (ID
->toi_class
)
203 case INFO_CLASS_GENERIC
:
207 if (ID
->toi_type
!= INFO_TYPE_PROVIDER
)
208 return TDI_INVALID_PARAMETER
;
210 return InfoTdiQueryListEntities(Buffer
, BufferSize
);
213 if (ID
->toi_type
!= INFO_TYPE_PROVIDER
)
214 return TDI_INVALID_PARAMETER
;
216 return InfoTdiQueryEntityType(ID
->toi_entity
, Buffer
, BufferSize
);
219 return TDI_INVALID_REQUEST
;
222 case INFO_CLASS_PROTOCOL
:
223 if (ID
->toi_type
== INFO_TYPE_ADDRESS_OBJECT
)
225 if ((EntityListContext
= GetContext(ID
->toi_entity
)))
226 return GetAddressFileInfo(ID
, EntityListContext
, Buffer
, BufferSize
);
228 return TDI_INVALID_PARAMETER
;
233 case IF_MIB_STATS_ID
:
234 if (ID
->toi_type
!= INFO_TYPE_PROVIDER
)
235 return TDI_INVALID_PARAMETER
;
237 if (ID
->toi_entity
.tei_entity
== IF_ENTITY
)
238 if ((EntityListContext
= GetContext(ID
->toi_entity
)))
239 return InfoTdiQueryGetInterfaceMIB(ID
->toi_entity
, EntityListContext
, Buffer
, BufferSize
);
241 return TDI_INVALID_PARAMETER
;
242 else if (ID
->toi_entity
.tei_entity
== CL_NL_ENTITY
||
243 ID
->toi_entity
.tei_entity
== CO_NL_ENTITY
)
244 if ((EntityListContext
= GetContext(ID
->toi_entity
)))
245 return InfoTdiQueryGetIPSnmpInfo(ID
->toi_entity
, EntityListContext
, Buffer
, BufferSize
);
247 return TDI_INVALID_PARAMETER
;
249 return TDI_INVALID_PARAMETER
;
251 case IP_MIB_ADDRTABLE_ENTRY_ID
:
252 if (ID
->toi_entity
.tei_entity
!= CL_NL_ENTITY
&&
253 ID
->toi_entity
.tei_entity
!= CO_NL_ENTITY
)
254 return TDI_INVALID_PARAMETER
;
256 if (ID
->toi_type
!= INFO_TYPE_PROVIDER
)
257 return TDI_INVALID_PARAMETER
;
259 return InfoTdiQueryGetAddrTable(ID
->toi_entity
, Buffer
, BufferSize
);
261 case IP_MIB_ARPTABLE_ENTRY_ID
:
262 if (ID
->toi_type
!= INFO_TYPE_PROVIDER
)
263 return TDI_INVALID_PARAMETER
;
265 if (ID
->toi_entity
.tei_entity
== AT_ENTITY
)
266 if ((EntityListContext
= GetContext(ID
->toi_entity
)))
267 return InfoTdiQueryGetArptableMIB(ID
->toi_entity
, EntityListContext
,
270 return TDI_INVALID_PARAMETER
;
271 else if (ID
->toi_entity
.tei_entity
== CO_NL_ENTITY
||
272 ID
->toi_entity
.tei_entity
== CL_NL_ENTITY
)
273 if ((EntityListContext
= GetContext(ID
->toi_entity
)))
274 return InfoTdiQueryGetRouteTable(EntityListContext
, Buffer
, BufferSize
);
276 return TDI_INVALID_PARAMETER
;
278 return TDI_INVALID_PARAMETER
;
281 case IP_INTFC_INFO_ID
:
282 if (ID
->toi_type
!= INFO_TYPE_PROVIDER
)
283 return TDI_INVALID_PARAMETER
;
285 return InfoTdiQueryGetIFInfo(Context
, Buffer
, BufferSize
);
289 return TDI_INVALID_REQUEST
;
293 return TDI_INVALID_REQUEST
;
297 TDI_STATUS InfoTdiSetInformationEx
298 (PTDI_REQUEST Request
,
303 * FUNCTION: Sets extended information
305 * Request = Pointer to TDI request structure for the request
306 * ID = Pointer to TDI object ID
307 * Buffer = Pointer to buffer with data to use
308 * BufferSize = Size of Buffer
310 * Status of operation
313 PVOID EntityListContext
;
315 switch (ID
->toi_class
)
317 case INFO_CLASS_PROTOCOL
:
318 if (ID
->toi_type
== INFO_TYPE_ADDRESS_OBJECT
)
320 if ((EntityListContext
= GetContext(ID
->toi_entity
)))
321 return SetAddressFileInfo(ID
, EntityListContext
, Buffer
, BufferSize
);
323 return TDI_INVALID_PARAMETER
;
328 case IP_MIB_ARPTABLE_ENTRY_ID
:
329 if (ID
->toi_type
!= INFO_TYPE_PROVIDER
)
330 return TDI_INVALID_PARAMETER
;
332 if (ID
->toi_entity
.tei_entity
== AT_ENTITY
)
333 if ((EntityListContext
= GetContext(ID
->toi_entity
)))
334 return InfoTdiSetArptableMIB(EntityListContext
,
337 return TDI_INVALID_PARAMETER
;
338 else if (ID
->toi_entity
.tei_entity
== CL_NL_ENTITY
||
339 ID
->toi_entity
.tei_entity
== CO_NL_ENTITY
)
340 if ((EntityListContext
= GetContext(ID
->toi_entity
)))
341 return InfoTdiSetRoute(EntityListContext
, Buffer
, BufferSize
);
343 return TDI_INVALID_PARAMETER
;
345 return TDI_INVALID_PARAMETER
;
348 return TDI_INVALID_REQUEST
;
352 return TDI_INVALID_REQUEST
;