4d47b555c5023607b4569656fe095346d6fec2ee
[reactos.git] / reactos / drivers / net / tcpip / tcpip / iinfo.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS TCP/IP protocol driver
4 * FILE: tcpip/iinfo.c
5 * PURPOSE: Per-interface information.
6 * PROGRAMMERS: Art Yerkes
7 * REVISIONS:
8 * CSH 01/08-2000 Created
9 */
10
11 #include "precomp.h"
12
13 TDI_STATUS InfoTdiQueryGetInterfaceMIB(TDIEntityID *ID,
14 PIP_INTERFACE Interface,
15 PNDIS_BUFFER Buffer,
16 PUINT BufferSize) {
17 TDI_STATUS Status = TDI_INVALID_REQUEST;
18 PIFENTRY OutData;
19 PLAN_ADAPTER IF = (PLAN_ADAPTER)Interface->Context;
20 PCHAR IFDescr;
21 ULONG Size;
22 UINT DescrLenMax = MAX_IFDESCR_LEN - 1;
23
24 TI_DbgPrint(MAX_TRACE,
25 ("Getting IFEntry MIB (IF %08x LA %08x) (%04x:%d)\n",
26 Interface, IF, ID->tei_entity, ID->tei_instance));
27
28 OutData =
29 (PIFENTRY)ExAllocatePool( NonPagedPool,
30 sizeof(IFENTRY) + MAX_IFDESCR_LEN );
31
32 if( !OutData ) return TDI_INVALID_REQUEST; /* Out of memory */
33
34 RtlZeroMemory( OutData, sizeof(IFENTRY) + MAX_IFDESCR_LEN );
35
36 OutData->Index = ID->tei_instance + 1;
37 /* viz: tcpip keeps those indices */
38 OutData->Type = Interface ==
39 Loopback ? MIB_IF_TYPE_LOOPBACK : MIB_IF_TYPE_ETHERNET;
40 OutData->Mtu = Interface->MTU;
41 TI_DbgPrint(MAX_TRACE,
42 ("Getting interface speed\n"));
43 OutData->PhysAddrLen = Interface->AddressLength;
44 OutData->AdminStatus = MIB_IF_ADMIN_STATUS_UP;
45 /* NDIS_HARDWARE_STATUS -> ROUTER_CONNECTION_STATE */
46 Status = GetInterfaceConnectionStatus( Interface, &OutData->OperStatus );
47
48 /* Not sure what to do here, but not ready seems a safe bet on failure */
49 if( !NT_SUCCESS(Status) )
50 OutData->OperStatus = NdisHardwareStatusNotReady;
51
52 IFDescr = (PCHAR)&OutData[1];
53
54 if( IF ) {
55 GetInterfaceSpeed( Interface, (PUINT)&OutData->Speed );
56 TI_DbgPrint(MAX_TRACE,
57 ("IF Speed = %d * 100bps\n", OutData->Speed));
58 memcpy(OutData->PhysAddr,Interface->Address,Interface->AddressLength);
59 TI_DbgPrint(MAX_TRACE, ("Got HWAddr\n"));
60 GetInterfaceName( Interface, IFDescr, MAX_IFDESCR_LEN - 1 );
61 DescrLenMax = strlen( IFDescr ) + 1;
62 }
63
64 IFDescr[DescrLenMax] = 0; /* Terminate ifdescr string */
65
66 TI_DbgPrint(MAX_TRACE, ("Copied in name %s\n", IFDescr));
67 OutData->DescrLen = DescrLenMax;
68 IFDescr += DescrLenMax;
69 Size = IFDescr - (PCHAR)OutData + 1;
70
71 TI_DbgPrint(MAX_TRACE, ("Finished IFEntry MIB (%04x:%d) size %d\n",
72 ID->tei_entity, ID->tei_instance, Size));
73
74 Status = InfoCopyOut( (PCHAR)OutData, Size, Buffer, BufferSize );
75 ExFreePool( OutData );
76
77 return Status;
78 }
79
80 TDI_STATUS InfoInterfaceTdiQueryEx( UINT InfoClass,
81 UINT InfoType,
82 UINT InfoId,
83 PVOID Context,
84 TDIEntityID *id,
85 PNDIS_BUFFER Buffer,
86 PUINT BufferSize ) {
87 if( InfoClass == INFO_CLASS_GENERIC &&
88 InfoType == INFO_TYPE_PROVIDER &&
89 InfoId == ENTITY_TYPE_ID ) {
90 ULONG Temp = IF_MIB;
91 return InfoCopyOut( (PCHAR)&Temp, sizeof(Temp), Buffer, BufferSize );
92 } else if( InfoClass == INFO_CLASS_PROTOCOL &&
93 InfoType == INFO_TYPE_PROVIDER &&
94 InfoId == IF_MIB_STATS_ID ) {
95 return InfoTdiQueryGetInterfaceMIB( id, Context, Buffer, BufferSize );
96 } else
97 return TDI_INVALID_REQUEST;
98 }
99
100 TDI_STATUS InfoInterfaceTdiSetEx( UINT InfoClass,
101 UINT InfoType,
102 UINT InfoId,
103 PVOID Context,
104 TDIEntityID *id,
105 PCHAR Buffer,
106 UINT BufferSize ) {
107 return TDI_INVALID_REQUEST;
108 }