Add support to export and redistribute IPv6 routes to and from quagga
[olsrd.git] / lib / quagga / src / olsrd_plugin.c
1 /*
2  * OLSRd Quagga plugin
3  *
4  * Copyright (C) 2006-2008 Immo 'FaUl' Wehrenberg <immo@chaostreff-dortmund.de>
5  * Copyright (C) 2007-2010 Vasilis Tsiligiannis <acinonyxs@yahoo.gr>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License version 2 as
9  * published by the Free Software Foundation or - at your option - under
10  * the terms of the GNU General Public Licence version 2 but can be
11  * linked to any BSD-Licenced Software with public available sourcecode
12  *
13  */
14
15 /* -------------------------------------------------------------------------
16  * File               : olsrd_plugin.c
17  * Description        : functions to setup plugin
18  * ------------------------------------------------------------------------- */
19
20
21 #include <stdio.h>
22 #include <string.h>
23
24 #include "olsrd_plugin.h"
25 #include "plugin_util.h"
26 #include "olsr.h"
27 #include "scheduler.h"
28 #include "defs.h"
29 #include "quagga.h"
30 #include "net_olsr.h"
31
32 #define PLUGIN_NAME    "OLSRD quagga plugin"
33 #define PLUGIN_VERSION "0.2.2"
34 #define PLUGIN_AUTHOR  "Immo 'FaUl' Wehrenberg"
35 #define MOD_DESC PLUGIN_NAME " " PLUGIN_VERSION " by " PLUGIN_AUTHOR
36 #define PLUGIN_INTERFACE_VERSION 5
37
38 static void __attribute__ ((constructor)) my_init(void);
39 static void __attribute__ ((destructor)) my_fini(void);
40
41 static set_plugin_parameter set_redistribute;
42 static set_plugin_parameter set_exportroutes;
43 static set_plugin_parameter set_distance;
44 static set_plugin_parameter set_localpref;
45 static set_plugin_parameter set_sockpath;
46 static set_plugin_parameter set_port;
47 static set_plugin_parameter set_version;
48
49
50 int
51 olsrd_plugin_interface_version(void)
52 {
53   return PLUGIN_INTERFACE_VERSION;
54 }
55
56 static const struct olsrd_plugin_parameters plugin_parameters[] = {
57   {.name = "Redistribute",.set_plugin_parameter = &set_redistribute,},
58   {.name = "ExportRoutes",.set_plugin_parameter = &set_exportroutes,},
59   {.name = "Distance",.set_plugin_parameter = &set_distance,},
60   {.name = "LocalPref",.set_plugin_parameter = &set_localpref,},
61   {.name = "SockPath",.set_plugin_parameter = &set_sockpath,.addon = {PATH_MAX},},
62   {.name = "Port",.set_plugin_parameter = &set_port,},
63   {.name = "Version",.set_plugin_parameter = &set_version,},
64 };
65
66 void
67 olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size)
68 {
69   *params = plugin_parameters;
70   *size = ARRAYSIZE(plugin_parameters);
71 }
72
73 static int
74 set_redistribute(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused)))
75 {
76   const char *zebra_route_types[] = { "system", "kernel", "connect",
77     "static", "rip", "ripng", "ospf",
78     "ospf6", "isis", "bgp", "hsls"
79   };
80   unsigned int i;
81
82   for (i = 0; i < ARRAYSIZE(zebra_route_types); i++) {
83     if (!strcmp(value, zebra_route_types[i]))
84       if (zebra_redistribute (i)) return 1;
85   }
86
87   return 0;
88 }
89
90 static int
91 set_exportroutes(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused)))
92 {
93   if (!strcmp(value, "only")) {
94     olsr_addroute_function = zebra_add_route;
95     olsr_delroute_function = zebra_del_route;
96     olsr_addroute6_function = zebra_add_route;
97     olsr_delroute6_function = zebra_del_route;
98     zebra_export_routes(1);
99   } else if (!strcmp(value, "additional")) {
100     olsr_addroute_function = zebra_add_route;
101     olsr_delroute_function = zebra_del_route;
102     olsr_addroute6_function = zebra_add_route;
103     olsr_delroute6_function = zebra_del_route;
104     zebra_export_routes(1);
105   } else
106     zebra_export_routes(0);
107   return 0;
108 }
109
110 static int
111 set_distance(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused)))
112 {
113   int distance;
114
115   if (set_plugin_int(value, &distance, addon))
116     return 1;
117   if (distance < 0 || distance > 255)
118     return 1;
119   zebra_olsr_distance(distance);
120   return 0;
121 }
122
123 static int
124 set_localpref(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused)))
125 {
126   int b;
127
128   if (set_plugin_boolean(value, &b, addon))
129     return 1;
130   if (b)
131     zebra_olsr_localpref();
132   return 0;
133 }
134
135 static int
136 set_sockpath(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon)
137 {
138   char sockpath[PATH_MAX];
139
140   if (set_plugin_string(value, &sockpath, addon))
141     return 1;
142   zebra_sockpath(sockpath);
143   return 0;
144 }
145
146 static int
147 set_port(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused)))
148 {
149   unsigned int port;
150
151   if (set_plugin_port(value, &port, addon))
152     return 1;
153   zebra_port(port);
154
155   return 0;
156 }
157
158 static int
159 set_version(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused)))
160 {
161   int version;
162
163   if (set_plugin_int(value, &version, addon))
164     return 1;
165   if (version < 0 || version > 1)
166     return 1;
167   zebra_version(version);
168
169   return 0;
170 }
171
172 int
173 olsrd_plugin_init(void)
174 {
175
176   olsr_start_timer(1 * MSEC_PER_SEC, 0, OLSR_TIMER_PERIODIC, &zebra_parse, NULL, 0);
177
178   return 0;
179 }
180
181 static void
182 my_init(void)
183 {
184   init_zebra();
185 }
186
187 static void
188 my_fini(void)
189 {
190   zebra_cleanup();
191 }
192
193 /*
194  * Local Variables:
195  * c-basic-offset: 2
196  * indent-tabs-mode: nil
197  * End:
198  */