ReactOS 0.4.16-dev-1165-g40721f4
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 OutData->if_type = IF_TYPE_IEEE80211;
76 break;
77#if 0
85#endif
87 OutData->if_type = IF_TYPE_IEEE80211;
88 break;
89#if 0
94#endif
97 break;
98
101 break;
102#if 0
107#endif
108 }
109 }
110 }
111
112 if (OutData->if_type == MIB_IF_TYPE_OTHER)
113 {
114 NdisStatus = NDISCall(IF,
117 &Medium,
118 sizeof(ULONG));
119 if (NdisStatus == NDIS_STATUS_SUCCESS)
120 {
121 switch (Medium)
122 {
123 case NdisMedium802_3:
124 OutData->if_type = MIB_IF_TYPE_ETHERNET;
125 break;
126
127 case NdisMedium802_5:
129 break;
130
131 case NdisMediumFddi:
132 OutData->if_type = MIB_IF_TYPE_FDDI;
133 break;
134#if 0
135 case NdisMediumWan,
137 case NdisMediumDix:
140 case NdisMediumAtm:
142 case NdisMediumIrda:
143 case NdisMediumBpc:
144 case NdisMediumCoWan:
145 case NdisMedium1394:
146#endif
147 }
148 }
149 }
150
153 ("IF Speed = %d * 100bps\n", OutData->if_speed));
154 memcpy(OutData->if_physaddr, Interface->Address, Interface->AddressLength);
155 TI_DbgPrint(DEBUG_INFO, ("Got HWAddr\n"));
156
157 memcpy(&OutData->if_inoctets, &Interface->Stats, sizeof(SEND_RECV_STATS));
158
159 NdisStatus = NDISCall(IF,
162 &OutData->if_outerrors,
163 sizeof(ULONG));
164 if (NdisStatus != NDIS_STATUS_SUCCESS)
165 OutData->if_outerrors = 0;
166
167 TI_DbgPrint(DEBUG_INFO, ("OutErrors = %d\n", OutData->if_outerrors));
168
169 NdisStatus = NDISCall(IF,
172 &OutData->if_inerrors,
173 sizeof(ULONG));
174 if (NdisStatus != NDIS_STATUS_SUCCESS)
175 OutData->if_inerrors = 0;
176
177 TI_DbgPrint(DEBUG_INFO, ("InErrors = %d\n", OutData->if_inerrors));
178 }
179
181
182 TI_DbgPrint(DEBUG_INFO, ("Copied in name %s\n", IFDescr));
183 OutData->if_descrlen = strlen(IFDescr);
184 Size = FIELD_OFFSET(IFEntry, if_descr[OutData->if_descrlen + 1]);
185
186 TI_DbgPrint(DEBUG_INFO, ("Finished IFEntry MIB (%04x:%d) size %d\n",
187 ID.tei_entity, ID.tei_instance, Size));
188
189 Status = InfoCopyOut( (PCHAR)OutData, Size, Buffer, BufferSize );
191
192 TI_DbgPrint(DEBUG_INFO,("Returning %x\n", Status));
193
194 return Status;
195}
196
202 ULONG NumNeighbors = NBCopyNeighbors( Interface, NULL );
203 ULONG MemSize = NumNeighbors * sizeof(IPARP_ENTRY);
204 PIPARP_ENTRY ArpEntries;
205
206 if (MemSize != 0)
207 {
208 ArpEntries = ExAllocatePoolWithTag( NonPagedPool, MemSize, ARP_ENTRY_TAG );
209 if( !ArpEntries ) return STATUS_NO_MEMORY;
210
211 NBCopyNeighbors( Interface, ArpEntries );
212
213 Status = InfoCopyOut( (PVOID)ArpEntries, MemSize, Buffer, BufferSize );
214
215 ExFreePoolWithTag( ArpEntries, ARP_ENTRY_TAG );
216 }
217 else
218 {
220 }
221
222 return Status;
223}
224
226{
227 PIPARP_ENTRY ArpEntry = Buffer;
230
231 if (!Buffer || BufferSize < sizeof(IPARP_ENTRY))
233
234 AddrInitIPv4(&Address, ArpEntry->LogAddr);
235
236 if ((NCE = NBLocateNeighbor(&Address, IF)))
237 NBRemoveNeighbor(NCE);
238
239 if (NBAddNeighbor(IF,
240 &Address,
241 ArpEntry->PhysAddr,
242 ArpEntry->AddrSize,
244 0))
245 return TDI_SUCCESS;
246 else
248}
249
252
255
256 /* FIXME: This is probably wrong */
258}
259
261 /* This removes all of them */
263}
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:260
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:225
TDI_STATUS InfoTdiQueryGetArptableMIB(TDIEntityID ID, PIP_INTERFACE Interface, PNDIS_BUFFER Buffer, PUINT BufferSize)
Definition: iinfo.c:197
VOID InsertTDIInterfaceEntity(PIP_INTERFACE Interface)
Definition: iinfo.c:250
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
unsigned int UINT
Definition: ndis.h:50
#define NDIS_STATUS_SUCCESS
Definition: ndis.h:346
MDL * PNDIS_BUFFER
Definition: ndis.h:343
@ 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:269
@ NdisPhysicalMediumIrda
Definition: ntddndis.h:223
@ NdisPhysicalMediumPowerLine
Definition: ntddndis.h:211
@ NdisPhysicalMediumBluetooth
Definition: ntddndis.h:217
@ NdisPhysicalMediumFibreChannel
Definition: ntddndis.h:213
@ NdisPhysicalMediumUnspecified
Definition: ntddndis.h:207
@ NdisPhysicalMediumUWB
Definition: ntddndis.h:220
@ NdisPhysicalMedium1394
Definition: ntddndis.h:214
@ NdisPhysicalMediumWirelessWan
Definition: ntddndis.h:215
@ NdisPhysicalMediumInfiniband
Definition: ntddndis.h:218
@ NdisPhysicalMediumDSL
Definition: ntddndis.h:212
@ NdisPhysicalMediumWiredWAN
Definition: ntddndis.h:224
@ NdisPhysicalMediumOther
Definition: ntddndis.h:226
@ NdisPhysicalMediumNative802_11
Definition: ntddndis.h:216
@ NdisPhysicalMediumCableModem
Definition: ntddndis.h:209
@ NdisPhysicalMediumWirelessLan
Definition: ntddndis.h:208
@ NdisPhysicalMedium802_5
Definition: ntddndis.h:222
@ NdisPhysicalMediumWiMax
Definition: ntddndis.h:219
@ NdisPhysicalMediumWiredCoWan
Definition: ntddndis.h:225
@ NdisPhysicalMedium802_3
Definition: ntddndis.h:221
@ NdisPhysicalMediumPhoneLine
Definition: ntddndis.h:210
#define OID_GEN_PHYSICAL_MEDIUM
Definition: ntddndis.h:264
#define OID_GEN_MEDIA_SUPPORTED
Definition: ntddndis.h:235
@ NdisMedium802_5
Definition: ntddndis.h:189
@ NdisMediumArcnetRaw
Definition: ntddndis.h:194
@ NdisMediumIrda
Definition: ntddndis.h:198
@ NdisMediumWan
Definition: ntddndis.h:191
@ NdisMediumCoWan
Definition: ntddndis.h:200
@ NdisMediumDix
Definition: ntddndis.h:193
@ NdisMediumFddi
Definition: ntddndis.h:190
@ NdisMediumArcnet878_2
Definition: ntddndis.h:195
@ NdisMedium1394
Definition: ntddndis.h:201
@ NdisMediumWirelessWan
Definition: ntddndis.h:197
@ NdisMediumLocalTalk
Definition: ntddndis.h:192
@ NdisMedium802_3
Definition: ntddndis.h:188
@ NdisMediumAtm
Definition: ntddndis.h:196
@ NdisMediumBpc
Definition: ntddndis.h:199
int NDIS_STATUS
Definition: ntddndis.h:475
#define OID_GEN_RCV_ERROR
Definition: ntddndis.h:270
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:4533
_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