ReactOS 0.4.15-dev-8222-g9164419
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 NDIS_STATUS NdisStatus;
28
29 if (!Interface)
31
33
35 ("Getting IFEntry MIB (IF %08x LA %08x) (%04x:%d)\n",
36 Interface, IF, ID.tei_entity, ID.tei_instance));
37
39
40 if( !OutData ) return TDI_NO_RESOURCES; /* Out of memory */
41
43
44 OutData->if_index = Interface->Index;
45 /* viz: tcpip keeps those indices */
46 OutData->if_type = Interface ==
48 OutData->if_mtu = Interface->MTU;
50 ("Getting interface speed\n"));
51 OutData->if_physaddrlen = Interface->AddressLength;
53 /* NDIS_HARDWARE_STATUS -> ROUTER_CONNECTION_STATE */
55
56 IFDescr = (PCHAR)&OutData->if_descr[0];
57
58 if( IF ) {
61 ("IF Speed = %d * 100bps\n", OutData->if_speed));
62 memcpy(OutData->if_physaddr, Interface->Address, Interface->AddressLength);
63 TI_DbgPrint(DEBUG_INFO, ("Got HWAddr\n"));
64
65 memcpy(&OutData->if_inoctets, &Interface->Stats, sizeof(SEND_RECV_STATS));
66
67 NdisStatus = NDISCall(IF,
70 &OutData->if_outerrors,
71 sizeof(ULONG));
72 if (NdisStatus != NDIS_STATUS_SUCCESS)
73 OutData->if_outerrors = 0;
74
75 TI_DbgPrint(DEBUG_INFO, ("OutErrors = %d\n", OutData->if_outerrors));
76
77 NdisStatus = NDISCall(IF,
80 &OutData->if_inerrors,
81 sizeof(ULONG));
82 if (NdisStatus != NDIS_STATUS_SUCCESS)
83 OutData->if_inerrors = 0;
84
85 TI_DbgPrint(DEBUG_INFO, ("InErrors = %d\n", OutData->if_inerrors));
86 }
87
89
90 TI_DbgPrint(DEBUG_INFO, ("Copied in name %s\n", IFDescr));
91 OutData->if_descrlen = strlen(IFDescr);
92 Size = FIELD_OFFSET(IFEntry, if_descr[OutData->if_descrlen + 1]);
93
94 TI_DbgPrint(DEBUG_INFO, ("Finished IFEntry MIB (%04x:%d) size %d\n",
95 ID.tei_entity, ID.tei_instance, Size));
96
99
100 TI_DbgPrint(DEBUG_INFO,("Returning %x\n", Status));
101
102 return Status;
103}
104
110 ULONG NumNeighbors = NBCopyNeighbors( Interface, NULL );
111 ULONG MemSize = NumNeighbors * sizeof(IPARP_ENTRY);
112 PIPARP_ENTRY ArpEntries;
113
114 if (MemSize != 0)
115 {
116 ArpEntries = ExAllocatePoolWithTag( NonPagedPool, MemSize, ARP_ENTRY_TAG );
117 if( !ArpEntries ) return STATUS_NO_MEMORY;
118
119 NBCopyNeighbors( Interface, ArpEntries );
120
121 Status = InfoCopyOut( (PVOID)ArpEntries, MemSize, Buffer, BufferSize );
122
123 ExFreePoolWithTag( ArpEntries, ARP_ENTRY_TAG );
124 }
125 else
126 {
128 }
129
130 return Status;
131}
132
134{
135 PIPARP_ENTRY ArpEntry = Buffer;
138
139 if (!Buffer || BufferSize < sizeof(IPARP_ENTRY))
141
142 AddrInitIPv4(&Address, ArpEntry->LogAddr);
143
144 if ((NCE = NBLocateNeighbor(&Address, IF)))
145 NBRemoveNeighbor(NCE);
146
147 if (NBAddNeighbor(IF,
148 &Address,
149 ArpEntry->PhysAddr,
150 ArpEntry->AddrSize,
152 0))
153 return TDI_SUCCESS;
154 else
156}
157
160
163
164 /* FIXME: This is probably wrong */
166}
167
169 /* This removes all of them */
171}
bool GetInterfaceName(const WCHAR *InterfaceString, WCHAR *buf, size_t size)
Definition: CFontExt.cpp:46
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 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:168
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:133
TDI_STATUS InfoTdiQueryGetArptableMIB(TDIEntityID ID, PIP_INTERFACE Interface, PNDIS_BUFFER Buffer, PUINT BufferSize)
Definition: iinfo.c:105
VOID InsertTDIInterfaceEntity(PIP_INTERFACE Interface)
Definition: iinfo.c:158
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_ADMIN_STATUS_UP
Definition: ipifcons.h:232
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
int NDIS_STATUS
Definition: ntddndis.h:475
#define OID_GEN_RCV_ERROR
Definition: ntddndis.h:270
#define STATUS_NO_MEMORY
Definition: ntstatus.h:260
static WCHAR Address[46]
Definition: ping.c:68
#define ID
Definition: ruserpass.c:36
ULONG if_operstatus
Definition: tcpioctl.h:115
UCHAR if_descr[1]
Definition: tcpioctl.h:130
ULONG if_inerrors
Definition: tcpioctl.h:121
ULONG if_index
Definition: tcpioctl.h:108
ULONG if_descrlen
Definition: tcpioctl.h:129
ULONG if_physaddrlen
Definition: tcpioctl.h:112
ULONG if_inoctets
Definition: tcpioctl.h:117
ULONG if_type
Definition: tcpioctl.h:109
ULONG if_speed
Definition: tcpioctl.h:111
ULONG if_mtu
Definition: tcpioctl.h:110
ULONG if_outerrors
Definition: tcpioctl.h:127
UCHAR if_physaddr[MAX_PHYSADDR_SIZE]
Definition: tcpioctl.h:113
ULONG if_adminstatus
Definition: tcpioctl.h:114
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