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