* applied 114-olsrd-timeoutlimit.patch
[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 "olsr.h"
23 #include "scheduler.h"
24 #include "defs.h"
25 #include "quagga.h"
26 #include "kernel_routes.h"
27
28 #define PLUGIN_NAME    "OLSRD quagga plugin"
29 #define PLUGIN_VERSION "0.2.2"
30 #define PLUGIN_AUTHOR  "Immo 'FaUl' Wehrenberg"
31 #define MOD_DESC PLUGIN_NAME " " PLUGIN_VERSION " by " PLUGIN_AUTHOR
32 #define PLUGIN_INTERFACE_VERSION 4
33
34 static void __attribute__ ((constructor)) my_init(void);
35 static void __attribute__ ((destructor)) my_fini(void);
36 static void redist_hna (void);
37
38
39 int olsrd_plugin_interface_version() {
40   return PLUGIN_INTERFACE_VERSION;
41 }
42
43
44 int olsrd_plugin_register_param(char *key, char *value) {
45   const char *zebra_route_types[] = {"system","kernel","connect","static",
46                               "rip","ripng","ospf","ospf6","isis",
47                               "bgp","hsls", NULL};
48   unsigned char i = 0;
49
50   if(!strcmp(key, "redistribute")) {
51     for (i = 0; zebra_route_types[i]; i++)
52       if (!strcmp(value, zebra_route_types[i])) {
53         zebra_redistribute(i);
54         return 1;
55       }
56   }
57   else if(!strcmp(key, "ExportRoutes")) {
58     if (!strcmp(value, "only")) {
59       if (!olsr_addroute_remove_function(&olsr_ioctl_add_route, AF_INET))
60         puts ("AIII, could not remove the kernel route exporter");
61       if (!olsr_delroute_remove_function(&olsr_ioctl_del_route, AF_INET))
62         puts ("AIII, could not remove the kernel route deleter");
63       olsr_addroute_add_function(&zebra_add_olsr_v4_route, AF_INET);
64       olsr_delroute_add_function(&zebra_del_olsr_v4_route, AF_INET);
65       zebra_export_routes(1);
66       return 1;
67     }
68     else if (!strcmp(value, "additional")) {
69       olsr_addroute_add_function(&zebra_add_olsr_v4_route, AF_INET);
70       olsr_delroute_add_function(&zebra_del_olsr_v4_route, AF_INET);
71       zebra_export_routes(1);
72       return 1;
73     }
74     else zebra_export_routes(0);
75   }
76   else if (!strcmp(key, "Distance")) {
77     unsigned int distance = atoi (value);
78     if (distance < 255)
79       zebra_olsr_distance(distance);
80       return 1;
81   }
82   
83   else if (!strcmp(key, "LocalPref")) {
84     if (!strcmp(value, "true")) 
85       zebra_olsr_localpref();
86     else if (strcmp (value, "false"))
87       return -1;
88     return 1;
89   }
90   return -1;
91 }
92
93
94 int olsrd_plugin_init() {
95   if(olsr_cnf->ip_version != AF_INET) {
96     fputs("see the source - ipv6 so far not supported\n" ,stderr);
97     return 1;
98   }
99
100   olsr_register_scheduler_event(&zebra_check, NULL, 1, 0, NULL);
101   return 0;
102 }
103
104 static void my_init(void) {
105   init_zebra();
106 }
107
108 static void my_fini(void) {
109   zebra_cleanup();
110 }
111