~zulcss/samba/server-dailies-3.4

« back to all changes in this revision

Viewing changes to source4/wrepl_server/wrepl_server.h

  • Committer: Chuck Short
  • Date: 2010-09-28 20:38:39 UTC
  • Revision ID: zulcss@ubuntu.com-20100928203839-pgjulytsi9ue63x1
Initial version

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* 
 
2
   Unix SMB/CIFS implementation.
 
3
   
 
4
   WINS Replication server
 
5
   
 
6
   Copyright (C) Stefan Metzmacher      2005
 
7
   
 
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.
 
12
   
 
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.
 
17
   
 
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/>.
 
20
*/
 
21
 
 
22
struct wreplsrv_service;
 
23
struct wreplsrv_in_connection;
 
24
struct wreplsrv_out_connection;
 
25
struct wreplsrv_partner;
 
26
 
 
27
#define WREPLSRV_VALID_ASSOC_CTX        0x12345678
 
28
#define WREPLSRV_INVALID_ASSOC_CTX      0x0000000a
 
29
 
 
30
/*
 
31
  state of an incoming wrepl call
 
32
*/
 
33
struct wreplsrv_in_call {
 
34
        struct wreplsrv_in_connection *wreplconn;
 
35
        struct wrepl_packet req_packet;
 
36
        struct wrepl_packet rep_packet;
 
37
        bool terminate_after_send;
 
38
};
 
39
 
 
40
/*
 
41
  state of an incoming wrepl connection
 
42
*/
 
43
struct wreplsrv_in_connection {
 
44
        struct wreplsrv_in_connection *prev,*next;
 
45
        struct stream_connection *conn;
 
46
        struct packet_context *packet;
 
47
 
 
48
        /* our global service context */
 
49
        struct wreplsrv_service *service;
 
50
 
 
51
        /*
 
52
         * the partner that connects us,
 
53
         * can be NULL, when we got a connection
 
54
         * from an unknown address
 
55
         */
 
56
        struct wreplsrv_partner *partner;
 
57
 
 
58
        /* keep track of the assoc_ctx's */
 
59
        struct {
 
60
                bool stopped;
 
61
                uint32_t our_ctx;
 
62
                uint32_t peer_ctx;
 
63
        } assoc_ctx;
 
64
};
 
65
 
 
66
/*
 
67
  state of an outgoing wrepl connection
 
68
*/
 
69
struct wreplsrv_out_connection {
 
70
        /* our global service context */
 
71
        struct wreplsrv_service *service;
 
72
 
 
73
        /*
 
74
         * the partner we connect
 
75
         */
 
76
        struct wreplsrv_partner *partner;
 
77
 
 
78
        /* keep track of the assoc_ctx's */
 
79
        struct {
 
80
                uint32_t our_ctx;
 
81
                uint32_t peer_ctx;
 
82
                uint16_t peer_major;
 
83
        } assoc_ctx;
 
84
 
 
85
        /* 
 
86
         * the client socket to the partner,
 
87
         * NULL if not yet connected
 
88
         */
 
89
        struct wrepl_socket *sock;
 
90
};
 
91
 
 
92
enum winsrepl_partner_type {
 
93
        WINSREPL_PARTNER_NONE = 0x0,
 
94
        WINSREPL_PARTNER_PULL = 0x1,
 
95
        WINSREPL_PARTNER_PUSH = 0x2,
 
96
        WINSREPL_PARTNER_BOTH = (WINSREPL_PARTNER_PULL | WINSREPL_PARTNER_PUSH)
 
97
};
 
98
 
 
99
#define WINSREPL_DEFAULT_PULL_INTERVAL (30*60)
 
100
#define WINSREPL_DEFAULT_PULL_RETRY_INTERVAL (30)
 
101
 
 
102
#define WINSREPL_DEFAULT_PUSH_CHANGE_COUNT (0)
 
103
 
 
104
/*
 
105
 this represents one of our configured partners
 
106
*/
 
