9ea5ce60e56bbcbb7f216da0dc0a5d378b03db04
[olsrd.git] / lib / quagga / src / olsrd_plugin.c
1
2 /***************************************************************************
3  projekt              : olsrd-quagga
4  file                 : olsrd_plugin.c
5  usage                : olsrd-plugin-handler-stuff
6  copyright            : (C) 2006 by Immo 'FaUl' Wehrenberg
7  e-mail               : immo@chaostreff-dortmund.de
8  ***************************************************************************/
9
10 /***************************************************************************
11  *                                                                         *
12  *   This program is free software; you can redistribute it and/or modify  *
13  *   it under the terms of the GNU General Public License version 2 as     *
14  *   published by the Free Software Foundation.                            *
15  *                                                                         *
16  ***************************************************************************/
17
18 #include <stdio.h>
19 #include <string.h>
20
21 #include "olsrd_plugin.h"
22 #include "plugin_util.h"
23 #include "olsr.h"
24 #include "scheduler.h"
25 #include "defs.h"
26 #include "quagga.h"
27 #include "kernel_routes.h"
28 #include "net_olsr.h"
29
30 #define PLUGIN_NAME    "OLSRD quagga plugin"
31 #define PLUGIN_VERSION "0.2.2"
32 #define PLUGIN_AUTHOR  "Immo 'FaUl' Wehrenberg"
33 #define MOD_DESC PLUGIN_NAME " " PLUGIN_VERSION " by " PLUGIN_AUTHOR
34 #define PLUGIN_INTERFACE_VERSION 5
35
36 static void __attribute__ ((constructor)) my_init(void);
37 static void __attribute__ ((destructor)) my_fini(void);
38
39 static set_plugin_parameter set_redistribute;
40 static set_plugin_parameter set_exportroutes;
41 static set_plugin_parameter set_distance;
42 static set_plugin_parameter set_localpref;
43
44 static export_route_function orig_addroute_function;
45 static export_route_function orig_delroute_function;
46
47 int
48 olsrd_plugin_interface_version(void)
49 {
50   return PLUGIN_INTERFACE_VERSION;
51 }
52
53 static const struct olsrd_plugin_parameters plugin_parameters[] = {
54   {.name = "redistribute",.set_plugin_parameter = &set_redistribute,},
55   {.name = "ExportRoutes",.set_plugin_parameter = &set_exportroutes,},
56   {.name = "Distance",.set_plugin_parameter = &set_distance,},
57   {.name = "LocalPref",.set_plugin_parameter = &set_localpref,},
58 };
59
60 void
61 olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size)
62 {
63   *params = plugin_parameters;
64   *size = sizeof plugin_parameters / sizeof *plugin_parameters;
65 }
66
67 static int
68 set_redistribute(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused)))
69 {
70   const char *zebra_route_types[] = { "system", "kernel", "connect",
71     "static", "rip", "ripng", "ospf",
72     "ospf6", "isis", "bgp", "hsls"
73   };
74   unsigned int i;
75
76   for (i = 0; i < ARRAYSIZE(zebra_route_types); i++) {
77     if (!strcmp(value, zebra_route_types[i])) {
78       zebra_redistribute(i);
79       return 0;
80     }
81   }
82   return 1;
83 }
84
85 static int
86 set_exportroutes(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused)))
87 {
88   if (!strcmp(value, "only")) {
89     orig_addroute_function = NULL;
90     orig_delroute_function = NULL;
91     olsr_addroute_function = zebra_add_olsr_v4_route;
92     olsr_delroute_function = zebra_del_olsr_v4_route;
93     zebra_export_routes(1);
94   } else if (!strcmp(value, "additional")) {
95     orig_addroute_function = olsr_addroute_function;
96     orig_delroute_function = olsr_delroute_function;
97     olsr_addroute_function = zebra_add_olsr_v4_route;
98     olsr_delroute_function = zebra_del_olsr_v4_route;
99     zebra_export_routes(1);
100   } else
101     zebra_export_routes(0);
102   return 0;
103 }
104
105 static int
106 set_distance(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused)))
107 {
108   int distance;
109
110   if (set_plugin_int(value, &distance, addon))
111     return 1;
112   if (distance < 0 || distance > 255)
113     return 1;
114   zebra_olsr_distance(distance);
115   return 0;
116 }
117
118 static int
119 set_localpref(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused)))
120 {
121   int b;
122
123   if (set_plugin_boolean(value, &b, addon))
124     return 1;
125   if (b)
126     zebra_olsr_localpref();
127   return 0;
128 }
129
130 int
131 olsrd_plugin_init(void)
132 {
133   if (olsr_cnf->ip_version != AF_INET) {
134     fputs("see the source - ipv6 so far not supported\n", stderr);
135     return 1;
136   }
137
138   olsr_start_timer(1 * MSEC_PER_SEC, 0, OLSR_TIMER_PERIODIC, &zebra_check, NULL, 0);
139
140   return 0;
141 }
142
143 static void
144 my_init(void)
145 {
146   init_zebra();
147 }
148
149 static void
150 my_fini(void)
151 {
152   zebra_cleanup();
153 }
154
155 /*
156  * Local Variables:
157  * c-basic-offset: 2
158  * indent-tabs-mode: nil
159  * End:
160  */