#ifndef _NETINET_IN_H_
#include <sys/socket.h>
#include <net/if.h>
#include <netinet/in.h>
#endif
#define SMBL_SM 0x0000
#define SMBL_VC 0x0001
#define SMBL_SHARE 0x0002
#define SMBL_VALID 0x0003
#define NSMBFL_OPEN 0x0001
#define NSMBFL_CANCEL 0x0002
#define NSMBFL_SHAREVC 0x0004
#define NSMBFL_TRYBOTH 0x0008
#define SMBO_GONE 0x80000000
#define SMBM_READ 0400
#define SMBM_WRITE 0200
#define SMBM_EXEC 0100
#define SMBM_READGRP 0040
#define SMBM_WRITEGRP 0020
#define SMBM_EXECGRP 0010
#define SMBM_READOTH 0004
#define SMBM_WRITEOTH 0002
#define SMBM_EXECOTH 0001
#define SMBM_MASK 0777
#define SMBM_ALL (SMBM_READ | SMBM_WRITE | SMBM_EXEC)
#define SMBM_DEFAULT (SMBM_READ | SMBM_WRITE | SMBM_EXEC)
#define SMBM_RECONNECT_WAIT_TIME 60 * 10
#define SMBV_USER_SECURITY SMB_SM_USER
#define SMBV_ENCRYPT_PASSWORD SMB_SM_ENCRYPT
#define SMBV_SIGNING SMB_SM_SIGS
#define SMBV_SIGNING_REQUIRED SMB_SM_SIGS_REQ
#define SMBV_SECURITY_MODE_MASK 0x000000ff
#define SMBV_NT4 0x00000100
#define SMBV_WIN2K_XP 0x00000200
#define SMBV_WIN98 0x00000400
#define SMBV_SERVER_MODE_MASK 0x0000ff00
#define SMBV_MECHTYPE_KRB5 0x00020000
#define SMBV_MECHTYPE_NTLMSSP 0x00040000
#define SMBV_AUTH_DONE 0x00080000
#define SMBV_PRIVATE_VC 0x00100000
#define SMBV_KERBEROS_ACCESS 0x00200000
#define SMBV_GUEST_ACCESS 0x00400000
#define SMBV_ANONYMOUS_ACCESS 0x00800000
#define SMBV_MINAUTH 0x1f000000
#define SMBV_MINAUTH_LM 0x01000000
#define SMBV_MINAUTH_NTLM 0x02000000
#define SMBV_MINAUTH_NTLMV2 0x04000000
#define SMBV_MINAUTH_KERBEROS 0x08000000
#define SMBV_NTLMV2_OFF 0x10000000
#define SMBV_SERVER_DOMAIN 0x20000000
#define SMBV_USER_LAND_MASK 0x7ff00000
#define SMBV_GONE SMBO_GONE
#define SMBS_PERMANENT 0x0001
#define SMBS_RECONNECTING 0x0002
#define SMBS_CONNECTED 0x0004
#define SMBS_SFM_VOLUME 0x0020
#define SMBS_MNT_SOFT 0x0040
#define SMBS_INMOUNT 0x0080
#define SMBS_GONE SMBO_GONE
#define SMB_ST_DISK 0x0
#define SMB_ST_PRINTER 0x1
#define SMB_ST_PIPE 0x2
#define SMB_ST_COMM 0x3
#define SMB_ST_ANY 0x4
#define SMB_ST_MAX 0x4
#define SMB_ST_NONE 0xff
struct smb_sopt {
int16_t sv_tz;
u_int32_t sv_maxtx;
u_int16_t sv_maxmux;
u_int16_t sv_maxvcs;
u_int32_t sv_skey;
u_int32_t sv_caps;
u_int64_t sv_unix_caps;
};
enum smbiod_state {
SMBIOD_ST_NOTCONN,
SMBIOD_ST_CONNECT,
SMBIOD_ST_TRANACTIVE,
SMBIOD_ST_NEGOACTIVE,
SMBIOD_ST_SSNSETUP,
SMBIOD_ST_VCACTIVE,
SMBIOD_ST_DEAD,
SMBIOD_ST_RECONNECT
};
#ifdef _KERNEL
#include <sys/lock.h>
#include <netsmb/smb_subr.h>
#define CONNADDREQ(a1,a2) ((a1)->sa_len == (a2)->sa_len && \
bcmp(a1, a2, (a1)->sa_len) == 0)
struct smbioc_negotiate;
struct smbioc_setup;
struct smbioc_share;
TAILQ_HEAD(smb_rqhead, smb_rq);
#define SMB_NBTIMO 15
#define SMB_DEFRQTIMO 30
#define SMBWRTTIMO 60
#define SMBSSNSETUPTIMO 60
#define SMBNOREPLYWAIT (0)
struct smb_tran_desc;
struct smb_dev;
struct smb_connobj;
typedef void smb_co_gone_t (struct smb_connobj *cp, vfs_context_t context);
typedef void smb_co_free_t (struct smb_connobj *cp);
struct smb_connobj {
int co_level;
u_int32_t co_flags;
lck_mtx_t *co_lock;
void *co_lockowner;
int32_t co_lockcount;
uint32_t co_lock_flags;
lck_mtx_t co_interlock;
int co_usecount;
struct smb_connobj * co_parent;
SLIST_HEAD(,smb_connobj)co_children;
SLIST_ENTRY(smb_connobj)co_next;
smb_co_gone_t * co_gone;
smb_co_free_t * co_free;
};
#define SMBFS_CO_LOCK_WAIT 1
#define SMBLIST_FOREACH(var, head, field) \
for((var) = (typeof (var))((head)->slh_first);(var); \
(var) = (typeof(var))(((struct smb_connobj*)var)->field.sle_next))
#define SMBCO_FOREACH(var, cp) SMBLIST_FOREACH((var), &(cp)->co_children, co_next)
struct smb_gss {
mach_port_t gss_mp;
char * gss_spn;
char * gss_cpn;
uint32_t gss_spnlen;
uint32_t gss_tokenlen;
uint8_t * gss_token;
uint64_t gss_ctx;
uint64_t gss_cred;
uint32_t gss_rflags;
uint32_t gss_major;
uint32_t gss_minor;
uint32_t gss_smb_error;
};
#define SMBC_ST_LOCK(vcp) lck_mtx_lock(&(vcp)->vc_stlock)
#define SMBC_ST_UNLOCK(vcp) lck_mtx_unlock(&(vcp)->vc_stlock)
struct smb_vc {
struct smb_connobj obj;
char * vc_srvname;
char * vc_localname;
struct sockaddr*vc_saddr;
struct sockaddr*vc_laddr;
char * vc_username;
char * vc_uppercase_username;
char * vc_pass;
char * vc_domain;
int32_t vc_volume_cnt;
u_int vc_timo;
int vc_maxvcs;
int32_t vc_number;
uid_t vc_uid;
u_short vc_smbuid;
u_char vc_hflags;
u_short vc_hflags2;
void * vc_tdata;
struct smb_tran_desc *vc_tdesc;
int vc_chlen;
u_char vc_ch[SMB_MAXCHALLENGELEN];
u_short vc_mid;
struct smb_sopt vc_sopt;
u_int32_t vc_txmax;
u_int32_t vc_rxmax;
u_int32_t vc_wxmax;
struct smbiod * vc_iod;
lck_mtx_t vc_stlock;
u_int32_t vc_seqno;
u_int8_t *vc_mackey;
u_int32_t vc_mackeylen;
u_int32_t reconnect_wait_time;
u_int32_t *connect_flag;
char *NativeOS;
char *NativeLANManager;
struct smb_gss vc_gss;
void *throttle_info;
};
#define vc_maxmux vc_sopt.sv_maxmux
#define vc_flags obj.co_flags
#define SMB_UNICODE_STRINGS(vcp) ((vcp)->vc_hflags2 & SMB_FLAGS2_UNICODE)
enum smb_fs_types {
SMB_FS_FAT = 0,
SMB_FS_CDFS = 1,
SMB_FS_UDF = 2,
SMB_FS_NTFS_UNKNOWN = 3,
SMB_FS_NTFS = 4,
SMB_FS_NTFS_UNIX = 5,
SMB_FS_MAC_OS_X = 6
};
struct smb_share {
struct smb_connobj obj;
char * ss_name;
struct smbmount* ss_mount;
lck_mtx_t ss_mntlock;
u_short ss_tid;
int ss_type;
enum smb_fs_types ss_fstype;
lck_mtx_t ss_stlock;
u_int32_t ss_attributes;
u_int32_t ss_maxfilenamelen;
char * ss_fsname;
};
#define ss_flags obj.co_flags
#define CPTOVC(cp) ((struct smb_vc*)(cp))
#define VCTOCP(vcp) (&(vcp)->obj)
#define CPTOSS(cp) ((struct smb_share*)(cp))
#define SSTOVC(ssp) CPTOVC(((ssp)->obj.co_parent))
#define SSTOCP(ssp) (&(ssp)->obj)
int smb_sm_init(void);
int smb_sm_done(void);
int smb_sm_negotiate(struct smbioc_negotiate *vcspec, vfs_context_t context, struct smb_vc **vcpp, struct smb_dev *sdp);
int smb_sm_ssnsetup(struct smb_vc *vcp, struct smbioc_setup * sspec, vfs_context_t context);
int smb_sm_tcon(struct smb_vc *vcp, struct smbioc_share *sspec, struct smb_share **shpp, vfs_context_t context);
uint32_t smb_vc_caps(struct smb_vc *vcp);
void parse_server_os_lanman_strings(struct smb_vc *, void * , uint16_t );
int smb_vc_negotiate(struct smb_vc *vcp, vfs_context_t context);
int smb_vc_ssnsetup(struct smb_vc *vcp);
int smb_vc_access(struct smb_vc *vcp, vfs_context_t context);
void smb_vc_ref(struct smb_vc *vcp);
void smb_vc_rele(struct smb_vc *vcp, vfs_context_t context);
int smb_vc_lock(struct smb_vc *vcp);
void smb_vc_unlock(struct smb_vc *vcp);
int smb_vc_reconnect_ref(struct smb_vc *vcp, vfs_context_t context);
void smb_vc_reconnect_rel(struct smb_vc *vcp);
const char * smb_vc_getpass(struct smb_vc *vcp);
u_short smb_vc_nextmid(struct smb_vc *vcp);
void smb_share_ref(struct smb_share *ssp);
void smb_share_rele(struct smb_share *ssp, vfs_context_t context);
const char * smb_share_getpass(struct smb_share *ssp);
int smb_smb_negotiate(struct smb_vc *vcp, vfs_context_t context, vfs_context_t user_context, int inReconnect);
int smb_smb_ssnsetup(struct smb_vc *vcp, vfs_context_t context);
int smb_smb_ssnclose(struct smb_vc *vcp, vfs_context_t context);
int smb_smb_treeconnect(struct smb_share *ssp, vfs_context_t context);
int smb_smb_treedisconnect(struct smb_share *ssp, vfs_context_t context);
int smb_read(struct smb_share *ssp, u_int16_t fid, uio_t uio, vfs_context_t context);
int smb_write(struct smb_share *ssp, u_int16_t fid, uio_t uio, vfs_context_t context, int timo);
int smb_smb_echo(struct smb_vc *vcp, vfs_context_t context, int timo);
int smb_smb_checkdir(struct smb_share *ssp, struct smbnode *dnp, const char *name, size_t nmlen, vfs_context_t context);
#define SMBIOD_INTR_TIMO 2
#define SMBIOD_SLEEP_TIMO 2
#define SMBIOD_PING_TIMO 60 * 2
#define SMB_SEND_WAIT_TIMO 60 * 2
#define SMB_RESP_WAIT_TIMO 60
#define SMBUETIMEOUT 12
#define SMB_MAX_SLEEP_CNT 5
#define NOTIFY_USER_TIMEOUT 5
#define SOFTMOUNT_TIMEOUT 10
#define SMB_IOD_EVLOCKPTR(iod) (&((iod)->iod_evlock))
#define SMB_IOD_EVLOCK(iod) lck_mtx_lock(&((iod)->iod_evlock))
#define SMB_IOD_EVUNLOCK(iod) lck_mtx_unlock(&((iod)->iod_evlock))
#define SMB_IOD_RQLOCKPTR(iod) (&((iod)->iod_rqlock))
#define SMB_IOD_RQLOCK(iod) lck_mtx_lock(&((iod)->iod_rqlock))
#define SMB_IOD_RQUNLOCK(iod) lck_mtx_unlock(&((iod)->iod_rqlock))
#define SMB_IOD_FLAGSLOCKPTR(iod) (&((iod)->iod_flagslock))
#define SMB_IOD_FLAGSLOCK(iod) lck_mtx_lock(&((iod)->iod_flagslock))
#define SMB_IOD_FLAGSUNLOCK(iod) lck_mtx_unlock(&((iod)->iod_flagslock))
#define smb_iod_wakeup(iod) wakeup(&(iod)->iod_flags)
#define SMBIOD_EV_NEWRQ 0x0001
#define SMBIOD_EV_SHUTDOWN 0x0002
#define SMBIOD_EV_DISCONNECT 0x0004
#define SMBIOD_EV_NEGOTIATE 0x0006
#define SMBIOD_EV_SSNSETUP 0x0007
#define SMBIOD_EV_MASK 0x00ff
#define SMBIOD_EV_SYNC 0x0100
#define SMBIOD_EV_PROCESSING 0x0200
struct smbiod_event {
int ev_type;
int ev_error;
void * ev_ident;
STAILQ_ENTRY(smbiod_event) ev_link;
};
#define SMBIOD_SHUTDOWN 0x0001
#define SMBIOD_RUNNING 0x0002
#define SMBIOD_RECONNECT 0x0004
#define SMBIOD_START_RECONNECT 0x0008
#define SMBIOD_VC_NOTRESP 0x0010
struct smbiod {
int iod_id;
int iod_flags;
enum smbiod_state iod_state;
lck_mtx_t iod_flagslock;
int iod_muxcnt;
int iod_asynccnt;
struct timespec iod_sleeptimespec;
struct smb_vc * iod_vc;
lck_mtx_t iod_rqlock;
struct smb_rqhead iod_rqlist;
int iod_muxwant;
vfs_context_t iod_context;
lck_mtx_t iod_evlock;
STAILQ_HEAD(,smbiod_event) iod_evlist;
struct timespec iod_lastrqsent;
struct timespec iod_lastrecv;
struct timespec iod_pingtimo;
int iod_workflag;
struct timespec reconnectStartTime;
};
int smb_iod_nb_intr(struct smb_vc *vcp);
int smb_iod_init(void);
int smb_iod_done(void);
void smb_vc_reset(struct smb_vc *vcp);
int smb_iod_create(struct smb_vc *vcp);
int smb_iod_destroy(struct smbiod *iod);
int smb_iod_request(struct smbiod *iod, int event, void *ident);
int smb_iod_rq_enqueue(struct smb_rq *rqp);
int smb_iod_waitrq(struct smb_rq *rqp);
int smb_iod_removerq(struct smb_rq *rqp);
void smb_iod_shutdown_share(struct smb_share *ssp);
extern lck_grp_attr_t *co_grp_attr;
extern lck_grp_t *co_lck_group;
extern lck_attr_t *co_lck_attr;
extern lck_grp_attr_t *vcst_grp_attr;
extern lck_grp_t *vcst_lck_group;
extern lck_attr_t *vcst_lck_attr;
extern lck_grp_attr_t *ssst_grp_attr;
extern lck_grp_t *ssst_lck_group;
extern lck_attr_t *ssst_lck_attr;
extern lck_grp_attr_t *iodflags_grp_attr;
extern lck_grp_t *iodflags_lck_group;
extern lck_attr_t *iodflags_lck_attr;
extern lck_grp_attr_t *iodrq_grp_attr;
extern lck_grp_t *iodrq_lck_group;
extern lck_attr_t *iodrq_lck_attr;
extern lck_grp_attr_t *iodev_grp_attr;
extern lck_grp_t *iodev_lck_group;
extern lck_attr_t *iodev_lck_attr;
extern lck_grp_attr_t *srs_grp_attr;
extern lck_grp_t *srs_lck_group;
extern lck_attr_t *srs_lck_attr;
#endif