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 PVOID
GetContext(TDIEntityID ID
)
21 TcpipAcquireSpinLock(&EntityListLock
, &OldIrql
);
23 for (i
= 0; i
< EntityCount
; i
++)
25 if (EntityList
[i
].tei_entity
== ID
.tei_entity
&&
26 EntityList
[i
].tei_instance
== ID
.tei_instance
)
32 TcpipReleaseSpinLock(&EntityListLock
, OldIrql
);
33 DbgPrint("WARNING: Unable to get context for %d %d\n", ID
.tei_entity
, ID
.tei_instance
);
37 Context
= EntityList
[i
].context
;
39 TcpipReleaseSpinLock(&EntityListLock
, OldIrql
);
44 TDI_STATUS
InfoCopyOut( PCHAR DataOut
, UINT SizeOut
,
45 PNDIS_BUFFER ClientBuf
, PUINT ClientBufSize
) {
46 UINT RememberedCBSize
= *ClientBufSize
;
47 *ClientBufSize
= SizeOut
;
49 /* The driver returns success even when it couldn't fit every available
51 if( RememberedCBSize
< SizeOut
|| !ClientBuf
)
54 CopyBufferToBufferChain( ClientBuf
, 0, (PCHAR
)DataOut
, SizeOut
);
59 TDI_STATUS
InfoTdiQueryEntityType(TDIEntityID ID
,
66 TcpipAcquireSpinLock(&EntityListLock
, &OldIrql
);
68 for (i
= 0; i
< EntityCount
; i
++)
70 if (EntityList
[i
].tei_entity
== ID
.tei_entity
&&
71 EntityList
[i
].tei_instance
== ID
.tei_instance
)
77 TcpipReleaseSpinLock(&EntityListLock
, OldIrql
);
78 return TDI_INVALID_PARAMETER
;
81 Flags
= EntityList
[i
].flags
;
83 InfoCopyOut((PCHAR
)&Flags
,
88 TcpipReleaseSpinLock(&EntityListLock
, OldIrql
);
93 TDI_STATUS
InfoTdiQueryListEntities(PNDIS_BUFFER Buffer
,
96 UINT Count
, Size
, BufSize
= *BufferSize
;
99 TI_DbgPrint(DEBUG_INFO
,("About to copy %d TDIEntityIDs to user\n",
102 TcpipAcquireSpinLock(&EntityListLock
, &OldIrql
);
104 Size
= EntityCount
* sizeof(TDIEntityID
);
107 TI_DbgPrint(DEBUG_INFO
,("BufSize: %d, NeededSize: %d\n", BufSize
, Size
));
109 if (BufSize
< Size
|| !Buffer
)
111 TcpipReleaseSpinLock( &EntityListLock
, OldIrql
);
112 /* The buffer is too small to contain requested data, but we return
113 * success anyway, as we did everything we wanted. */
117 /* Return entity list -- Copy only the TDIEntityID parts. */
118 for( Count
= 0; Count
< EntityCount
; Count
++ ) {
119 CopyBufferToBufferChain(Buffer
,
120 Count
* sizeof(TDIEntityID
),
121 (PCHAR
)&EntityList
[Count
],
122 sizeof(TDIEntityID
));
125 TcpipReleaseSpinLock(&EntityListLock
, OldIrql
);
130 TDI_STATUS
InfoTdiQueryInformationEx(
131 PTDI_REQUEST Request
,
137 * FUNCTION: Returns extended information
139 * Request = Pointer to TDI request structure for the request
141 * Buffer = Pointer to buffer with data to use
142 * BufferSize = Pointer to buffer with size of Buffer. On return
143 * this is filled with number of bytes returned
144 * Context = Pointer to context buffer
146 * Status of operation
149 PVOID EntityListContext
;
151 TI_DbgPrint(DEBUG_INFO
,
152 ("InfoEx Req: %x %x %x!%04x:%d\n",
156 ID
->toi_entity
.tei_entity
,
157 ID
->toi_entity
.tei_instance
));
159 switch (ID
->toi_class
)
161 case INFO_CLASS_GENERIC
:
165 if (ID
->toi_type
!= INFO_TYPE_PROVIDER
)
166 return TDI_INVALID_PARAMETER
;
168 return InfoTdiQueryListEntities(Buffer
, BufferSize
);
171 if (ID
->toi_type
!= INFO_TYPE_PROVIDER
)
172 return TDI_INVALID_PARAMETER
;
174 return InfoTdiQueryEntityType(ID
->toi_entity
, Buffer
, BufferSize
);
177 return TDI_INVALID_REQUEST
;
180 case INFO_CLASS_PROTOCOL
:
183 case IF_MIB_STATS_ID
:
184 if (ID
->toi_entity
.tei_entity
== IF_ENTITY
)
185 if ((EntityListContext
= GetContext(ID
->toi_entity
)))
186 return InfoTdiQueryGetInterfaceMIB(ID
->toi_entity
, EntityListContext
, Buffer
, BufferSize
);
188 return TDI_INVALID_PARAMETER
;
189 else if (ID
->toi_entity
.tei_entity
== CL_NL_ENTITY
||
190 ID
->toi_entity
.tei_entity
== CO_NL_ENTITY
)
191 if ((EntityListContext
= GetContext(ID
->toi_entity
)))
192 return InfoTdiQueryGetIPSnmpInfo(ID
->toi_entity
, EntityListContext
, Buffer
, BufferSize
);
194 return TDI_INVALID_PARAMETER
;
196 return TDI_INVALID_PARAMETER
;
198 case IP_MIB_ADDRTABLE_ENTRY_ID
:
199 if (ID
->toi_entity
.tei_entity
!= CL_NL_ENTITY
&&
200 ID
->toi_entity
.tei_entity
!= CO_NL_ENTITY
)
201 return TDI_INVALID_PARAMETER
;
203 if (ID
->toi_type
!= INFO_TYPE_PROVIDER
)
204 return TDI_INVALID_PARAMETER
;
206 return InfoTdiQueryGetAddrTable(ID
->toi_entity
, Buffer
, BufferSize
);
208 case IP_MIB_ARPTABLE_ENTRY_ID
:
209 if (ID
->toi_type
!= INFO_TYPE_PROVIDER
)
210 return TDI_INVALID_PARAMETER
;
212 if (ID
->toi_entity
.tei_entity
== AT_ENTITY
)
213 if ((EntityListContext
= GetContext(ID
->toi_entity
)))
214 return InfoTdiQueryGetArptableMIB(ID
->toi_entity
, EntityListContext
,
217 return TDI_INVALID_PARAMETER
;
218 else if (ID
->toi_entity
.tei_entity
== CO_NL_ENTITY
||
219 ID
->toi_entity
.tei_entity
== CL_NL_ENTITY
)
220 if ((EntityListContext
= GetContext(ID
->toi_entity
)))
221 return InfoTdiQueryGetRouteTable(EntityListContext
, Buffer
, BufferSize
);
223 return TDI_INVALID_PARAMETER
;
225 return TDI_INVALID_PARAMETER
;
228 case IP_INTFC_INFO_ID
:
229 if (ID
->toi_type
!= INFO_TYPE_PROVIDER
)
230 return TDI_INVALID_PARAMETER
;
232 return InfoTdiQueryGetIFInfo(Context
, Buffer
, BufferSize
);
236 return TDI_INVALID_REQUEST
;
240 return TDI_INVALID_REQUEST
;
244 TDI_STATUS InfoTdiSetInformationEx
245 (PTDI_REQUEST Request
,
250 * FUNCTION: Sets extended information
252 * Request = Pointer to TDI request structure for the request
253 * ID = Pointer to TDI object ID
254 * Buffer = Pointer to buffer with data to use
255 * BufferSize = Size of Buffer
257 * Status of operation
260 PVOID EntityListContext
;
262 switch (ID
->toi_class
)
264 case INFO_CLASS_PROTOCOL
:
267 case IP_MIB_ARPTABLE_ENTRY_ID
:
268 if (ID
->toi_type
!= INFO_TYPE_PROVIDER
)
269 return TDI_INVALID_PARAMETER
;
271 if (ID
->toi_entity
.tei_entity
!= CL_NL_ENTITY
&&
272 ID
->toi_entity
.tei_entity
!= CO_NL_ENTITY
)
273 return TDI_INVALID_PARAMETER
;
275 if ((EntityListContext
= GetContext(ID
->toi_entity
)))
276 return InfoTdiSetRoute(EntityListContext
, (PIPROUTE_ENTRY
)Buffer
);
278 return TDI_INVALID_PARAMETER
;
281 return TDI_INVALID_REQUEST
;
285 return TDI_INVALID_REQUEST
;