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