* use the ARRAYSIZE macro everywhere
[olsrd.git] / lib / quagga / src / olsrd_plugin.c
1 /***************************************************************************
2  projekt              : olsrd-quagga
3  file                 : olsrd_plugin.c  
4  usage                : olsrd-plugin-handler-stuff 
5  copyright            : (C) 2006 by Immo 'FaUl' Wehrenberg
6  e-mail               : immo@chaostreff-dortmund.de
7  ***************************************************************************/
8
9 /***************************************************************************
10  *                                                                         *
11  *   This program is free software; you can redistribute it and/or modify  *
12  *   it under the terms of the GNU General Public License version 2 as     *
13  *   published by the Free Software Foundation.                            *
14  *                                                                         *
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 static struct olsr_cookie_info *zebra_check_timer_cookie;
48
49 int olsrd_plugin_interface_version (void) {
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 olsrd_get_plugin_parameters (const struct olsrd_plugin_parameters **params,
61                                   int *size) {
62   *params = plugin_parameters;
63   *size = ARRAYSIZE(plugin_parameters);
64 }
65
66 static int set_redistribute (const char *value, 
67                              void *data __attribute__((unused)),
68                              set_plugin_parameter_addon addon __attribute__((unused))) {
69   const char *zebra_route_types[] = {"system","kernel","connect",
70                                               "static","rip","ripng","ospf",
71                                               "ospf6","isis","bgp","hsls"};
72   unsigned int i;
73
74   for (i = 0; i < ARRAYSIZE(zebra_route_types); i++) {
75     if (!strcmp(value, zebra_route_types[i])) {
76       zebra_redistribute(i);
77       return 0;
78     }
79   }
80   return 1;
81 }
82
83 static int set_exportroutes (const char *value, 
84                              void *data __attribute__((unused)),
85                              set_plugin_parameter_addon addon __attribute__((unused))) {
86   if (!strcmp(value, "only")) {
87     orig_addroute_function = NULL;
88     orig_delroute_function = NULL;
89     olsr_addroute_function = zebra_add_olsr_v4_route;
90     olsr_delroute_function = zebra_del_olsr_v4_route;
91     zebra_export_routes(1);
92   }
93   else if (!strcmp(value, "additional")) {
94     orig_addroute_function = olsr_addroute_function;
95     orig_delroute_function = olsr_delroute_function;
96     olsr_addroute_function = zebra_add_olsr_v4_route;
97     olsr_delroute_function = zebra_del_olsr_v4_route;
98     zebra_export_routes(1);
99   }
100   else zebra_export_routes(0);
101   return 0;
102 }
103
104 static int set_distance(const char *value, void *data __attribute__((unused)), 
105                         set_plugin_parameter_addon addon __attribute__((unused))) {
106   int distance;
107
108   if (set_plugin_int(value, &distance, addon)) return 1;
109   if (distance < 0 || distance > 255) return 1;
110   zebra_olsr_distance(distance);
111   return 0;
112 }
113  
114 static int set_localpref(const char *value, void *data __attribute__((unused)), 
115                          set_plugin_parameter_addon addon __attribute__((unused))) {
116   int b;
117
118   if (set_plugin_boolean(value, &b, addon)) return 1;
119   if (b) zebra_olsr_localpref();
120   return 0;
121 }
122
123
124 int olsrd_plugin_init(void) {
125   if(olsr_cnf->ip_version != AF_INET) {
126     fputs("see the source - ipv6 so far not supported\n" ,stderr);
127     return 1;
128   }
129
130   zebra_check_timer_cookie = olsr_alloc_cookie("Quagga: Zebra Check", OLSR_COOKIE_TYPE_TIMER);
131
132   olsr_start_timer(1 * MSEC_PER_SEC, 0, OLSR_TIMER_PERIODIC,
133                    &zebra_check, NULL, zebra_check_timer_cookie->ci_id);
134
135   return 0;
136 }
137
138 static void my_init(void) {
139   init_zebra();
140 }
141
142 static void my_fini(void) {
143   zebra_cleanup();
144 }
145
146
147 /*
148  * Local Variables:
149  * c-basic-offset: 2
150  * indent-tabs-mode: nil
151  * End:
152  */