s3:smbd: add smbd_smb2_send_oplock_break()
[metze/samba/wip.git] / source3 / smbd / globals.h
index 178263ba2ce487a5bd292d3e784db9ddac3df1c7..e101205417e0eeb098f30ea76951726d7eb05b66 100644 (file)
 #if defined(WITH_AIO)
 struct aio_extra;
 extern struct aio_extra *aio_list_head;
+extern struct tevent_signal *aio_signal_event;
 extern int aio_pending_size;
-extern sig_atomic_t aio_signals_received;
 extern int outstanding_aio_calls;
-extern uint16_t *aio_pending_array;
 #endif
 
 /* dlink list we store pending lock records on. */
@@ -43,11 +42,6 @@ struct smbd_dmapi_context;
 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;
@@ -92,43 +86,9 @@ extern char *last_to;
 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 SIG_ATOMIC_T reload_after_sighup;
-extern SIG_ATOMIC_T got_sig_term;
-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;
@@ -162,12 +122,6 @@ extern uint16_t last_flags;
 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;
 
@@ -184,29 +138,15 @@ extern struct vfs_init_function_entry *backends;
 extern char *sparse_buf;
 extern char *LastDir;
 
-#if HAVE_KERNEL_OPLOCKS_LINUX
-extern SIG_ATOMIC_T oplock_signals_received;
-#define FD_PENDING_SIZE 100
-extern SIG_ATOMIC_T fd_pending_array[FD_PENDING_SIZE];
-extern struct kernel_oplocks linux_koplocks;
-#endif
-
-#if HAVE_KERNEL_OPLOCKS_IRIX
-extern int oplock_pipe_write;
-extern int oplock_pipe_read;
-extern struct kernel_oplocks irix_koplocks;
-#endif
-
 /* Current number of oplocks we have outstanding. */
 extern int32_t exclusive_oplocks_open;
 extern int32_t level_II_oplocks_open;
 extern bool global_client_failed_oplock_break;
-extern const struct kernel_oplocks *koplocks;
+extern struct kernel_oplocks *koplocks;
 
 extern struct notify_mid_map *notify_changes_by_mid;
 
 extern int am_parent;
-extern SIG_ATOMIC_T got_sig_cld;
 extern int server_fd;
 extern struct event_context *smbd_event_ctx;
 extern struct messaging_context *smbd_msg_ctx;
@@ -216,4 +156,241 @@ struct child_pid;
 extern struct child_pid *children;
 extern int num_children;
 
+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);
+
+void smbd_server_connection_terminate_ex(struct smbd_server_connection *sconn,
+                                        const char *reason,
+                                        const char *location);
+#define smbd_server_connection_terminate(sconn, reason) \
+       smbd_server_connection_terminate_ex(sconn, reason, __location__)
+
+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 smbd_smb2_request_error_ex(struct smbd_smb2_request *req,
+                                   NTSTATUS status,
+                                   DATA_BLOB *info,
+                                   const char *location);
+#define smbd_smb2_request_error(req, status) \
+       smbd_smb2_request_error_ex(req, status, NULL, __location__)
+NTSTATUS smbd_smb2_request_done_ex(struct smbd_smb2_request *req,
+                                  NTSTATUS status,
+                                  DATA_BLOB body, DATA_BLOB *dyn,
+                                  const char *location);
+#define smbd_smb2_request_done(req, body, dyn) \
+       smbd_smb2_request_done_ex(req, NT_STATUS_OK, body, dyn, __location__)
+
+NTSTATUS smbd_smb2_send_oplock_break(struct smbd_server_connection *sconn,
+                                    uint64_t file_id_persistent,
+                                    uint64_t file_id_volatile,
+                                    uint8_t oplock_level);
+
+NTSTATUS smbd_smb2_request_check_session(struct smbd_smb2_request *req);
+NTSTATUS smbd_smb2_request_check_tcon(struct smbd_smb2_request *req);
+
+struct smb_request *smbd_smb2_fake_smb_request(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_create(struct smbd_smb2_request *req);
+NTSTATUS smbd_smb2_request_process_close(struct smbd_smb2_request *req);
+NTSTATUS smbd_smb2_request_process_flush(struct smbd_smb2_request *req);
+NTSTATUS smbd_smb2_request_process_read(struct smbd_smb2_request *req);
+NTSTATUS smbd_smb2_request_process_write(struct smbd_smb2_request *req);
+NTSTATUS smbd_smb2_request_process_ioctl(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 files_struct *compat_chain_fsp;
+
+       NTSTATUS next_status;
+
+       struct {
+               /* the NBT header is not allocated */
+               uint8_t nbt_hdr[4];
+               /*
+                * vector[0] NBT
+                * .
+                * vector[1] SMB2
+                * vector[2] fixed body
+                * vector[3] dynamic body
+                * .
+                * .
+                * .
+                * vector[4] SMB2
+                * vector[5] fixed body
+                * vector[6] dynamic body
+                * .
+                * .
+                * .
+                */
+               struct iovec *vector;
+               int vector_count;
+       } in;
+       struct {
+               /* the NBT header is not allocated */
+               uint8_t nbt_hdr[4];
+               /*
+                * vector[0] NBT
+                * .
+                * vector[1] SMB2
+                * vector[2] fixed body
+                * vector[3] dynamic body
+                * .
+                * .
+                * .
+                * vector[4] SMB2
+                * vector[5] fixed body
+                * vector[6] dynamic body
+                * .
+                * .
+                * .
+                */
+               struct iovec *vector;
+               int vector_count;
+       } 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;
+
+       user_struct *compat_vuser;
+
+       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;
+       connection_struct *compat_conn;
+};
+
+struct pending_auth_data;
+
+struct smbd_server_connection {
+       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;
+};
+
+extern struct smbd_server_connection *smbd_server_conn;
+
 void smbd_init_globals(void);