2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS TCP/IP protocol driver
5 * PURPOSE: Network information
6 * PROGRAMMERS: Art Yerkes
8 * CSH 01/08-2000 Created
13 #define IP_ROUTE_TYPE_ADD 3
14 #define IP_ROUTE_TYPE_DEL 2
16 /* Get IPRouteEntry s for each of the routes in the system */
17 TDI_STATUS
InfoTdiQueryGetRouteTable( PIP_INTERFACE IF
, PNDIS_BUFFER Buffer
, PUINT BufferSize
) {
20 UINT RtCount
= CountFIBs(IF
);
21 UINT Size
= sizeof( IPROUTE_ENTRY
) * RtCount
;
22 PFIB_ENTRY RCache
, RCacheCur
;
23 PIPROUTE_ENTRY RouteEntries
, RtCurrent
;
26 TI_DbgPrint(DEBUG_INFO
, ("Called, routes = %d\n",
30 return InfoCopyOut(NULL
, 0, NULL
, BufferSize
);
32 RouteEntries
= ExAllocatePoolWithTag( NonPagedPool
, Size
, ROUTE_ENTRY_TAG
);
33 RtCurrent
= RouteEntries
;
35 RCache
= ExAllocatePoolWithTag( NonPagedPool
, sizeof( FIB_ENTRY
) * RtCount
, FIB_TAG
);
38 if( !RCache
|| !RouteEntries
) {
39 if( RCache
) ExFreePoolWithTag( RCache
, FIB_TAG
);
40 if( RouteEntries
) ExFreePoolWithTag( RouteEntries
, ROUTE_ENTRY_TAG
);
41 return TDI_NO_RESOURCES
;
44 RtlZeroMemory( RouteEntries
, Size
);
46 RtCount
= CopyFIBs( IF
, RCache
);
48 while( RtCurrent
< RouteEntries
+ RtCount
) {
49 ASSERT(RCacheCur
->Router
);
51 RtlCopyMemory( &RtCurrent
->Dest
,
52 &RCacheCur
->NetworkAddress
.Address
,
53 sizeof(RtCurrent
->Dest
) );
54 RtlCopyMemory( &RtCurrent
->Mask
,
55 &RCacheCur
->Netmask
.Address
,
56 sizeof(RtCurrent
->Mask
) );
57 RtlCopyMemory( &RtCurrent
->Gw
,
58 &RCacheCur
->Router
->Address
.Address
,
59 sizeof(RtCurrent
->Gw
) );
61 RtCurrent
->Metric1
= RCacheCur
->Metric
;
62 RtCurrent
->Type
= TDI_ADDRESS_TYPE_IP
;
66 ("%d: NA %08x NM %08x GW %08x MT %x\n",
67 RtCurrent
- RouteEntries
,
71 RtCurrent
->Metric1
));
73 TcpipAcquireSpinLock(&EntityListLock
, &OldIrql
);
74 for (i
= 0; i
< EntityCount
; i
++)
75 if (EntityList
[i
].context
== IF
)
79 RtCurrent
->Index
= EntityList
[i
].tei_instance
;
83 TcpipReleaseSpinLock(&EntityListLock
, OldIrql
);
85 RtCurrent
++; RCacheCur
++;
88 Status
= InfoCopyOut( (PCHAR
)RouteEntries
, Size
, Buffer
, BufferSize
);
90 ExFreePoolWithTag( RouteEntries
, ROUTE_ENTRY_TAG
);
91 ExFreePoolWithTag( RCache
, FIB_TAG
);
93 TI_DbgPrint(DEBUG_INFO
, ("Returning %08x\n", Status
));
98 TDI_STATUS
InfoTdiQueryGetAddrTable(TDIEntityID ID
,
103 PIPADDR_ENTRY IPEntry
;
104 PIP_INTERFACE CurrentIF
;
107 TI_DbgPrint(DEBUG_INFO
, ("Called.\n"));
110 TcpipAcquireSpinLock(&EntityListLock
, &OldIrql
);
112 for (i
= 0; i
< EntityCount
; i
++)
114 if (EntityList
[i
].tei_entity
== ID
.tei_entity
&&
115 EntityList
[i
].tei_instance
== ID
.tei_instance
)
119 if (i
== EntityCount
)
121 TcpipReleaseSpinLock(&EntityListLock
, OldIrql
);
122 return TDI_INVALID_PARAMETER
;
125 IPEntry
= ExAllocatePoolWithTag(NonPagedPool
, sizeof(IPADDR_ENTRY
), IP_ADDRESS_TAG
);
128 TcpipReleaseSpinLock(&EntityListLock
, OldIrql
);
129 return TDI_NO_RESOURCES
;
132 CurrentIF
= EntityList
[i
].context
;
134 IPEntry
->Index
= CurrentIF
->Index
;
135 GetInterfaceIPv4Address(CurrentIF
,
138 GetInterfaceIPv4Address(CurrentIF
,
141 GetInterfaceIPv4Address(CurrentIF
,
143 &IPEntry
->BcastAddr
);
145 TcpipReleaseSpinLock(&EntityListLock
, OldIrql
);
147 InfoCopyOut((PCHAR
)IPEntry
, sizeof(IPADDR_ENTRY
),
150 ExFreePoolWithTag(IPEntry
, IP_ADDRESS_TAG
);
155 TDI_STATUS
InfoTdiQueryGetIPSnmpInfo( TDIEntityID ID
,
160 UINT IfCount
= CountInterfaces();
161 UINT RouteCount
= CountFIBs(IF
);
162 TDI_STATUS Status
= TDI_INVALID_REQUEST
;
164 TI_DbgPrint(DEBUG_INFO
, ("Called.\n"));
166 RtlZeroMemory(&SnmpInfo
, sizeof(SnmpInfo
));
168 SnmpInfo
.ipsi_numif
= IfCount
;
169 SnmpInfo
.ipsi_numaddr
= 1;
170 SnmpInfo
.ipsi_numroutes
= RouteCount
;
172 Status
= InfoCopyOut( (PCHAR
)&SnmpInfo
, sizeof(SnmpInfo
),
173 Buffer
, BufferSize
);
175 TI_DbgPrint(DEBUG_INFO
, ("Returning %08x\n", Status
));
180 TDI_STATUS
InfoTdiQueryGetConnectionTcpTable(PADDRESS_FILE AddrFile
,
185 PADDRESS_FILE EndPoint
;
186 TDI_STATUS Status
= TDI_INVALID_REQUEST
;
188 TI_DbgPrint(DEBUG_INFO
, ("Called.\n"));
191 TcpRow
.State
= 0; /* FIXME */
193 if (AddrFile
->Listener
!= NULL
)
195 EndPoint
= AddrFile
->Listener
->AddressFile
;
196 TcpRow
.State
= MIB_TCP_STATE_LISTEN
;
198 else if (AddrFile
->Connection
!= NULL
)
199 EndPoint
= AddrFile
->Connection
->AddressFile
;
201 TcpRow
.dwLocalAddr
= AddrFile
->Address
.Address
.IPv4Address
;
202 TcpRow
.dwLocalPort
= AddrFile
->Port
;
204 if (EndPoint
!= NULL
)
206 TcpRow
.dwRemoteAddr
= EndPoint
->Address
.Address
.IPv4Address
;
207 TcpRow
.dwRemotePort
= EndPoint
->Port
;
211 TcpRow
.dwRemoteAddr
= 0;
212 TcpRow
.dwRemotePort
= 0;
215 Status
= InfoCopyOut( (PCHAR
)&TcpRow
, sizeof(TcpRow
),
216 Buffer
, BufferSize
);
218 TI_DbgPrint(DEBUG_INFO
, ("Returning %08x\n", Status
));
223 TDI_STATUS
InfoTdiQueryGetConnectionUdpTable(PADDRESS_FILE AddrFile
,
228 TDI_STATUS Status
= TDI_INVALID_REQUEST
;
230 TI_DbgPrint(DEBUG_INFO
, ("Called.\n"));
232 UdpRow
.dwLocalAddr
= AddrFile
->Address
.Address
.IPv4Address
;
233 UdpRow
.dwLocalPort
= AddrFile
->Port
;
235 Status
= InfoCopyOut( (PCHAR
)&UdpRow
, sizeof(UdpRow
),
236 Buffer
, BufferSize
);
238 TI_DbgPrint(DEBUG_INFO
, ("Returning %08x\n", Status
));
243 TDI_STATUS
InfoTdiSetRoute(PIP_INTERFACE IF
, PVOID Buffer
, UINT BufferSize
)
245 IP_ADDRESS Address
, Netmask
, Router
;
246 PIPROUTE_ENTRY Route
= Buffer
;
248 AddrInitIPv4( &Address
, Route
->Dest
);
249 AddrInitIPv4( &Netmask
, Route
->Mask
);
250 AddrInitIPv4( &Router
, Route
->Gw
);
252 if (!Buffer
|| BufferSize
< sizeof(IPROUTE_ENTRY
))
253 return TDI_INVALID_PARAMETER
;
257 DbgPrint("Failing attempt to add route to loopback adapter\n");
258 return TDI_INVALID_PARAMETER
;
261 if( Route
->Type
== IP_ROUTE_TYPE_ADD
) { /* Add the route */
262 TI_DbgPrint(DEBUG_INFO
,("Adding route (%s)\n", A2S(&Address
)));
263 if (!RouterCreateRoute( &Address
, &Netmask
, &Router
,
265 return TDI_NO_RESOURCES
;
268 } else if( Route
->Type
== IP_ROUTE_TYPE_DEL
) {
269 TI_DbgPrint(DEBUG_INFO
,("Removing route (%s)\n", A2S(&Address
)));
270 if (NT_SUCCESS(RouterRemoveRoute( &Address
, &Router
)))
273 return TDI_INVALID_PARAMETER
;
276 return TDI_INVALID_REQUEST
;