Windows port compiles again. Moved all LQ packet functions to a single
[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.6 2004/11/03 18:19:54 tlopatic Exp $
22  *
23  */
24
25 #include <stdio.h>
26 #include "net/route.h"
27
28 #include "../kernel_routes.h"
29 #include "../defs.h"
30
31 #undef interface
32 #undef TRUE
33 #undef FALSE
34
35 #define WIN32_LEAN_AND_MEAN
36 #include <windows.h>
37 #include <iprtrmib.h>
38 #include <iphlpapi.h>
39
40 char *StrError(unsigned int ErrNo);
41
42 int olsr_ioctl_add_route(struct rt_entry *Dest)
43 {
44   MIB_IPFORWARDROW Row;
45   unsigned long Res;
46   union olsr_kernel_route Route;
47   char *IntString;
48   char Str1[16], Str2[16], Str3[16];
49
50   inet_ntop(AF_INET, &Dest->rt_dst.v4, Str1, 16);
51   inet_ntop(AF_INET, &Dest->rt_mask.v4, Str2, 16);
52   inet_ntop(AF_INET, &Dest->rt_router.v4, Str3, 16);
53
54   olsr_printf(1, "Adding IPv4 route to %s/%s via %s.\n", Str1, Str2, Str3);
55
56   memset(&Row, 0, sizeof (MIB_IPFORWARDROW));
57
58   Row.dwForwardDest = Dest->rt_dst.v4;
59   Row.dwForwardMask = Dest->rt_mask.v4;
60   Row.dwForwardNextHop = Dest->rt_router.v4;
61   Row.dwForwardIfIndex = Dest->rt_if->if_index;
62   Row.dwForwardType = (Dest->rt_dst.v4 == Dest->rt_router.v4) ? 3 : 4;
63   Row.dwForwardProto = 3; // PROTO_IP_NETMGMT
64
65   Res = SetIpForwardEntry(&Row);
66
67   if (Res != NO_ERROR)
68   {
69     fprintf(stderr, "SetIpForwardEntry() = %08lx, %s", Res, StrError(Res));
70     Res = CreateIpForwardEntry(&Row);
71   }
72
73   if (Res != NO_ERROR)
74   {
75     fprintf(stderr, "CreateIpForwardEntry() = %08lx, %s", Res, StrError(Res));
76
77     // XXX - report error in a different way
78
79     errno = Res;
80
81     return -1;
82   }
83
84   if(olsr_cnf->open_ipc)
85   {
86     memset(&Route, 0, sizeof (Route));
87
88     Route.v4.rt_metric = Dest->rt_metric;
89
90     ((struct sockaddr_in *)&Route.v4.rt_gateway)->sin_addr.s_addr =
91       Dest->rt_router.v4;
92
93     ((struct sockaddr_in *)&Route.v4.rt_dst)->sin_addr.s_addr =
94       Dest->rt_dst.v4;
95
96     IntString = (Dest->rt_router.v4 == 0) ? NULL : Dest->rt_if->int_name;
97     ipc_route_send_rtentry(&Route, 1, IntString);
98   }
99
100   return 0;
101 }
102
103 // XXX - to be implemented
104
105 int olsr_ioctl_add_route6(struct rt_entry *Dest)
106 {
107   return 0;
108 }
109
110 int olsr_ioctl_del_route(struct rt_entry *Dest)
111 {
112   MIB_IPFORWARDROW Row;
113   unsigned long Res;
114   union olsr_kernel_route Route;
115   char Str1[16], Str2[16], Str3[16];
116
117   inet_ntop(AF_INET, &Dest->rt_dst.v4, Str1, 16);
118   inet_ntop(AF_INET, &Dest->rt_mask.v4, Str2, 16);
119   inet_ntop(AF_INET, &Dest->rt_router.v4, Str3, 16);
120
121   olsr_printf(1, "Deleting IPv4 route to %s/%s via %s.\n", Str1, Str2, Str3);
122
123   memset(&Row, 0, sizeof (MIB_IPFORWARDROW));
124
125   Row.dwForwardDest = Dest->rt_dst.v4;
126   Row.dwForwardMask = Dest->rt_mask.v4;
127   Row.dwForwardNextHop = Dest->rt_router.v4;
128   Row.dwForwardIfIndex = Dest->rt_if->if_index;
129   Row.dwForwardType = (Dest->rt_dst.v4 == Dest->rt_router.v4) ? 3 : 4;
130   Row.dwForwardProto = 3; // PROTO_IP_NETMGMT
131
132   Res = DeleteIpForwardEntry(&Row);
133
134   if (Res != NO_ERROR)
135   {
136     fprintf(stderr, "DeleteIpForwardEntry() = %08lx, %s", Res, StrError(Res));
137
138     // XXX - report error in a different way
139
140     errno = Res;
141
142     return -1;
143   }
144
145   if(olsr_cnf->open_ipc)
146   {
147     memset(&Route, 0, sizeof (Route));
148
149     Route.v4.rt_metric = Dest->rt_metric;
150
151     ((struct sockaddr_in *)&Route.v4.rt_gateway)->sin_addr.s_addr =
152       Dest->rt_router.v4;
153
154     ((struct sockaddr_in *)&Route.v4.rt_dst)->sin_addr.s_addr =
155       Dest->rt_dst.v4;
156
157     ipc_route_send_rtentry(&Route, 0, NULL);
158   }
159
160   return 0;
161 }
162
163 // XXX - to be implemented
164
165 int olsr_ioctl_del_route6(struct rt_entry *Dest)
166 {
167   return 0;
168 }
169
170 // XXX - to be implemented
171
172 int delete_tunnel_route()
173 {
174   return 0;
175 }