* Sync up to trunk head (r64894).
[reactos.git] / dll / win32 / iphlpapi / route_reactos.c
1 /*
2 * iphlpapi dll implementation -- Setting and storing route information
3 *
4 * These are stubs for functions that set routing information on the target
5 * operating system. They are grouped here because their implementation will
6 * vary widely by operating system.
7 *
8 * Copyright (C) 2004 Art Yerkes
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
13 *
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
18 *
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 */
23
24 #include <config.h>
25 #include "iphlpapi_private.h"
26
27 #define IP_FORWARD_ADD 3
28 #define IP_FORWARD_DEL 2
29
30 WINE_DEFAULT_DEBUG_CHANNEL(iphlpapi);
31
32 DWORD createIpForwardEntry( PMIB_IPFORWARDROW pRoute ) {
33 HANDLE tcpFile;
34 NTSTATUS status = openTcpFile( &tcpFile );
35 TCP_REQUEST_SET_INFORMATION_EX_ROUTE_ENTRY req =
36 TCP_REQUEST_SET_INFORMATION_INIT;
37 IPRouteEntry *rte;
38 TDIEntityID id;
39 DWORD returnSize = 0;
40
41 TRACE("Called.\n");
42
43 if( NT_SUCCESS(status) ) {
44 status = getNthIpEntity( tcpFile, pRoute->dwForwardIfIndex, &id );
45
46 if( NT_SUCCESS(status) ) {
47 req.Req.ID.toi_class = INFO_CLASS_PROTOCOL;
48 req.Req.ID.toi_type = INFO_TYPE_PROVIDER;
49 req.Req.ID.toi_id = IP_MIB_ARPTABLE_ENTRY_ID;
50 req.Req.ID.toi_entity.tei_instance = id.tei_instance;
51 req.Req.ID.toi_entity.tei_entity = CL_NL_ENTITY;
52 req.Req.BufferSize = sizeof(*rte);
53 rte =
54 (IPRouteEntry *)&req.Req.Buffer[0];
55
56 // dwForwardPolicy
57 // dwForwardNextHopAS
58 rte->ire_dest = pRoute->dwForwardDest;
59 rte->ire_mask = pRoute->dwForwardMask;
60 rte->ire_gw = pRoute->dwForwardNextHop;
61 rte->ire_index = pRoute->dwForwardIfIndex;
62 rte->ire_type = IP_FORWARD_ADD;
63 rte->ire_proto = pRoute->dwForwardProto;
64 rte->ire_age = pRoute->dwForwardAge;
65 rte->ire_metric1 = pRoute->dwForwardMetric1;
66 rte->ire_metric2 = pRoute->dwForwardMetric2;
67 rte->ire_metric3 = pRoute->dwForwardMetric3;
68 rte->ire_metric4 = pRoute->dwForwardMetric4;
69 rte->ire_metric5 = pRoute->dwForwardMetric5;
70
71 status = DeviceIoControl( tcpFile,
72 IOCTL_TCP_SET_INFORMATION_EX,
73 &req,
74 sizeof(req),
75 NULL,
76 0,
77 &returnSize,
78 NULL );
79 }
80
81 closeTcpFile( tcpFile );
82 }
83
84 TRACE("Returning: %08x (IOCTL was %08x)\n", status, IOCTL_TCP_SET_INFORMATION_EX);
85
86 if( NT_SUCCESS(status) )
87 return NO_ERROR;
88 else
89 return status;
90 }
91
92 DWORD setIpForwardEntry( PMIB_IPFORWARDROW pRoute ) {
93 FIXME(":stub\n");
94 return (DWORD) 0;
95 }
96
97 DWORD deleteIpForwardEntry( PMIB_IPFORWARDROW pRoute ) {
98 HANDLE tcpFile;
99 NTSTATUS status = openTcpFile( &tcpFile );
100 TCP_REQUEST_SET_INFORMATION_EX_ROUTE_ENTRY req =
101 TCP_REQUEST_SET_INFORMATION_INIT;
102 IPRouteEntry *rte;
103 TDIEntityID id;
104 DWORD returnSize = 0;
105
106 TRACE("Called.\n");
107
108 if( NT_SUCCESS(status) ) {
109 status = getNthIpEntity( tcpFile, pRoute->dwForwardIfIndex, &id );
110
111 if( NT_SUCCESS(status) ) {
112 req.Req.ID.toi_class = INFO_CLASS_PROTOCOL;
113 req.Req.ID.toi_type = INFO_TYPE_PROVIDER;
114 req.Req.ID.toi_id = IP_MIB_ARPTABLE_ENTRY_ID;
115 req.Req.ID.toi_entity.tei_instance = id.tei_instance;
116 req.Req.ID.toi_entity.tei_entity = CL_NL_ENTITY;
117 req.Req.BufferSize = sizeof(*rte);
118 rte =
119 (IPRouteEntry *)&req.Req.Buffer[0];
120
121 // dwForwardPolicy
122 // dwForwardNextHopAS
123 rte->ire_dest = pRoute->dwForwardDest;
124 rte->ire_mask = INADDR_NONE;
125 rte->ire_gw = pRoute->dwForwardNextHop;
126 rte->ire_index = pRoute->dwForwardIfIndex;
127 rte->ire_type = IP_FORWARD_DEL;
128 rte->ire_proto = pRoute->dwForwardProto;
129 rte->ire_age = pRoute->dwForwardAge;
130 rte->ire_metric1 = pRoute->dwForwardMetric1;
131 rte->ire_metric2 = INADDR_NONE;
132 rte->ire_metric3 = INADDR_NONE;
133 rte->ire_metric4 = INADDR_NONE;
134 rte->ire_metric5 = INADDR_NONE;
135
136 status = DeviceIoControl( tcpFile,
137 IOCTL_TCP_SET_INFORMATION_EX,
138 &req,
139 sizeof(req),
140 NULL,
141 0,
142 &returnSize,
143 NULL );
144 }
145
146 closeTcpFile( tcpFile );
147 }
148
149 TRACE("Returning: %08x (IOCTL was %08x)\n", status, IOCTL_TCP_SET_INFORMATION_EX);
150
151 if( NT_SUCCESS(status) )
152 return NO_ERROR;
153 else
154 return status;
155 }