107
struct wreplsrv_partner {
 
108
        struct wreplsrv_partner *prev,*next;
 
109
 
 
110
        /* our global service context */
 
111
        struct wreplsrv_service *service;
 
112
 
 
113
        /* the netbios name of the partner, mostly just for debugging */
 
114
        const char *name;
 
115
 
 
116
        /* the ip-address of the partner */
 
117
        const char *address;
 
118
 
 
119
        /* 
 
120
         * as wins partners identified by ip-address, we need to use a specific source-ip
 
121
         *  when we want to connect to the partner
 
122
         */
 
123
        const char *our_address;
 
124
 
 
125
        /* the type of the partner, pull, push or both */
 
126
        enum winsrepl_partner_type type;
 
127
 
 
128
        /* pull specific options */
 
129
        struct {
 
130
                /* the interval between 2 pull replications to the partner */
 
131
                uint32_t interval;
 
132
 
 
133
                /* the retry_interval if a pull cycle failed to the partner */
 
134
                uint32_t retry_interval;
 
135
 
 
136
                /* the error count till the last success */
 
137
                uint32_t error_count;
 
138
 
 
139
                /* the status of the last pull cycle */
 
140
                NTSTATUS last_status;
 
141
 
 
142
                /* the timestamp of the next pull try */
 
143
                struct timeval next_run;
 
144
 
 
145
                /* this is a list of each wins_owner the partner knows about */
 
146
                struct wreplsrv_owner *table;
 
147
 
 
148
                /* the outgoing connection to the partner */
 
149
                struct wreplsrv_out_connection *wreplconn;
 
150
 
 
151
                /* the current pending pull cycle request */
 
152
                struct composite_context *creq;
 
153
 
 
154
                /* the pull cycle io params */
 
155
                struct wreplsrv_pull_cycle_io *cycle_io;
 
156
 
 
157
                /* the current timed_event to the next pull cycle */
 
158
                struct tevent_timer *te;
 
159
        } pull;
 
160
 
 
161
        /* push specific options */
 
162
        struct {
 
163
                /* change count till push notification */
 
164
                uint32_t change_count;
 
165
 
 
166
                /* the last wins db maxVersion have reported to the partner */
 
167
                uint64_t maxVersionID;
 
168
 
 
169
                /* we should use WREPL_REPL_INFORM* messages to this partner */
 
170
                bool use_inform;
 
171
 
 
172
                /* the error count till the last success */
 
173
                uint32_t error_count;
 
174
 
 
175
                /* the status of the last push cycle */
 
176
                NTSTATUS last_status;
 
177
 
 
178
                /* the outgoing connection to the partner */
 
179
                struct wreplsrv_out_connection *wreplconn;
 
180
 
 
181
                /* the current push notification */
 
182
                struct composite_context *creq;
 
183
 
 
184
                /* the pull cycle io params */
 
185
                struct wreplsrv_push_notify_io *notify_io;
 
186
        } push;
 
187
};
 
188
 
 
189
struct wreplsrv_owner {
 
190
        struct wreplsrv_owner *prev,*next;
 
191
 
 
192
        /* this hold the owner_id (address), min_version, max_version and partner_type */
 
193
        struct wrepl_wins_owner owner;
 
194
 
 
195
        /* can be NULL if this owner isn't a configure partner */
 
196
        struct wreplsrv_partner *partner; 
 
197
};
 
198
 
 
199
/*
 
200
  state of the whole wrepl service
 
201
*/
 
