* fixed warnings
[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
37 int olsrd_plugin_interface_version(void) {
38   return PLUGIN_INTERFACE_VERSION;
39 }
40
41
42 int olsrd_plugin_register_param(char *key, char *value) {
43   const char *zebra_route_types[] = {"system","kernel","connect","static",
44                               "rip","ripng","ospf","ospf6","isis",
45                               "bgp","hsls", NULL};
46   unsigned char i = 0;
47
48   if(!strcmp(key, "redistribute")) {
49     for (i = 0; zebra_route_types[i]; i++)
50       if (!strcmp(value, zebra_route_types[i])) {
51         zebra_redistribute(i);
52         return 1;
53       }
54   }
55   else if(!strcmp(key, "ExportRoutes")) {
56     if (!strcmp(value, "only")) {
57       if (!olsr_addroute_remove_function(&olsr_ioctl_add_route, AF_INET))
58         puts ("AIII, could not remove the kernel route exporter");
59       if (!olsr_delroute_remove_function(&olsr_ioctl_del_route, AF_INET))
60         puts ("AIII, could not remove the kernel route deleter");
61       olsr_addroute_add_function(&zebra_add_olsr_v4_route, AF_INET);
62       olsr_delroute_add_function(&zebra_del_olsr_v4_route, AF_INET);
63       zebra_export_routes(1);
64       return 1;
65     }
66     else if (!strcmp(value, "additional")) {
67       olsr_addroute_add_function(&zebra_add_olsr_v4_route, AF_INET);
68       olsr_delroute_add_function(&zebra_del_olsr_v4_route, AF_INET);
69       zebra_export_routes(1);
70       return 1;
71     }
72     else zebra_export_routes(0);
73   }
74   else if (!strcmp(key, "Distance")) {
75     unsigned int distance = atoi (value);
76     if (distance < 255)
77       zebra_olsr_distance(distance);
78       return 1;
79   }
80   
81   else if (!strcmp(key, "LocalPref")) {
82     if (!strcmp(value, "true")) 
83       zebra_olsr_localpref();
84     else if (strcmp (value, "false"))
85       return -1;
86     return 1;
87   }
88   return -1;
89 }
90
91
92 int olsrd_plugin_init(void) {
93   if(olsr_cnf->ip_version != AF_INET) {
94     fputs("see the source - ipv6 so far not supported\n" ,stderr);
95     return 1;
96   }
97
98   olsr_register_scheduler_event(&zebra_check, NULL, 1, 0, NULL);
99   return 0;
100 }
101
102 static void my_init(void) {
103   init_zebra();
104 }
105
106 static void my_fini(void) {
107   zebra_cleanup();
108 }
109