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
16 #define MAX_ADAPTER_DESCRIPTION_LENGTH 128
18 TDI_STATUS
InfoTdiQueryGetInterfaceMIB(TDIEntityID ID
,
19 PIP_INTERFACE Interface
,
22 TDI_STATUS Status
= TDI_INVALID_REQUEST
;
27 NDIS_STATUS NdisStatus
;
30 return TDI_INVALID_PARAMETER
;
32 IF
= (PLAN_ADAPTER
)Interface
->Context
;
34 TI_DbgPrint(DEBUG_INFO
,
35 ("Getting IFEntry MIB (IF %08x LA %08x) (%04x:%d)\n",
36 Interface
, IF
, ID
.tei_entity
, ID
.tei_instance
));
38 OutData
= ExAllocatePoolWithTag( NonPagedPool
, FIELD_OFFSET(IFEntry
, if_descr
[MAX_ADAPTER_DESCRIPTION_LENGTH
+ 1]), OUT_DATA_TAG
);
40 if( !OutData
) return TDI_NO_RESOURCES
; /* Out of memory */
42 RtlZeroMemory( OutData
, FIELD_OFFSET(IFEntry
, if_descr
[MAX_ADAPTER_DESCRIPTION_LENGTH
+ 1]));
44 OutData
->if_index
= Interface
->Index
;
45 /* viz: tcpip keeps those indices */
46 OutData
->if_type
= Interface
==
47 Loopback
? MIB_IF_TYPE_LOOPBACK
: MIB_IF_TYPE_ETHERNET
;
48 OutData
->if_mtu
= Interface
->MTU
;
49 TI_DbgPrint(DEBUG_INFO
,
50 ("Getting interface speed\n"));
51 OutData
->if_physaddrlen
= Interface
->AddressLength
;
52 OutData
->if_adminstatus
= MIB_IF_ADMIN_STATUS_UP
;
53 /* NDIS_HARDWARE_STATUS -> ROUTER_CONNECTION_STATE */
54 GetInterfaceConnectionStatus( Interface
, &OutData
->if_operstatus
);
56 IFDescr
= (PCHAR
)&OutData
->if_descr
[0];
59 GetInterfaceSpeed( Interface
, (PUINT
)&OutData
->if_speed
);
60 TI_DbgPrint(DEBUG_INFO
,
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"));
65 memcpy(&OutData
->if_inoctets
, &Interface
->Stats
, sizeof(SEND_RECV_STATS
));
67 NdisStatus
= NDISCall(IF
,
68 NdisRequestQueryInformation
,
70 &OutData
->if_outerrors
,
72 if (NdisStatus
!= NDIS_STATUS_SUCCESS
)
73 OutData
->if_outerrors
= 0;
75 TI_DbgPrint(DEBUG_INFO
, ("OutErrors = %d\n", OutData
->if_outerrors
));
77 NdisStatus
= NDISCall(IF
,
78 NdisRequestQueryInformation
,
80 &OutData
->if_inerrors
,
82 if (NdisStatus
!= NDIS_STATUS_SUCCESS
)
83 OutData
->if_inerrors
= 0;
85 TI_DbgPrint(DEBUG_INFO
, ("InErrors = %d\n", OutData
->if_inerrors
));
88 GetInterfaceName( Interface
, IFDescr
, MAX_ADAPTER_DESCRIPTION_LENGTH
);
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]);
94 TI_DbgPrint(DEBUG_INFO
, ("Finished IFEntry MIB (%04x:%d) size %d\n",
95 ID
.tei_entity
, ID
.tei_instance
, Size
));
97 Status
= InfoCopyOut( (PCHAR
)OutData
, Size
, Buffer
, BufferSize
);
98 ExFreePoolWithTag( OutData
, OUT_DATA_TAG
);
100 TI_DbgPrint(DEBUG_INFO
,("Returning %x\n", Status
));
105 TDI_STATUS
InfoTdiQueryGetArptableMIB(TDIEntityID ID
,
106 PIP_INTERFACE Interface
,
110 ULONG NumNeighbors
= NBCopyNeighbors( Interface
, NULL
);
111 ULONG MemSize
= NumNeighbors
* sizeof(IPARP_ENTRY
);
112 PIPARP_ENTRY ArpEntries
;
116 ArpEntries
= ExAllocatePoolWithTag( NonPagedPool
, MemSize
, ARP_ENTRY_TAG
);
117 if( !ArpEntries
) return STATUS_NO_MEMORY
;
119 NBCopyNeighbors( Interface
, ArpEntries
);
121 Status
= InfoCopyOut( (PVOID
)ArpEntries
, MemSize
, Buffer
, BufferSize
);
123 ExFreePoolWithTag( ArpEntries
, ARP_ENTRY_TAG
);
127 Status
= InfoCopyOut(NULL
, 0, NULL
, BufferSize
);
133 TDI_STATUS
InfoTdiSetArptableMIB(PIP_INTERFACE IF
, PVOID Buffer
, UINT BufferSize
)
135 PIPARP_ENTRY ArpEntry
= Buffer
;
137 PNEIGHBOR_CACHE_ENTRY NCE
;
139 if (!Buffer
|| BufferSize
< sizeof(IPARP_ENTRY
))
140 return TDI_INVALID_PARAMETER
;
142 AddrInitIPv4(&Address
, ArpEntry
->LogAddr
);
144 if ((NCE
= NBLocateNeighbor(&Address
, IF
)))
145 NBRemoveNeighbor(NCE
);
147 if (NBAddNeighbor(IF
,
155 return TDI_INVALID_PARAMETER
;
158 VOID
InsertTDIInterfaceEntity( PIP_INTERFACE Interface
) {
159 AddEntity(IF_ENTITY
, Interface
, IF_MIB
);
161 AddEntity(AT_ENTITY
, Interface
,
162 (Interface
!= Loopback
) ? AT_ARP
: AT_NULL
);
164 /* FIXME: This is probably wrong */
165 AddEntity(CL_NL_ENTITY
, Interface
, CL_NL_IP
);
168 VOID
RemoveTDIInterfaceEntity( PIP_INTERFACE Interface
) {
169 /* This removes all of them */
170 RemoveEntityByContext(Interface
);