2 Unix SMB/CIFS implementation.
4 WINS Replication server
6 Copyright (C) Stefan Metzmacher 2005
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>.
22 #include "system/network.h"
24 struct wreplsrv_service
;
25 struct wreplsrv_in_connection
;
26 struct wreplsrv_out_connection
;
27 struct wreplsrv_partner
;
29 #define WREPLSRV_VALID_ASSOC_CTX 0x12345678
30 #define WREPLSRV_INVALID_ASSOC_CTX 0x0000000a
33 state of an incoming wrepl call
35 struct wreplsrv_in_call
{
36 struct wreplsrv_in_connection
*wreplconn
;
37 struct wrepl_packet req_packet
;
38 struct wrepl_packet rep_packet
;
39 bool terminate_after_send
;
43 struct iovec out_iov
[1];
47 state of an incoming wrepl connection
49 struct wreplsrv_in_connection
{
50 struct wreplsrv_in_connection
*prev
,*next
;
51 struct stream_connection
*conn
;
52 struct tstream_context
*tstream
;
53 struct tevent_queue
*send_queue
;
55 /* our global service context */
56 struct wreplsrv_service
*service
;
59 * the partner that connects us,
60 * can be NULL, when we got a connection
61 * from an unknown address
63 struct wreplsrv_partner
*partner
;
65 /* keep track of the assoc_ctx's */
74 state of an outgoing wrepl connection
76 struct wreplsrv_out_connection
{
77 /* our global service context */
78 struct wreplsrv_service
*service
;
81 * the partner we connect
83 struct wreplsrv_partner
*partner
;
85 /* keep track of the assoc_ctx's */
93 * the client socket to the partner,
94 * NULL if not yet connected
96 struct wrepl_socket
*sock
;
99 enum winsrepl_partner_type
{
100 WINSREPL_PARTNER_NONE
= 0x0,
101 WINSREPL_PARTNER_PULL
= 0x1,
102 WINSREPL_PARTNER_PUSH
= 0x2,
103 WINSREPL_PARTNER_BOTH
= (WINSREPL_PARTNER_PULL
| WINSREPL_PARTNER_PUSH
)
106 #define WINSREPL_DEFAULT_PULL_INTERVAL (30*60)
107 #define WINSREPL_DEFAULT_PULL_RETRY_INTERVAL (30)
109 #define WINSREPL_DEFAULT_PUSH_CHANGE_COUNT (0)
112 this represents one of our configured partners
114 struct wreplsrv_partner
{
115 struct wreplsrv_partner
*prev
,*next
;
117 /* our global service context */
118 struct wreplsrv_service
*service
;
120 /* the netbios name of the partner, mostly just for debugging */
123 /* the ip-address of the partner */
127 * as wins partners identified by ip-address, we need to use a specific source-ip
128 * when we want to connect to the partner
130 const char *our_address
;
132 /* the type of the partner, pull, push or both */
133 enum winsrepl_partner_type type
;
135 /* pull specific options */
137 /* the interval between 2 pull replications to the partner */
140 /* the retry_interval if a pull cycle failed to the partner */
141 uint32_t retry_interval
;
143 /* the error count till the last success */
144 uint32_t error_count
;
146 /* the status of the last pull cycle */
147 NTSTATUS last_status
;
149 /* the timestamp of the next pull try */
150 struct timeval next_run
;
152 /* this is a list of each wins_owner the partner knows about */
153 struct wreplsrv_owner
*table
;
155 /* the outgoing connection to the partner */
156 struct wreplsrv_out_connection
*wreplconn
;
158 /* the current pending pull cycle request */
159 struct composite_context
*creq
;
161 /* the pull cycle io params */
162 struct wreplsrv_pull_cycle_io
*cycle_io
;
164 /* the current timed_event to the next pull cycle */
165 struct tevent_timer
*te
;
168 /* push specific options */
170 /* change count till push notification */
171 uint32_t change_count
;
173 /* the last wins db maxVersion have reported to the partner */
174 uint64_t maxVersionID
;
176 /* we should use WREPL_REPL_INFORM* messages to this partner */
179 /* the error count till the last success */
180 uint32_t error_count
;
182 /* the status of the last push cycle */
183 NTSTATUS last_status
;
185 /* the outgoing connection to the partner */
186 struct wreplsrv_out_connection
*wreplconn
;
188 /* the current push notification */
189 struct composite_context
*creq
;
191 /* the pull cycle io params */
192 struct wreplsrv_push_notify_io
*notify_io
;
196 struct wreplsrv_owner
{
197 struct wreplsrv_owner
*prev
,*next
;
199 /* this hold the owner_id (address), min_version, max_version and partner_type */
200 struct wrepl_wins_owner owner
;
202 /* can be NULL if this owner isn't a configure partner */
203 struct wreplsrv_partner
*partner
;
207 state of the whole wrepl service
209 struct wreplsrv_service
{
210 /* the whole wrepl service is in one task */
211 struct task_server
*task
;
213 /* the time the service was started */
214 struct timeval startup_time
;
216 /* the winsdb handle */
217 struct winsdb_handle
*wins_db
;
219 /* some configuration */
221 /* the wins config db handle */
222 struct ldb_context
*ldb
;
224 /* the last wins config db seqnumber we know about */
228 * the interval (in secs) till an active record will be marked as RELEASED
230 uint32_t renew_interval
;
233 * the interval (in secs) a record remains in RELEASED state,
234 * before it will be marked as TOMBSTONE
235 * (also known as extinction interval)
237 uint32_t tombstone_interval
;
240 * the interval (in secs) a record remains in TOMBSTONE state,
241 * before it will be removed from the database.
242 * See also 'tombstone_extra_timeout'.
243 * (also known as extinction timeout)
245 uint32_t tombstone_timeout
;
248 * the interval (in secs) a record remains in TOMBSTONE state,
249 * even after 'tombstone_timeout' passes the current timestamp.
250 * this is the minimum uptime of the wrepl service, before
251 * we start delete tombstones. This is to prevent deletion of
252 * tombstones, without replacte them.
254 uint32_t tombstone_extra_timeout
;
257 * the interval (in secs) till a replica record will be verified
258 * with the owning wins server
260 uint32_t verify_interval
;
263 * the interval (in secs) till a do a database cleanup
265 uint32_t scavenging_interval
;
268 * the interval (in secs) to the next periodic processing
269 * (this is the maximun interval)
271 uint32_t periodic_interval
;
274 /* all incoming connections */
275 struct wreplsrv_in_connection
*in_connections
;
277 /* all partners (pull and push) */
278 struct wreplsrv_partner
*partners
;
281 * this is our local wins_owner entry, this is also in the table list
282 * but we need a pointer to it, because we need to update it on each
283 * query to wreplsrv_find_owner(), as the local records can be added
284 * to the wins.ldb from external tools and the winsserver
286 struct wreplsrv_owner
*owner
;
288 /* this is a list of each wins_owner we know about in our database */
289 struct wreplsrv_owner
*table
;
291 /* some stuff for periodic processing */
294 * the timestamp for the next event,
295 * this is the timstamp passed to event_add_timed()
297 struct timeval next_event
;
299 /* here we have a reference to the timed event the schedules the periodic stuff */
300 struct tevent_timer
*te
;
303 /* some stuff for scavenging processing */
306 * the timestamp for the next scavenging run,
307 * this is the timstamp passed to event_add_timed()
309 struct timeval next_run
;
312 * are we currently inside a scavenging run
318 struct socket_context
;
320 #include "wrepl_server/wrepl_out_helpers.h"
321 #include "wrepl_server/wrepl_server_proto.h"