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
)
18 ULONG i
, Instance
= 0;
19 BOOLEAN ChoseIndex
= FALSE
;
21 TcpipAcquireSpinLock(&EntityListLock
, &OldIrql
);
26 for (i
= 0; i
< EntityCount
; i
++)
28 if (EntityList
[i
].tei_entity
== EntityType
&&
29 EntityList
[i
].tei_instance
== Instance
)
37 EntityList
[EntityCount
].tei_entity
= EntityType
;
38 EntityList
[EntityCount
].tei_instance
= Instance
;
39 EntityList
[EntityCount
].context
= Context
;
40 EntityList
[EntityCount
].flags
= Flags
;
43 TcpipReleaseSpinLock(&EntityListLock
, OldIrql
);
46 VOID
RemoveEntityByContext(PVOID Context
)
51 TcpipAcquireSpinLock(&EntityListLock
, &OldIrql
);
53 for (i
= 0; i
< EntityCount
; i
++) {
54 if( EntityList
[i
].context
== Context
) {
55 if( i
!= EntityCount
- 1 ) {
56 memcpy( &EntityList
[i
],
57 &EntityList
[--EntityCount
],
58 sizeof(EntityList
[i
]) );
65 TcpipReleaseSpinLock(&EntityListLock
, OldIrql
);
68 PVOID
GetContext(TDIEntityID ID
)
74 TcpipAcquireSpinLock(&EntityListLock
, &OldIrql
);
76 for (i
= 0; i
< EntityCount
; i
++)
78 if (EntityList
[i
].tei_entity
== ID
.tei_entity
&&
79 EntityList
[i
].tei_instance
== ID
.tei_instance
)
85 TcpipReleaseSpinLock(&EntityListLock
, OldIrql
);
86 DbgPrint("WARNING: Unable to get context for %d %d\n", ID
.tei_entity
, ID
.tei_instance
);
90 Context
= EntityList
[i
].context
;
92 TcpipReleaseSpinLock(&EntityListLock
, OldIrql
);
97 TDI_STATUS
InfoCopyOut( PCHAR DataOut
, UINT SizeOut
,
98 PNDIS_BUFFER ClientBuf
, PUINT ClientBufSize
) {
99 UINT RememberedCBSize
= *ClientBufSize
;
100 *ClientBufSize
= SizeOut
;
102 /* The driver returns success even when it couldn't fit every available
104 if( RememberedCBSize
< SizeOut
|| !ClientBuf
)
107 CopyBufferToBufferChain( ClientBuf
, 0, (PCHAR
)DataOut
, SizeOut
);
112 TDI_STATUS
InfoTdiQueryEntityType(TDIEntityID ID
,
119 TcpipAcquireSpinLock(&EntityListLock
, &OldIrql
);
121 for (i
= 0; i
< EntityCount
; i
++)
123 if (EntityList
[i
].tei_entity
== ID
.tei_entity
&&
124 EntityList
[i
].tei_instance
== ID
.tei_instance
)
128 if (i
== EntityCount
)
130 TcpipReleaseSpinLock(&EntityListLock
, OldIrql
);
131 return TDI_INVALID_PARAMETER
;
134 Flags
= EntityList
[i
].flags
;
136 InfoCopyOut((PCHAR
)&Flags
,
141 TcpipReleaseSpinLock(&EntityListLock
, OldIrql
);
146 TDI_STATUS
InfoTdiQueryListEntities(PNDIS_BUFFER Buffer
,
149 UINT Count
, Size
, BufSize
= *BufferSize
;
152 TI_DbgPrint(DEBUG_INFO
,("About to copy %d TDIEntityIDs to user\n",
155 TcpipAcquireSpinLock(&EntityListLock
, &OldIrql
);
157 Size
= EntityCount
* sizeof(TDIEntityID
);
160 TI_DbgPrint(DEBUG_INFO
,("BufSize: %d, NeededSize: %d\n", BufSize
, Size
));
162 if (BufSize
< Size
|| !Buffer
)
164 TcpipReleaseSpinLock( &EntityListLock
, OldIrql
);
165 /* The buffer is too small to contain requested data, but we return
166 * success anyway, as we did everything we wanted. */
170 /* Return entity list -- Copy only the TDIEntityID parts. */
171 for( Count
= 0; Count
< EntityCount
; Count
++ ) {
172 CopyBufferToBufferChain(Buffer
,
173 Count
* sizeof(TDIEntityID
),
174 (PCHAR
)&EntityList
[Count
],
175 sizeof(TDIEntityID
));
178 TcpipReleaseSpinLock(&EntityListLock
, OldIrql
);
183 TDI_STATUS
InfoTdiQueryInformationEx(
184 PTDI_REQUEST Request
,
190 * FUNCTION: Returns extended information
192 * Request = Pointer to TDI request structure for the request
194 * Buffer = Pointer to buffer with data to use
195 * BufferSize = Pointer to buffer with size of Buffer. On return
196 * this is filled with number of bytes returned
197 * Context = Pointer to context buffer
199 * Status of operation
202 PVOID EntityListContext
;
204 TI_DbgPrint(DEBUG_INFO
,
205 ("InfoEx Req: %x %x %x!%04x:%d\n",
209 ID
->toi_entity
.tei_entity
,
210 ID
->toi_entity
.tei_instance
));
212 switch (ID
->toi_class
)
214 case INFO_CLASS_GENERIC
:
218 if (ID
->toi_type
!= INFO_TYPE_PROVIDER
)
219 return TDI_INVALID_PARAMETER
;
221 return InfoTdiQueryListEntities(Buffer
, BufferSize
);
224 if (ID
->toi_type
!= INFO_TYPE_PROVIDER
)
225 return TDI_INVALID_PARAMETER
;
227 return InfoTdiQueryEntityType(ID
->toi_entity
, Buffer
, BufferSize
);
230 return TDI_INVALID_REQUEST
;
233 case INFO_CLASS_PROTOCOL
:
234 if (ID
->toi_type
== INFO_TYPE_ADDRESS_OBJECT
)
236 if ((EntityListContext
= GetContext(ID
->toi_entity
)))
237 return GetAddressFileInfo(ID
, EntityListContext
, Buffer
, BufferSize
);
239 return TDI_INVALID_PARAMETER
;
244 case IF_MIB_STATS_ID
:
245 if (ID
->toi_type
!= INFO_TYPE_PROVIDER
)
246 return TDI_INVALID_PARAMETER
;
248 if (ID
->toi_entity
.tei_entity
== IF_ENTITY
)
249 if ((EntityListContext
= GetContext(ID
->toi_entity
)))
250 return InfoTdiQueryGetInterfaceMIB(ID
->toi_entity
, EntityListContext
, Buffer
, BufferSize
);
252 return TDI_INVALID_PARAMETER
;
253 else if (ID
->toi_entity
.tei_entity
== CL_NL_ENTITY
||
254 ID
->toi_entity
.tei_entity
== CO_NL_ENTITY
)
255 if ((EntityListContext
= GetContext(ID
->toi_entity
)))
256 return InfoTdiQueryGetIPSnmpInfo(ID
->toi_entity
, EntityListContext
, Buffer
, BufferSize
);
258 return TDI_INVALID_PARAMETER
;
260 return TDI_INVALID_PARAMETER
;
262 case IP_MIB_ADDRTABLE_ENTRY_ID
:
263 if (ID
->toi_entity
.tei_entity
!= CL_NL_ENTITY
&&
264 ID
->toi_entity
.tei_entity
!= CO_NL_ENTITY
)
265 return TDI_INVALID_PARAMETER
;
267 if (ID
->toi_type
!= INFO_TYPE_PROVIDER
)
268 return TDI_INVALID_PARAMETER
;
270 return InfoTdiQueryGetAddrTable(ID
->toi_entity
, Buffer
, BufferSize
);
272 case IP_MIB_ARPTABLE_ENTRY_ID
:
273 if (ID
->toi_type
!= INFO_TYPE_PROVIDER
)
274 return TDI_INVALID_PARAMETER
;
276 if (ID
->toi_entity
.tei_entity
== AT_ENTITY
)
277 if ((EntityListContext
= GetContext(ID
->toi_entity
)))
278 return InfoTdiQueryGetArptableMIB(ID
->toi_entity
, EntityListContext
,
281 return TDI_INVALID_PARAMETER
;
282 else if (ID
->toi_entity
.tei_entity
== CO_NL_ENTITY
||
283 ID
->toi_entity
.tei_entity
== CL_NL_ENTITY
)
284 if ((EntityListContext
= GetContext(ID
->toi_entity
)))
285 return InfoTdiQueryGetRouteTable(EntityListContext
, Buffer
, BufferSize
);
287 return TDI_INVALID_PARAMETER
;
289 return TDI_INVALID_PARAMETER
;
292 case IP_INTFC_INFO_ID
:
293 if (ID
->toi_type
!= INFO_TYPE_PROVIDER
)
294 return TDI_INVALID_PARAMETER
;
296 return InfoTdiQueryGetIFInfo(Context
, Buffer
, BufferSize
);
300 return TDI_INVALID_REQUEST
;
304 return TDI_INVALID_REQUEST
;
308 TDI_STATUS InfoTdiSetInformationEx
309 (PTDI_REQUEST Request
,
314 * FUNCTION: Sets extended information
316 * Request = Pointer to TDI request structure for the request
317 * ID = Pointer to TDI object ID
318 * Buffer = Pointer to buffer with data to use
319 * BufferSize = Size of Buffer
321 * Status of operation
324 PVOID EntityListContext
;
326 switch (ID
->toi_class
)
328 case INFO_CLASS_PROTOCOL
:
329 switch (ID
->toi_type
)
331 case INFO_TYPE_ADDRESS_OBJECT
:
333 if ((EntityListContext
= GetContext(ID
->toi_entity
)))
334 return SetAddressFileInfo(ID
, EntityListContext
, Buffer
, BufferSize
);
336 return TDI_INVALID_PARAMETER
;
338 case INFO_TYPE_CONNECTION
:
340 PADDRESS_FILE AddressFile
= GetContext(ID
->toi_entity
);
341 if (AddressFile
== NULL
)
342 return TDI_INVALID_PARAMETER
;
343 return SetConnectionInfo(ID
, AddressFile
->Connection
, Buffer
, BufferSize
);
346 DbgPrint("TCPIP: IOCTL_TCP_SET_INFORMATION_EX - Unrecognized information type for INFO_CLASS_PROTOCOL: 0x%#x.\n", ID
->toi_type
);
347 return TDI_INVALID_PARAMETER
;
352 case IP_MIB_ARPTABLE_ENTRY_ID
:
353 if (ID
->toi_type
!= INFO_TYPE_PROVIDER
)
354 return TDI_INVALID_PARAMETER
;
356 if (ID
->toi_entity
.tei_entity
== AT_ENTITY
)
357 if ((EntityListContext
= GetContext(ID
->toi_entity
)))
358 return InfoTdiSetArptableMIB(EntityListContext
,
361 return TDI_INVALID_PARAMETER
;
362 else if (ID
->toi_entity
.tei_entity
== CL_NL_ENTITY
||
363 ID
->toi_entity
.tei_entity
== CO_NL_ENTITY
)
364 if ((EntityListContext
= GetContext(ID
->toi_entity
)))
365 return InfoTdiSetRoute(EntityListContext
, Buffer
, BufferSize
);
367 return TDI_INVALID_PARAMETER
;
369 return TDI_INVALID_PARAMETER
;
372 return TDI_INVALID_REQUEST
;
376 return TDI_INVALID_REQUEST
;