mirror of
https://github.com/reactos/reactos.git
synced 2024-11-20 14:30:57 +00:00
155 lines
5.8 KiB
C
155 lines
5.8 KiB
C
/*
|
|
* iphlpapi dll implementation -- Setting and storing route information
|
|
*
|
|
* These are stubs for functions that set routing information on the target
|
|
* operating system. They are grouped here because their implementation will
|
|
* vary widely by operating system.
|
|
*
|
|
* Copyright (C) 2004 Art Yerkes
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
|
|
#include <config.h>
|
|
#include "iphlpapi_private.h"
|
|
|
|
#define IP_FORWARD_ADD 3
|
|
#define IP_FORWARD_DEL 2
|
|
|
|
WINE_DEFAULT_DEBUG_CHANNEL(iphlpapi);
|
|
|
|
DWORD createIpForwardEntry( PMIB_IPFORWARDROW pRoute ) {
|
|
HANDLE tcpFile;
|
|
NTSTATUS status = openTcpFile( &tcpFile, FILE_READ_DATA | FILE_WRITE_DATA );
|
|
TCP_REQUEST_SET_INFORMATION_EX_ROUTE_ENTRY req =
|
|
TCP_REQUEST_SET_INFORMATION_INIT;
|
|
IPRouteEntry *rte;
|
|
TDIEntityID id;
|
|
DWORD returnSize = 0;
|
|
|
|
TRACE("Called.\n");
|
|
|
|
if( NT_SUCCESS(status) ) {
|
|
status = getNthIpEntity( tcpFile, pRoute->dwForwardIfIndex, &id );
|
|
|
|
if( NT_SUCCESS(status) ) {
|
|
req.Req.ID.toi_class = INFO_CLASS_PROTOCOL;
|
|
req.Req.ID.toi_type = INFO_TYPE_PROVIDER;
|
|
req.Req.ID.toi_id = IP_MIB_ARPTABLE_ENTRY_ID;
|
|
req.Req.ID.toi_entity.tei_instance = id.tei_instance;
|
|
req.Req.ID.toi_entity.tei_entity = CL_NL_ENTITY;
|
|
req.Req.BufferSize = sizeof(*rte);
|
|
rte =
|
|
(IPRouteEntry *)&req.Req.Buffer[0];
|
|
|
|
// dwForwardPolicy
|
|
// dwForwardNextHopAS
|
|
rte->ire_dest = pRoute->dwForwardDest;
|
|
rte->ire_mask = pRoute->dwForwardMask;
|
|
rte->ire_gw = pRoute->dwForwardNextHop;
|
|
rte->ire_index = pRoute->dwForwardIfIndex;
|
|
rte->ire_type = IP_FORWARD_ADD;
|
|
rte->ire_proto = pRoute->dwForwardProto;
|
|
rte->ire_age = pRoute->dwForwardAge;
|
|
rte->ire_metric1 = pRoute->dwForwardMetric1;
|
|
rte->ire_metric2 = pRoute->dwForwardMetric2;
|
|
rte->ire_metric3 = pRoute->dwForwardMetric3;
|
|
rte->ire_metric4 = pRoute->dwForwardMetric4;
|
|
rte->ire_metric5 = pRoute->dwForwardMetric5;
|
|
|
|
status = DeviceIoControl( tcpFile,
|
|
IOCTL_TCP_SET_INFORMATION_EX,
|
|
&req,
|
|
sizeof(req),
|
|
NULL,
|
|
0,
|
|
&returnSize,
|
|
NULL );
|
|
}
|
|
|
|
closeTcpFile( tcpFile );
|
|
}
|
|
|
|
TRACE("Returning: %08x (IOCTL was %08x)\n", status, IOCTL_TCP_SET_INFORMATION_EX);
|
|
|
|
if( NT_SUCCESS(status) )
|
|
return NO_ERROR;
|
|
else
|
|
return status;
|
|
}
|
|
|
|
DWORD setIpForwardEntry( PMIB_IPFORWARDROW pRoute ) {
|
|
FIXME(":stub\n");
|
|
return (DWORD) 0;
|
|
}
|
|
|
|
DWORD deleteIpForwardEntry( PMIB_IPFORWARDROW pRoute ) {
|
|
HANDLE tcpFile;
|
|
NTSTATUS status = openTcpFile( &tcpFile, FILE_READ_DATA | FILE_WRITE_DATA );
|
|
TCP_REQUEST_SET_INFORMATION_EX_ROUTE_ENTRY req =
|
|
TCP_REQUEST_SET_INFORMATION_INIT;
|
|
IPRouteEntry *rte;
|
|
TDIEntityID id;
|
|
DWORD returnSize = 0;
|
|
|
|
TRACE("Called.\n");
|
|
|
|
if( NT_SUCCESS(status) ) {
|
|
status = getNthIpEntity( tcpFile, pRoute->dwForwardIfIndex, &id );
|
|
|
|
if( NT_SUCCESS(status) ) {
|
|
req.Req.ID.toi_class = INFO_CLASS_PROTOCOL;
|
|
req.Req.ID.toi_type = INFO_TYPE_PROVIDER;
|
|
req.Req.ID.toi_id = IP_MIB_ARPTABLE_ENTRY_ID;
|
|
req.Req.ID.toi_entity.tei_instance = id.tei_instance;
|
|
req.Req.ID.toi_entity.tei_entity = CL_NL_ENTITY;
|
|
req.Req.BufferSize = sizeof(*rte);
|
|
rte =
|
|
(IPRouteEntry *)&req.Req.Buffer[0];
|
|
|
|
// dwForwardPolicy
|
|
// dwForwardNextHopAS
|
|
rte->ire_dest = pRoute->dwForwardDest;
|
|
rte->ire_mask = INADDR_NONE;
|
|
rte->ire_gw = pRoute->dwForwardNextHop;
|
|
rte->ire_index = pRoute->dwForwardIfIndex;
|
|
rte->ire_type = IP_FORWARD_DEL;
|
|
rte->ire_proto = pRoute->dwForwardProto;
|
|
rte->ire_age = pRoute->dwForwardAge;
|
|
rte->ire_metric1 = pRoute->dwForwardMetric1;
|
|
rte->ire_metric2 = INADDR_NONE;
|
|
rte->ire_metric3 = INADDR_NONE;
|
|
rte->ire_metric4 = INADDR_NONE;
|
|
rte->ire_metric5 = INADDR_NONE;
|
|
|
|
status = DeviceIoControl( tcpFile,
|
|
IOCTL_TCP_SET_INFORMATION_EX,
|
|
&req,
|
|
sizeof(req),
|
|
NULL,
|
|
0,
|
|
&returnSize,
|
|
NULL );
|
|
}
|
|
|
|
closeTcpFile( tcpFile );
|
|
}
|
|
|
|
TRACE("Returning: %08x (IOCTL was %08x)\n", status, IOCTL_TCP_SET_INFORMATION_EX);
|
|
|
|
if( NT_SUCCESS(status) )
|
|
return NO_ERROR;
|
|
else
|
|
return status;
|
|
}
|