#ifndef _NETSMB_SMB_RQ_H_
#define _NETSMB_SMB_RQ_H_
#ifndef MB_MSYSTEM
#include <sys/mchain.h>
#endif
#define SMBR_ALLOCED 0x0001
#define SMBR_SENT 0x0002
#define SMBR_REXMIT 0x0004
#define SMBR_INTR 0x0008
#define SMBR_RESTART 0x0010
#define SMBR_NORESTART 0x0020
#define SMBR_MULTIPACKET 0x0040
#define SMBR_INTERNAL 0x0080
#define SMBR_XLOCK 0x0100
#define SMBR_XLOCKWANT 0x0200
#define SMBT2_ALLSENT 0x0001
#define SMBT2_ALLRECV 0x0002
#define SMBT2_ALLOCED 0x0004
#define SMBT2_RESTART 0x0008
#define SMBT2_NORESTART 0x0010
#define SMBT2_SECONDARY 0x0020
#define SMBRQ_SLOCK(rqp) smb_sl_lock(&(rqp)->sr_slock)
#define SMBRQ_SUNLOCK(rqp) smb_sl_unlock(&(rqp)->sr_slock)
#define SMBRQ_SLOCKPTR(rqp) (&(rqp)->sr_slock)
enum smbrq_state {
SMBRQ_NOTSENT,
SMBRQ_SENT,
SMBRQ_REPLYRECEIVED,
SMBRQ_NOTIFIED
};
struct smb_vc;
struct smb_t2rq;
struct smb_rq {
enum smbrq_state sr_state;
struct smb_vc * sr_vc;
struct smb_share* sr_share;
u_short sr_mid;
u_int32_t sr_seqno;
u_int32_t sr_rseqno;
struct mbchain sr_rq;
u_int8_t sr_rqflags;
u_int16_t sr_rqflags2;
u_char * sr_wcount;
void * sr_bcount;
struct mdchain sr_rp;
int sr_rpgen;
int sr_rplast;
int sr_flags;
int sr_rpsize;
struct smb_cred * sr_cred;
int sr_timo;
int sr_rexmit;
int sr_sendcnt;
struct timespec sr_timesent;
int sr_lerror;
u_int8_t * sr_rqsig;
void * sr_rqtid;
void * 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;
struct smb_slock sr_slock;
struct smb_t2rq * sr_t2;
TAILQ_ENTRY(smb_rq) sr_link;
};
struct smb_t2rq {
u_int16_t t2_setupcount;
u_int16_t * t2_setupdata;
u_int16_t t2_setup[2];
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;
struct smb_cred*t2_cred;
struct smb_connobj *t2_source;
struct smb_rq * t2_rq;
struct smb_vc * t2_vc;
};
int smb_rq_alloc(struct smb_connobj *layer, u_char cmd,
struct smb_cred *scred, struct smb_rq **rqpp);
int smb_rq_init(struct smb_rq *rqp, struct smb_connobj *layer, u_char cmd,
struct smb_cred *scred);
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_t2_alloc(struct smb_connobj *layer, u_short setup, struct smb_cred *scred,
struct smb_t2rq **rqpp);
int smb_t2_init(struct smb_t2rq *rqp, struct smb_connobj *layer, u_short setup,
struct smb_cred *scred);
void smb_t2_done(struct smb_t2rq *t2p);
int smb_t2_request(struct smb_t2rq *t2p);
#endif