>From 0bf78b49d8433baca0be7cb0b351bf1d62a02a82 Mon Sep 17 00:00:00 2001 From: Noel Power Date: Mon, 30 Jun 2014 14:31:14 +0100 Subject: [PATCH 4/5] allow raw pipe client to bump transaction max data count. add client new function "raw_pipe_handle_set_trans_maxdata" and associated code to push max data count to transaction layer --- librpc/rpc/raw_handle.c | 6 ++++++ librpc/rpc/raw_pipe_common.h | 3 +++ source3/rpc_client/raw_pipe.c | 18 ++++++++++++++++++ source3/rpc_client/raw_pipe_transport.h | 2 ++ source3/rpc_client/raw_transport_tstream.c | 13 +++++++++++++ 5 files changed, 42 insertions(+) diff --git a/librpc/rpc/raw_handle.c b/librpc/rpc/raw_handle.c index 2ddc58b..10ff31f 100644 --- a/librpc/rpc/raw_handle.c +++ b/librpc/rpc/raw_handle.c @@ -88,6 +88,12 @@ uint32_t raw_pipe_handle_set_timeout(struct raw_pipe_handle *h, return h->ops->set_timeout(h, timeout); } +void raw_pipe_handle_set_trans_maxdata(struct raw_pipe_handle *h, + uint32_t maxdata) +{ + h->ops->set_trans_maxdata(h, maxdata); +} + struct raw_pipe_handle_disconnect_state { const struct raw_pipe_handle_ops *ops; }; diff --git a/librpc/rpc/raw_pipe_common.h b/librpc/rpc/raw_pipe_common.h index 952313d..4394a6f 100644 --- a/librpc/rpc/raw_pipe_common.h +++ b/librpc/rpc/raw_pipe_common.h @@ -44,6 +44,7 @@ struct raw_pipe_handle_ops { bool (*is_connected)(struct raw_pipe_handle *h); uint32_t (*set_timeout)(struct raw_pipe_handle *h, uint32_t timeout); + void (*set_trans_maxdata)(struct raw_pipe_handle *h, uint32_t max_data); struct tevent_req *(*raw_call_send)(TALLOC_CTX *mem_ctx, struct tevent_context *ev, @@ -81,6 +82,8 @@ bool raw_pipe_handle_is_connected(struct raw_pipe_handle *h); uint32_t raw_pipe_handle_set_timeout(struct raw_pipe_handle *h, uint32_t timeout); +void raw_pipe_handle_set_trans_maxdata(struct raw_pipe_handle *h, + uint32_t maxdata); NTSTATUS raw_pipe_binding_handle_call(struct raw_pipe_handle *h, const struct GUID *object, const struct ndr_interface_table *table, diff --git a/source3/rpc_client/raw_pipe.c b/source3/rpc_client/raw_pipe.c index bfbdaca..9cdb740 100644 --- a/source3/rpc_client/raw_pipe.c +++ b/source3/rpc_client/raw_pipe.c @@ -103,6 +103,23 @@ uint32_t raw_pipe_handle_set_timeout(struct raw_pipe_handle *h, return raw_pipe_set_timeout(hs->raw_cli, timeout); } +static void raw_pipe_set_trans_maxdata(struct raw_pipe_client *raw_cli, + uint32_t maxdata) +{ + if (raw_cli->transport) { + raw_cli->transport->trans_set_maxdata(raw_cli->transport->priv, + maxdata); + } +} + +void raw_pipe_handle_set_trans_maxdata(struct raw_pipe_handle *h, + uint32_t maxdata) +{ + struct raw_pipe_handle_state *hs = raw_pipe_handle_data(h, + struct raw_pipe_handle_state); + raw_pipe_set_trans_maxdata(hs->raw_cli, maxdata); +} + static void raw_pipe_req_send_done(struct tevent_req *subreq) { struct tevent_req *req = tevent_req_callback_data( @@ -269,6 +286,7 @@ static const struct raw_pipe_handle_ops raw_pipe_ops = { .raw_call_recv = raw_pipe_call_recv, .is_connected = raw_pipe_handle_is_connected, .set_timeout = raw_pipe_handle_set_timeout, + .set_trans_maxdata = raw_pipe_handle_set_trans_maxdata, }; static struct raw_pipe_handle *lcl_raw_pipe_handle_create(struct raw_pipe_client *c, diff --git a/source3/rpc_client/raw_pipe_transport.h b/source3/rpc_client/raw_pipe_transport.h index 0612147..ac831ce 100644 --- a/source3/rpc_client/raw_pipe_transport.h +++ b/source3/rpc_client/raw_pipe_transport.h @@ -36,6 +36,8 @@ struct raw_cli_transport { NTSTATUS (*trans_recv)(struct tevent_req *req, TALLOC_CTX *mem_ctx, uint8_t **prdata, uint32_t *prdata_len); + void (*trans_set_maxdata)(void *priv, uint32_t maxdata); + bool (*is_connected)(void *priv); unsigned int (*set_timeout)(void *priv, unsigned int timeout); diff --git a/source3/rpc_client/raw_transport_tstream.c b/source3/rpc_client/raw_transport_tstream.c index b79d72f..6803755 100644 --- a/source3/rpc_client/raw_transport_tstream.c +++ b/source3/rpc_client/raw_transport_tstream.c @@ -83,6 +83,18 @@ static unsigned int raw_pipe_tstream_set_timeout(void *priv, unsigned int timeou return orig_timeout; } +static void raw_pipe_tstream_set_trans_maxdata(void *priv, uint32_t maxdata) +{ + struct raw_tstream_state *transp = + talloc_get_type_abort(priv, struct raw_tstream_state); + bool ok; + + ok = raw_pipe_tstream_is_connected(transp); + if (ok && tstream_is_smbXcli_np(transp->stream)) { + tstream_smbXcli_np_set_trans_maxdata(transp->stream, maxdata); + } +} + struct raw_tstream_next_vector_state { uint8_t *buf; size_t len; @@ -378,6 +390,7 @@ NTSTATUS raw_transport_tstream_init(TALLOC_CTX *mem_ctx, result->trans_send = raw_pipe_tstream_trans_send; result->trans_recv = raw_pipe_tstream_trans_recv; + result->trans_set_maxdata = raw_pipe_tstream_set_trans_maxdata; result->is_connected = raw_pipe_tstream_is_connected; result->set_timeout = raw_pipe_tstream_set_timeout; -- 1.8.1.4