Copyright comments now in the new format.
[olsrd.git] / src / win32 / kernel_routes.c
1 /* 
2  * OLSR ad-hoc routing table management protocol
3  * Copyright (C) 2004 Thomas Lopatic (thomas@lopatic.de)
4  *
5  * This file is part of the olsr.org OLSR daemon.
6  *
7  * olsr.org 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  * olsr.org 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 olsr.org; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20  *
21  * $Id: kernel_routes.c,v 1.4 2004/10/19 13:58:46 tlopatic Exp $
22  *
23  */
24
25 #include <stdio.h>
26 #include "net/route.h"
27
28 #include "../kernel_routes.h"
29
30 #define WIN32_LEAN_AND_MEAN
31 #include <iprtrmib.h>
32 #include <iphlpapi.h>
33 #undef interface
34
35 char *StrError(unsigned int ErrNo);
36
37 int olsr_ioctl_add_route(struct rt_entry *Dest)
38 {
39   MIB_IPFORWARDROW Row;
40   unsigned long Res;
41   union olsr_kernel_route Route;
42   char *IntString;
43   char Str1[16], Str2[16], Str3[16];
44
45   inet_ntop(AF_INET, &Dest->rt_dst.v4, Str1, 16);
46   inet_ntop(AF_INET, &Dest->rt_mask.v4, Str2, 16);
47   inet_ntop(AF_INET, &Dest->rt_router.v4, Str3, 16);
48
49   olsr_printf(1, "Adding IPv4 route to %s/%s via %s.\n", Str1, Str2, Str3);
50
51   memset(&Row, 0, sizeof (MIB_IPFORWARDROW));
52
53   Row.dwForwardDest = Dest->rt_dst.v4;
54   Row.dwForwardMask = Dest->rt_mask.v4;
55   Row.dwForwardNextHop = Dest->rt_router.v4;
56   Row.dwForwardIfIndex = Dest->rt_if->if_index;
57   Row.dwForwardType = (Dest->rt_dst.v4 == Dest->rt_router.v4) ? 3 : 4;
58   Row.dwForwardProto = 3; // PROTO_IP_NETMGMT
59
60   Res = SetIpForwardEntry(&Row);
61
62   if (Res != NO_ERROR)
63   {
64     fprintf(stderr, "SetIpForwardEntry() = %08lx, %s", Res, StrError(Res));
65     Res = CreateIpForwardEntry(&Row);
66   }
67
68   if (Res != NO_ERROR)
69   {
70     fprintf(stderr, "CreateIpForwardEntry() = %08lx, %s", Res, StrError(Res));
71
72     // XXX - report error in a different way
73
74     errno = Res;
75
76     return -1;
77   }
78
79   if(use_ipc)
80   {
81     memset(&Route, 0, sizeof (Route));
82
83     Route.v4.rt_metric = Dest->rt_metric;
84
85     ((struct sockaddr_in *)&Route.v4.rt_gateway)->sin_addr.s_addr =
86       Dest->rt_router.v4;
87
88     ((struct sockaddr_in *)&Route.v4.rt_dst)->sin_addr.s_addr =
89       Dest->rt_dst.v4;
90
91     IntString = (Dest->rt_router.v4 == 0) ? NULL : Dest->rt_if->int_name;
92     ipc_route_send_rtentry(&Route, 1, IntString);
93   }
94
95   return 0;
96 }
97
98 // XXX - to be implemented
99
100 int olsr_ioctl_add_route6(struct rt_entry *Dest)
101 {
102   return 0;
103 }
104
105 int olsr_ioctl_del_route(struct rt_entry *Dest)
106 {
107   MIB_IPFORWARDROW Row;
108   unsigned long Res;
109   union olsr_kernel_route Route;
110   char Str1[16], Str2[16], Str3[16];
111
112   inet_ntop(AF_INET, &Dest->rt_dst.v4, Str1, 16);
113   inet_ntop(AF_INET, &Dest->rt_mask.v4, Str2, 16);
114   inet_ntop(AF_INET, &Dest->rt_router.v4, Str3, 16);
115
116   olsr_printf(1, "Deleting IPv4 route to %s/%s via %s.\n", Str1, Str2, Str3);
117
118 #if 0
119   Res = GetBestRoute(Dest->rt_dst.v4, 0, &Row);
120
121   if (Res != NO_ERROR)
122   {
123     fprintf(stderr, "GetBestRoute() = %08lx, %s", Res, StrError(Res));
124
125     // XXX - report error in a different way
126
127     errno = Res;
128
129     return -1;
130   }
131 #else
132   memset(&Row, 0, sizeof (MIB_IPFORWARDROW));
133
134   Row.dwForwardDest = Dest->rt_dst.v4;
135   Row.dwForwardMask = Dest->rt_mask.v4;
136   Row.dwForwardNextHop = Dest->rt_router.v4;
137   Row.dwForwardIfIndex = Dest->rt_if->if_index;
138   Row.dwForwardType = (Dest->rt_dst.v4 == Dest->rt_router.v4) ? 3 : 4;
139   Row.dwForwardProto = 3; // PROTO_IP_NETMGMT
140 #endif
141
142   Res = DeleteIpForwardEntry(&Row);
143
144   if (Res != NO_ERROR)
145   {
146     fprintf(stderr, "DeleteIpForwardEntry() = %08lx, %s", Res, StrError(Res));
147
148     // XXX - report error in a different way
149
150     errno = Res;
151
152     return -1;
153   }
154
155   if(use_ipc)
156   {
157     memset(&Route, 0, sizeof (Route));
158
159     Route.v4.rt_metric = Dest->rt_metric;
160
161     ((struct sockaddr_in *)&Route.v4.rt_gateway)->sin_addr.s_addr =
162       Dest->rt_router.v4;
163
164     ((struct sockaddr_in *)&Route.v4.rt_dst)->sin_addr.s_addr =
165       Dest->rt_dst.v4;
166
167     ipc_route_send_rtentry(&Route, 0, NULL);
168   }
169
170   return 0;
171 }
172
173 // XXX - to be implemented
174
175 int olsr_ioctl_del_route6(struct rt_entry *Dest)
176 {
177   return 0;
178 }
179
180 // XXX - to be implemented
181
182 int delete_tunnel_route()
183 {
184   return 0;
185 }