202
struct wreplsrv_service {
 
203
        /* the whole wrepl service is in one task */
 
204
        struct task_server *task;
 
205
 
 
206
        /* the time the service was started */
 
207
        struct timeval startup_time;
 
208
 
 
209
        /* the winsdb handle */
 
210
        struct winsdb_handle *wins_db;
 
211
 
 
212
        /* some configuration */
 
213
        struct {
 
214
                /* the wins config db handle */
 
215
                struct ldb_context *ldb;
 
216
 
 
217
                /* the last wins config db seqnumber we know about */
 
218
                uint64_t seqnumber;
 
219
 
 
220
                /* 
 
221
                 * the interval (in secs) till an active record will be marked as RELEASED 
 
222
                 */
 
223
                uint32_t renew_interval;
 
224
 
 
225
                /* 
 
226
                 * the interval (in secs) a record remains in RELEASED state,
 
227
                 * before it will be marked as TOMBSTONE
 
228
                 * (also known as extinction interval)
 
229
                 */
 
230
                uint32_t tombstone_interval;
 
231
 
 
232
                /* 
 
233
                 * the interval (in secs) a record remains in TOMBSTONE state,
 
234
                 * before it will be removed from the database.
 
235
                 * See also 'tombstone_extra_timeout'.
 
236
                 * (also known as extinction timeout)
 
237
                 */
 
238
                uint32_t tombstone_timeout;
 
239
 
 
240
                /* 
 
241
                 * the interval (in secs) a record remains in TOMBSTONE state,
 
242
                 * even after 'tombstone_timeout' passes the current timestamp.
 
243
                 * this is the minimum uptime of the wrepl service, before
 
244
                 * we start delete tombstones. This is to prevent deletion of
 
245
                 * tombstones, without replacte them.
 
246
                 */
 
247
                uint32_t tombstone_extra_timeout;
 
248
 
 
249
                /* 
 
250
                 * the interval (in secs) till a replica record will be verified
 
251
                 * with the owning wins server
 
252
                 */
 
253
                uint32_t verify_interval;
 
254
 
 
255
                /* 
 
256
                 * the interval (in secs) till a do a database cleanup
 
257
                 */
 
258
                uint32_t scavenging_interval;
 
259
 
 
260
                /* 
 
261
                 * the interval (in secs) to the next periodic processing
 
262
                 * (this is the maximun interval)
 
263
                 */
 
264
                uint32_t periodic_interval;
 
265
        } config;
 
266
 
 
267
        /* all incoming connections */
 
268
        struct wreplsrv_in_connection *in_connections;
 
269
 
 
270
        /* all partners (pull and push) */
 
271
        struct wreplsrv_partner *partners;
 
272
 
 
273
        /*
 
274
         * this is our local wins_owner entry, this is also in the table list
 
275
         * but we need a pointer to it, because we need to update it on each 
 
276
         * query to wreplsrv_find_owner(), as the local records can be added
 
277
         * to the wins.ldb from external tools and the winsserver
 
278
         */
 
279
        struct wreplsrv_owner *owner;
 
280
 
 
281
        /* this is a list of each wins_owner we know about in our database */
 
282
        struct wreplsrv_owner *table;
 
283
 
 
284
        /* some stuff for periodic processing */
 
285
        struct {
 
286
                /*
 
287
                 * the timestamp for the next event,
 
288
                 * this is the timstamp passed to event_add_timed()
 
289
                 */
 
290
                struct timeval next_event;
 
291
 
 
292
                /* here we have a reference to the timed event the schedules the periodic stuff */
 
293
                struct tevent_timer *te;
 
294
        } periodic;
 
295
 
 
296
        /* some stuff for scavenging processing */
 
297
        struct {
 
298
                /*
 
299
                 * the timestamp for the next scavenging run,
 
300
                 * this is the timstamp passed to event_add_timed()
 
301
                 */
 
302
                struct timeval next_run;
 
303
 
 
304
                /*
 
305
                 * are we currently inside a scavenging run
 
306
                 */
 
307
                bool processing;        
 
308
        } scavenging;
 
309
};
 
310
 
 
311
struct socket_context;
 
312
struct wrepl_name;
 
313
#include "wrepl_server/wrepl_out_helpers.h"
 
314
#include "wrepl_server/wrepl_server_proto.h"