#ifndef _NETSMB_SMB_RQ_H_
#define _NETSMB_SMB_RQ_H_
#ifndef MB_MSYSTEM
#include <sys/mchain.h>
#endif
#define SMBR_ALLOCED 0x0001
#define SMBR_ASYNC 0x0002
#define SMBR_REXMIT 0x0004
#define SMBR_INTR 0x0008
#define SMBR_RECONNECTED 0x0010
#define SMBR_DEAD 0x0020
#define SMBR_MULTIPACKET 0x0040
#define SMBR_INTERNAL 0x0080
#define SMBR_XLOCK 0x0100
#define SMBR_XLOCKWANT 0x0200
#define SMBR_VCREF 0x4000
#define SMBR_MOREDATA 0x8000
#define SMBT2_ALLSENT 0x0001
#define SMBT2_ALLRECV 0x0002
#define SMBT2_ALLOCED 0x0004
#define SMBT2_SECONDARY 0x0020
#define SMBT2_MOREDATA 0x8000
#define SMBRQ_SLOCK(rqp) lck_mtx_lock(&(rqp)->sr_slock)
#define SMBRQ_SUNLOCK(rqp) lck_mtx_unlock(&(rqp)->sr_slock)
#define SMBRQ_SLOCKPTR(rqp) (&(rqp)->sr_slock)
enum smbrq_state {
SMBRQ_NOTSENT = 0x00,
SMBRQ_SENT = 0x01,
SMBRQ_NOTIFIED = 0x04,
SMBRQ_RECONNECT = 0x08
};
struct smb_vc;
#define MAX_SR_RECONNECT_CNT 5
struct smb_rq {
enum smbrq_state sr_state;
struct smb_vc * sr_vc;
struct smb_share* sr_share;
u_int32_t sr_reconnect_cnt;
u_short sr_mid;
u_int32_t sr_seqno;
u_int32_t sr_rseqno;
struct mbchain sr_rq;
u_int8_t sr_cmd;
u_int8_t sr_rqflags;
u_int16_t sr_rqflags2;
u_char * sr_wcount;
u_short * sr_bcount;
struct mdchain sr_rp;
int sr_rpgen;
int sr_rplast;
u_int32_t sr_flags;
int sr_rpsize;
vfs_context_t sr_context;
int sr_timo;
struct timespec sr_timesent;
int sr_lerror;
u_int8_t * sr_rqsig;
u_int16_t * sr_rqtid;
u_int16_t * sr_rquid;
u_int8_t sr_errclass;
u_int16_t sr_serror;
u_int32_t sr_error;
u_int8_t sr_rpflags;
u_int16_t sr_rpflags2;
u_int16_t sr_rptid;
u_int16_t sr_rppid;
u_int16_t sr_rpuid;
u_int16_t sr_rpmid;
lck_mtx_t sr_slock;
struct smb_t2rq *sr_t2;
TAILQ_ENTRY(smb_rq) sr_link;
void *sr_callback_args;
void (*sr_callback)(void *);
};
struct smb_t2rq {
u_int16_t t2_setupcount;
u_int16_t * t2_setupdata;
u_int16_t t2_setup[SMB_MAXSETUPWORDS];
u_int8_t t2_maxscount;
u_int16_t t2_maxpcount;
u_int16_t t2_maxdcount;
u_int16_t t2_fid;
char * t_name;
int t2_flags;
struct mbchain t2_tparam;
struct mbchain t2_tdata;
struct mdchain t2_rparam;
struct mdchain t2_rdata;
vfs_context_t t2_context;
struct smb_connobj * t2_source;
struct smb_rq * t2_rq;
struct smb_vc * t2_vc;
struct smb_share * t2_share;
u_int8_t t2_sr_errclass;
u_int16_t t2_sr_serror;
u_int32_t t2_sr_error;
u_int16_t t2_sr_rpflags2;
};
struct smb_ntrq {
u_int16_t nt_function;
u_int8_t nt_maxscount;
u_int32_t nt_maxpcount;
u_int32_t nt_maxdcount;
int nt_flags;
struct mbchain nt_tsetup;
struct mbchain nt_tparam;
struct mbchain nt_tdata;
struct mdchain nt_rparam;
struct mdchain nt_rdata;
vfs_context_t nt_context;
struct smb_connobj * nt_source;
struct smb_rq * nt_rq;
struct smb_vc * nt_vc;
struct smb_share * nt_share;
u_int32_t nt_sr_error;
u_int16_t nt_sr_rpflags2;
};
void mbuf_cat_internal(mbuf_t md_top, mbuf_t m0);
int smb_rq_alloc(struct smb_connobj *layer, u_char cmd, vfs_context_t context, struct smb_rq **rqpp);
int smb_rq_init(struct smb_rq *rqp, struct smb_connobj *layer, u_char cmd, vfs_context_t context);
void smb_rq_done(struct smb_rq *rqp);
int smb_rq_getrequest(struct smb_rq *rqp, struct mbchain **mbpp);
int smb_rq_getreply(struct smb_rq *rqp, struct mdchain **mbpp);
void smb_rq_wstart(struct smb_rq *rqp);
void smb_rq_wend(struct smb_rq *rqp);
void smb_rq_bstart(struct smb_rq *rqp);
void smb_rq_bend(struct smb_rq *rqp);
int smb_rq_intr(struct smb_rq *rqp);
int smb_rq_simple(struct smb_rq *rqp);
int smb_rq_simple_timed(struct smb_rq *rqp, int timo);
int smb_t2_alloc(struct smb_connobj *layer, u_short setup, vfs_context_t context,
struct smb_t2rq **rqpp);
int smb_t2_init(struct smb_t2rq *rqp, struct smb_connobj *layer, u_short *setup,
int setupcnt, vfs_context_t context);
void smb_t2_done(struct smb_t2rq *t2p);
int smb_t2_request(struct smb_t2rq *t2p);
u_int32_t smb_t2_err(struct smb_t2rq *t2p);
int smb_nt_alloc(struct smb_connobj *layer, u_short fn, vfs_context_t context, struct smb_ntrq **rqpp);
void smb_nt_done(struct smb_ntrq *ntp);
int smb_nt_request(struct smb_ntrq *ntp);
int smb_nt_reply(struct smb_ntrq *ntp);
int smb_nt_async_request(struct smb_ntrq *ntp, void *nt_callback, void *nt_callback_args);
#endif