xref: /reactos/dll/win32/iphlpapi/route_reactos.c (revision 1734f297)
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, FILE_READ_DATA | FILE_WRITE_DATA );
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, FILE_READ_DATA | FILE_WRITE_DATA );
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 }
156