Home | History | Annotate | Download | only in iscsitgtd
      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 
     27 #pragma D depends_on library net.d
     28 #pragma D depends_on module genunix
     29 #pragma D depends_on library scsi.d
     30 
     31 typedef struct uiscsiproto uiscsiproto_t;
     32 
     33 typedef struct uiscsiproto64 {
     34 	struct sockaddr_storage *uip_taddr;
     35 	struct sockaddr_storage *uip_iaddr;
     36 
     37 	uint64_t uip_target;
     38 	uint64_t uip_initiator;
     39 	uint64_t uip_lun;
     40 
     41 	uint32_t uip_itt;
     42 	uint32_t uip_ttt;
     43 
     44 	uint32_t uip_cmdsn;
     45 	uint32_t uip_statsn;
     46 	uint32_t uip_datasn;
     47 
     48 	uint32_t uip_datalen;
     49 	uint32_t uip_flags;
     50 } uiscsiproto64_t;
     51 
     52 typedef struct uiscsiproto32 {
     53 	struct sockaddr_storage *uip_taddr;
     54 	struct sockaddr_storage *uip_iaddr;
     55 
     56 	uint32_t uip_target;
     57 	uint32_t uip_initiator;
     58 	uint64_t uip_lun;
     59 
     60 	uint32_t uip_itt;
     61 	uint32_t uip_ttt;
     62 
     63 	uint32_t uip_cmdsn;
     64 	uint32_t uip_statsn;
     65 	uint32_t uip_datasn;
     66 
     67 	uint32_t uip_datalen;
     68 	uint32_t uip_flags;
     69 } uiscsiproto32_t;
     70 
     71 #pragma D binding "1.5" translator
     72 translator conninfo_t < uiscsiproto_t *P > {
     73 	ci_local = (2 == *(sa_family_t *)
     74 	    copyin((uintptr_t)((curthread->t_procp->p_model == 0x00100000) ?
     75 	    *(uint32_t *)copyin((uintptr_t)
     76 		&(((uiscsiproto32_t *)P)->uip_taddr), sizeof (uint32_t)) :
     77 	    *(uint64_t *)copyin((uintptr_t)
     78 		&(((uiscsiproto64_t *)P)->uip_taddr), sizeof (uint64_t))),
     79 	    sizeof (sa_family_t))) ?
     80 
     81 	    inet_ntoa((ipaddr_t *)copyin((uintptr_t)
     82 	    &((struct sockaddr_in *)
     83 		((curthread->t_procp->p_model == 0x00100000) ?
     84 	    	*(uint32_t *)copyin((uintptr_t)
     85 		&(((uiscsiproto32_t *)P)->uip_taddr), sizeof (uint32_t)) :
     86 	    	*(uint64_t *)copyin((uintptr_t)
     87 	       	&(((uiscsiproto64_t *)P)->uip_taddr), sizeof (uint64_t))))
     88 	    ->sin_addr, sizeof (ipaddr_t))) :
     89 
     90 	    inet_ntoa6((in6_addr_t *)copyin((uintptr_t)
     91 	    &((struct sockaddr_in6 *)
     92 		((curthread->t_procp->p_model == 0x00100000) ?
     93 	    	*(uint32_t *)copyin((uintptr_t)
     94 		&(((uiscsiproto32_t *)P)->uip_taddr), sizeof (uint32_t)) :
     95 	    	*(uint64_t *)copyin((uintptr_t)
     96 	       	&(((uiscsiproto64_t *)P)->uip_taddr), sizeof (uint64_t))))
     97 	    ->sin6_addr, sizeof (in6_addr_t)));
     98 
     99 	ci_remote = (2 == *(sa_family_t *)
    100 	    copyin((uintptr_t)((curthread->t_procp->p_model == 0x00100000) ?
    101 	    *(uint32_t *)copyin((uintptr_t)
    102 		&(((uiscsiproto32_t *)P)->uip_iaddr), sizeof (uint32_t)) :
    103 	    *(uint64_t *)copyin((uintptr_t)
    104 		&(((uiscsiproto64_t *)P)->uip_iaddr), sizeof (uint64_t))),
    105 	    sizeof (sa_family_t))) ?
    106 
    107 	    inet_ntoa((ipaddr_t *)copyin((uintptr_t)
    108 	    &((struct sockaddr_in *)
    109 		((curthread->t_procp->p_model == 0x00100000) ?
    110 	    	*(uint32_t *)copyin((uintptr_t)
    111 		&(((uiscsiproto32_t *)P)->uip_iaddr), sizeof (uint32_t)) :
    112 	    	*(uint64_t *)copyin((uintptr_t)
    113 	       	&(((uiscsiproto64_t *)P)->uip_iaddr), sizeof (uint64_t))))
    114 	    ->sin_addr, sizeof (ipaddr_t))) :
    115 
    116 	    inet_ntoa6((in6_addr_t *)copyin((uintptr_t)
    117 	    &((struct sockaddr_in6 *)
    118 		((curthread->t_procp->p_model == 0x00100000) ?
    119 	    	*(uint32_t *)copyin((uintptr_t)
    120 		&(((uiscsiproto32_t *)P)->uip_iaddr), sizeof (uint32_t)) :
    121 	    	*(uint64_t *)copyin((uintptr_t)
    122 	       	&(((uiscsiproto64_t *)P)->uip_iaddr), sizeof (uint64_t))))
    123 	    ->sin6_addr, sizeof (in6_addr_t)));
    124 
    125 	ci_protocol = (*(sa_family_t *)copyin((uintptr_t)
    126 	    ((curthread->t_procp->p_model == 0x00100000) ?
    127 
    128 	    *(uint32_t *)copyin((uintptr_t)
    129 		&(((uiscsiproto32_t *)P)->uip_taddr), sizeof (uint32_t)) :
    130 
    131 	    *(uint64_t *)copyin((uintptr_t)
    132 		&(((uiscsiproto64_t *)P)->uip_taddr), sizeof (uint64_t))),
    133 
    134 	    sizeof (sa_family_t)) == 2) ? "ipv4" : "ipv6";
    135 };
    136 
    137 #pragma D binding "1.5" translator
    138 translator iscsiinfo_t < uiscsiproto_t *P > {
    139 	ii_initiator = (curthread->t_procp->p_model == 0x00100000) ?
    140 	    copyinstr((uintptr_t)*(uint32_t *)copyin((uintptr_t)
    141 		&((uiscsiproto32_t *)P)->uip_initiator, sizeof (uint32_t))) :
    142 	    copyinstr((uintptr_t)*(uint64_t *)copyin((uintptr_t)
    143 		&((uiscsiproto64_t *)P)->uip_initiator, sizeof (uint64_t)));
    144 
    145 	ii_target = (curthread->t_procp->p_model == 0x00100000) ?
    146 	    copyinstr((uintptr_t)*(uint32_t *)copyin((uintptr_t)
    147 		&((uiscsiproto32_t *)P)->uip_target, sizeof (uint32_t))) :
    148 	    copyinstr((uintptr_t)*(uint64_t *)copyin((uintptr_t)
    149 		&((uiscsiproto64_t *)P)->uip_target, sizeof (uint64_t)));
    150 
    151 	ii_lun = (curthread->t_procp->p_model == 0x00100000) ?
    152 	    *(uint64_t *)copyin((uintptr_t)
    153 		&((uiscsiproto32_t *)P)->uip_lun, sizeof (uint64_t)) :
    154 	    *(uint64_t *)copyin((uintptr_t)
    155 		&((uiscsiproto64_t *)P)->uip_lun, sizeof (uint64_t));
    156 
    157 	ii_itt = (curthread->t_procp->p_model == 0x00100000) ?
    158 	    *(uint32_t *)copyin((uintptr_t)
    159 		&((uiscsiproto32_t *)P)->uip_itt, sizeof (uint32_t)) :
    160 	    *(uint32_t *)copyin((uintptr_t)
    161 		&((uiscsiproto64_t *)P)->uip_itt, sizeof (uint32_t));
    162 
    163 	ii_ttt = (curthread->t_procp->p_model == 0x00100000) ?
    164 	    *(uint32_t *)copyin((uintptr_t)
    165 		&((uiscsiproto32_t *)P)->uip_ttt, sizeof (uint32_t)) :
    166 	    *(uint32_t *)copyin((uintptr_t)
    167 		&((uiscsiproto64_t *)P)->uip_ttt, sizeof (uint32_t));
    168 
    169 	ii_cmdsn = (curthread->t_procp->p_model == 0x00100000) ?
    170 	    *(uint32_t *)copyin((uintptr_t)
    171 		&((uiscsiproto32_t *)P)->uip_cmdsn, sizeof (uint32_t)) :
    172 	    *(uint32_t *)copyin((uintptr_t)
    173 		&((uiscsiproto64_t *)P)->uip_cmdsn, sizeof (uint32_t));
    174 
    175 	ii_statsn = (curthread->t_procp->p_model == 0x00100000) ?
    176 	    *(uint32_t *)copyin((uintptr_t)
    177 		&((uiscsiproto32_t *)P)->uip_statsn, sizeof (uint32_t)) :
    178 	    *(uint32_t *)copyin((uintptr_t)
    179 		&((uiscsiproto64_t *)P)->uip_statsn, sizeof (uint32_t));
    180 
    181 	ii_datasn = (curthread->t_procp->p_model == 0x00100000) ?
    182 	    *(uint32_t *)copyin((uintptr_t)
    183 		&((uiscsiproto32_t *)P)->uip_datasn, sizeof (uint32_t)) :
    184 	    *(uint32_t *)copyin((uintptr_t)
    185 		&((uiscsiproto64_t *)P)->uip_datasn, sizeof (uint32_t));
    186 
    187 	ii_datalen = (curthread->t_procp->p_model == 0x00100000) ?
    188 	    *(uint32_t *)copyin((uintptr_t)
    189 		&((uiscsiproto32_t *)P)->uip_datalen, sizeof (uint32_t)) :
    190 	    *(uint32_t *)copyin((uintptr_t)
    191 		&((uiscsiproto64_t *)P)->uip_datalen, sizeof (uint32_t));
    192 
    193 	ii_flags = (curthread->t_procp->p_model == 0x00100000) ?
    194 	    *(uint32_t *)copyin((uintptr_t)
    195 		&((uiscsiproto32_t *)P)->uip_flags, sizeof (uint32_t)) :
    196 	    *(uint32_t *)copyin((uintptr_t)
    197 		&((uiscsiproto64_t *)P)->uip_flags, sizeof (uint32_t));
    198 };
    199 
    200 typedef struct iscsicmd {
    201 	uint64_t ic_len;	/* CDB length */
    202 	uint8_t *ic_cdb;	/* CDB data */
    203 } iscsicmd_t;
    204 
    205 typedef struct uiscsicmd {
    206 	uint64_t uic_len;
    207 	uint8_t *uic_cdb;
    208 } uiscsicmd_t;
    209 
    210 #pragma D binding "1.5" translator
    211 translator iscsicmd_t < uiscsicmd_t *P > {
    212 	ic_len = *(uint64_t *)copyin((uintptr_t)&P->uic_len, sizeof (uint64_t));
    213 	ic_cdb = (uint8_t *)copyin((curthread->t_procp->p_model == 0x00100000) ?
    214 	    (uintptr_t)*(uint32_t *)copyin((uintptr_t)&P->uic_cdb,
    215 	    sizeof (uint32_t)) :
    216 	    (uintptr_t)*(uint64_t *)copyin((uintptr_t)&P->uic_cdb,
    217 	    sizeof (uint64_t)),
    218 	    *(uint64_t *)copyin((uintptr_t)&P->uic_len, sizeof (uint64_t)));
    219 };
    220 
    221 inline int ISCSI_FLAG_FINAL = 0x80;
    222 #pragma D binding "1.5" ISCSI_FLAG_FINAL
    223 inline int ISCSI_FLAG_CMD_WRITE = 0x20;
    224 #pragma D binding "1.5" ISCSI_FLAG_CMD_WRITE
    225 inline int ISCSI_FLAG_CMD_READ = 0x40;
    226 #pragma D binding "1.5" ISCSI_FLAG_CMD_READ
    227 inline int ISCSI_FLAG_CMD_BIDI_UNDERFLOW = 0x08;
    228 #pragma D binding "1.5" ISCSI_FLAG_CMD_BIDI_UNDERFLOW
    229 inline int ISCSI_FLAG_CMD_BIDI_OVERFLOW = 0x10;
    230 #pragma D binding "1.5" ISCSI_FLAG_CMD_BIDI_OVERFLOW
    231 inline int ISCSI_FLAG_CMD_UNDERFLOW = 0x02;
    232 #pragma D binding "1.5" ISCSI_FLAG_CMD_UNDERFLOW
    233 inline int ISCSI_FLAG_CMD_OVERFLOW = 0x04;
    234 #pragma D binding "1.5" ISCSI_FLAG_CMD_OVERFLOW
    235 inline int ISCSI_FLAG_DATA_STATUS = 0x01;
    236 #pragma D binding "1.5" ISCSI_FLAG_DATA_STATUS
    237 inline int ISCSI_FLAG_DATA_UNDERFLOW = 0x02;
    238 #pragma D binding "1.5" ISCSI_FLAG_DATA_UNDERFLOW
    239 inline int ISCSI_FLAG_DATA_OVERFLOW = 0x04;
    240 #pragma D binding "1.5" ISCSI_FLAG_DATA_OVERFLOW
    241 inline int ISCSI_FLAG_DATA_ACK = 0x40;
    242 #pragma D binding "1.5" ISCSI_FLAG_DATA_ACK
    243 inline int ISCSI_FLAG_TEXT_CONTINUE = 0x40;
    244 #pragma D binding "1.5" ISCSI_FLAG_TEXT_CONTINUE
    245 inline int ISCSI_FLAG_LOGIN_CONTINUE = 0x40;
    246 #pragma D binding "1.5" ISCSI_FLAG_LOGIN_CONTINUE
    247 inline int ISCSI_FLAG_LOGIN_TRANSIT = 0x80;
    248 #pragma D binding "1.5" ISCSI_FLAG_LOGIN_TRANSIT
    249