ReactOS 0.4.16-dev-1946-g52006dd
iinfo.c
Go to the documentation of this file.
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#include <ipifcons.h>
14
15/* See iptypes.h */
16#define MAX_ADAPTER_DESCRIPTION_LENGTH 128
17
23 IFEntry* OutData;
24 PLAN_ADAPTER IF;
25 PCHAR IFDescr;
26 ULONG Size;
27 ULONG Medium;
28 NDIS_STATUS NdisStatus;
29
30 if (!Interface)
32
34
36 ("Getting IFEntry MIB (IF %08x LA %08x) (%04x:%d)\n",
37 Interface, IF, ID.tei_entity, ID.tei_instance));
38
40
41 if( !OutData ) return TDI_NO_RESOURCES; /* Out of memory */
42
44
45 OutData->if_index = Interface->Index;
46 /* viz: tcpip keeps those indices */
47 OutData->if_type = Interface ==
49 OutData->if_mtu = Interface->MTU;
51 ("Getting interface speed\n"));
52 OutData->if_physaddrlen = Interface->AddressLength;
54 /* NDIS_HARDWARE_STATUS -> ROUTER_CONNECTION_STATE */
56
57 IFDescr = (PCHAR)&OutData->if_descr[0];
58
59 if( IF ) {
60 if (OutData->if_type == MIB_IF_TYPE_OTHER)
61 {
62 NdisStatus = NDISCall(IF,
65 &Medium,
66 sizeof(ULONG));
67 if (NdisStatus == NDIS_STATUS_SUCCESS)
68 {
69 switch (Medium)
70 {
71#if 0
73#endif
75 /* Win2003: MIB_IF_TYPE_ETHERNET; Vista+: IF_TYPE_IEEE80211 */
76#if (_WIN32_WINNT >= _WIN32_WINNT_VISTA)
77 OutData->if_type = IF_TYPE_IEEE80211;
78#else
80#endif
81 break;
82#if 0
90#endif
91#if (_WIN32_WINNT >= _WIN32_WINNT_VISTA)
92 /* NDIS 6.0+ (Vista+) */
94 OutData->if_type = IF_TYPE_IEEE80211;
95 break;
96#endif
97#if 0
102#endif
104 OutData->if_type = MIB_IF_TYPE_ETHERNET;
105 break;
106
109 break;
110#if 0
115#endif
116 }
117 }
118 }
119
120 if (OutData->if_type == MIB_IF_TYPE_OTHER)
121 {
122 NdisStatus = NDISCall(IF,
125 &Medium,
126 sizeof(ULONG));
127 if (NdisStatus == NDIS_STATUS_SUCCESS)
128 {
129 switch (Medium)
130 {
131 case NdisMedium802_3:
132 OutData->if_type = MIB_IF_TYPE_ETHERNET;
133 break;
134
135 case NdisMedium802_5:
137 break;
138
139 case NdisMediumFddi:
140 OutData->if_type = MIB_IF_TYPE_FDDI;
141 break;
142#if 0
143 case NdisMediumWan,
145 case NdisMediumDix:
148 case NdisMediumAtm:
150 case NdisMediumIrda:
151 case NdisMediumBpc:
152 case NdisMediumCoWan:
153 case NdisMedium1394:
154#endif
155 }
156 }
157 }
158
161 ("IF Speed = %d * 100bps\n", OutData->if_speed));
162 memcpy(OutData->if_physaddr, Interface->Address, Interface->AddressLength);
163 TI_DbgPrint(DEBUG_INFO, ("Got HWAddr\n"));
164
165 memcpy(&OutData->if_inoctets, &Interface->Stats, sizeof(SEND_RECV_STATS));
166
167 NdisStatus = NDISCall(IF,
170 &OutData->if_outerrors,
171 sizeof(ULONG));
172 if (NdisStatus != NDIS_STATUS_SUCCESS)
173 OutData->if_outerrors = 0;
174
175 TI_DbgPrint(DEBUG_INFO, ("OutErrors = %d\n", OutData->if_outerrors));
176
177 NdisStatus = NDISCall(IF,
180 &OutData->if_inerrors,
181 sizeof(ULONG));
182 if (NdisStatus != NDIS_STATUS_SUCCESS)
183 OutData->if_inerrors = 0;
184
185 TI_DbgPrint(DEBUG_INFO, ("InErrors = %d\n", OutData->if_inerrors));
186 }
187
189
190 TI_DbgPrint(DEBUG_INFO, ("Copied in name %s\n", IFDescr));
191 OutData->if_descrlen = strlen(IFDescr);
192 Size = FIELD_OFFSET(IFEntry, if_descr[OutData->if_descrlen + 1]);
193
194 TI_DbgPrint(DEBUG_INFO, ("Finished IFEntry MIB (%04x:%d) size %d\n",
195 ID.tei_entity, ID.tei_instance, Size));
196
197 Status = InfoCopyOut( (PCHAR)OutData, Size, Buffer, BufferSize );
199
200 TI_DbgPrint(DEBUG_INFO,("Returning %x\n", Status));
201
202 return Status;
203}
204
210 ULONG NumNeighbors = NBCopyNeighbors( Interface, NULL );
211 ULONG MemSize = NumNeighbors * sizeof(IPARP_ENTRY);
212 PIPARP_ENTRY ArpEntries;
213
214 if (MemSize != 0)
215 {
216 ArpEntries = ExAllocatePoolWithTag( NonPagedPool, MemSize, ARP_ENTRY_TAG );
217 if( !ArpEntries ) return STATUS_NO_MEMORY;
218
219 NBCopyNeighbors( Interface, ArpEntries );
220
221 Status = InfoCopyOut( (PVOID)ArpEntries, MemSize, Buffer, BufferSize );
222
223 ExFreePoolWithTag( ArpEntries, ARP_ENTRY_TAG );
224 }
225 else
226 {
228 }
229
230 return Status;
231}
232
234{
235 PIPARP_ENTRY ArpEntry = Buffer;
238
239 if (!Buffer || BufferSize < sizeof(IPARP_ENTRY))
241
242 AddrInitIPv4(&Address, ArpEntry->LogAddr);
243
244 if ((NCE = NBLocateNeighbor(&Address, IF)))
245 NBRemoveNeighbor(NCE);
246
247 if (NBAddNeighbor(IF,
248 &Address,
249 ArpEntry->PhysAddr,
250 ArpEntry->AddrSize,
252 0))
253 return TDI_SUCCESS;
254 else
256}
257
260
263
264 /* FIXME: This is probably wrong */
266}
267
269 /* This removes all of them */
271}
bool GetInterfaceName(const WCHAR *InterfaceString, WCHAR *buf, size_t size)
Definition: CFontExt.cpp:44
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
#define AddrInitIPv4(IPAddress, RawAddress)
Definition: address.h:16
LONG NTSTATUS
Definition: precomp.h:26
Definition: bufpool.h:45
#define STATUS_NO_MEMORY
Definition: d3dkmdt.h:51
#define NULL
Definition: types.h:112
#define DEBUG_INFO
Definition: debug.h:33
#define TI_DbgPrint(_t_, _x_)
Definition: debug.h:45
#define ARP_ENTRY_TAG
Definition: tags.h:40
#define OUT_DATA_TAG
Definition: tags.h:39
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define NonPagedPool
Definition: env_spec_w32.h:307
Status
Definition: gdiplustypes.h:25
VOID RemoveTDIInterfaceEntity(PIP_INTERFACE Interface)
Definition: iinfo.c:268
TDI_STATUS InfoTdiQueryGetInterfaceMIB(TDIEntityID ID, PIP_INTERFACE Interface, PNDIS_BUFFER Buffer, PUINT BufferSize)
Definition: iinfo.c:18
#define MAX_ADAPTER_DESCRIPTION_LENGTH
Definition: iinfo.c:16
TDI_STATUS InfoTdiSetArptableMIB(PIP_INTERFACE IF, PVOID Buffer, UINT BufferSize)
Definition: iinfo.c:233
TDI_STATUS InfoTdiQueryGetArptableMIB(TDIEntityID ID, PIP_INTERFACE Interface, PNDIS_BUFFER Buffer, PUINT BufferSize)
Definition: iinfo.c:205
VOID InsertTDIInterfaceEntity(PIP_INTERFACE Interface)
Definition: iinfo.c:258
TDI_STATUS InfoCopyOut(PCHAR DataOut, UINT SizeOut, PNDIS_BUFFER ClientBuf, PUINT ClientBufSize)
Definition: info.c:97
VOID RemoveEntityByContext(PVOID Context)
Definition: info.c:46
VOID AddEntity(ULONG EntityType, PVOID Context, ULONG Flags)
Definition: info.c:15
#define MIB_IF_TYPE_ETHERNET
Definition: ipifcons.h:223
#define MIB_IF_TYPE_LOOPBACK
Definition: ipifcons.h:227
#define MIB_IF_TYPE_OTHER
Definition: ipifcons.h:222
#define MIB_IF_ADMIN_STATUS_UP
Definition: ipifcons.h:232
#define IF_TYPE_IEEE80211
Definition: ipifcons.h:91
#define MIB_IF_TYPE_TOKENRING
Definition: ipifcons.h:224
#define MIB_IF_TYPE_FDDI
Definition: ipifcons.h:225
struct LAN_ADAPTER * PLAN_ADAPTER
NDIS_STATUS NDISCall(PLAN_ADAPTER Adapter, NDIS_REQUEST_TYPE Type, NDIS_OID OID, PVOID Buffer, UINT Length)
Send a request to NDIS.
Definition: lan.c:29
PIP_INTERFACE Loopback
Definition: loopback.c:13
#define PCHAR
Definition: match.c:90
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
unsigned int * PUINT
Definition: ndis.h:50
#define NDIS_STATUS_SUCCESS
Definition: ndis.h:346
MDL * PNDIS_BUFFER
Definition: ndis.h:343
unsigned int UINT
Definition: ndis.h:50
@ NdisRequestQueryInformation
Definition: ndis.h:790
ULONG NBCopyNeighbors(PIP_INTERFACE Interface, PIPARP_ENTRY ArpTable)
Definition: neighbor.c:636
PNEIGHBOR_CACHE_ENTRY NBLocateNeighbor(PIP_ADDRESS Address, PIP_INTERFACE Interface)
Definition: neighbor.c:417
PNEIGHBOR_CACHE_ENTRY NBAddNeighbor(PIP_INTERFACE Interface, PIP_ADDRESS Address, PVOID LinkAddress, UINT LinkAddressLength, UCHAR Type, UINT EventTimer)
Definition: neighbor.c:273
#define NUD_PERMANENT
Definition: neighbor.h:42
VOID NBRemoveNeighbor(PNEIGHBOR_CACHE_ENTRY NCE)
Definition: neighbor.c:590
NTSTATUS GetInterfaceSpeed(PIP_INTERFACE Interface, PUINT Speed)
Definition: interface.c:62
VOID GetInterfaceConnectionStatus(PIP_INTERFACE Interface, PULONG OperStatus)
Definition: interface.c:254
#define OID_GEN_XMIT_ERROR
Definition: ntddndis.h:288
@ NdisPhysicalMediumIrda
Definition: ntddndis.h:239
@ NdisPhysicalMediumPowerLine
Definition: ntddndis.h:226
@ NdisPhysicalMediumBluetooth
Definition: ntddndis.h:232
@ NdisPhysicalMediumFibreChannel
Definition: ntddndis.h:228
@ NdisPhysicalMediumUnspecified
Definition: ntddndis.h:222
@ NdisPhysicalMediumUWB
Definition: ntddndis.h:236
@ NdisPhysicalMedium1394
Definition: ntddndis.h:229
@ NdisPhysicalMediumWirelessWan
Definition: ntddndis.h:230
@ NdisPhysicalMediumInfiniband
Definition: ntddndis.h:234
@ NdisPhysicalMediumDSL
Definition: ntddndis.h:227
@ NdisPhysicalMediumWiredWAN
Definition: ntddndis.h:240
@ NdisPhysicalMediumOther
Definition: ntddndis.h:242
@ NdisPhysicalMediumNative802_11
Definition: ntddndis.h:231
@ NdisPhysicalMediumCableModem
Definition: ntddndis.h:224
@ NdisPhysicalMediumWirelessLan
Definition: ntddndis.h:223
@ NdisPhysicalMedium802_5
Definition: ntddndis.h:238
@ NdisPhysicalMediumWiMax
Definition: ntddndis.h:235
@ NdisPhysicalMediumWiredCoWan
Definition: ntddndis.h:241
@ NdisPhysicalMedium802_3
Definition: ntddndis.h:237
@ NdisPhysicalMediumPhoneLine
Definition: ntddndis.h:225
#define OID_GEN_PHYSICAL_MEDIUM
Definition: ntddndis.h:283
#define OID_GEN_MEDIA_SUPPORTED
Definition: ntddndis.h:254
@ NdisMedium802_5
Definition: ntddndis.h:192
@ NdisMediumArcnetRaw
Definition: ntddndis.h:197
@ NdisMediumIrda
Definition: ntddndis.h:201
@ NdisMediumWan
Definition: ntddndis.h:194
@ NdisMediumCoWan
Definition: ntddndis.h:203
@ NdisMediumDix
Definition: ntddndis.h:196
@ NdisMediumFddi
Definition: ntddndis.h:193
@ NdisMediumArcnet878_2
Definition: ntddndis.h:198
@ NdisMedium1394
Definition: ntddndis.h:204
@ NdisMediumWirelessWan
Definition: ntddndis.h:200
@ NdisMediumLocalTalk
Definition: ntddndis.h:195
@ NdisMedium802_3
Definition: ntddndis.h:191
@ NdisMediumAtm
Definition: ntddndis.h:199
@ NdisMediumBpc
Definition: ntddndis.h:202
int NDIS_STATUS
Definition: ntddndis.h:496
#define OID_GEN_RCV_ERROR
Definition: ntddndis.h:289
static WCHAR Address[46]
Definition: ping.c:68
#define ID
Definition: ruserpass.c:36
ULONG if_operstatus
Definition: tcpioctl.h:118
UCHAR if_descr[1]
Definition: tcpioctl.h:133
ULONG if_inerrors
Definition: tcpioctl.h:124
ULONG if_index
Definition: tcpioctl.h:111
ULONG if_descrlen
Definition: tcpioctl.h:132
ULONG if_physaddrlen
Definition: tcpioctl.h:115
ULONG if_inoctets
Definition: tcpioctl.h:120
ULONG if_type
Definition: tcpioctl.h:112
ULONG if_speed
Definition: tcpioctl.h:114
ULONG if_mtu
Definition: tcpioctl.h:113
ULONG if_outerrors
Definition: tcpioctl.h:130
UCHAR if_physaddr[MAX_PHYSADDR_SIZE]
Definition: tcpioctl.h:116
ULONG if_adminstatus
Definition: tcpioctl.h:117
Definition: info.h:35
ULONG LogAddr
Definition: info.h:39
UCHAR PhysAddr[8]
Definition: info.h:38
ULONG AddrSize
Definition: info.h:37
Definition: ip.h:23
PVOID Context
Definition: lan.h:64
Definition: neighbor.h:28
LONG TDI_STATUS
Definition: tdi.h:36
#define IF_ENTITY
Definition: tdiinfo.h:47
#define CL_NL_IP
Definition: tdiinfo.h:54
#define AT_ENTITY
Definition: tdiinfo.h:41
#define AT_NULL
Definition: tdiinfo.h:50
#define AT_ARP
Definition: tdiinfo.h:49
#define CL_NL_ENTITY
Definition: tdiinfo.h:42
#define IF_MIB
Definition: tdiinfo.h:61
#define TDI_SUCCESS
Definition: tdistat.h:30
#define TDI_NO_RESOURCES
Definition: tdistat.h:31
#define TDI_INVALID_PARAMETER
Definition: tdistat.h:52
#define TDI_INVALID_REQUEST
Definition: tdistat.h:63
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
uint32_t ULONG
Definition: typedefs.h:59
char * PCHAR
Definition: typedefs.h:51
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4539
_Must_inspect_result_ _In_ WDFDEVICE _In_ LPCGUID _Out_ PINTERFACE Interface
Definition: wdffdo.h:465
_In_ WDFMEMORY _Out_opt_ size_t * BufferSize
Definition: wdfmemory.h:254