s4:libcli/smb2: setup a smbXcli_tcon for each smb2_tree
[Samba/gebeck_regimport.git] / source4 / libcli / smb2 / smb2.h
blob569028e63c91af20d0ee4342a57c60571c9b9503
1 /*
2 Unix SMB/CIFS implementation.
4 SMB2 client library header
6 Copyright (C) Andrew Tridgell 2005
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.
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.
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/>.
22 #ifndef __LIBCLI_SMB2_SMB2_H__
23 #define __LIBCLI_SMB2_SMB2_H__
25 #include "libcli/raw/request.h"
26 #include "libcli/raw/libcliraw.h"
28 struct smb2_handle;
29 struct smb2_lease_break;
31 struct smb2_request_buffer {
32 /* the raw SMB2 buffer, including the 4 byte length header */
33 uint8_t *buffer;
35 /* the size of the raw buffer, including 4 byte header */
36 size_t size;
38 /* how much has been allocated - on reply the buffer is over-allocated to
39 prevent too many realloc() calls
41 size_t allocated;
43 /* the start of the SMB2 header - this is always buffer+4 */
44 uint8_t *hdr;
46 /* the packet body */
47 uint8_t *body;
48 size_t body_fixed;
49 size_t body_size;
51 /* this point to the next dynamic byte that can be used
52 * this will be moved when some dynamic data is pushed
54 uint8_t *dynamic;
56 /* this is used to range check and align strings and buffers */
57 struct request_bufinfo bufinfo;
60 /* this is the context for the smb2 transport layer */
61 struct smb2_transport {
62 struct tevent_context *ev; /* TODO: remove this !!! */
63 struct smbXcli_conn *conn;
65 /* the details for coumpounded requests */
66 struct {
67 bool related;
68 struct tevent_req **reqs;
69 } compound;
71 /* an idle function - if this is defined then it will be
72 called once every period microseconds while we are waiting
73 for a packet */
74 struct {
75 void (*func)(struct smb2_transport *, void *);
76 void *private_data;
77 unsigned int period;
78 struct tevent_timer *te;
79 } idle;
81 struct {
82 /* a oplock break request handler */
83 bool (*handler)(struct smb2_transport *transport,
84 const struct smb2_handle *handle,
85 uint8_t level, void *private_data);
86 /* private data passed to the oplock handler */
87 void *private_data;
88 } oplock;
90 struct {
91 /* a lease break request handler */
92 bool (*handler)(struct smb2_transport *transport,
93 const struct smb2_lease_break *lease_break,
94 void *private_data);
95 /* private data passed to the oplock handler */
96 void *private_data;
97 } lease;
98 struct tevent_req *break_subreq;
100 struct smbcli_options options;
105 SMB2 tree context
107 struct smb2_tree {
108 struct smb2_session *session;
109 uint32_t tid;
110 uint32_t capabilities;
111 struct smbXcli_tcon *smbXcli;
115 SMB2 session context
117 struct smb2_session {
118 struct smb2_transport *transport;
119 struct gensec_security *gensec;
120 uint32_t pid;
121 struct smbXcli_session *smbXcli;
127 a client request moves between the following 4 states.
129 enum smb2_request_state {SMB2_REQUEST_INIT, /* we are creating the request */
130 SMB2_REQUEST_RECV, /* we are waiting for a matching reply */
131 SMB2_REQUEST_DONE, /* the request is finished */
132 SMB2_REQUEST_ERROR}; /* a packet or transport level error has occurred */
134 /* the context for a single SMB2 request */
135 struct smb2_request {
136 /* each request is in one of 3 possible states */
137 enum smb2_request_state state;
139 struct tevent_req *subreq;
141 struct smb2_transport *transport;
142 struct smb2_session *session;
143 struct smb2_tree *tree;
145 struct {
146 bool can_cancel;
147 } cancel;
149 /* the NT status for this request. Set by packet receive code
150 or code detecting error. */
151 NTSTATUS status;
153 struct smb2_request_buffer in;
154 struct smb2_request_buffer out;
155 struct iovec *recv_iov;
157 uint16_t credit_charge;
159 /* information on what to do with a reply when it is received
160 asyncronously. If this is not setup when a reply is received then
161 the reply is discarded
163 The private pointer is private to the caller of the client
164 library (the application), not private to the library
166 struct {
167 void (*fn)(struct smb2_request *);
168 void *private_data;
169 } async;
173 #define SMB2_MIN_SIZE 0x42
174 #define SMB2_MIN_SIZE_NO_BODY 0x40
177 check that a body has the expected size
179 #define SMB2_CHECK_PACKET_RECV(req, size, dynamic) do { \
180 size_t is_size = req->in.body_size; \
181 uint16_t field_size = SVAL(req->in.body, 0); \
182 uint16_t want_size = ((dynamic)?(size)+1:(size)); \
183 if (is_size < (size)) { \
184 DEBUG(0,("%s: buffer too small 0x%x. Expected 0x%x\n", \
185 __location__, (unsigned)is_size, (unsigned)want_size)); \
186 return NT_STATUS_BUFFER_TOO_SMALL; \
188 if (field_size != want_size) { \
189 DEBUG(0,("%s: unexpected fixed body size 0x%x. Expected 0x%x\n", \
190 __location__, (unsigned)field_size, (unsigned)want_size)); \
191 return NT_STATUS_INVALID_PARAMETER; \
193 } while (0)
195 #endif