Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygeninfo.c
Go to the documentation of this file.
00001 /* 00002 * COPYRIGHT: See COPYING in the top level directory 00003 * PROJECT: ReactOS TCP/IP protocol driver 00004 * FILE: tcpip/info.c 00005 * PURPOSE: TDI query and set information routines 00006 * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net) 00007 * REVISIONS: 00008 * CSH 01/08-2000 Created 00009 */ 00010 00011 #include "precomp.h" 00012 #include <debug.h> 00013 00014 VOID AddEntity(ULONG EntityType, PVOID Context, ULONG Flags) 00015 { 00016 KIRQL OldIrql; 00017 ULONG i, Instance = 0; 00018 BOOLEAN ChoseIndex = FALSE; 00019 00020 TcpipAcquireSpinLock(&EntityListLock, &OldIrql); 00021 00022 while (!ChoseIndex) 00023 { 00024 ChoseIndex = TRUE; 00025 for (i = 0; i < EntityCount; i++) 00026 { 00027 if (EntityList[i].tei_entity == EntityType && 00028 EntityList[i].tei_instance == Instance) 00029 { 00030 Instance++; 00031 ChoseIndex = FALSE; 00032 } 00033 } 00034 } 00035 00036 EntityList[EntityCount].tei_entity = EntityType; 00037 EntityList[EntityCount].tei_instance = Instance; 00038 EntityList[EntityCount].context = Context; 00039 EntityList[EntityCount].flags = Flags; 00040 EntityCount++; 00041 00042 TcpipReleaseSpinLock(&EntityListLock, OldIrql); 00043 } 00044 00045 VOID RemoveEntityByContext(PVOID Context) 00046 { 00047 ULONG i; 00048 KIRQL OldIrql; 00049 00050 TcpipAcquireSpinLock(&EntityListLock, &OldIrql); 00051 00052 for (i = 0; i < EntityCount; i++) { 00053 if( EntityList[i].context == Context ) { 00054 if( i != EntityCount - 1 ) { 00055 memcpy( &EntityList[i], 00056 &EntityList[--EntityCount], 00057 sizeof(EntityList[i]) ); 00058 } else { 00059 EntityCount--; 00060 } 00061 } 00062 } 00063 00064 TcpipReleaseSpinLock(&EntityListLock, OldIrql); 00065 } 00066 00067 PVOID GetContext(TDIEntityID ID) 00068 { 00069 UINT i; 00070 KIRQL OldIrql; 00071 PVOID Context; 00072 00073 TcpipAcquireSpinLock(&EntityListLock, &OldIrql); 00074 00075 for (i = 0; i < EntityCount; i++) 00076 { 00077 if (EntityList[i].tei_entity == ID.tei_entity && 00078 EntityList[i].tei_instance == ID.tei_instance) 00079 break; 00080 } 00081 00082 if (i == EntityCount) 00083 { 00084 TcpipReleaseSpinLock(&EntityListLock, OldIrql); 00085 DbgPrint("WARNING: Unable to get context for %d %d\n", ID.tei_entity, ID.tei_instance); 00086 return NULL; 00087 } 00088 00089 Context = EntityList[i].context; 00090 00091 TcpipReleaseSpinLock(&EntityListLock, OldIrql); 00092 00093 return Context; 00094 } 00095 00096 TDI_STATUS InfoCopyOut( PCHAR DataOut, UINT SizeOut, 00097 PNDIS_BUFFER ClientBuf, PUINT ClientBufSize ) { 00098 UINT RememberedCBSize = *ClientBufSize; 00099 *ClientBufSize = SizeOut; 00100 00101 /* The driver returns success even when it couldn't fit every available 00102 * byte. */ 00103 if( RememberedCBSize < SizeOut || !ClientBuf ) 00104 return TDI_SUCCESS; 00105 else { 00106 CopyBufferToBufferChain( ClientBuf, 0, (PCHAR)DataOut, SizeOut ); 00107 return TDI_SUCCESS; 00108 } 00109 } 00110 00111 TDI_STATUS InfoTdiQueryEntityType(TDIEntityID ID, 00112 PNDIS_BUFFER Buffer, 00113 PUINT BufferSize) 00114 { 00115 KIRQL OldIrql; 00116 UINT i, Flags = 0; 00117 00118 TcpipAcquireSpinLock(&EntityListLock, &OldIrql); 00119 00120 for (i = 0; i < EntityCount; i++) 00121 { 00122 if (EntityList[i].tei_entity == ID.tei_entity && 00123 EntityList[i].tei_instance == ID.tei_instance) 00124 break; 00125 } 00126 00127 if (i == EntityCount) 00128 { 00129 TcpipReleaseSpinLock(&EntityListLock, OldIrql); 00130 return TDI_INVALID_PARAMETER; 00131 } 00132 00133 Flags = EntityList[i].flags; 00134 00135 InfoCopyOut((PCHAR)&Flags, 00136 sizeof(ULONG), 00137 Buffer, 00138 BufferSize); 00139 00140 TcpipReleaseSpinLock(&EntityListLock, OldIrql); 00141 00142 return TDI_SUCCESS; 00143 } 00144 00145 TDI_STATUS InfoTdiQueryListEntities(PNDIS_BUFFER Buffer, 00146 PUINT BufferSize) 00147 { 00148 UINT Count, Size, BufSize = *BufferSize; 00149 KIRQL OldIrql; 00150 00151 TI_DbgPrint(DEBUG_INFO,("About to copy %d TDIEntityIDs to user\n", 00152 EntityCount)); 00153 00154 TcpipAcquireSpinLock(&EntityListLock, &OldIrql); 00155 00156 Size = EntityCount * sizeof(TDIEntityID); 00157 *BufferSize = Size; 00158 00159 TI_DbgPrint(DEBUG_INFO,("BufSize: %d, NeededSize: %d\n", BufSize, Size)); 00160 00161 if (BufSize < Size || !Buffer) 00162 { 00163 TcpipReleaseSpinLock( &EntityListLock, OldIrql ); 00164 /* The buffer is too small to contain requested data, but we return 00165 * success anyway, as we did everything we wanted. */ 00166 return TDI_SUCCESS; 00167 } 00168 00169 /* Return entity list -- Copy only the TDIEntityID parts. */ 00170 for( Count = 0; Count < EntityCount; Count++ ) { 00171 CopyBufferToBufferChain(Buffer, 00172 Count * sizeof(TDIEntityID), 00173 (PCHAR)&EntityList[Count], 00174 sizeof(TDIEntityID)); 00175 } 00176 00177 TcpipReleaseSpinLock(&EntityListLock, OldIrql); 00178 00179 return TDI_SUCCESS; 00180 } 00181 00182 TDI_STATUS InfoTdiQueryInformationEx( 00183 PTDI_REQUEST Request, 00184 TDIObjectID *ID, 00185 PNDIS_BUFFER Buffer, 00186 PUINT BufferSize, 00187 PVOID Context) 00188 /* 00189 * FUNCTION: Returns extended information 00190 * ARGUMENTS: 00191 * Request = Pointer to TDI request structure for the request 00192 * ID = TDI object ID 00193 * Buffer = Pointer to buffer with data to use 00194 * BufferSize = Pointer to buffer with size of Buffer. On return 00195 * this is filled with number of bytes returned 00196 * Context = Pointer to context buffer 00197 * RETURNS: 00198 * Status of operation 00199 */ 00200 { 00201 PVOID EntityListContext; 00202 00203 TI_DbgPrint(DEBUG_INFO, 00204 ("InfoEx Req: %x %x %x!%04x:%d\n", 00205 ID->toi_class, 00206 ID->toi_type, 00207 ID->toi_id, 00208 ID->toi_entity.tei_entity, 00209 ID->toi_entity.tei_instance)); 00210 00211 switch (ID->toi_class) 00212 { 00213 case INFO_CLASS_GENERIC: 00214 switch (ID->toi_id) 00215 { 00216 case ENTITY_LIST_ID: 00217 if (ID->toi_type != INFO_TYPE_PROVIDER) 00218 return TDI_INVALID_PARAMETER; 00219 00220 return InfoTdiQueryListEntities(Buffer, BufferSize); 00221 00222 case ENTITY_TYPE_ID: 00223 if (ID->toi_type != INFO_TYPE_PROVIDER) 00224 return TDI_INVALID_PARAMETER; 00225 00226 return InfoTdiQueryEntityType(ID->toi_entity, Buffer, BufferSize); 00227 00228 default: 00229 return TDI_INVALID_REQUEST; 00230 } 00231 00232 case INFO_CLASS_PROTOCOL: 00233 if (ID->toi_type == INFO_TYPE_ADDRESS_OBJECT) 00234 { 00235 if ((EntityListContext = GetContext(ID->toi_entity))) 00236 return GetAddressFileInfo(ID, EntityListContext, Buffer, BufferSize); 00237 else 00238 return TDI_INVALID_PARAMETER; 00239 } 00240 00241 switch (ID->toi_id) 00242 { 00243 case IF_MIB_STATS_ID: 00244 if (ID->toi_type != INFO_TYPE_PROVIDER) 00245 return TDI_INVALID_PARAMETER; 00246 00247 if (ID->toi_entity.tei_entity == IF_ENTITY) 00248 if ((EntityListContext = GetContext(ID->toi_entity))) 00249 return InfoTdiQueryGetInterfaceMIB(ID->toi_entity, EntityListContext, Buffer, BufferSize); 00250 else 00251 return TDI_INVALID_PARAMETER; 00252 else if (ID->toi_entity.tei_entity == CL_NL_ENTITY || 00253 ID->toi_entity.tei_entity == CO_NL_ENTITY) 00254 if ((EntityListContext = GetContext(ID->toi_entity))) 00255 return InfoTdiQueryGetIPSnmpInfo(ID->toi_entity, EntityListContext, Buffer, BufferSize); 00256 else 00257 return TDI_INVALID_PARAMETER; 00258 else 00259 return TDI_INVALID_PARAMETER; 00260 00261 case IP_MIB_ADDRTABLE_ENTRY_ID: 00262 if (ID->toi_entity.tei_entity != CL_NL_ENTITY && 00263 ID->toi_entity.tei_entity != CO_NL_ENTITY) 00264 return TDI_INVALID_PARAMETER; 00265 00266 if (ID->toi_type != INFO_TYPE_PROVIDER) 00267 return TDI_INVALID_PARAMETER; 00268 00269 return InfoTdiQueryGetAddrTable(ID->toi_entity, Buffer, BufferSize); 00270 00271 case IP_MIB_ARPTABLE_ENTRY_ID: 00272 if (ID->toi_type != INFO_TYPE_PROVIDER) 00273 return TDI_INVALID_PARAMETER; 00274 00275 if (ID->toi_entity.tei_entity == AT_ENTITY) 00276 if ((EntityListContext = GetContext(ID->toi_entity))) 00277 return InfoTdiQueryGetArptableMIB(ID->toi_entity, EntityListContext, 00278 Buffer, BufferSize); 00279 else 00280 return TDI_INVALID_PARAMETER; 00281 else if (ID->toi_entity.tei_entity == CO_NL_ENTITY || 00282 ID->toi_entity.tei_entity == CL_NL_ENTITY) 00283 if ((EntityListContext = GetContext(ID->toi_entity))) 00284 return InfoTdiQueryGetRouteTable(EntityListContext, Buffer, BufferSize); 00285 else 00286 return TDI_INVALID_PARAMETER; 00287 else 00288 return TDI_INVALID_PARAMETER; 00289 00290 #if 0 00291 case IP_INTFC_INFO_ID: 00292 if (ID->toi_type != INFO_TYPE_PROVIDER) 00293 return TDI_INVALID_PARAMETER; 00294 00295 return InfoTdiQueryGetIFInfo(Context, Buffer, BufferSize); 00296 #endif 00297 00298 default: 00299 return TDI_INVALID_REQUEST; 00300 } 00301 00302 default: 00303 return TDI_INVALID_REQUEST; 00304 } 00305 } 00306 00307 TDI_STATUS InfoTdiSetInformationEx 00308 (PTDI_REQUEST Request, 00309 TDIObjectID *ID, 00310 PVOID Buffer, 00311 UINT BufferSize) 00312 /* 00313 * FUNCTION: Sets extended information 00314 * ARGUMENTS: 00315 * Request = Pointer to TDI request structure for the request 00316 * ID = Pointer to TDI object ID 00317 * Buffer = Pointer to buffer with data to use 00318 * BufferSize = Size of Buffer 00319 * RETURNS: 00320 * Status of operation 00321 */ 00322 { 00323 PVOID EntityListContext; 00324 00325 switch (ID->toi_class) 00326 { 00327 case INFO_CLASS_PROTOCOL: 00328 if (ID->toi_type == INFO_TYPE_ADDRESS_OBJECT) 00329 { 00330 if ((EntityListContext = GetContext(ID->toi_entity))) 00331 return SetAddressFileInfo(ID, EntityListContext, Buffer, BufferSize); 00332 else 00333 return TDI_INVALID_PARAMETER; 00334 } 00335 00336 switch (ID->toi_id) 00337 { 00338 case IP_MIB_ARPTABLE_ENTRY_ID: 00339 if (ID->toi_type != INFO_TYPE_PROVIDER) 00340 return TDI_INVALID_PARAMETER; 00341 00342 if (ID->toi_entity.tei_entity == AT_ENTITY) 00343 if ((EntityListContext = GetContext(ID->toi_entity))) 00344 return InfoTdiSetArptableMIB(EntityListContext, 00345 Buffer, BufferSize); 00346 else 00347 return TDI_INVALID_PARAMETER; 00348 else if (ID->toi_entity.tei_entity == CL_NL_ENTITY || 00349 ID->toi_entity.tei_entity == CO_NL_ENTITY) 00350 if ((EntityListContext = GetContext(ID->toi_entity))) 00351 return InfoTdiSetRoute(EntityListContext, Buffer, BufferSize); 00352 else 00353 return TDI_INVALID_PARAMETER; 00354 else 00355 return TDI_INVALID_PARAMETER; 00356 00357 default: 00358 return TDI_INVALID_REQUEST; 00359 } 00360 00361 default: 00362 return TDI_INVALID_REQUEST; 00363 } 00364 } Generated on Sun May 27 2012 04:24:39 for ReactOS by
1.7.6.1
|