]> git.meshlink.io Git - catta/blob - src/internal.h
use closesocket() on windows
[catta] / src / internal.h
1 #ifndef foointernalhfoo
2 #define foointernalhfoo
3
4 /***
5   This file is part of catta.
6
7   catta is free software; you can redistribute it and/or modify it
8   under the terms of the GNU Lesser General Public License as
9   published by the Free Software Foundation; either version 2.1 of the
10   License, or (at your option) any later version.
11
12   catta is distributed in the hope that it will be useful, but WITHOUT
13   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14   or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
15   Public License for more details.
16
17   You should have received a copy of the GNU Lesser General Public
18   License along with catta; if not, write to the Free Software
19   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
20   USA.
21 ***/
22
23 /** A locally registered DNS resource record */
24 typedef struct CattaEntry CattaEntry;
25
26 #include <catta/llist.h>
27 #include <catta/watch.h>
28 #include <catta/timeval.h>
29 #include <catta/core.h>
30
31 #include "iface.h"
32 #include "prioq.h"
33 #include "timeeventq.h"
34 #include "announce.h"
35 #include "browse.h"
36 #include "dns.h"
37 #include "rrlist.h"
38 #include "hashmap.h"
39 #include "wide-area.h"
40 #include "multicast-lookup.h"
41 #include "dns-srv-rr.h"
42
43 #define CATTA_LEGACY_UNICAST_REFLECT_SLOTS_MAX 100
44
45 #define CATTA_FLAGS_VALID(flags, max) (!((flags) & ~(max)))
46
47 #define CATTA_RR_HOLDOFF_MSEC 1000
48 #define CATTA_RR_HOLDOFF_MSEC_RATE_LIMIT 20000
49 #define CATTA_RR_RATE_LIMIT_COUNT 15
50
51 #ifndef _WIN32
52 #define closesocket close
53 #endif
54
55 typedef struct CattaLegacyUnicastReflectSlot CattaLegacyUnicastReflectSlot;
56
57 struct CattaLegacyUnicastReflectSlot {
58     CattaServer *server;
59
60     uint16_t id, original_id;
61     CattaAddress address;
62     uint16_t port;
63     int iface;
64     struct timeval elapse_time;
65     CattaTimeEvent *time_event;
66 };
67
68 struct CattaEntry {
69     CattaServer *server;
70     CattaSEntryGroup *group;
71
72     int dead;
73
74     CattaPublishFlags flags;
75     CattaRecord *record;
76     CattaIfIndex iface;
77     CattaProtocol protocol;
78
79     CATTA_LLIST_FIELDS(CattaEntry, entries);
80     CATTA_LLIST_FIELDS(CattaEntry, by_key);
81     CATTA_LLIST_FIELDS(CattaEntry, by_group);
82
83     CATTA_LLIST_HEAD(CattaAnnouncer, announcers);
84 };
85
86 struct CattaSEntryGroup {
87     CattaServer *server;
88     int dead;
89
90     CattaEntryGroupState state;
91     void* userdata;
92     CattaSEntryGroupCallback callback;
93
94     unsigned n_probing;
95
96     unsigned n_register_try;
97     struct timeval register_time;
98     CattaTimeEvent *register_time_event;
99
100     struct timeval established_at;
101
102     CATTA_LLIST_FIELDS(CattaSEntryGroup, groups);
103     CATTA_LLIST_HEAD(CattaEntry, entries);
104 };
105
106 struct CattaServer {
107     const CattaPoll *poll_api;
108
109     CattaInterfaceMonitor *monitor;
110     CattaServerConfig config;
111
112     CATTA_LLIST_HEAD(CattaEntry, entries);
113     CattaHashmap *entries_by_key;
114
115     CATTA_LLIST_HEAD(CattaSEntryGroup, groups);
116
117     CATTA_LLIST_HEAD(CattaSRecordBrowser, record_browsers);
118     CattaHashmap *record_browser_hashmap;
119     CATTA_LLIST_HEAD(CattaSHostNameResolver, host_name_resolvers);
120     CATTA_LLIST_HEAD(CattaSAddressResolver, address_resolvers);
121     CATTA_LLIST_HEAD(CattaSDomainBrowser, domain_browsers);
122     CATTA_LLIST_HEAD(CattaSServiceTypeBrowser, service_type_browsers);
123     CATTA_LLIST_HEAD(CattaSServiceBrowser, service_browsers);
124     CATTA_LLIST_HEAD(CattaSServiceResolver, service_resolvers);
125     CATTA_LLIST_HEAD(CattaSDNSServerBrowser, dns_server_browsers);
126
127     int need_entry_cleanup, need_group_cleanup, need_browser_cleanup;
128
129     /* Used for scheduling RR cleanup */
130     CattaTimeEvent *cleanup_time_event;
131
132     CattaTimeEventQueue *time_event_queue;
133
134     char *host_name, *host_name_fqdn, *domain_name;
135
136     int fd_ipv4, fd_ipv6,
137         /* The following two sockets two are used for reflection only */
138         fd_legacy_unicast_ipv4, fd_legacy_unicast_ipv6;
139
140     CattaWatch *watch_ipv4, *watch_ipv6,
141         *watch_legacy_unicast_ipv4, *watch_legacy_unicast_ipv6;
142
143     CattaServerState state;
144     CattaServerCallback callback;
145     void* userdata;
146
147     CattaSEntryGroup *hinfo_entry_group;
148     CattaSEntryGroup *browse_domain_entry_group;
149     unsigned n_host_rr_pending;
150
151     /* Used for assembling responses */
152     CattaRecordList *record_list;
153
154     /* Used for reflection of legacy unicast packets */
155     CattaLegacyUnicastReflectSlot **legacy_unicast_reflect_slots;
156     uint16_t legacy_unicast_reflect_id;
157
158     /* The last error code */
159     int error;
160
161     /* The local service cookie */
162     uint32_t local_service_cookie;
163
164     CattaMulticastLookupEngine *multicast_lookup_engine;
165     CattaWideAreaLookupEngine *wide_area_lookup_engine;
166 };
167
168 void catta_entry_free(CattaServer*s, CattaEntry *e);
169 void catta_entry_group_free(CattaServer *s, CattaSEntryGroup *g);
170
171 void catta_cleanup_dead_entries(CattaServer *s);
172
173 void catta_server_prepare_response(CattaServer *s, CattaInterface *i, CattaEntry *e, int unicast_response, int auxiliary);
174 void catta_server_prepare_matching_responses(CattaServer *s, CattaInterface *i, CattaKey *k, int unicast_response);
175 void catta_server_generate_response(CattaServer *s, CattaInterface *i, CattaDnsPacket *p, const CattaAddress *a, uint16_t port, int legacy_unicast, int is_probe);
176
177 void catta_s_entry_group_change_state(CattaSEntryGroup *g, CattaEntryGroupState state);
178
179 int catta_entry_is_commited(CattaEntry *e);
180
181 void catta_server_enumerate_aux_records(CattaServer *s, CattaInterface *i, CattaRecord *r, void (*callback)(CattaServer *s, CattaRecord *r, int flush_cache, void* userdata), void* userdata);
182
183 void catta_host_rr_entry_group_callback(CattaServer *s, CattaSEntryGroup *g, CattaEntryGroupState state, void *userdata);
184
185 void catta_server_decrease_host_rr_pending(CattaServer *s);
186
187 int catta_server_set_errno(CattaServer *s, int error);
188
189 int catta_server_is_service_local(CattaServer *s, CattaIfIndex iface, CattaProtocol protocol, const char *name);
190 int catta_server_is_record_local(CattaServer *s, CattaIfIndex iface, CattaProtocol protocol, CattaRecord *record);
191
192 int catta_server_add_ptr(
193     CattaServer *s,
194     CattaSEntryGroup *g,
195     CattaIfIndex iface,
196     CattaProtocol protocol,
197     CattaPublishFlags flags,
198     uint32_t ttl,
199     const char *name,
200     const char *dest);
201
202 #define CATTA_CHECK_VALIDITY(server, expression, error) { \
203         if (!(expression)) \
204             return catta_server_set_errno((server), (error)); \
205 }
206
207 #define CATTA_CHECK_VALIDITY_RETURN_NULL(server, expression, error) { \
208         if (!(expression)) { \
209             catta_server_set_errno((server), (error)); \
210             return NULL; \
211         } \
212 }
213
214 #define CATTA_CHECK_VALIDITY_SET_RET_GOTO_FAIL(server, expression, error) {\
215     if (!(expression)) { \
216         ret = catta_server_set_errno((server), (error)); \
217         goto fail; \
218     } \
219 }
220
221 #define CATTA_ASSERT_TRUE(expression) { \
222     int __tmp = !!(expression); \
223     assert(__tmp); \
224 }
225
226 #define CATTA_ASSERT_SUCCESS(expression) { \
227     int __tmp = (expression); \
228     assert(__tmp == 0); \
229 }
230
231 #endif