root/source4/wrepl_server/wrepl_server.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   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"

/* [<][>][^][v][top][bottom][index][help] */