852ec61af3be2d9a5153241024e58bf5809f2b47
[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.9 2004/11/14 20:48:03 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 #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   char Str1[16], Str2[16], Str3[16];
43
44   inet_ntop(AF_INET, &Dest->rt_dst.v4, Str1, 16);
45   inet_ntop(AF_INET, &Dest->rt_mask.v4, Str2, 16);
46   inet_ntop(AF_INET, &Dest->rt_router.v4, Str3, 16);
47
48   olsr_printf(1, "Adding IPv4 route to %s/%s via %s.\n", Str1, Str2, Str3);
49
50   memset(&Row, 0, sizeof (MIB_IPFORWARDROW));
51
52   Row.dwForwardDest = Dest->rt_dst.v4;
53   Row.dwForwardMask = Dest->rt_mask.v4;
54   Row.dwForwardNextHop = Dest->rt_router.v4;
55   Row.dwForwardIfIndex = Dest->rt_if->if_index;
56   Row.dwForwardType = (Dest->rt_dst.v4 == Dest->rt_router.v4) ? 3 : 4;
57   Row.dwForwardProto = 3; // PROTO_IP_NETMGMT
58
59   Res = SetIpForwardEntry(&Row);
60
61   if (Res != NO_ERROR)
62   {
63     fprintf(stderr, "SetIpForwardEntry() = %08lx, %s", Res, StrError(Res));
64     Res = CreateIpForwardEntry(&Row);
65   }
66
67   if (Res != NO_ERROR)
68   {
69     fprintf(stderr, "CreateIpForwardEntry() = %08lx, %s", Res, StrError(Res));
70
71     // XXX - report error in a different way
72
73     errno = Res;
74
75     return -1;
76   }
77
78   if(olsr_cnf->open_ipc)
79     ipc_route_send_rtentry(&Dest->rt_dst, &Dest->rt_router, Dest->rt_metric,
80                            1, Dest->rt_if->int_name);
81
82   return 0;
83 }
84
85 // XXX - to be implemented
86
87 int olsr_ioctl_add_route6(struct rt_entry *Dest)
88 {
89   return 0;
90 }
91
92 int olsr_ioctl_del_route(struct rt_entry *Dest)
93 {
94   MIB_IPFORWARDROW Row;
95   unsigned long Res;
96   char Str1[16], Str2[16], Str3[16];
97
98   inet_ntop(AF_INET, &Dest->rt_dst.v4, Str1, 16);
99   inet_ntop(AF_INET, &Dest->rt_mask.v4, Str2, 16);
100   inet_ntop(AF_INET, &Dest->rt_router.v4, Str3, 16);
101
102   olsr_printf(1, "Deleting IPv4 route to %s/%s via %s.\n", Str1, Str2, Str3);
103
104   memset(&Row, 0, sizeof (MIB_IPFORWARDROW));
105
106   Row.dwForwardDest = Dest->rt_dst.v4;
107   Row.dwForwardMask = Dest->rt_mask.v4;
108   Row.dwForwardNextHop = Dest->rt_router.v4;
109   Row.dwForwardIfIndex = Dest->rt_if->if_index;
110   Row.dwForwardType = (Dest->rt_dst.v4 == Dest->rt_router.v4) ? 3 : 4;
111   Row.dwForwardProto = 3; // PROTO_IP_NETMGMT
112
113   Res = DeleteIpForwardEntry(&Row);
114
115   if (Res != NO_ERROR)
116   {
117     fprintf(stderr, "DeleteIpForwardEntry() = %08lx, %s", Res, StrError(Res));
118
119     // XXX - report error in a different way
120
121     errno = Res;
122
123     return -1;
124   }
125
126   if(olsr_cnf->open_ipc)
127     ipc_route_send_rtentry(&Dest->rt_dst, NULL, Dest->rt_metric, 0, NULL);
128
129   return 0;
130 }
131
132 // XXX - to be implemented
133
134 int olsr_ioctl_del_route6(struct rt_entry *Dest)
135 {
136   return 0;
137 }
138
139 // XXX - to be implemented
140
141 int delete_tunnel_route()
142 {
143   return 0;
144 }