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
14 VOID
AddEntity(ULONG EntityType
, PVOID Context
, ULONG Flags
)
17 ULONG i
, Instance
= 0;
18 BOOLEAN ChoseIndex
= FALSE
;
20 TcpipAcquireSpinLock(&EntityListLock
, &OldIrql
);
25 for (i
= 0; i
< EntityCount
; i
++)
27 if (EntityList
[i
].tei_entity
== EntityType
&&
28 EntityList
[i
].tei_instance
== Instance
)
36 EntityList
[EntityCount
].tei_entity
= EntityType
;
37 EntityList
[EntityCount
].tei_instance
= Instance
;
38 EntityList
[EntityCount
].context
= Context
;
39 EntityList
[EntityCount
].flags
= Flags
;
42 TcpipReleaseSpinLock(&EntityListLock
, OldIrql
);
45 VOID
RemoveEntityByContext(PVOID Context
)
50 TcpipAcquireSpinLock(&EntityListLock
, &OldIrql
);
52 for (i
= 0; i
< EntityCount
; i
++) {
53 if( EntityList
[i
].context
== Context
) {
54 if( i
!= EntityCount
- 1 ) {
55 memcpy( &EntityList
[i
],
56 &EntityList
[--EntityCount
],
57 sizeof(EntityList
[i
]) );
64 TcpipReleaseSpinLock(&EntityListLock
, OldIrql
);
67 PVOID
GetContext(TDIEntityID ID
)
73 TcpipAcquireSpinLock(&EntityListLock
, &OldIrql
);
75 for (i
= 0; i
< EntityCount
; i
++)
77 if (EntityList
[i
].tei_entity
== ID
.tei_entity
&&
78 EntityList
[i
].tei_instance
== ID
.tei_instance
)
84 TcpipReleaseSpinLock(&EntityListLock
, OldIrql
);
85 DbgPrint("WARNING: Unable to get context for %d %d\n", ID
.tei_entity
, ID
.tei_instance
);
89 Context
= EntityList
[i
].context
;
91 TcpipReleaseSpinLock(&EntityListLock
, OldIrql
);
96 TDI_STATUS
InfoCopyOut( PCHAR DataOut
, UINT SizeOut
,
97 PNDIS_BUFFER ClientBuf
, PUINT ClientBufSize
) {
98 UINT RememberedCBSize
= *ClientBufSize
;
99 *ClientBufSize
= SizeOut
;
101 /* The driver returns success even when it couldn't fit every available
103 if( RememberedCBSize
< SizeOut
|| !ClientBuf
)
106 CopyBufferToBufferChain( ClientBuf
, 0, (PCHAR
)DataOut
, SizeOut
);
111 TDI_STATUS
InfoTdiQueryEntityType(TDIEntityID ID
,
118 TcpipAcquireSpinLock(&EntityListLock
, &OldIrql
);
120 for (i
= 0; i
< EntityCount
; i
++)
122 if (EntityList
[i
].tei_entity
== ID
.tei_entity
&&
123 EntityList
[i
].tei_instance
== ID
.tei_instance
)
127 if (i
== EntityCount
)
129 TcpipReleaseSpinLock(&EntityListLock
, OldIrql
);
130 return TDI_INVALID_PARAMETER
;
133 Flags
= EntityList
[i
].flags
;
135 InfoCopyOut((PCHAR
)&Flags
,
140 TcpipReleaseSpinLock(&EntityListLock
, OldIrql
);
145 TDI_STATUS
InfoTdiQueryListEntities(PNDIS_BUFFER Buffer
,
148 UINT Count
, Size
, BufSize
= *BufferSize
;
151 TI_DbgPrint(DEBUG_INFO
,("About to copy %d TDIEntityIDs to user\n",
154 TcpipAcquireSpinLock(&EntityListLock
, &OldIrql
);
156 Size
= EntityCount
* sizeof(TDIEntityID
);
159 TI_DbgPrint(DEBUG_INFO
,("BufSize: %d, NeededSize: %d\n", BufSize
, Size
));
161 if (BufSize
< Size
|| !Buffer
)
163 TcpipReleaseSpinLock( &EntityListLock
, OldIrql
);
164 /* The buffer is too small to contain requested data, but we return
165 * success anyway, as we did everything we wanted. */
169 /* Return entity list -- Copy only the TDIEntityID parts. */
170 for( Count
= 0; Count
< EntityCount
; Count
++ ) {
171 CopyBufferToBufferChain(Buffer
,
172 Count
* sizeof(TDIEntityID
),
173 (PCHAR
)&EntityList
[Count
],
174 sizeof(TDIEntityID
));
177 TcpipReleaseSpinLock(&EntityListLock
, OldIrql
);
182 TDI_STATUS
InfoTdiQueryInformationEx(
183 PTDI_REQUEST Request
,
189 * FUNCTION: Returns extended information
191 * Request = Pointer to TDI request structure for the request
193 * Buffer = Pointer to buffer with data to use
194 * BufferSize = Pointer to buffer with size of Buffer. On return
195 * this is filled with number of bytes returned
196 * Context = Pointer to context buffer
198 * Status of operation
201 PVOID EntityListContext
;
203 TI_DbgPrint(DEBUG_INFO
,
204 ("InfoEx Req: %x %x %x!%04x:%d\n",
208 ID
->toi_entity
.tei_entity
,
209 ID
->toi_entity
.tei_instance
));
211 switch (ID
->toi_class
)
213 case INFO_CLASS_GENERIC
:
217 if (ID
->toi_type
!= INFO_TYPE_PROVIDER
)
218 return TDI_INVALID_PARAMETER
;
220 return InfoTdiQueryListEntities(Buffer
, BufferSize
);
223 if (ID
->toi_type
!= INFO_TYPE_PROVIDER
)
224 return TDI_INVALID_PARAMETER
;
226 return InfoTdiQueryEntityType(ID
->toi_entity
, Buffer
, BufferSize
);
229 return TDI_INVALID_REQUEST
;
232 case INFO_CLASS_PROTOCOL
:
233 if (ID
->toi_type
== INFO_TYPE_ADDRESS_OBJECT
)
235 if ((EntityListContext
= GetContext(ID
->toi_entity
)))
236 return GetAddressFileInfo(ID
, EntityListContext
, Buffer
, BufferSize
);
238 return TDI_INVALID_PARAMETER
;
243 case IF_MIB_STATS_ID
:
244 if (ID
->toi_type
!= INFO_TYPE_PROVIDER
)
245 return TDI_INVALID_PARAMETER
;
247 if (ID
->toi_entity
.tei_entity
== IF_ENTITY
)
248 if ((EntityListContext
= GetContext(ID
->toi_entity
)))
249 return InfoTdiQueryGetInterfaceMIB(ID
->toi_entity
, EntityListContext
, Buffer
, BufferSize
);
251 return TDI_INVALID_PARAMETER
;
252 else if (ID
->toi_entity
.tei_entity
== CL_NL_ENTITY
||
253 ID
->toi_entity
.tei_entity
== CO_NL_ENTITY
)
254 if ((EntityListContext
= GetContext(ID
->toi_entity
)))
255 return InfoTdiQueryGetIPSnmpInfo(ID
->toi_entity
, EntityListContext
, Buffer
, BufferSize
);
257 return TDI_INVALID_PARAMETER
;
259 return TDI_INVALID_PARAMETER
;
261 case IP_MIB_ADDRTABLE_ENTRY_ID
:
262 if (ID
->toi_entity
.tei_entity
!= CL_NL_ENTITY
&&
263 ID
->toi_entity
.tei_entity
!= CO_NL_ENTITY
)
264 return TDI_INVALID_PARAMETER
;
266 if (ID
->toi_type
!= INFO_TYPE_PROVIDER
)
267 return TDI_INVALID_PARAMETER
;
269 return InfoTdiQueryGetAddrTable(ID
->toi_entity
, Buffer
, BufferSize
);
271 case IP_MIB_ARPTABLE_ENTRY_ID
:
272 if (ID
->toi_type
!= INFO_TYPE_PROVIDER
)
273 return TDI_INVALID_PARAMETER
;
275 if (ID
->toi_entity
.tei_entity
== AT_ENTITY
)
276 if ((EntityListContext
= GetContext(ID
->toi_entity
)))
277 return InfoTdiQueryGetArptableMIB(ID
->toi_entity
, EntityListContext
,
280 return TDI_INVALID_PARAMETER
;
281 else if (ID
->toi_entity
.tei_entity
== CO_NL_ENTITY
||
282 ID
->toi_entity
.tei_entity
== CL_NL_ENTITY
)
283 if ((EntityListContext
= GetContext(ID
->toi_entity
)))
284 return InfoTdiQueryGetRouteTable(EntityListContext
, Buffer
, BufferSize
);
286 return TDI_INVALID_PARAMETER
;
288 return TDI_INVALID_PARAMETER
;
291 case IP_INTFC_INFO_ID
:
292 if (ID
->toi_type
!= INFO_TYPE_PROVIDER
)
293 return TDI_INVALID_PARAMETER
;
295 return InfoTdiQueryGetIFInfo(Context
, Buffer
, BufferSize
);
299 return TDI_INVALID_REQUEST
;
303 return TDI_INVALID_REQUEST
;
307 TDI_STATUS InfoTdiSetInformationEx
308 (PTDI_REQUEST Request
,
313 * FUNCTION: Sets extended information
315 * Request = Pointer to TDI request structure for the request
316 * ID = Pointer to TDI object ID
317 * Buffer = Pointer to buffer with data to use
318 * BufferSize = Size of Buffer
320 * Status of operation
323 PVOID EntityListContext
;
325 switch (ID
->toi_class
)
327 case INFO_CLASS_PROTOCOL
:
328 if (ID
->toi_type
== INFO_TYPE_ADDRESS_OBJECT
)
330 if ((EntityListContext
= GetContext(ID
->toi_entity
)))
331 return SetAddressFileInfo(ID
, EntityListContext
, Buffer
, BufferSize
);
333 return TDI_INVALID_PARAMETER
;
338 case IP_MIB_ARPTABLE_ENTRY_ID
:
339 if (ID
->toi_type
!= INFO_TYPE_PROVIDER
)
340 return TDI_INVALID_PARAMETER
;
342 if (ID
->toi_entity
.tei_entity
== AT_ENTITY
)
343 if ((EntityListContext
= GetContext(ID
->toi_entity
)))
344 return InfoTdiSetArptableMIB(EntityListContext
,
347 return TDI_INVALID_PARAMETER
;
348 else if (ID
->toi_entity
.tei_entity
== CL_NL_ENTITY
||
349 ID
->toi_entity
.tei_entity
== CO_NL_ENTITY
)
350 if ((EntityListContext
= GetContext(ID
->toi_entity
)))
351 return InfoTdiSetRoute(EntityListContext
, Buffer
, BufferSize
);
353 return TDI_INVALID_PARAMETER
;
355 return TDI_INVALID_PARAMETER
;
358 return TDI_INVALID_REQUEST
;
362 return TDI_INVALID_REQUEST
;