1 #ifndef foointernalhfoo
2 #define foointernalhfoo
5 This file is part of catta.
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.
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.
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
23 /** A locally registered DNS resource record */
24 typedef struct CattaEntry CattaEntry;
26 #include <catta/llist.h>
27 #include <catta/watch.h>
28 #include <catta/timeval.h>
29 #include <catta/core.h>
33 #include "timeeventq.h"
39 #include "wide-area.h"
40 #include "multicast-lookup.h"
41 #include "dns-srv-rr.h"
43 #define CATTA_LEGACY_UNICAST_REFLECT_SLOTS_MAX 100
45 #define CATTA_FLAGS_VALID(flags, max) (!((flags) & ~(max)))
47 #define CATTA_RR_HOLDOFF_MSEC 1000
48 #define CATTA_RR_HOLDOFF_MSEC_RATE_LIMIT 20000
49 #define CATTA_RR_RATE_LIMIT_COUNT 15
52 #define closesocket close
53 #define closepipe close
54 #define writepipe write
56 #define winsock_init()
57 #define winsock_exit()
58 #define errnostrsocket() strerror(errno)
61 typedef struct CattaLegacyUnicastReflectSlot CattaLegacyUnicastReflectSlot;
63 struct CattaLegacyUnicastReflectSlot {
66 uint16_t id, original_id;
70 struct timeval elapse_time;
71 CattaTimeEvent *time_event;
76 CattaSEntryGroup *group;
80 CattaPublishFlags flags;
83 CattaProtocol protocol;
85 CATTA_LLIST_FIELDS(CattaEntry, entries);
86 CATTA_LLIST_FIELDS(CattaEntry, by_key);
87 CATTA_LLIST_FIELDS(CattaEntry, by_group);
89 CATTA_LLIST_HEAD(CattaAnnouncer, announcers);
92 struct CattaSEntryGroup {
96 CattaEntryGroupState state;
98 CattaSEntryGroupCallback callback;
102 unsigned n_register_try;
103 struct timeval register_time;
104 CattaTimeEvent *register_time_event;
106 struct timeval established_at;
108 CATTA_LLIST_FIELDS(CattaSEntryGroup, groups);
109 CATTA_LLIST_HEAD(CattaEntry, entries);
113 const CattaPoll *poll_api;
115 CattaInterfaceMonitor *monitor;
116 CattaServerConfig config;
118 CATTA_LLIST_HEAD(CattaEntry, entries);
119 CattaHashmap *entries_by_key;
121 CATTA_LLIST_HEAD(CattaSEntryGroup, groups);
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);
133 int need_entry_cleanup, need_group_cleanup, need_browser_cleanup;
135 /* Used for scheduling RR cleanup */
136 CattaTimeEvent *cleanup_time_event;
138 CattaTimeEventQueue *time_event_queue;
140 char *host_name, *host_name_fqdn, *domain_name;
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;
146 CattaWatch *watch_ipv4, *watch_ipv6,
147 *watch_legacy_unicast_ipv4, *watch_legacy_unicast_ipv6;
149 CattaServerState state;
150 CattaServerCallback callback;
153 CattaSEntryGroup *hinfo_entry_group;
154 CattaSEntryGroup *browse_domain_entry_group;
155 unsigned n_host_rr_pending;
157 /* Used for assembling responses */
158 CattaRecordList *record_list;
160 /* Used for reflection of legacy unicast packets */
161 CattaLegacyUnicastReflectSlot **legacy_unicast_reflect_slots;
162 uint16_t legacy_unicast_reflect_id;
164 /* The last error code */
167 /* The local service cookie */
168 uint32_t local_service_cookie;
170 CattaMulticastLookupEngine *multicast_lookup_engine;
171 CattaWideAreaLookupEngine *wide_area_lookup_engine;
174 void catta_entry_free(CattaServer*s, CattaEntry *e);
175 void catta_entry_group_free(CattaServer *s, CattaSEntryGroup *g);
177 void catta_cleanup_dead_entries(CattaServer *s);
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);
183 void catta_s_entry_group_change_state(CattaSEntryGroup *g, CattaEntryGroupState state);
185 int catta_entry_is_commited(CattaEntry *e);
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);
189 void catta_host_rr_entry_group_callback(CattaServer *s, CattaSEntryGroup *g, CattaEntryGroupState state, void *userdata);
191 void catta_server_decrease_host_rr_pending(CattaServer *s);
193 int catta_server_set_errno(CattaServer *s, int error);
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);
198 int catta_server_add_ptr(
202 CattaProtocol protocol,
203 CattaPublishFlags flags,
208 #define CATTA_CHECK_VALIDITY(server, expression, error) { \
210 return catta_server_set_errno((server), (error)); \
213 #define CATTA_CHECK_VALIDITY_RETURN_NULL(server, expression, error) { \
214 if (!(expression)) { \
215 catta_server_set_errno((server), (error)); \
220 #define CATTA_CHECK_VALIDITY_SET_RET_GOTO_FAIL(server, expression, error) {\
221 if (!(expression)) { \
222 ret = catta_server_set_errno((server), (error)); \
227 #define CATTA_ASSERT_TRUE(expression) { \
228 int __tmp = !!(expression); \
232 #define CATTA_ASSERT_SUCCESS(expression) { \
233 int __tmp = (expression); \
234 assert(__tmp == 0); \