quagga plugin routes additional
[olsrd.git] / lib / quagga / src / plugin.c
1 /*
2  * OLSRd Quagga plugin
3  *
4  * Copyright (C) 2006-2008 Immo 'FaUl' Wehrenberg <immo@chaostreff-dortmund.de>
5  * Copyright (C) 2007-2012 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               : plugin.c
17  * Description        : functions to set zebra plugin parameters
18  * ------------------------------------------------------------------------- */
19
20 #include "defs.h"
21 #include "olsr.h"
22 #include "log.h"
23 #include "olsrd_plugin.h"
24 #include "plugin_util.h"
25 #include "net_olsr.h"
26
27 #include "common.h"
28 #include "quagga.h"
29 #include "packet.h"
30 #include "plugin.h"
31
32 static void *my_realloc(void *, size_t, const char *);
33
34 static void
35 *my_realloc(void *buf, size_t s, const char *c)
36 {
37
38   buf = realloc(buf, s);
39   if (!buf) {
40     OLSR_PRINTF(1, "(QUAGGA) Out of memory: %s!\n", strerror(errno));
41     olsr_syslog(OLSR_LOG_ERR, "(QUAGGA) Out of memory!\n");
42     olsr_exit(c, EXIT_FAILURE);
43   }
44
45   return buf;
46 }
47
48 int
49 zplugin_redistribute(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused)))
50 {
51   const char *zroute_types[] = { "system", "kernel", "connect",
52                                  "static", "rip", "ripng", "ospf", "ospf6", "isis", "bgp",
53                                  "hsls", "olsr", "batman", "babel"
54   };
55   unsigned int i;
56
57   for (i = 0; i < ARRAYSIZE(zroute_types) && i < ZEBRA_ROUTE_MAX; i++) {
58     if (!strcmp(value, zroute_types[i]))
59       zebra.redistribute[i] = 1;
60   }
61
62   return 0;
63 }
64
65 int
66 zplugin_exportroutes(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused)))
67 {
68   if (!strcmp(value, "only")) {
69     olsr_addroute_function = zebra_addroute;
70     olsr_delroute_function = zebra_delroute;
71     olsr_addroute6_function = zebra_addroute;
72     olsr_delroute6_function = zebra_delroute;
73     zebra.options |= OPTION_EXPORT;
74   } else if (!strcmp(value, "additional")) {
75     zebra.orig_addroute_function = olsr_addroute_function;
76     zebra.orig_delroute_function = olsr_delroute_function;
77     zebra.orig_addroute6_function = olsr_addroute6_function;
78     zebra.orig_delroute6_function = olsr_delroute6_function;
79     olsr_addroute_function = zebra_addroute;
80     olsr_delroute_function = zebra_delroute;
81     olsr_addroute6_function = zebra_addroute;
82     olsr_delroute6_function = zebra_delroute;
83     zebra.options |= OPTION_EXPORT | OPTION_ROUTE_ADDITIONAL;
84   }
85
86   return 0;
87 }
88
89 int
90 zplugin_distance(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused)))
91 {
92   int distance;
93
94   if (set_plugin_int(value, &distance, addon))
95     return 1;
96   if (distance < 0 || distance > 255)
97     return 1;
98   zebra.distance = distance;
99
100   return 0;
101 }
102
103 int
104 zplugin_localpref(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused)))
105 {
106   int b;
107
108   if (set_plugin_boolean(value, &b, addon))
109     return 1;
110   if (b)
111     zebra.flags &= ZEBRA_FLAG_SELECTED;
112
113   return 0;
114 }
115
116 int
117 zplugin_sockpath(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon)
118 {
119   size_t len;
120   char sockpath[PATH_MAX];
121
122   if (set_plugin_string(value, &sockpath, addon))
123     return 1;
124   len = strlen(sockpath) + 1;
125   zebra.sockpath = my_realloc(zebra.sockpath, len, "QUAGGA: Grow socket path");
126   memcpy(zebra.sockpath, sockpath, len);
127
128   return 0;
129 }
130
131 int
132 zplugin_port(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused)))
133 {
134   unsigned int port;
135
136   if (set_plugin_port(value, &port, addon))
137     return 1;
138   zebra.port = port;
139
140   return 0;
141 }
142
143 int
144 zplugin_version(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused)))
145 {
146   int version;
147
148   if (set_plugin_int(value, &version, addon))
149     return 1;
150   if (version < 0 || version > 2)
151     return 1;
152   zebra.version = version;
153
154   return 0;
155 }
156
157 /*
158  * Local Variables:
159  * c-basic-offset: 2
160  * indent-tabs-mode: nil
161  * End:
162  */