Major overhaul and cleanup on read and parse functions
[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
45 int
46 olsrd_plugin_interface_version(void)
47 {
48   return PLUGIN_INTERFACE_VERSION;
49 }
50
51 static const struct olsrd_plugin_parameters plugin_parameters[] = {
52   {.name = "redistribute",.set_plugin_parameter = &set_redistribute,},
53   {.name = "ExportRoutes",.set_plugin_parameter = &set_exportroutes,},
54   {.name = "Distance",.set_plugin_parameter = &set_distance,},
55   {.name = "LocalPref",.set_plugin_parameter = &set_localpref,},
56 };
57
58 void
59 olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size)
60 {
61   *params = plugin_parameters;
62   *size = ARRAYSIZE(plugin_parameters);
63 }
64
65 static int
66 set_redistribute(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused)))
67 {
68   const char *zebra_route_types[] = { "system", "kernel", "connect",
69     "static", "rip", "ripng", "ospf",
70     "ospf6", "isis", "bgp", "hsls"
71   };
72   unsigned int i;
73
74   for (i = 0; i < ARRAYSIZE(zebra_route_types); i++) {
75     if (!strcmp(value, zebra_route_types[i]))
76       if (zebra_redistribute (i)) return 1;
77   }
78
79   return 0;
80 }
81
82 static int
83 set_exportroutes(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused)))
84 {
85   if (!strcmp(value, "only")) {
86     olsr_addroute_function = zebra_add_route;
87     olsr_delroute_function = zebra_del_route;
88     zebra_export_routes(1);
89   } else if (!strcmp(value, "additional")) {
90     olsr_addroute_function = zebra_add_route;
91     olsr_delroute_function = zebra_del_route;
92     zebra_export_routes(1);
93   } else
94     zebra_export_routes(0);
95   return 0;
96 }
97
98 static int
99 set_distance(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused)))
100 {
101   int distance;
102
103   if (set_plugin_int(value, &distance, addon))
104     return 1;
105   if (distance < 0 || distance > 255)
106     return 1;
107   zebra_olsr_distance(distance);
108   return 0;
109 }
110
111 static int
112 set_localpref(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused)))
113 {
114   int b;
115
116   if (set_plugin_boolean(value, &b, addon))
117     return 1;
118   if (b)
119     zebra_olsr_localpref();
120   return 0;
121 }
122
123 int
124 olsrd_plugin_init(void)
125 {
126   if (olsr_cnf->ip_version != AF_INET) {
127     fputs("see the source - ipv6 so far not supported\n", stderr);
128     return 1;
129   }
130
131   olsr_start_timer(1 * MSEC_PER_SEC, 0, OLSR_TIMER_PERIODIC, &zebra_parse, NULL, 0);
132
133   return 0;
134 }
135
136 static void
137 my_init(void)
138 {
139   init_zebra();
140 }
141
142 static void
143 my_fini(void)
144 {
145   zebra_cleanup();
146 }
147
148 /*
149  * Local Variables:
150  * c-basic-offset: 2
151  * indent-tabs-mode: nil
152  * End:
153  */