Merge branch 'PolynomialDivision-feature/add_workflow'
[olsrd.git] / lib / nameservice / src / nameservice.h
1 /*
2  * The olsr.org Optimized Link-State Routing daemon (olsrd)
3  *
4  * (c) by the OLSR project
5  *
6  * See our Git repository to find out who worked on this file
7  * and thus is a copyright holder on it.
8  *
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  *
15  * * Redistributions of source code must retain the above copyright
16  *   notice, this list of conditions and the following disclaimer.
17  * * Redistributions in binary form must reproduce the above copyright
18  *   notice, this list of conditions and the following disclaimer in
19  *   the documentation and/or other materials provided with the
20  *   distribution.
21  * * Neither the name of olsr.org, olsrd nor the names of its
22  *   contributors may be used to endorse or promote products derived
23  *   from this software without specific prior written permission.
24  *
25  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
28  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
29  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
30  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
31  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
32  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
33  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
35  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36  * POSSIBILITY OF SUCH DAMAGE.
37  *
38  * Visit http://www.olsr.org for more information.
39  *
40  * If you find this software useful feel free to make a donation
41  * to the project. For more information see the website or contact
42  * the copyright holders.
43  *
44  */
45
46 /*
47  * Dynamic linked library for UniK OLSRd
48  */
49
50 #ifndef _NAMESERVICE_PLUGIN
51 #define _NAMESERVICE_PLUGIN
52
53 #include <sys/time.h>
54 #include <regex.h>
55
56 #include "olsr_types.h"
57 #include "interfaces.h"
58 #include "olsr_protocol.h"
59 #include "common/list.h"
60
61 #include "olsrd_plugin.h"
62 #include "nameservice_msg.h"
63 #include "hashing.h"
64 #include "mapwrite.h"
65 #include "mantissa.h"
66
67 #define PLUGIN_NAME     "OLSRD nameservice plugin"
68 #define PLUGIN_VERSION  "0.3"
69
70 // useful to set for the freifunkfirmware to remove all
71 // calls to olsr_printf by the empty statement ";"
72 //#define olsr_printf(...) ;
73
74 #define MESSAGE_TYPE            130
75 #define PARSER_TYPE             MESSAGE_TYPE
76 #define EMISSION_INTERVAL       120     /* seconds */
77 #define EMISSION_JITTER         25      /* percent */
78 #define NAME_VALID_TIME         1800    /* seconds */
79 #define NAMESERVER_COUNT        3
80
81 #define NAME_PROTOCOL_VERSION   1
82
83 #define MAX_NAME 127
84 #define MAX_FILE 255
85 #define MAX_SUFFIX 63
86
87 #define MID_ENTRIES 1
88 #define MID_MAXLEN 16
89 #define MID_PREFIX "mid%i."
90
91 /**
92  * a linked list of name_entry
93  * if type is NAME_HOST, name is a hostname and ip its IP addr
94  * if type is NAME_FORWARDER, then ip is a dns-server (and name is irrelevant)
95  * if type is NAME_SERVICE, then name is a service-line (and the ip is irrelevant)
96  * if type is NAME_LATLON, then name has 2 floats with lat and lon (and the ip is irrelevant)
97  */
98 struct name_entry {
99   union olsr_ip_addr ip;
100   uint16_t type;
101   uint16_t len;
102   char *name;
103   struct name_entry *next;             /* linked list */
104 };
105
106 /* *
107  * linked list of db_entries for each originator with
108  * originator being its main_addr
109  *
110  * names points to the name_entry with its hostname, dns-server or
111  * service-line entry
112  *
113  * all the db_entries are hashed in nameservice.c to avoid a too long list
114  * for many nodes in a net
115  *
116  * */
117 struct db_entry {
118   union olsr_ip_addr originator;       /* IP address of the node this entry describes */
119   struct timer_entry *db_timer;        /* Validity time */
120   struct name_entry *names;            /* list of names this originator declares */
121   struct list_node db_list;            /* linked list of db entries per hash container */
122 };
123
124 /* INLINE to recast from db_list back to db_entry */
125 LISTNODE2STRUCT(list2db, struct db_entry, db_list);
126
127 #define OLSR_NAMESVC_DB_JITTER 5        /* percent */
128
129 extern struct name_entry *my_names;
130 extern struct list_node latlon_list[HASHSIZE];
131 extern float my_lat, my_lon;
132
133 void olsr_expire_write_file_timer(void *);
134 void olsr_namesvc_delete_db_entry(struct db_entry *);
135
136 /* Parser function to register with the sceduler */
137 bool olsr_parser(union olsr_message *, struct interface_olsr *, union olsr_ip_addr *);
138
139 /* callback for periodic timer */
140 void olsr_namesvc_gen(void *);
141
142 int encap_namemsg(struct namemsg *);
143
144 struct name_entry *add_name_to_list(struct name_entry *my_list, const char *value, int type, const union olsr_ip_addr *ip);
145
146 struct name_entry *remove_nonvalid_names_from_list(struct name_entry *my_list, int type);
147
148 void free_all_list_entries(struct list_node *);
149
150 void decap_namemsg(struct name *from_packet, struct name_entry **to, bool * this_table_changed);
151
152 void insert_new_name_in_list(union olsr_ip_addr *, struct list_node *, struct name *, bool *, olsr_reltime);
153
154 bool allowed_hostname_or_ip_in_service(const char *service_line, const regmatch_t * hostname_or_ip);
155
156 void update_name_entry(union olsr_ip_addr *, struct namemsg *, int, olsr_reltime);
157
158 void write_hosts_file(void);
159
160 void write_services_file(bool writemacs);
161
162 void write_resolv_file(void);
163
164 int register_olsr_param(char *key, char *value);
165
166 void free_name_entry_list(struct name_entry **list);
167
168 bool allowed_ip(const union olsr_ip_addr *addr);
169
170 bool allowed_service(const char *service_line);
171
172 bool is_name_wellformed(const char *service_line);
173
174 bool is_service_wellformed(const char *service_line);
175
176 bool is_mac_wellformed(const char *service_line);
177
178 bool is_latlon_wellformed(const char *latlon_line);
179
180 bool get_isdefhna_latlon(void);
181
182 void lookup_defhna_latlon(union olsr_ip_addr *ip);
183
184 const char *lookup_name_latlon(union olsr_ip_addr *ip);
185
186 void write_latlon_file(void);
187
188 char *create_packet(struct name *to, struct name_entry *from);
189
190 void name_constructor(void);
191
192 void name_destructor(void);
193
194 int name_init(void);
195
196 #endif /* _NAMESERVICE_PLUGIN */
197
198 /*
199  * Local Variables:
200  * c-basic-offset: 2
201  * indent-tabs-mode: nil
202  * End:
203  */