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 if (AddrFile
->Connection
!= NULL
)
192 EndPoint
= AddrFile
->Connection
->AddressFile
;
193 else if (AddrFile
->Listener
!= NULL
)
194 EndPoint
= AddrFile
->Listener
->AddressFile
;
196 TcpRow
.State
= 0; /* FIXME */
197 TcpRow
.dwLocalAddr
= AddrFile
->Address
.Address
.IPv4Address
;
198 TcpRow
.dwLocalPort
= AddrFile
->Port
;
200 if (EndPoint
!= NULL
)
202 TcpRow
.dwRemoteAddr
= EndPoint
->Address
.Address
.IPv4Address
;
203 TcpRow
.dwRemotePort
= EndPoint
->Port
;
207 TcpRow
.dwRemoteAddr
= 0;
208 TcpRow
.dwRemotePort
= 0;
211 Status
= InfoCopyOut( (PCHAR
)&TcpRow
, sizeof(TcpRow
),
212 Buffer
, BufferSize
);
214 TI_DbgPrint(DEBUG_INFO
, ("Returning %08x\n", Status
));
219 TDI_STATUS
InfoTdiQueryGetConnectionUdpTable(PADDRESS_FILE AddrFile
,
224 TDI_STATUS Status
= TDI_INVALID_REQUEST
;
226 TI_DbgPrint(DEBUG_INFO
, ("Called.\n"));
228 UdpRow
.dwLocalAddr
= AddrFile
->Address
.Address
.IPv4Address
;
229 UdpRow
.dwLocalPort
= AddrFile
->Port
;
231 Status
= InfoCopyOut( (PCHAR
)&UdpRow
, sizeof(UdpRow
),
232 Buffer
, BufferSize
);
234 TI_DbgPrint(DEBUG_INFO
, ("Returning %08x\n", Status
));
239 TDI_STATUS
InfoTdiSetRoute(PIP_INTERFACE IF
, PVOID Buffer
, UINT BufferSize
)
241 IP_ADDRESS Address
, Netmask
, Router
;
242 PIPROUTE_ENTRY Route
= Buffer
;
244 AddrInitIPv4( &Address
, Route
->Dest
);
245 AddrInitIPv4( &Netmask
, Route
->Mask
);
246 AddrInitIPv4( &Router
, Route
->Gw
);
248 if (!Buffer
|| BufferSize
< sizeof(IPROUTE_ENTRY
))
249 return TDI_INVALID_PARAMETER
;
253 DbgPrint("Failing attempt to add route to loopback adapter\n");
254 return TDI_INVALID_PARAMETER
;
257 if( Route
->Type
== IP_ROUTE_TYPE_ADD
) { /* Add the route */
258 TI_DbgPrint(DEBUG_INFO
,("Adding route (%s)\n", A2S(&Address
)));
259 if (!RouterCreateRoute( &Address
, &Netmask
, &Router
,
261 return TDI_NO_RESOURCES
;
264 } else if( Route
->Type
== IP_ROUTE_TYPE_DEL
) {
265 TI_DbgPrint(DEBUG_INFO
,("Removing route (%s)\n", A2S(&Address
)));
266 if (NT_SUCCESS(RouterRemoveRoute( &Address
, &Router
)))
269 return TDI_INVALID_PARAMETER
;
272 return TDI_INVALID_REQUEST
;