facf9d1031e0c97bdd4ccd040619c71ca09a00d0
[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 #if 0
40 static set_plugin_parameter set_redistribute;
41 #endif
42 static set_plugin_parameter set_exportroutes;
43 static set_plugin_parameter set_distance;
44 static set_plugin_parameter set_localpref;
45
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 #if 0
55   {.name = "redistribute",.set_plugin_parameter = &set_redistribute,},
56 #endif
57   {.name = "ExportRoutes",.set_plugin_parameter = &set_exportroutes,},
58   {.name = "Distance",.set_plugin_parameter = &set_distance,},
59   {.name = "LocalPref",.set_plugin_parameter = &set_localpref,},
60 };
61
62 void
63 olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size)
64 {
65   *params = plugin_parameters;
66   *size = ARRAYSIZE(plugin_parameters);
67 }
68
69 #if 0
70 static int
71 set_redistribute(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused)))
72 {
73   const char *zebra_route_types[] = { "system", "kernel", "connect",
74     "static", "rip", "ripng", "ospf",
75     "ospf6", "isis", "bgp", "hsls"
76   };
77   unsigned int i;
78
79   for (i = 0; i < ARRAYSIZE(zebra_route_types); i++) {
80     if (!strcmp(value, zebra_route_types[i])) {
81       zebra_redistribute(i);
82       return 0;
83     }
84   }
85   return 1;
86 }
87 #endif
88
89 static int
90 set_exportroutes(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused)))
91 {
92   if (!strcmp(value, "only")) {
93     olsr_addroute_function = zebra_add_route;
94     olsr_delroute_function = zebra_del_route;
95     zebra_export_routes(1);
96   } else if (!strcmp(value, "additional")) {
97     olsr_addroute_function = zebra_add_route;
98     olsr_delroute_function = zebra_del_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 #if 0
139   olsr_start_timer(1 * MSEC_PER_SEC, 0, OLSR_TIMER_PERIODIC, &zebra_check, NULL, 0);
140 #endif
141
142   return 0;
143 }
144
145 static void
146 my_init(void)
147 {
148   init_zebra();
149 }
150
151 static void
152 my_fini(void)
153 {
154   zebra_cleanup();
155 }
156
157 /*
158  * Local Variables:
159  * c-basic-offset: 2
160  * indent-tabs-mode: nil
161  * End:
162  */