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
= exAllocatePoolWithTag( NonPagedPool
, MemSize
, FOURCC('A','R','P','t') );
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
) {
164 UINT IFCount
= 0, CLNLCount
= 0, CLTLCount
= 0, COTLCount
= 0, ATCount
= 0, ERCount
= 0, i
;
166 TI_DbgPrint(DEBUG_INFO
,
167 ("Inserting interface %08x (%d entities already)\n",
168 Interface
, EntityCount
));
170 TcpipAcquireSpinLock( &EntityListLock
, &OldIrql
);
172 /* Count IP Entities */
173 for( i
= 0; i
< EntityCount
; i
++ )
174 switch( EntityList
[i
].tei_entity
)
204 EntityList
[EntityCount
].tei_entity
= IF_ENTITY
;
205 EntityList
[EntityCount
].tei_instance
= IFCount
;
206 EntityList
[EntityCount
].context
= Interface
;
207 EntityList
[EntityCount
].flags
= IF_MIB
;
209 EntityList
[EntityCount
].tei_entity
= CL_NL_ENTITY
;
210 EntityList
[EntityCount
].tei_instance
= CLNLCount
;
211 EntityList
[EntityCount
].context
= Interface
;
212 EntityList
[EntityCount
].flags
= CL_NL_IP
;
214 EntityList
[EntityCount
].tei_entity
= CL_TL_ENTITY
;
215 EntityList
[EntityCount
].tei_instance
= CLTLCount
;
216 EntityList
[EntityCount
].context
= Interface
;
217 EntityList
[EntityCount
].flags
= CL_TL_UDP
;
219 EntityList
[EntityCount
].tei_entity
= CO_TL_ENTITY
;
220 EntityList
[EntityCount
].tei_instance
= COTLCount
;
221 EntityList
[EntityCount
].context
= Interface
;
222 EntityList
[EntityCount
].flags
= CO_TL_TCP
;
224 EntityList
[EntityCount
].tei_entity
= ER_ENTITY
;
225 EntityList
[EntityCount
].tei_instance
= ERCount
;
226 EntityList
[EntityCount
].context
= Interface
;
227 EntityList
[EntityCount
].flags
= ER_ICMP
;
229 EntityList
[EntityCount
].tei_entity
= AT_ENTITY
;
230 EntityList
[EntityCount
].tei_instance
= ATCount
;
231 EntityList
[EntityCount
].context
= Interface
;
232 EntityList
[EntityCount
].flags
= (Interface
!= Loopback
) ? AT_ARP
: AT_NULL
;
235 TcpipReleaseSpinLock( &EntityListLock
, OldIrql
);
238 VOID
RemoveTDIInterfaceEntity( PIP_INTERFACE Interface
) {
242 TI_DbgPrint(DEBUG_INFO
,("Removing TDI entry 0x%x\n", Interface
));
244 TcpipAcquireSpinLock( &EntityListLock
, &OldIrql
);
246 /* Remove entities that have this interface as context
247 * In the future, this might include AT_ENTITY types, too
249 for( i
= 0; i
< EntityCount
; i
++ ) {
250 TI_DbgPrint(DEBUG_INFO
,("--> examining TDI entry 0x%x\n", EntityList
[i
].context
));
251 if( EntityList
[i
].context
== Interface
) {
252 if( i
!= EntityCount
-1 ) {
253 memcpy( &EntityList
[i
],
254 &EntityList
[--EntityCount
],
255 sizeof(EntityList
[i
]) );
262 TcpipReleaseSpinLock( &EntityListLock
, OldIrql
);