Initial import
[olsrd.git] / src / win32 / kernel_routes.c
1 /*
2  * Functions for the Windows port
3  * Copyright (C) 2004 Thomas Lopatic (thomas@lopatic.de)
4  *
5  * This file is part of olsrd-unik.
6  *
7  * olsrd-unik is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * olsrd-unik is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with olsrd-unik; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20  *
21  */
22
23 #include <stdio.h>
24
25 #include "../olsr_protocol.h"
26 #include "net/route.h"
27 #include "../routing_table.h"
28 #include "../olsr.h"
29 #include "../defs.h"
30
31 #define WIN32_LEAN_AND_MEAN
32 #include <iprtrmib.h>
33 #include <iphlpapi.h>
34 #undef interface
35
36 char *StrError(unsigned int ErrNo);
37
38 int olsr_ioctl_add_route(struct rt_entry *Dest)
39 {
40   MIB_IPFORWARDROW Row;
41   unsigned long Res;
42   union olsr_kernel_route Route;
43   char *IntString;
44   char Str1[16], Str2[16], Str3[16];
45
46   inet_ntop(AF_INET, &Dest->rt_dst.v4, Str1, 16);
47   inet_ntop(AF_INET, &Dest->rt_mask.v4, Str2, 16);
48   inet_ntop(AF_INET, &Dest->rt_router.v4, Str3, 16);
49
50   olsr_printf(1, "Adding IPv4 route to %s/%s via %s.\n", Str1, Str2, Str3);
51
52   memset(&Row, 0, sizeof (MIB_IPFORWARDROW));
53
54   Row.dwForwardDest = Dest->rt_dst.v4;
55   Row.dwForwardMask = Dest->rt_mask.v4;
56   Row.dwForwardNextHop = Dest->rt_router.v4;
57   Row.dwForwardIfIndex = Dest->rt_if->if_index;
58   Row.dwForwardType = (Dest->rt_dst.v4 == Dest->rt_router.v4) ? 3 : 4;
59   Row.dwForwardProto = 3; // PROTO_IP_NETMGMT
60
61   Res = SetIpForwardEntry(&Row);
62
63   if (Res != NO_ERROR)
64   {
65     fprintf(stderr, "SetIpForwardEntry() = %08lx, %s", Res, StrError(Res));
66     Res = CreateIpForwardEntry(&Row);
67   }
68
69   if (Res != NO_ERROR)
70   {
71     fprintf(stderr, "CreateIpForwardEntry() = %08lx, %s", Res, StrError(Res));
72
73     // XXX - report error in a different way
74
75     errno = Res;
76
77     return -1;
78   }
79
80   if(use_ipc)
81   {
82     memset(&Route, 0, sizeof (Route));
83
84     Route.v4.rt_metric = Dest->rt_metric;
85
86     ((struct sockaddr_in *)&Route.v4.rt_gateway)->sin_addr.s_addr =
87       Dest->rt_router.v4;
88
89     ((struct sockaddr_in *)&Route.v4.rt_dst)->sin_addr.s_addr =
90       Dest->rt_dst.v4;
91
92     IntString = (Dest->rt_router.v4 == 0) ? NULL : Dest->rt_if->int_name;
93     ipc_route_send_rtentry(&Route, 1, IntString);
94   }
95
96   return 0;
97 }
98
99 // XXX - to be implemented
100
101 int olsr_ioctl_add_route6(struct rt_entry *Dest)
102 {
103   return 0;
104 }
105
106 int olsr_ioctl_del_route(struct rt_entry *Dest)
107 {
108   MIB_IPFORWARDROW Row;
109   unsigned long Res;
110   union olsr_kernel_route Route;
111   char Str1[16], Str2[16], Str3[16];
112
113   inet_ntop(AF_INET, &Dest->rt_dst.v4, Str1, 16);
114   inet_ntop(AF_INET, &Dest->rt_mask.v4, Str2, 16);
115   inet_ntop(AF_INET, &Dest->rt_router.v4, Str3, 16);
116
117   olsr_printf(1, "Deleting IPv4 route to %s/%s via %s.\n", Str1, Str2, Str3);
118
119 #if 0
120   Res = GetBestRoute(Dest->rt_dst.v4, 0, &Row);
121
122   if (Res != NO_ERROR)
123   {
124     fprintf(stderr, "GetBestRoute() = %08lx, %s", Res, StrError(Res));
125
126     // XXX - report error in a different way
127
128     errno = Res;
129
130     return -1;
131   }
132 #else
133   memset(&Row, 0, sizeof (MIB_IPFORWARDROW));
134
135   Row.dwForwardDest = Dest->rt_dst.v4;
136   Row.dwForwardMask = Dest->rt_mask.v4;
137   Row.dwForwardNextHop = Dest->rt_router.v4;
138   Row.dwForwardIfIndex = Dest->rt_if->if_index;
139   Row.dwForwardType = (Dest->rt_dst.v4 == Dest->rt_router.v4) ? 3 : 4;
140   Row.dwForwardProto = 3; // PROTO_IP_NETMGMT
141 #endif
142
143   Res = DeleteIpForwardEntry(&Row);
144
145   if (Res != NO_ERROR)
146   {
147     fprintf(stderr, "DeleteIpForwardEntry() = %08lx, %s", Res, StrError(Res));
148
149     // XXX - report error in a different way
150
151     errno = Res;
152
153     return -1;
154   }
155
156   if(use_ipc)
157   {
158     memset(&Route, 0, sizeof (Route));
159
160     Route.v4.rt_metric = Dest->rt_metric;
161
162     ((struct sockaddr_in *)&Route.v4.rt_gateway)->sin_addr.s_addr =
163       Dest->rt_router.v4;
164
165     ((struct sockaddr_in *)&Route.v4.rt_dst)->sin_addr.s_addr =
166       Dest->rt_dst.v4;
167
168     ipc_route_send_rtentry(&Route, 0, NULL);
169   }
170
171   return 0;
172 }
173
174 // XXX - to be implemented
175
176 int olsr_ioctl_del_route6(struct rt_entry *Dest)
177 {
178   return 0;
179 }
180
181 // XXX - to be implemented
182
183 int delete_tunnel_route()
184 {
185   return 0;
186 }