2004-08-16 Casper S. Hornstrup <chorns@users.sourceforge.net>
[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
14 TDI_STATUS InfoTdiQueryGetInterfaceMIB(TDIEntityID *ID,
15 PIP_INTERFACE Interface,
16 PNDIS_BUFFER Buffer,
17 PUINT BufferSize) {
18 TDI_STATUS Status = TDI_INVALID_REQUEST;
19 PIFENTRY OutData;
20 PLAN_ADAPTER IF = (PLAN_ADAPTER)Interface->Context;
21 PCHAR IFDescr;
22 KIRQL OldIrql;
23 ULONG Size;
24 UINT DescrLenMax = MAX_IFDESCR_LEN - 1;
25
26 TI_DbgPrint(MAX_TRACE,
27 ("Getting IFEntry MIB (IF %08x LA %08x) (%04x:%d)\n",
28 Interface, IF, ID->tei_entity, ID->tei_instance));
29
30 OutData =
31 (PIFENTRY)ExAllocatePool( NonPagedPool,
32 sizeof(IFENTRY) + MAX_IFDESCR_LEN );
33
34 if( !OutData ) return TDI_INVALID_REQUEST; /* Out of memory */
35
36 RtlZeroMemory( OutData, sizeof(IFENTRY) + MAX_IFDESCR_LEN );
37
38 OutData->Index = ID->tei_instance + 1;
39 /* viz: tcpip keeps those indices */
40 OutData->Type = IF ? 1 : 0; /* XXX other -- for now ... */
41 OutData->Mtu = Interface->MTU;
42 TI_DbgPrint(MAX_TRACE,
43 ("Getting interface speed\n"));
44 OutData->PhysAddrLen = Interface->AddressLength;
45 OutData->AdminStatus = 1; /* XXX Up -- How do I know? */
46 OutData->OperStatus = 1; /* XXX Up -- How do I know? */
47
48 IFDescr = (PCHAR)&OutData[1];
49
50 if( IF ) {
51 GetInterfaceSpeed( Interface, &OutData->Speed );
52 TI_DbgPrint(MAX_TRACE,
53 ("IF Speed = %d * 100bps\n", OutData->Speed));
54 memcpy(OutData->PhysAddr,Interface->Address,Interface->AddressLength);
55 TI_DbgPrint(MAX_TRACE, ("Got HWAddr\n"));
56 GetInterfaceName( Interface, IFDescr, MAX_IFDESCR_LEN - 1 );
57 DescrLenMax = strlen( IFDescr ) + 1;
58 }
59
60 IFDescr[DescrLenMax] = 0; /* Terminate ifdescr string */
61
62 TI_DbgPrint(MAX_TRACE, ("Copied in name %s\n", IFDescr));
63 OutData->DescrLen = DescrLenMax;
64 IFDescr += DescrLenMax;
65 Size = IFDescr - (PCHAR)OutData + 1;
66
67 TI_DbgPrint(MAX_TRACE, ("Finished IFEntry MIB (%04x:%d) size %d\n",
68 ID->tei_entity, ID->tei_instance, Size));
69
70 Status = InfoCopyOut( OutData, Size, Buffer, BufferSize );
71 ExFreePool( OutData );
72
73 return Status;
74 }
75
76 TDI_STATUS InfoInterfaceTdiQueryEx( UINT InfoClass,
77 UINT InfoType,
78 UINT InfoId,
79 PVOID Context,
80 TDIEntityID *id,
81 PNDIS_BUFFER Buffer,
82 PUINT BufferSize ) {
83 if( InfoClass == INFO_CLASS_GENERIC &&
84 InfoType == INFO_TYPE_PROVIDER &&
85 InfoId == ENTITY_TYPE_ID ) {
86 ULONG Temp = IF_MIB;
87 return InfoCopyOut( &Temp, sizeof(Temp), Buffer, BufferSize );
88 } else if( InfoClass == INFO_CLASS_PROTOCOL &&
89 InfoType == INFO_TYPE_PROVIDER &&
90 InfoId == IF_MIB_STATS_ID ) {
91 return InfoTdiQueryGetInterfaceMIB( id, Context, Buffer, BufferSize );
92 } else
93 return TDI_INVALID_REQUEST;
94 }
95
96 TDI_STATUS InfoInterfaceTdiSetEx( UINT InfoClass,
97 UINT InfoType,
98 UINT InfoId,
99 PVOID Context,
100 TDIEntityID *id,
101 PCHAR Buffer,
102 UINT BufferSize ) {
103 return TDI_INVALID_REQUEST;
104 }