wrepl_server: make 'use inform' the default and autofallback against old servers
authorStefan Metzmacher <metze@sernet.de>
Wed, 26 Mar 2008 19:07:10 +0000 (20:07 +0100)
committerStefan Metzmacher <metze@samba.org>
Mon, 19 Jan 2009 06:05:53 +0000 (07:05 +0100)
metze
(from samba4wins tree f44c8c8e1986e2105e899bb1f8a3896575eef582)

source4/wrepl_server/wrepl_out_helpers.c
source4/wrepl_server/wrepl_server.c
source4/wrepl_server/wrepl_server.h

index e1e3f38b12e5a1e0463d6a7a1c1496be9964234f..d9a9684c797b24254928c0ede80a7fedf4ad0e00 100644 (file)
@@ -77,10 +77,15 @@ static NTSTATUS wreplsrv_out_connect_wait_assoc_ctx(struct wreplsrv_out_connect_
        NT_STATUS_NOT_OK_RETURN(status);
 
        state->wreplconn->assoc_ctx.peer_ctx = state->assoc_io.out.assoc_ctx;
+       state->wreplconn->assoc_ctx.peer_major = state->assoc_io.out.major_version;
 
        if (state->type == WINSREPL_PARTNER_PUSH) {
-               state->wreplconn->partner->push.wreplconn = state->wreplconn;
-               talloc_steal(state->wreplconn->partner, state->wreplconn);
+               if (state->wreplconn->assoc_ctx.peer_major >= 5) {
+                       state->wreplconn->partner->push.wreplconn = state->wreplconn;
+                       talloc_steal(state->wreplconn->partner, state->wreplconn);
+               } else {
+                       state->type = WINSREPL_PARTNER_NONE;
+               }
        } else if (state->type == WINSREPL_PARTNER_PULL) {
                state->wreplconn->partner->pull.wreplconn = state->wreplconn;
                talloc_steal(state->wreplconn->partner, state->wreplconn);
@@ -966,6 +971,22 @@ static NTSTATUS wreplsrv_push_notify_wait_connect(struct wreplsrv_push_notify_st
        status = wreplsrv_out_connect_recv(state->creq, state, &state->wreplconn);
        NT_STATUS_NOT_OK_RETURN(status);
 
+       /* is the peer doesn't support inform fallback to update */
+       switch (state->command) {
+       case WREPL_REPL_INFORM:
+               if (state->wreplconn->assoc_ctx.peer_major < 5) {
+                       state->command = WREPL_REPL_UPDATE;
+               }
+               break;
+       case WREPL_REPL_INFORM2:
+               if (state->wreplconn->assoc_ctx.peer_major < 5) {
+                       state->command = WREPL_REPL_UPDATE2;
+               }
+               break;
+       default:
+               break;
+       }
+
        switch (state->command) {
        case WREPL_REPL_UPDATE:
                state->full_table = true;
index 393712c76a56720c426b5759569d2d93f3807cd3..5e100f46ccd1b761c9cad5619b239d3fd4020923 100644 (file)
@@ -207,7 +207,7 @@ NTSTATUS wreplsrv_load_partners(struct wreplsrv_service *service)
                                                                    WINSREPL_DEFAULT_PULL_RETRY_INTERVAL);
                partner->push.change_count      = ldb_msg_find_attr_as_uint(res->msgs[i], "pushChangeCount",
                                                                    WINSREPL_DEFAULT_PUSH_CHANGE_COUNT);
-               partner->push.use_inform        = ldb_msg_find_attr_as_uint(res->msgs[i], "pushUseInform", false);
+               partner->push.use_inform        = ldb_msg_find_attr_as_uint(res->msgs[i], "pushUseInform", true);
 
                DEBUG(3,("wreplsrv_load_partners: found partner: %s type: 0x%X\n",
                        partner->address, partner->type));
index 7ee5a806240fc0f3fa61f9bd1471ba3edf2af471..d92e524c353714a42e0af148c0116d1e9317a7fc 100644 (file)
@@ -79,6 +79,7 @@ struct wreplsrv_out_connection {
        struct {
                uint32_t our_ctx;
                uint32_t peer_ctx;
+               uint16_t peer_major;
        } assoc_ctx;
 
        /*