1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 
  22 /*
  23  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  24  * Use is subject to license terms.
  25  *
  26  * Copyright 2018 Nexenta Systems, Inc.  All rights reserved.
  27  */
  28 
  29 #pragma D depends_on library ip.d
  30 #pragma D depends_on library net.d
  31 #pragma D depends_on module genunix
  32 #pragma D depends_on module smbsrv
  33 
  34 #pragma D binding "1.5" translator
  35 translator conninfo_t < struct smb_request *P > {
  36         ci_protocol =
  37             P->session->ipaddr.a_family == AF_INET6 ? "tcp6" :
  38             P->session->ipaddr.a_family == AF_INET ? "tcp" :
  39             "<unknown>";
  40         ci_local = "<any>"; /* not interesting */
  41         ci_remote = P->session->ip_addr_str;
  42 };
  43 
  44 /*
  45  * The smbopinfo_t structure describes the internal form of a
  46  * single SMB request (SMB v1).
  47  */
  48 typedef struct smbopinfo {
  49         cred_t   *soi_cred;             /* credentials for operation */
  50         string   soi_share;             /* share name */
  51         string   soi_curpath;           /* file handle path (if any) */
  52         uint64_t soi_sid;               /* session id */
  53         uint32_t soi_pid;               /* process id */
  54         uint32_t soi_status;            /* status */
  55         uint16_t soi_tid;               /* tree id */
  56         uint16_t soi_uid;               /* user id */
  57         uint16_t soi_mid;               /* request id */
  58         uint16_t soi_fid;               /* file id */
  59         uint16_t soi_flags2;            /* flags2 */
  60         uint8_t  soi_flags;             /* flags */
  61         zoneid_t soi_zoneid;            /* zone identifier */
  62 } smbopinfo_t;
  63 
  64 #pragma D binding "1.5" translator
  65 translator smbopinfo_t < struct smb_request *P > {
  66         soi_cred        = (cred_t *)P->user_cr;
  67         soi_sid         = P->session->s_kid;
  68         soi_pid         = P->smb_pid;
  69         soi_status      = P->smb_error.status;
  70         soi_tid         = P->smb_tid;
  71         soi_uid         = P->smb_uid;
  72         soi_mid         = P->smb_mid;
  73         soi_fid         = P->smb_fid;
  74         soi_flags2      = P->smb_flg2;
  75         soi_flags       = P->smb_flg;
  76         soi_zoneid      = P->sr_server->sv_zid;
  77 
  78         soi_share = (P->tid_tree == NULL) ? "<NULL>" :
  79             P->tid_tree->t_sharename;
  80 
  81         soi_curpath = (P->fid_ofile == NULL ||
  82             P->fid_ofile->f_node == NULL ||
  83             P->fid_ofile->f_node->vp == NULL ||
  84             P->fid_ofile->f_node->vp->v_path == NULL) ? "<NULL>" :
  85             P->fid_ofile->f_node->vp->v_path;
  86 };
  87 
  88 typedef struct smb_rw_args {
  89         off_t   soa_offset;
  90         uint_t  soa_count;
  91 } smb_rw_args_t;
  92 
  93 #pragma D binding "1.5" translator
  94 translator smb_rw_args_t < smb_request_t *P > {
  95         soa_offset = P->arg.rw->rw_offset;
  96         soa_count  = P->arg.rw->rw_count;
  97 };
  98 
  99 typedef struct smb_name_args {
 100         string  soa_name;
 101 } smb_name_args_t;
 102 
 103 #pragma D binding "1.5" translator
 104 translator smb_name_args_t < smb_request_t *P > {
 105         soa_name = (P->arg.dirop.fqi.fq_path.pn_path == NULL) ? "<NULL>" :
 106             P->arg.dirop.fqi.fq_path.pn_path;
 107 };
 108 
 109 typedef struct smb_open_args {
 110         string          soa_name;
 111         uint32_t        soa_desired_access;
 112         uint32_t        soa_share_access;
 113         uint32_t        soa_create_options;
 114         uint32_t        soa_create_disposition;
 115 } smb_open_args_t;
 116 
 117 #pragma D binding "1.5" translator
 118 translator smb_open_args_t < smb_request_t *P > {
 119         soa_name = (P->arg.open.fqi.fq_path.pn_path == NULL) ? "<NULL>" :
 120             P->arg.open.fqi.fq_path.pn_path;
 121         soa_desired_access = P->arg.open.desired_access;
 122         soa_share_access   = P->arg.open.share_access;
 123         soa_create_options = P->arg.open.create_options;
 124         soa_create_disposition = P->arg.open.create_disposition;
 125 };
 126 
 127 /*
 128  * The smb2opinfo_t structure describes the internal form of a
 129  * single SMB2 request (SMB v2 and later).
 130  */
 131 typedef struct smb2opinfo {
 132         cred_t   *soi_cred;             /* credentials for operation */
 133         string   soi_share;             /* share name */
 134         string   soi_curpath;           /* file handle path (if any) */
 135         uint64_t soi_sid;               /* (internal) session ID */
 136         uint64_t soi_mid;               /* Message ID */
 137         uint64_t soi_asyncid;           /* Message ID (when async) */
 138         uint64_t soi_uid;               /* user ID (SMB2 Session ID) */
 139         uint32_t soi_tid;               /* tree ID */
 140         uint32_t soi_status;
 141         uint32_t soi_flags;
 142         zoneid_t soi_zoneid;            /* zone identifier */
 143 } smb2opinfo_t;
 144 
 145 #pragma D binding "1.5" translator
 146 translator smb2opinfo_t < struct smb_request *P > {
 147         soi_cred        = (cred_t *)P->user_cr;
 148         soi_sid         = P->session->s_kid;
 149         soi_mid         = P->smb2_messageid;
 150         soi_asyncid     = P->smb2_async_id;
 151         soi_uid         = P->smb2_ssnid;
 152         soi_tid         = P->smb_tid;
 153         soi_status      = P->smb2_status;
 154         soi_flags       = P->smb2_hdr_flags;
 155         soi_zoneid      = P->sr_server->sv_zid;
 156 
 157         soi_share = (P->tid_tree == NULL) ? "<NULL>" :
 158             P->tid_tree->t_sharename;
 159 
 160         soi_curpath = (P->fid_ofile == NULL ||
 161             P->fid_ofile->f_node == NULL ||
 162             P->fid_ofile->f_node->vp == NULL ||
 163             P->fid_ofile->f_node->vp->v_path == NULL) ? "<NULL>" :
 164             P->fid_ofile->f_node->vp->v_path;
 165 };