]> git.meshlink.io Git - catta/blob - src/internal.h
wrap lifetimes of CattaServer and CattaSimplePoll in WSAStartup/WSACleanup
[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 #define winsock_init()
54 #define winsock_exit()
55 #endif
56
57 typedef struct CattaLegacyUnicastReflectSlot CattaLegacyUnicastReflectSlot;
58
59 struct CattaLegacyUnicastReflectSlot {
60     CattaServer *server;
61
62     uint16_t id, original_id;
63     CattaAddress address;
64     uint16_t port;
65     int iface;
66     struct timeval elapse_time;
67     CattaTimeEvent *time_event;
68 };
69
70 struct CattaEntry {
71     CattaServer *server;
72     CattaSEntryGroup *group;
73
74     int dead;
75
76     CattaPublishFlags flags;
77     CattaRecord *record;
78     CattaIfIndex iface;
79     CattaProtocol protocol;
80
81     CATTA_LLIST_FIELDS(CattaEntry, entries);
82     CATTA_LLIST_FIELDS(CattaEntry, by_key);
83     CATTA_LLIST_FIELDS(CattaEntry, by_group);
84
85     CATTA_LLIST_HEAD(CattaAnnouncer, announcers);
86 };
87
88 struct CattaSEntryGroup {
89     CattaServer *server;
90     int dead;
91
92     CattaEntryGroupState state;
93     void* userdata;
94     CattaSEntryGroupCallback callback;
95
96     unsigned n_probing;
97
98     unsigned n_register_try;
99     struct timeval register_time;
100     CattaTimeEvent *register_time_event;
101
102     struct timeval established_at;
103
104     CATTA_LLIST_FIELDS(CattaSEntryGroup, groups);
105     CATTA_LLIST_HEAD(CattaEntry, entries);
106 };
107
108 struct CattaServer {
109     const CattaPoll *poll_api;
110
111     CattaInterfaceMonitor *monitor;
112     CattaServerConfig config;
113
114     CATTA_LLIST_HEAD(CattaEntry, entries);
115     CattaHashmap *entries_by_key;
116
117     CATTA_LLIST_HEAD(CattaSEntryGroup, groups);
118
119     CATTA_LLIST_HEAD(CattaSRecordBrowser, record_browsers);
120     CattaHashmap *record_browser_hashmap;
121     CATTA_LLIST_HEAD(CattaSHostNameResolver, host_name_resolvers);
122     CATTA_LLIST_HEAD(CattaSAddressResolver, address_resolvers);
123     CATTA_LLIST_HEAD(CattaSDomainBrowser, domain_browsers);
124     CATTA_LLIST_HEAD(CattaSServiceTypeBrowser, service_type_browsers);
125     CATTA_LLIST_HEAD(CattaSServiceBrowser, service_browsers);
126     CATTA_LLIST_HEAD(CattaSServiceResolver, service_resolvers);
127     CATTA_LLIST_HEAD(CattaSDNSServerBrowser, dns_server_browsers);
128
129     int need_entry_cleanup, need_group_cleanup, need_browser_cleanup;
130
131     /* Used for scheduling RR cleanup */
132     CattaTimeEvent *cleanup_time_event;
133
134     CattaTimeEventQueue *time_event_queue;
135
136     char *host_name, *host_name_fqdn, *domain_name;
137
138     int fd_ipv4, fd_ipv6,
139         /* The following two sockets two are used for reflection only */
140         fd_legacy_unicast_ipv4, fd_legacy_unicast_ipv6;
141
142     CattaWatch *watch_ipv4, *watch_ipv6,
143         *watch_legacy_unicast_ipv4, *watch_legacy_unicast_ipv6;
144
145     CattaServerState state;
146     CattaServerCallback callback;
147     void* userdata;
148
149     CattaSEntryGroup *hinfo_entry_group;
150     CattaSEntryGroup *browse_domain_entry_group;
151     unsigned n_host_rr_pending;
152
153     /* Used for assembling responses */
154     CattaRecordList *record_list;
155
156     /* Used for reflection of legacy unicast packets */
157     CattaLegacyUnicastReflectSlot **legacy_unicast_reflect_slots;
158     uint16_t legacy_unicast_reflect_id;
159
160     /* The last error code */
161     int error;
162
163     /* The local service cookie */
164     uint32_t local_service_cookie;
165
166     CattaMulticastLookupEngine *multicast_lookup_engine;
167     CattaWideAreaLookupEngine *wide_area_lookup_engine;
168 };
169
170 void catta_entry_free(CattaServer*s, CattaEntry *e);
171 void catta_entry_group_free(CattaServer *s, CattaSEntryGroup *g);
172
173 void catta_cleanup_dead_entries(CattaServer *s);
174
175 void catta_server_prepare_response(CattaServer *s, CattaInterface *i, CattaEntry *e, int unicast_response, int auxiliary);
176 void catta_server_prepare_matching_responses(CattaServer *s, CattaInterface *i, CattaKey *k, int unicast_response);
177 void catta_server_generate_response(CattaServer *s, CattaInterface *i, CattaDnsPacket *p, const CattaAddress *a, uint16_t port, int legacy_unicast, int is_probe);
178
179 void catta_s_entry_group_change_state(CattaSEntryGroup *g, CattaEntryGroupState state);
180
181 int catta_entry_is_commited(CattaEntry *e);
182
183 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);
184
185 void catta_host_rr_entry_group_callback(CattaServer *s, CattaSEntryGroup *g, CattaEntryGroupState state, void *userdata);
186
187 void catta_server_decrease_host_rr_pending(CattaServer *s);
188
189 int catta_server_set_errno(CattaServer *s, int error);
190
191 int catta_server_is_service_local(CattaServer *s, CattaIfIndex iface, CattaProtocol protocol, const char *name);
192 int catta_server_is_record_local(CattaServer *s, CattaIfIndex iface, CattaProtocol protocol, CattaRecord *record);
193
194 int catta_server_add_ptr(
195     CattaServer *s,
196     CattaSEntryGroup *g,
197     CattaIfIndex iface,
198     CattaProtocol protocol,
199     CattaPublishFlags flags,
200     uint32_t ttl,
201     const char *name,
202     const char *dest);
203
204 #define CATTA_CHECK_VALIDITY(server, expression, error) { \
205         if (!(expression)) \
206             return catta_server_set_errno((server), (error)); \
207 }
208
209 #define CATTA_CHECK_VALIDITY_RETURN_NULL(server, expression, error) { \
210         if (!(expression)) { \
211             catta_server_set_errno((server), (error)); \
212             return NULL; \
213         } \
214 }
215
216 #define CATTA_CHECK_VALIDITY_SET_RET_GOTO_FAIL(server, expression, error) {\
217     if (!(expression)) { \
218         ret = catta_server_set_errno((server), (error)); \
219         goto fail; \
220     } \
221 }
222
223 #define CATTA_ASSERT_TRUE(expression) { \
224     int __tmp = !!(expression); \
225     assert(__tmp); \
226 }
227
228 #define CATTA_ASSERT_SUCCESS(expression) { \
229     int __tmp = (expression); \
230     assert(__tmp == 0); \
231 }
232
233 #endif