summaryrefslogtreecommitdiff
path: root/source4/libnet
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2007-02-23 11:04:05 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 14:48:48 -0500
commitd92bc6db36880d973b19a07fca69876eb33796a0 (patch)
tree07a6428bc1ce9e9f4e4564f0a5b2ee0e7b7b7919 /source4/libnet
parent1b17d9a587bf3600d449c2481fe1191793479e32 (diff)
downloadsamba-d92bc6db36880d973b19a07fca69876eb33796a0.tar.gz
samba-d92bc6db36880d973b19a07fca69876eb33796a0.tar.bz2
samba-d92bc6db36880d973b19a07fca69876eb33796a0.zip
r21516: - use the same assoc_group_id, for all 3 drsuapi connection
- use the PFC_CONC_MPX flag for the 3rd connection - to DsGetNCChanges requests on the 3rd connection with the bind handle from the 2nd connection to match w2k3 metze (This used to be commit 5071af332c2c079fd94c577e58ee6e8ccf157ffa)
Diffstat (limited to 'source4/libnet')
-rw-r--r--source4/libnet/libnet_become_dc.c25
1 files changed, 21 insertions, 4 deletions
diff --git a/source4/libnet/libnet_become_dc.c b/source4/libnet/libnet_become_dc.c
index 9f54fa646f..bb7b4bb613 100644
--- a/source4/libnet/libnet_become_dc.c
+++ b/source4/libnet/libnet_become_dc.c
@@ -1487,6 +1487,7 @@ static void becomeDC_drsuapi1_add_entry_recv(struct rpc_request *req)
struct composite_context *c = s->creq;
struct drsuapi_DsAddEntry *r = talloc_get_type(req->ndr.struct_ptr,
struct drsuapi_DsAddEntry);
+ char *binding_str;
bool print = false;
if (req->p->conn->flags & DCERPC_DEBUG_PRINT_OUT) {
@@ -1565,6 +1566,17 @@ static void becomeDC_drsuapi1_add_entry_recv(struct rpc_request *req)
c->status = becomeDC_prepare_db(s);
if (!composite_is_ok(c)) return;
+ /* this avoids the epmapper lookup on the 2nd connection */
+ binding_str = dcerpc_binding_string(s, s->drsuapi1.binding);
+ if (composite_nomem(binding_str, c)) return;
+
+ c->status = dcerpc_parse_binding(s, binding_str, &s->drsuapi2.binding);
+ talloc_free(binding_str);
+ if (!composite_is_ok(c)) return;
+
+ /* w2k3 uses the same assoc_group_id as on the first connection, so we do */
+ s->drsuapi2.binding->assoc_group_id = s->drsuapi1.pipe->assoc_group_id;
+
becomeDC_drsuapi_connect_send(s, &s->drsuapi2, becomeDC_drsuapi2_connect_recv);
}
@@ -1627,14 +1639,19 @@ static void becomeDC_drsuapi2_bind_recv(struct rpc_request *req)
return;
}
- /* this avoids the epmapper lookup on the 2nd connection */
- binding_str = dcerpc_binding_string(s, s->drsuapi2.binding);
+ /* this avoids the epmapper lookup on the 3rd connection */
+ binding_str = dcerpc_binding_string(s, s->drsuapi1.binding);
if (composite_nomem(binding_str, c)) return;
c->status = dcerpc_parse_binding(s, binding_str, &s->drsuapi3.binding);
talloc_free(binding_str);
if (!composite_is_ok(c)) return;
+ /* w2k3 uses the same assoc_group_id as on the first connection, so we do */
+ s->drsuapi3.binding->assoc_group_id = s->drsuapi1.pipe->assoc_group_id;
+ /* w2k3 uses the concurrent multiplex feature on the 3rd connection, so we do */
+ s->drsuapi3.binding->flags |= DCERPC_CONCURRENT_MULTIPLEX;
+
becomeDC_drsuapi_connect_send(s, &s->drsuapi3, becomeDC_drsuapi3_connect_recv);
}
@@ -1711,7 +1728,7 @@ static void becomeDC_drsuapi_pull_partition_send(struct libnet_BecomeDC_state *s
* are needed for it. Or the same KRB5 TGS is needed on both
* connections.
*/
- req = dcerpc_drsuapi_DsGetNCChanges_send(drsuapi_h->pipe, r, r);
+ req = dcerpc_drsuapi_DsGetNCChanges_send(drsuapi_p->pipe, r, r);
composite_continue_rpc(c, req, recv_fn, s);
}
@@ -1782,7 +1799,7 @@ static WERROR becomeDC_drsuapi_pull_partition_recv(struct libnet_BecomeDC_state
* we need to use the drsuapi_p->gensec_skey here,
* when we use drsuapi_p->pipe in the for this request
*/
- s->_sc.gensec_skey = &drsuapi_h->gensec_skey;
+ s->_sc.gensec_skey = &drsuapi_p->gensec_skey;
nt_status = partition->store_chunk(s->callbacks.private_data, &s->_sc);
if (!NT_STATUS_IS_OK(nt_status)) {