2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS TCP/IP protocol driver
5 * PURPOSE: Per-interface information.
6 * PROGRAMMERS: Art Yerkes
8 * CSH 01/08-2000 Created
13 TDI_STATUS
InfoTdiQueryGetInterfaceMIB(TDIEntityID ID
,
14 PIP_INTERFACE Interface
,
17 TDI_STATUS Status
= TDI_INVALID_REQUEST
;
22 UINT DescrLenMax
= MAX_IFDESCR_LEN
- 1;
23 NDIS_STATUS NdisStatus
;
26 return TDI_INVALID_PARAMETER
;
28 IF
= (PLAN_ADAPTER
)Interface
->Context
;
30 TI_DbgPrint(DEBUG_INFO
,
31 ("Getting IFEntry MIB (IF %08x LA %08x) (%04x:%d)\n",
32 Interface
, IF
, ID
.tei_entity
, ID
.tei_instance
));
35 (PIFENTRY
)ExAllocatePool( NonPagedPool
,
36 sizeof(IFENTRY
) + MAX_IFDESCR_LEN
);
38 if( !OutData
) return TDI_NO_RESOURCES
; /* Out of memory */
40 RtlZeroMemory( OutData
, sizeof(IFENTRY
) + MAX_IFDESCR_LEN
);
42 OutData
->Index
= Interface
->Index
;
43 /* viz: tcpip keeps those indices */
44 OutData
->Type
= Interface
==
45 Loopback
? MIB_IF_TYPE_LOOPBACK
: MIB_IF_TYPE_ETHERNET
;
46 OutData
->Mtu
= Interface
->MTU
;
47 TI_DbgPrint(DEBUG_INFO
,
48 ("Getting interface speed\n"));
49 OutData
->PhysAddrLen
= Interface
->AddressLength
;
50 OutData
->AdminStatus
= MIB_IF_ADMIN_STATUS_UP
;
51 /* NDIS_HARDWARE_STATUS -> ROUTER_CONNECTION_STATE */
52 Status
= GetInterfaceConnectionStatus( Interface
, &OutData
->OperStatus
);
54 /* Not sure what to do here, but not ready seems a safe bet on failure */
55 if( !NT_SUCCESS(Status
) )
56 OutData
->OperStatus
= NdisHardwareStatusNotReady
;
58 IFDescr
= (PCHAR
)&OutData
[1];
61 GetInterfaceSpeed( Interface
, (PUINT
)&OutData
->Speed
);
62 TI_DbgPrint(DEBUG_INFO
,
63 ("IF Speed = %d * 100bps\n", OutData
->Speed
));
64 memcpy(OutData
->PhysAddr
,Interface
->Address
,Interface
->AddressLength
);
65 TI_DbgPrint(DEBUG_INFO
, ("Got HWAddr\n"));
67 memcpy(&OutData
->InOctets
, &Interface
->Stats
, sizeof(SEND_RECV_STATS
));
69 NdisStatus
= NDISCall(IF
,
70 NdisRequestQueryInformation
,
74 if (NdisStatus
!= NDIS_STATUS_SUCCESS
)
75 OutData
->OutErrors
= 0;
77 TI_DbgPrint(DEBUG_INFO
, ("OutErrors = %d\n", OutData
->OutErrors
));
79 NdisStatus
= NDISCall(IF
,
80 NdisRequestQueryInformation
,
84 if (NdisStatus
!= NDIS_STATUS_SUCCESS
)
85 OutData
->InErrors
= 0;
87 TI_DbgPrint(DEBUG_INFO
, ("InErrors = %d\n", OutData
->InErrors
));
90 GetInterfaceName( Interface
, IFDescr
, MAX_IFDESCR_LEN
- 1 );
91 DescrLenMax
= strlen( IFDescr
) + 1;
93 TI_DbgPrint(DEBUG_INFO
, ("Copied in name %s\n", IFDescr
));
94 OutData
->DescrLen
= DescrLenMax
;
95 IFDescr
+= DescrLenMax
;
96 Size
= IFDescr
- (PCHAR
)OutData
+ 1;
98 TI_DbgPrint(DEBUG_INFO
, ("Finished IFEntry MIB (%04x:%d) size %d\n",
99 ID
.tei_entity
, ID
.tei_instance
, Size
));
101 Status
= InfoCopyOut( (PCHAR
)OutData
, Size
, Buffer
, BufferSize
);
102 ExFreePool( OutData
);
104 TI_DbgPrint(DEBUG_INFO
,("Returning %x\n", Status
));
109 TDI_STATUS
InfoTdiQueryGetArptableMIB(TDIEntityID ID
,
110 PIP_INTERFACE Interface
,
114 ULONG NumNeighbors
= NBCopyNeighbors( Interface
, NULL
);
115 ULONG MemSize
= NumNeighbors
* sizeof(IPARP_ENTRY
);
116 PIPARP_ENTRY ArpEntries
;
120 ArpEntries
= ExAllocatePool( NonPagedPool
, MemSize
);
121 if( !ArpEntries
) return STATUS_NO_MEMORY
;
123 NBCopyNeighbors( Interface
, ArpEntries
);
125 Status
= InfoCopyOut( (PVOID
)ArpEntries
, MemSize
, Buffer
, BufferSize
);
127 ExFreePool( ArpEntries
);
131 Status
= InfoCopyOut(NULL
, 0, NULL
, BufferSize
);
137 TDI_STATUS
InfoTdiSetArptableMIB(PIP_INTERFACE IF
, PVOID Buffer
, UINT BufferSize
)
139 PIPARP_ENTRY ArpEntry
= Buffer
;
141 PNEIGHBOR_CACHE_ENTRY NCE
;
143 if (!Buffer
|| BufferSize
< sizeof(IPARP_ENTRY
))
144 return TDI_INVALID_PARAMETER
;
146 AddrInitIPv4(&Address
, ArpEntry
->LogAddr
);
148 if ((NCE
= NBLocateNeighbor(&Address
)))
149 NBRemoveNeighbor(NCE
);
151 if (NBAddNeighbor(IF
,
159 return TDI_INVALID_PARAMETER
;
162 VOID
InsertTDIInterfaceEntity( PIP_INTERFACE Interface
) {
163 AddEntity(IF_ENTITY
, Interface
, IF_MIB
);
165 AddEntity(AT_ENTITY
, Interface
,
166 (Interface
!= Loopback
) ? AT_ARP
: AT_NULL
);
168 /* FIXME: This is probably wrong */
169 AddEntity(CL_NL_ENTITY
, Interface
, CL_NL_IP
);
172 VOID
RemoveTDIInterfaceEntity( PIP_INTERFACE Interface
) {
173 /* This removes all of them */
174 RemoveEntityByContext(Interface
);