ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

info.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.