s4:drepl_out_helpers: don't look at the internals of 'struct rpc_request'
[ira/wip.git] / source4 / dsdb / repl / drepl_service.h
1 /* 
2    Unix SMB/CIFS mplementation.
3    DSDB replication service
4    
5    Copyright (C) Stefan Metzmacher 2007
6     
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11    
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16    
17    You should have received a copy of the GNU General Public License
18    along with this program.  If not, see <http://www.gnu.org/licenses/>.
19    
20 */
21
22 #ifndef _DSDB_REPL_DREPL_SERVICE_H_
23 #define _DSDB_REPL_DREPL_SERVICE_H_
24
25 #include "librpc/gen_ndr/ndr_drsuapi_c.h"
26
27 struct dreplsrv_service;
28 struct dreplsrv_partition;
29
30 struct dreplsrv_drsuapi_connection {
31         /*
32          * this pipe pointer is also the indicator
33          * for a valid connection
34          */
35         struct dcerpc_pipe *pipe;
36
37         DATA_BLOB gensec_skey;
38         struct drsuapi_DsBindInfo28 remote_info28;
39         struct policy_handle bind_handle;
40 };
41
42 struct dreplsrv_out_connection {
43         struct dreplsrv_out_connection *prev, *next;
44
45         struct dreplsrv_service *service;
46
47         /*
48          * the binding for the outgoing connection
49          */
50         struct dcerpc_binding *binding;
51
52         /* the out going connection to the source dsa */
53         struct dreplsrv_drsuapi_connection *drsuapi;
54 };
55
56 struct dreplsrv_partition_source_dsa {
57         struct dreplsrv_partition_source_dsa *prev, *next;
58
59         struct dreplsrv_partition *partition;
60
61         /*
62          * the cached repsFrom value for this source dsa
63          *
64          * it needs to be updated after each DsGetNCChanges() call
65          * to the source dsa
66          *
67          * repsFrom1 == &_repsFromBlob.ctr.ctr1
68          */
69         struct repsFromToBlob _repsFromBlob;
70         struct repsFromTo1 *repsFrom1;
71
72         /* the last uSN when we sent a notify */
73         uint64_t notify_uSN;
74         
75         /* the reference to the source_dsa and its outgoing connection */
76         struct dreplsrv_out_connection *conn;
77 };
78
79 struct dreplsrv_partition {
80         struct dreplsrv_partition *prev, *next;
81
82         struct dreplsrv_service *service;
83
84         /* the dn of the partition */
85         struct ldb_dn *dn;
86         struct drsuapi_DsReplicaObjectIdentifier nc;
87
88         /* 
89          * uptodate vector needs to be updated before and after each DsGetNCChanges() call
90          *
91          * - before: we need to use our own invocationId together with our highestCommitedUsn
92          * - after: we need to merge in the remote uptodatevector, to avoid reading it again
93          */
94         struct replUpToDateVectorCtr2 uptodatevector;
95         struct drsuapi_DsReplicaCursorCtrEx uptodatevector_ex;
96
97         /*
98          * a linked list of all source dsa's we replicate from
99          */
100         struct dreplsrv_partition_source_dsa *sources;
101 };
102
103 typedef void (*dreplsrv_fsmo_callback_t)(struct dreplsrv_service *, WERROR );
104
105 struct dreplsrv_out_operation {
106         struct dreplsrv_out_operation *prev, *next;
107
108         struct dreplsrv_service *service;
109
110         struct dreplsrv_partition_source_dsa *source_dsa;
111
112         enum drsuapi_DsExtendedOperation extended_op;
113         uint64_t fsmo_info;
114         dreplsrv_fsmo_callback_t callback;
115 };
116
117 struct dreplsrv_notify_operation {
118         struct dreplsrv_notify_operation *prev, *next;
119
120         struct dreplsrv_service *service;
121         uint64_t uSN;
122
123         struct dreplsrv_partition_source_dsa *source_dsa;
124         bool is_urgent;
125 };
126
127 struct dreplsrv_service {
128         /* the whole drepl service is in one task */
129         struct task_server *task;
130
131         /* the time the service was started */
132         struct timeval startup_time;
133
134         /* 
135          * system session info
136          * with machine account credentials
137          */
138         struct auth_session_info *system_session_info;
139
140         /*
141          * a connection to the local samdb
142          */
143         struct ldb_context *samdb;
144
145         /* the guid of our NTDS Settings object, which never changes! */
146         struct GUID ntds_guid;
147         /*
148          * the struct holds the values used for outgoing DsBind() calls,
149          * so that we need to set them up only once
150          */
151         struct drsuapi_DsBindInfo28 bind_info28;
152
153         /* some stuff for periodic processing */
154         struct {
155                 /*
156                  * the interval between to periodic runs
157                  */
158                 uint32_t interval;
159
160                 /*
161                  * the timestamp for the next event,
162                  * this is the timstamp passed to event_add_timed()
163                  */
164                 struct timeval next_event;
165
166                 /* here we have a reference to the timed event the schedules the periodic stuff */
167                 struct tevent_timer *te;
168         } periodic;
169
170         /* some stuff for notify processing */
171         struct {
172                 /*
173                  * the interval between notify runs
174                  */
175                 uint32_t interval;
176
177                 /*
178                  * the timestamp for the next event,
179                  * this is the timstamp passed to event_add_timed()
180                  */
181                 struct timeval next_event;
182
183                 /* here we have a reference to the timed event the schedules the notifies */
184                 struct tevent_timer *te;
185         } notify;
186
187         /*
188          * the list of partitions we need to replicate
189          */
190         struct dreplsrv_partition *partitions;
191
192         /*
193          * the list of cached connections
194          */
195         struct dreplsrv_out_connection *connections;
196
197         struct {        
198                 /* the pointer to the current active operation */
199                 struct dreplsrv_out_operation *current;
200
201                 /* the list of pending operations */
202                 struct dreplsrv_out_operation *pending;
203
204                 /* the list of pending notify operations */
205                 struct dreplsrv_notify_operation *notifies;
206
207                 /* an active notify operation */
208                 struct dreplsrv_notify_operation *n_current;
209         } ops;
210
211         struct {
212                 bool in_progress;
213                 struct dreplsrv_partition_source_dsa *rid_manager_source_dsa;
214         } ridalloc;
215 };
216
217 #include "dsdb/repl/drepl_out_helpers.h"
218 #include "dsdb/repl/drepl_service_proto.h"
219
220 #endif /* _DSDB_REPL_DREPL_SERVICE_H_ */