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
= ExAllocatePool( NonPagedPool
, Size
);
33 RtCurrent
= RouteEntries
;
35 RCache
= ExAllocatePool( NonPagedPool
, sizeof( FIB_ENTRY
) * RtCount
);
38 if( !RCache
|| !RouteEntries
) {
39 if( RCache
) ExFreePool( RCache
);
40 if( RouteEntries
) ExFreePool( RouteEntries
);
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 ExFreePool( RouteEntries
);
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
= ExAllocatePool(NonPagedPool
, sizeof(IPADDR_ENTRY
));
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
),
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
InfoTdiSetRoute(PIP_INTERFACE IF
, PVOID Buffer
, UINT BufferSize
)
182 IP_ADDRESS Address
, Netmask
, Router
;
183 PIPROUTE_ENTRY Route
= Buffer
;
185 AddrInitIPv4( &Address
, Route
->Dest
);
186 AddrInitIPv4( &Netmask
, Route
->Mask
);
187 AddrInitIPv4( &Router
, Route
->Gw
);
189 if (!Buffer
|| BufferSize
< sizeof(IPROUTE_ENTRY
))
190 return TDI_INVALID_PARAMETER
;
194 DbgPrint("Failing attempt to add route to loopback adapter\n");
195 return TDI_INVALID_PARAMETER
;
198 if( Route
->Type
== IP_ROUTE_TYPE_ADD
) { /* Add the route */
199 TI_DbgPrint(DEBUG_INFO
,("Adding route (%s)\n", A2S(&Address
)));
200 if (!RouterCreateRoute( &Address
, &Netmask
, &Router
,
202 return TDI_NO_RESOURCES
;
205 } else if( Route
->Type
== IP_ROUTE_TYPE_DEL
) {
206 TI_DbgPrint(DEBUG_INFO
,("Removing route (%s)\n", A2S(&Address
)));
207 if (NT_SUCCESS(RouterRemoveRoute( &Address
, &Router
)))
210 return TDI_INVALID_PARAMETER
;
213 return TDI_INVALID_REQUEST
;