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