extern struct smbd_dmapi_context *dmapi_ctx;
#endif
-extern connection_struct *Connections;
-/* number of open connections */
-extern struct bitmap *bmap;
-extern int num_open;
-
extern bool dfree_broken;
extern struct bitmap *dptr_bmap;
struct msg_state;
extern struct msg_state *smbd_msg_state;
-extern bool global_encrypted_passwords_negotiated;
-extern bool global_spnego_negotiated;
-extern struct auth_context *negprot_global_auth_context;
-extern bool done_negprot;
-
extern bool logged_ioctl_message;
-/* users from session setup */
-extern char *session_userlist;
-/* workgroup from session setup. */
-extern char *session_workgroup;
-/* this holds info on user ids that are already validated for this VC */
-extern user_struct *validated_users;
-extern uint16_t next_vuid;
-extern int num_validated_vuids;
-#ifdef HAVE_NETGROUP
-extern char *my_yp_domain;
-#endif
-
-extern bool already_got_session;
-
-/*
- * Size of data we can send to client. Set
- * by the client for all protocols above CORE.
- * Set by us for CORE protocol.
- */
-extern int max_send;
-/*
- * Size of the data we can receive. Set by us.
- * Can be modified by the max xmit parameter.
- */
-extern int max_recv;
-extern uint16 last_session_tag;
extern int trans_num;
-extern char *orig_inbuf;
extern pid_t mypid;
extern time_t last_smb_conf_reload_time;
extern struct db_context *session_db_ctx_ptr;
extern uint32_t global_client_caps;
-extern bool done_sesssetup;
-/****************************************************************************
- List to store partial SPNEGO auth fragments.
-****************************************************************************/
-struct pending_auth_data;
-extern struct pending_auth_data *pd_list;
extern uint16_t fnf_handle;
struct tstream_context;
struct smbd_smb2_request;
+struct smbd_smb2_session;
+struct smbd_smb2_tcon;
DATA_BLOB negprot_spnego(void);
+NTSTATUS smb2_signing_sign_pdu(DATA_BLOB session_key,
+ struct iovec *vector,
+ int count);
+NTSTATUS smb2_signing_check_pdu(DATA_BLOB session_key,
+ const struct iovec *vector,
+ int count);
+
bool smbd_is_smb2_header(const uint8_t *inbuf, size_t size);
+void reply_smb2002(struct smb_request *req, uint16_t choice);
void smbd_smb2_first_negprot(struct smbd_server_connection *conn,
const uint8_t *inbuf, size_t size);
NTSTATUS status, DATA_BLOB *info);
NTSTATUS smbd_smb2_request_error(struct smbd_smb2_request *req,
NTSTATUS status);
+NTSTATUS smbd_smb2_request_done_ex(struct smbd_smb2_request *req,
+ NTSTATUS status,
+ DATA_BLOB body, DATA_BLOB *dyn);
NTSTATUS smbd_smb2_request_done(struct smbd_smb2_request *req,
DATA_BLOB body, DATA_BLOB *dyn);
+NTSTATUS smbd_smb2_request_check_session(struct smbd_smb2_request *req);
+NTSTATUS smbd_smb2_request_check_tcon(struct smbd_smb2_request *req);
+
+NTSTATUS smbd_smb2_request_process_negprot(struct smbd_smb2_request *req);
+NTSTATUS smbd_smb2_request_process_sesssetup(struct smbd_smb2_request *req);
+NTSTATUS smbd_smb2_request_process_logoff(struct smbd_smb2_request *req);
+NTSTATUS smbd_smb2_request_process_tcon(struct smbd_smb2_request *req);
+NTSTATUS smbd_smb2_request_process_tdis(struct smbd_smb2_request *req);
+NTSTATUS smbd_smb2_request_process_keepalive(struct smbd_smb2_request *req);
+
struct smbd_smb2_request {
TALLOC_CTX *mem_pool;
struct smbd_server_connection *conn;
+ /* the session the request operates on, maybe NULL */
+ struct smbd_smb2_session *session;
+
+ /* the tcon the request operates on, maybe NULL */
+ struct smbd_smb2_tcon *tcon;
+
int current_idx;
+ bool do_signing;
struct {
/* the NBT header is not allocated */
} out;
};
+struct smbd_server_connection;
+
+struct smbd_smb2_session {
+ struct smbd_smb2_session *prev, *next;
+ struct smbd_server_connection *conn;
+ NTSTATUS status;
+ uint64_t vuid;
+ AUTH_NTLMSSP_STATE *auth_ntlmssp_state;
+ struct auth_serversupplied_info *server_info;
+ DATA_BLOB session_key;
+ bool do_signing;
+
+ struct {
+ /* an id tree used to allocate tids */
+ struct idr_context *idtree;
+
+ /* this is the limit of tid values for this connection */
+ uint32_t limit;
+
+ struct smbd_smb2_tcon *list;
+ } tcons;
+};
+
+struct smbd_smb2_tcon {
+ struct smbd_smb2_tcon *prev, *next;
+ struct smbd_smb2_session *session;
+ uint32_t tid;
+ int snum;
+};
+
+struct pending_auth_data;
+
struct smbd_server_connection {
- struct fd_event *fde;
- uint64_t num_requests;
- struct smb_signing_state *signing_state;
+ struct {
+ bool got_session;
+ } nbt;
bool allow_smb2;
+ struct {
+ struct fd_event *fde;
+ uint64_t num_requests;
+ struct {
+ bool encrypted_passwords;
+ bool spnego;
+ struct auth_context *auth_context;
+ bool done;
+ /*
+ * Size of the data we can receive. Set by us.
+ * Can be modified by the max xmit parameter.
+ */
+ int max_recv;
+ } negprot;
+
+ struct {
+ bool done_sesssetup;
+ /*
+ * Size of data we can send to client. Set
+ * by the client for all protocols above CORE.
+ * Set by us for CORE protocol.
+ */
+ int max_send;
+ uint16_t last_session_tag;
+
+ /* users from session setup */
+ char *session_userlist;
+ /* workgroup from session setup. */
+ char *session_workgroup;
+ /*
+ * this holds info on user ids that are already
+ * validated for this VC
+ */
+ user_struct *validated_users;
+ uint16_t next_vuid;
+ int num_validated_vuids;
+#ifdef HAVE_NETGROUP
+ char *my_yp_domain;
+#endif
+ } sessions;
+ struct {
+ connection_struct *Connections;
+ /* number of open connections */
+ struct bitmap *bmap;
+ int num_open;
+ } tcons;
+ struct smb_signing_state *signing_state;
+ /* List to store partial SPNEGO auth fragments. */
+ struct pending_auth_data *pd_list;
+ } smb1;
struct {
struct tevent_context *event_ctx;
struct tevent_queue *recv_queue;
struct tevent_queue *send_queue;
struct tstream_context *stream;
+ struct {
+ /* an id tree used to allocate vuids */
+ /* this holds info on session vuids that are already
+ * validated for this VC */
+ struct idr_context *idtree;
+
+ /* this is the limit of vuid values for this connection */
+ uint64_t limit;
+
+ struct smbd_smb2_session *list;
+ } sessions;
} smb2;
};