Lines Matching refs:sr

490 smbsr_cleanup(smb_request_t *sr)  in smbsr_cleanup()  argument
492 ASSERT((sr->sr_state != SMB_REQ_STATE_CLEANED_UP) && in smbsr_cleanup()
493 (sr->sr_state != SMB_REQ_STATE_COMPLETED)); in smbsr_cleanup()
495 if (sr->r_xa) { in smbsr_cleanup()
496 if (sr->r_xa->xa_flags & SMB_XA_FLAG_COMPLETE) in smbsr_cleanup()
497 smb_xa_close(sr->r_xa); in smbsr_cleanup()
498 smb_xa_rele(sr->session, sr->r_xa); in smbsr_cleanup()
499 sr->r_xa = NULL; in smbsr_cleanup()
507 mutex_enter(&sr->sr_mutex); in smbsr_cleanup()
508 if (sr->sr_state != SMB_REQ_STATE_CANCELLED) in smbsr_cleanup()
509 sr->sr_state = SMB_REQ_STATE_CLEANED_UP; in smbsr_cleanup()
510 mutex_exit(&sr->sr_mutex); in smbsr_cleanup()
532 smb1sr_newrq(smb_request_t *sr) in smb1sr_newrq() argument
542 save_offset = sr->command.chain_offset; in smb1sr_newrq()
543 rc = smb_mbc_decodef(&sr->command, SMB_HEADER_ED_FMT, in smb1sr_newrq()
544 &sr->smb_com, in smb1sr_newrq()
545 &sr->smb_rcls, in smb1sr_newrq()
546 &sr->smb_reh, in smb1sr_newrq()
547 &sr->smb_err, in smb1sr_newrq()
548 &sr->smb_flg, in smb1sr_newrq()
549 &sr->smb_flg2, in smb1sr_newrq()
551 sr->smb_sig, in smb1sr_newrq()
552 &sr->smb_tid, in smb1sr_newrq()
554 &sr->smb_uid, in smb1sr_newrq()
555 &sr->smb_mid); in smb1sr_newrq()
556 sr->command.chain_offset = save_offset; in smb1sr_newrq()
559 smb_request_free(sr); in smb1sr_newrq()
562 sr->smb_pid = (pid_hi << 16) | pid_lo; in smb1sr_newrq()
564 if (sr->smb_com == SMB_COM_NT_CANCEL) { in smb1sr_newrq()
565 if (sr->session->signing.flags & SMB_SIGNING_ENABLED) { in smb1sr_newrq()
566 sr->session->signing.seqnum++; in smb1sr_newrq()
567 sr->sr_seqnum = sr->session->signing.seqnum + 1; in smb1sr_newrq()
568 sr->reply_seqnum = 0; in smb1sr_newrq()
580 rc = smb1sr_newrq_cancel(sr); in smb1sr_newrq()
581 smb_request_free(sr); in smb1sr_newrq()
586 if (sr->session->signing.flags & SMB_SIGNING_ENABLED) { in smb1sr_newrq()
587 sr->session->signing.seqnum += 2; in smb1sr_newrq()
588 sr->sr_seqnum = sr->session->signing.seqnum; in smb1sr_newrq()
589 sr->reply_seqnum = sr->sr_seqnum + 1; in smb1sr_newrq()
597 sr->sr_time_submitted = gethrtime(); in smb1sr_newrq()
598 sr->sr_state = SMB_REQ_STATE_SUBMITTED; in smb1sr_newrq()
599 smb_srqueue_waitq_enter(sr->session->s_srqueue); in smb1sr_newrq()
600 tqid = taskq_dispatch(sr->sr_server->sv_worker_pool, in smb1sr_newrq()
601 smb1_tq_work, sr, TQ_SLEEP); in smb1sr_newrq()
610 smb_request_t *sr; in smb1_tq_work() local
613 sr = (smb_request_t *)arg; in smb1_tq_work()
614 SMB_REQ_VALID(sr); in smb1_tq_work()
616 srq = sr->session->s_srqueue; in smb1_tq_work()
618 sr->sr_worker = curthread; in smb1_tq_work()
619 sr->sr_time_active = gethrtime(); in smb1_tq_work()
625 mutex_enter(&sr->sr_mutex); in smb1_tq_work()
626 if (sr->sr_state == SMB_REQ_STATE_SUBMITTED) in smb1_tq_work()
627 sr->sr_state = SMB_REQ_STATE_ACTIVE; in smb1_tq_work()
628 mutex_exit(&sr->sr_mutex); in smb1_tq_work()
630 smb1sr_work(sr); in smb1_tq_work()
642 smb1sr_work(struct smb_request *sr) in smb1sr_work() argument
654 session = sr->session; in smb1sr_work()
657 ASSERT(sr->tid_tree == 0); in smb1sr_work()
658 ASSERT(sr->uid_user == 0); in smb1sr_work()
659 ASSERT(sr->fid_ofile == 0); in smb1sr_work()
660 sr->smb_fid = (uint16_t)-1; in smb1sr_work()
663 sr->user_cr = zone_kcred(); in smb1sr_work()
664 sr->orig_request_hdr = sr->command.chain_offset; in smb1sr_work()
669 if (smb_mbc_decodef(&sr->command, SMB_HEADER_ED_FMT, in smb1sr_work()
670 &sr->smb_com, in smb1sr_work()
671 &sr->smb_rcls, in smb1sr_work()
672 &sr->smb_reh, in smb1sr_work()
673 &sr->smb_err, in smb1sr_work()
674 &sr->smb_flg, in smb1sr_work()
675 &sr->smb_flg2, in smb1sr_work()
677 sr->smb_sig, in smb1sr_work()
678 &sr->smb_tid, in smb1sr_work()
680 &sr->smb_uid, in smb1sr_work()
681 &sr->smb_mid) != 0) { in smb1sr_work()
685 sr->smb_pid = (pid_hi << 16) | pid_lo; in smb1sr_work()
698 sr->smb_rcls = 0; in smb1sr_work()
699 sr->smb_reh = 0; in smb1sr_work()
700 sr->smb_err = 0; in smb1sr_work()
701 sr->smb_flg2 &= ~SMB_FLAGS2_NT_STATUS; in smb1sr_work()
703 (void) smb_mbc_encodef(&sr->reply, SMB_HEADER_ED_FMT, in smb1sr_work()
704 sr->smb_com, in smb1sr_work()
705 sr->smb_rcls, in smb1sr_work()
706 sr->smb_reh, in smb1sr_work()
707 sr->smb_err, in smb1sr_work()
708 sr->smb_flg, in smb1sr_work()
709 sr->smb_flg2, in smb1sr_work()
711 sr->smb_sig, in smb1sr_work()
712 sr->smb_tid, in smb1sr_work()
714 sr->smb_uid, in smb1sr_work()
715 sr->smb_mid); in smb1sr_work()
716 sr->first_smb_com = sr->smb_com; in smb1sr_work()
719 sr->cur_reply_offset = sr->reply.chain_offset; in smb1sr_work()
722 if ((sr->smb_flg2 & SMB_FLAGS2_SMB_SECURITY_SIGNATURE) == 0 || in smb1sr_work()
723 smb_sign_check_request(sr) != 0) { in smb1sr_work()
724 smbsr_error(sr, NT_STATUS_ACCESS_DENIED, in smb1sr_work()
732 sdd = &smb_disp_table[sr->smb_com]; in smb1sr_work()
734 sds = &server->sv_disp_stats1[sr->smb_com]; in smb1sr_work()
736 if (smb_mbc_decodef(&sr->command, "b", &sr->smb_wct) != 0) { in smb1sr_work()
741 (void) MBC_SHADOW_CHAIN(&sr->smb_vwv, &sr->command, in smb1sr_work()
742 sr->command.chain_offset, sr->smb_wct * 2); in smb1sr_work()
744 if (smb_mbc_decodef(&sr->command, "#.w", sr->smb_wct*2, &sr->smb_bcc)) { in smb1sr_work()
750 (int64_t)(sr->smb_wct * 2 + sr->smb_bcc + 1)); in smb1sr_work()
751 sr->sr_txb = sr->reply.chain_offset; in smb1sr_work()
758 max_bytes = sr->command.max_bytes - sr->command.chain_offset; in smb1sr_work()
759 if (sr->smb_com == SMB_COM_WRITE_ANDX) { in smb1sr_work()
762 } else if (max_bytes < (uint32_t)sr->smb_bcc) { in smb1sr_work()
767 byte_count = (uint32_t)sr->smb_bcc; in smb1sr_work()
770 (void) MBC_SHADOW_CHAIN(&sr->smb_data, &sr->command, in smb1sr_work()
771 sr->command.chain_offset, byte_count); in smb1sr_work()
773 sr->command.chain_offset += byte_count; in smb1sr_work()
774 if (sr->command.chain_offset > sr->command.max_bytes) { in smb1sr_work()
780 sr->cur_reply_offset = sr->reply.chain_offset; in smb1sr_work()
782 if (is_andx_com(sr->smb_com)) { in smb1sr_work()
784 if (smb_mbc_peek(&sr->smb_vwv, sr->smb_vwv.chain_offset, "b.w", in smb1sr_work()
785 &sr->andx_com, &sr->andx_off) < 0) { in smb1sr_work()
790 sr->andx_com = (unsigned char)-1; in smb1sr_work()
793 mutex_enter(&sr->sr_mutex); in smb1sr_work()
794 switch (sr->sr_state) { in smb1sr_work()
798 sr->sr_state = SMB_REQ_STATE_ACTIVE; in smb1sr_work()
810 mutex_exit(&sr->sr_mutex); in smb1sr_work()
819 if (!(sdd->sdt_flags & SDDF_SUPPRESS_UID) && (sr->uid_user == NULL)) { in smb1sr_work()
820 sr->uid_user = smb_session_lookup_uid(session, sr->smb_uid); in smb1sr_work()
821 if (sr->uid_user == NULL) { in smb1sr_work()
822 smbsr_error(sr, 0, ERRSRV, ERRbaduid); in smb1sr_work()
823 smbsr_cleanup(sr); in smb1sr_work()
827 sr->user_cr = smb_user_getcred(sr->uid_user); in smb1sr_work()
829 if (!(sdd->sdt_flags & SDDF_SUPPRESS_TID) && (sr->tid_tree == NULL)) { in smb1sr_work()
830 sr->tid_tree = smb_session_lookup_tree(session, sr->smb_tid); in smb1sr_work()
831 if (sr->tid_tree == NULL) { in smb1sr_work()
832 smbsr_error(sr, 0, ERRSRV, ERRinvnid); in smb1sr_work()
833 smbsr_cleanup(sr); in smb1sr_work()
838 sr->sr_time_start = gethrtime(); in smb1sr_work()
839 if ((sdrc = (*sdd->sdt_pre_op)(sr)) == SDRC_SUCCESS) in smb1sr_work()
840 sdrc = (*sdd->sdt_function)(sr); in smb1sr_work()
843 (*sdd->sdt_post_op)(sr); in smb1sr_work()
844 smbsr_cleanup(sr); in smb1sr_work()
848 smb_latency_add_sample(&sds->sdt_lat, gethrtime() - sr->sr_time_start); in smb1sr_work()
851 (int64_t)(sr->reply.chain_offset - sr->sr_txb)); in smb1sr_work()
867 sr = NULL; in smb1sr_work()
875 smbsr_error(sr, 0, ERRDOS, ERRbadfunc); in smb1sr_work()
882 if (sr->andx_com == 0xff) in smb1sr_work()
889 sr->andx_prev_wct = sr->cur_reply_offset; in smb1sr_work()
890 (void) smb_mbc_poke(&sr->reply, sr->andx_prev_wct + 1, "b.w", in smb1sr_work()
891 sr->andx_com, MBC_LENGTH(&sr->reply)); in smb1sr_work()
893 sr->command.chain_offset = sr->orig_request_hdr + sr->andx_off; in smb1sr_work()
894 sr->smb_com = sr->andx_com; in smb1sr_work()
898 sr->reply.chain_offset = sr->cur_reply_offset; in smb1sr_work()
899 (void) smb_mbc_encodef(&sr->reply, "bw", 0, 0); in smb1sr_work()
901 sr->smb_wct = 0; in smb1sr_work()
902 sr->smb_bcc = 0; in smb1sr_work()
904 if (sr->smb_rcls == 0 && sr->smb_reh == 0 && sr->smb_err == 0) in smb1sr_work()
905 smbsr_error(sr, 0, ERRSRV, ERRerror); in smb1sr_work()
908 smbsr_send_reply(sr); in smb1sr_work()
915 if (sr != NULL) { in smb1sr_work()
916 mutex_enter(&sr->sr_mutex); in smb1sr_work()
917 sr->sr_state = SMB_REQ_STATE_COMPLETED; in smb1sr_work()
918 mutex_exit(&sr->sr_mutex); in smb1sr_work()
919 smb_request_free(sr); in smb1sr_work()
924 smbsr_encode_empty_result(struct smb_request *sr) in smbsr_encode_empty_result() argument
926 return (smbsr_encode_result(sr, 0, 0, "bw", 0, 0)); in smbsr_encode_empty_result()
930 smbsr_encode_result(struct smb_request *sr, int wct, int bcc, in smbsr_encode_result() argument
935 if (MBC_LENGTH(&sr->reply) != sr->cur_reply_offset) in smbsr_encode_result()
939 (void) smb_mbc_vencodef(&sr->reply, fmt, ap); in smbsr_encode_result()
942 sr->smb_wct = (unsigned char)wct; in smbsr_encode_result()
943 sr->smb_bcc = (uint16_t)bcc; in smbsr_encode_result()
945 if (smbsr_check_result(sr, wct, bcc) != 0) in smbsr_encode_result()
952 smbsr_check_result(struct smb_request *sr, int wct, int bcc) in smbsr_check_result() argument
954 int offset = sr->cur_reply_offset; in smbsr_check_result()
960 m = sr->reply.chain; in smbsr_check_result()
969 (void) smb_mbc_peek(&sr->reply, offset, "b", &temp); in smbsr_check_result()
982 (void) smb_mbc_peek(&sr->reply, offset, "bb", &temp, &temp1); in smbsr_check_result()
988 (void) smb_mbc_poke(&sr->reply, offset, "bb", in smbsr_check_result()
1001 sr->smb_wct = (unsigned char)wct; in smbsr_check_result()
1002 sr->smb_bcc = (uint16_t)bcc; in smbsr_check_result()
1007 smbsr_decode_vwv(struct smb_request *sr, const char *fmt, ...) in smbsr_decode_vwv() argument
1013 rc = smb_mbc_vdecodef(&sr->smb_vwv, fmt, ap); in smbsr_decode_vwv()
1017 smbsr_error(sr, 0, ERRSRV, ERRerror); in smbsr_decode_vwv()
1022 smbsr_decode_data(struct smb_request *sr, const char *fmt, ...) in smbsr_decode_data() argument
1028 rc = smb_mbc_vdecodef(&sr->smb_data, fmt, ap); in smbsr_decode_data()
1032 smbsr_error(sr, 0, ERRSRV, ERRerror); in smbsr_decode_data()
1037 smbsr_decode_data_avail(smb_request_t *sr) in smbsr_decode_data_avail() argument
1039 return (sr->smb_data.chain_offset < sr->smb_data.max_bytes); in smbsr_decode_data_avail()
1043 smbsr_send_reply(smb_request_t *sr) in smbsr_send_reply() argument
1047 if (SMB_TREE_IS_CASEINSENSITIVE(sr)) in smbsr_send_reply()
1048 sr->smb_flg |= SMB_FLAGS_CASE_INSENSITIVE; in smbsr_send_reply()
1050 sr->smb_flg &= ~SMB_FLAGS_CASE_INSENSITIVE; in smbsr_send_reply()
1051 pid_hi = sr->smb_pid >> 16; in smbsr_send_reply()
1052 pid_lo = (uint16_t)sr->smb_pid; in smbsr_send_reply()
1054 (void) smb_mbc_poke(&sr->reply, 0, SMB_HEADER_ED_FMT, in smbsr_send_reply()
1055 sr->first_smb_com, in smbsr_send_reply()
1056 sr->smb_rcls, in smbsr_send_reply()
1057 sr->smb_reh, in smbsr_send_reply()
1058 sr->smb_err, in smbsr_send_reply()
1059 sr->smb_flg | SMB_FLAGS_REPLY, in smbsr_send_reply()
1060 sr->smb_flg2, in smbsr_send_reply()
1062 sr->smb_sig, in smbsr_send_reply()
1063 sr->smb_tid, in smbsr_send_reply()
1065 sr->smb_uid, in smbsr_send_reply()
1066 sr->smb_mid); in smbsr_send_reply()
1068 if (sr->session->signing.flags & SMB_SIGNING_ENABLED) in smbsr_send_reply()
1069 smb_sign_reply(sr, NULL); in smbsr_send_reply()
1071 if (smb_session_send(sr->session, 0, &sr->reply) == 0) in smbsr_send_reply()
1072 sr->reply.chain = 0; in smbsr_send_reply()
1090 smbsr_errno(struct smb_request *sr, int errnum) in smbsr_errno() argument
1092 smbsr_map_errno(errnum, &sr->smb_error); in smbsr_errno()
1093 smbsr_set_error(sr, &sr->smb_error); in smbsr_errno()
1100 smbsr_status(smb_request_t *sr, DWORD status, uint16_t errcls, uint16_t errcode) in smbsr_status() argument
1103 sr->smb_error.status = status; in smbsr_status()
1112 if (sr->session->dialect >= SMB_VERS_2_BASE) { in smbsr_status()
1113 smbsr_status_smb2(sr, status); in smbsr_status()
1122 sr->smb_error.errcls = errcls; in smbsr_status()
1123 sr->smb_error.errcode = errcode; in smbsr_status()
1125 smbsr_set_error(sr, &sr->smb_error); in smbsr_status()
1138 smbsr_set_error(smb_request_t *sr, smb_error_t *err) in smbsr_set_error() argument
1143 ASSERT(sr); in smbsr_set_error()
1147 capabilities = sr->session->capabilities; in smbsr_set_error()
1156 sr->smb_rcls = status & 0xff; in smbsr_set_error()
1157 sr->smb_reh = (status >> 8) & 0xff; in smbsr_set_error()
1158 sr->smb_err = status >> 16; in smbsr_set_error()
1159 sr->smb_flg2 |= SMB_FLAGS2_NT_STATUS; in smbsr_set_error()
1162 sr->smb_rcls = ERRSRV; in smbsr_set_error()
1163 sr->smb_err = ERRerror; in smbsr_set_error()
1165 sr->smb_rcls = (uint8_t)err->errcls; in smbsr_set_error()
1166 sr->smb_err = (uint16_t)err->errcode; in smbsr_set_error()
1172 smbsr_lookup_xa(smb_request_t *sr) in smbsr_lookup_xa() argument
1174 ASSERT(sr->r_xa == 0); in smbsr_lookup_xa()
1176 sr->r_xa = smb_xa_find(sr->session, sr->smb_pid, sr->smb_mid); in smbsr_lookup_xa()
1177 return (sr->r_xa); in smbsr_lookup_xa()
1181 smbsr_release_file(smb_request_t *sr) in smbsr_release_file() argument
1183 smb_ofile_t *of = sr->fid_ofile; in smbsr_release_file()
1185 sr->fid_ofile = NULL; in smbsr_release_file()
1190 smbsr_lookup_file(smb_request_t *sr) in smbsr_lookup_file() argument
1192 if (sr->fid_ofile == NULL) in smbsr_lookup_file()
1193 sr->fid_ofile = smb_ofile_lookup_by_fid(sr, sr->smb_fid); in smbsr_lookup_file()
1223 smb_pre_invalid(smb_request_t *sr) in smb_pre_invalid() argument
1225 DTRACE_SMB_START(op__Invalid, smb_request_t *, sr); in smb_pre_invalid()
1230 smb_post_invalid(smb_request_t *sr) in smb_post_invalid() argument
1232 DTRACE_SMB_DONE(op__Invalid, smb_request_t *, sr); in smb_post_invalid()
1236 smb_com_invalid(smb_request_t *sr) in smb_com_invalid() argument
1240 switch (sr->smb_com) { in smb_com_invalid()
1242 smbsr_error(sr, 0, ERRSRV, ERRerror); in smb_com_invalid()
1247 smbsr_error(sr, NT_STATUS_NOT_IMPLEMENTED, in smb_com_invalid()