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