| File: | modules/iscsi_initiator/../../dev/iscsi_initiator/iscsi.c |
| Warning: | line 560, column 17 Copies out a struct with a partially unsanitized field |
| 1 | /*- | |||
| 2 | * Copyright (c) 2005-2011 Daniel Braniss <[email protected]> | |||
| 3 | * All rights reserved. | |||
| 4 | * | |||
| 5 | * Redistribution and use in source and binary forms, with or without | |||
| 6 | * modification, are permitted provided that the following conditions | |||
| 7 | * are met: | |||
| 8 | * 1. Redistributions of source code must retain the above copyright | |||
| 9 | * notice, this list of conditions and the following disclaimer. | |||
| 10 | * 2. Redistributions in binary form must reproduce the above copyright | |||
| 11 | * notice, this list of conditions and the following disclaimer in the | |||
| 12 | * documentation and/or other materials provided with the distribution. | |||
| 13 | * | |||
| 14 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND | |||
| 15 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |||
| 16 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |||
| 17 | * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE | |||
| 18 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |||
| 19 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |||
| 20 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |||
| 21 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |||
| 22 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |||
| 23 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
| 24 | * SUCH DAMAGE. | |||
| 25 | * | |||
| 26 | */ | |||
| 27 | /* | |||
| 28 | | $Id: iscsi.c 752 2009-08-20 11:23:28Z danny $ | |||
| 29 | */ | |||
| 30 | ||||
| 31 | #include <sys/cdefs.h> | |||
| 32 | __FBSDID("$FreeBSD: releng/11.0/sys/dev/iscsi_initiator/iscsi.c 298955 2016-05-03 03:41:25Z pfg $")__asm__(".ident\t\"" "$FreeBSD: releng/11.0/sys/dev/iscsi_initiator/iscsi.c 298955 2016-05-03 03:41:25Z pfg $" "\""); | |||
| 33 | ||||
| 34 | #include "opt_iscsi_initiator.h" | |||
| 35 | ||||
| 36 | #include <sys/param.h> | |||
| 37 | #include <sys/capsicum.h> | |||
| 38 | #include <sys/kernel.h> | |||
| 39 | #include <sys/module.h> | |||
| 40 | #include <sys/conf.h> | |||
| 41 | #include <sys/bus.h> | |||
| 42 | #include <sys/systm.h> | |||
| 43 | #include <sys/malloc.h> | |||
| 44 | #include <sys/ctype.h> | |||
| 45 | #include <sys/errno.h> | |||
| 46 | #include <sys/sysctl.h> | |||
| 47 | #include <sys/file.h> | |||
| 48 | #include <sys/uio.h> | |||
| 49 | #include <sys/socketvar.h> | |||
| 50 | #include <sys/socket.h> | |||
| 51 | #include <sys/protosw.h> | |||
| 52 | #include <sys/proc.h> | |||
| 53 | #include <sys/ioccom.h> | |||
| 54 | #include <sys/queue.h> | |||
| 55 | #include <sys/kthread.h> | |||
| 56 | #include <sys/mbuf.h> | |||
| 57 | #include <sys/syslog.h> | |||
| 58 | #include <vm/uma.h> | |||
| 59 | #include <sys/sx.h> | |||
| 60 | ||||
| 61 | #include <dev/iscsi_initiator/iscsi.h> | |||
| 62 | #include <dev/iscsi_initiator/iscsivar.h> | |||
| 63 | static char *iscsi_driver_version = "2.3.1"; | |||
| 64 | ||||
| 65 | static struct isc_softc *isc; | |||
| 66 | ||||
| 67 | MALLOC_DEFINE(M_ISCSI, "iSCSI", "iSCSI driver")struct malloc_type M_ISCSI[1] = { { ((void *)0), 877983977, "iSCSI" , ((void *)0) } }; static struct sysinit M_ISCSI_init_sys_init = { SI_SUB_KMEM, SI_ORDER_THIRD, (sysinit_cfunc_t)(sysinit_nfunc_t )malloc_init, ((void *)(M_ISCSI)) }; __asm__(".globl " "__start_set_sysinit_set" ); __asm__(".globl " "__stop_set_sysinit_set"); static void const * const __set_sysinit_set_sym_M_ISCSI_init_sys_init __attribute__ ((__section__("set_" "sysinit_set"))) __attribute__((__used__ )) = &(M_ISCSI_init_sys_init); static struct sysinit M_ISCSI_uninit_sys_uninit = { SI_SUB_KMEM, SI_ORDER_ANY, (sysinit_cfunc_t)(sysinit_nfunc_t )malloc_uninit, ((void *)(M_ISCSI)) }; __asm__(".globl " "__start_set_sysuninit_set" ); __asm__(".globl " "__stop_set_sysuninit_set"); static void const * const __set_sysuninit_set_sym_M_ISCSI_uninit_sys_uninit __attribute__((__section__("set_" "sysuninit_set"))) __attribute__ ((__used__)) = &(M_ISCSI_uninit_sys_uninit); | |||
| 68 | MALLOC_DEFINE(M_ISCSIBUF, "iSCbuf", "iSCSI buffers")struct malloc_type M_ISCSIBUF[1] = { { ((void *)0), 877983977 , "iSCbuf", ((void *)0) } }; static struct sysinit M_ISCSIBUF_init_sys_init = { SI_SUB_KMEM, SI_ORDER_THIRD, (sysinit_cfunc_t)(sysinit_nfunc_t )malloc_init, ((void *)(M_ISCSIBUF)) }; __asm__(".globl " "__start_set_sysinit_set" ); __asm__(".globl " "__stop_set_sysinit_set"); static void const * const __set_sysinit_set_sym_M_ISCSIBUF_init_sys_init __attribute__ ((__section__("set_" "sysinit_set"))) __attribute__((__used__ )) = &(M_ISCSIBUF_init_sys_init); static struct sysinit M_ISCSIBUF_uninit_sys_uninit = { SI_SUB_KMEM, SI_ORDER_ANY, (sysinit_cfunc_t)(sysinit_nfunc_t )malloc_uninit, ((void *)(M_ISCSIBUF)) }; __asm__(".globl " "__start_set_sysuninit_set" ); __asm__(".globl " "__stop_set_sysuninit_set"); static void const * const __set_sysuninit_set_sym_M_ISCSIBUF_uninit_sys_uninit __attribute__((__section__("set_" "sysuninit_set"))) __attribute__ ((__used__)) = &(M_ISCSIBUF_uninit_sys_uninit); | |||
| 69 | static MALLOC_DEFINE(M_TMP, "iSCtmp", "iSCSI tmp")struct malloc_type M_TMP[1] = { { ((void *)0), 877983977, "iSCtmp" , ((void *)0) } }; static struct sysinit M_TMP_init_sys_init = { SI_SUB_KMEM, SI_ORDER_THIRD, (sysinit_cfunc_t)(sysinit_nfunc_t )malloc_init, ((void *)(M_TMP)) }; __asm__(".globl " "__start_set_sysinit_set" ); __asm__(".globl " "__stop_set_sysinit_set"); static void const * const __set_sysinit_set_sym_M_TMP_init_sys_init __attribute__ ((__section__("set_" "sysinit_set"))) __attribute__((__used__ )) = &(M_TMP_init_sys_init); static struct sysinit M_TMP_uninit_sys_uninit = { SI_SUB_KMEM, SI_ORDER_ANY, (sysinit_cfunc_t)(sysinit_nfunc_t )malloc_uninit, ((void *)(M_TMP)) }; __asm__(".globl " "__start_set_sysuninit_set" ); __asm__(".globl " "__stop_set_sysuninit_set"); static void const * const __set_sysuninit_set_sym_M_TMP_uninit_sys_uninit __attribute__((__section__("set_" "sysuninit_set"))) __attribute__ ((__used__)) = &(M_TMP_uninit_sys_uninit); | |||
| 70 | ||||
| 71 | #ifdef ISCSI_INITIATOR_DEBUG1 | |||
| 72 | int iscsi_debug = ISCSI_INITIATOR_DEBUG1; | |||
| 73 | SYSCTL_INT(_debug, OID_AUTO, iscsi_initiator, CTLFLAG_RW, &iscsi_debug, 0,static struct sysctl_oid sysctl___debug_iscsi_initiator = { . oid_parent = ((&(&sysctl___debug)->oid_children)), .oid_children = { ((void *)0) }, .oid_number = ((-1)), .oid_kind = (2 | 0x00040000 | ((0x80000000|0x40000000))), .oid_arg1 = ( &iscsi_debug), .oid_arg2 = (0), .oid_name = ("iscsi_initiator" ), .oid_handler = (sysctl_handle_int), .oid_fmt = ("I"), .oid_descr = "iSCSI driver debug flag" }; __asm__(".globl " "__start_set_sysctl_set" ); __asm__(".globl " "__stop_set_sysctl_set"); static void const * const __set_sysctl_set_sym_sysctl___debug_iscsi_initiator __attribute__ ((__section__("set_" "sysctl_set"))) __attribute__((__used__) ) = &(sysctl___debug_iscsi_initiator); _Static_assert(((( (0x80000000|0x40000000)) & 0xf) == 0 || (((0x80000000|0x40000000 )) & 0xf) == 2) && sizeof(int) == sizeof(*(&iscsi_debug )), "compile-time assertion failed") | |||
| 74 | "iSCSI driver debug flag")static struct sysctl_oid sysctl___debug_iscsi_initiator = { . oid_parent = ((&(&sysctl___debug)->oid_children)), .oid_children = { ((void *)0) }, .oid_number = ((-1)), .oid_kind = (2 | 0x00040000 | ((0x80000000|0x40000000))), .oid_arg1 = ( &iscsi_debug), .oid_arg2 = (0), .oid_name = ("iscsi_initiator" ), .oid_handler = (sysctl_handle_int), .oid_fmt = ("I"), .oid_descr = "iSCSI driver debug flag" }; __asm__(".globl " "__start_set_sysctl_set" ); __asm__(".globl " "__stop_set_sysctl_set"); static void const * const __set_sysctl_set_sym_sysctl___debug_iscsi_initiator __attribute__ ((__section__("set_" "sysctl_set"))) __attribute__((__used__) ) = &(sysctl___debug_iscsi_initiator); _Static_assert(((( (0x80000000|0x40000000)) & 0xf) == 0 || (((0x80000000|0x40000000 )) & 0xf) == 2) && sizeof(int) == sizeof(*(&iscsi_debug )), "compile-time assertion failed"); | |||
| 75 | ||||
| 76 | struct mtx iscsi_dbg_mtx; | |||
| 77 | #endif | |||
| 78 | ||||
| 79 | static int max_sessions = MAX_SESSIONS64; | |||
| 80 | SYSCTL_INT(_net, OID_AUTO, iscsi_initiator_max_sessions, CTLFLAG_RDTUN,static struct sysctl_oid sysctl___net_iscsi_initiator_max_sessions = { .oid_parent = ((&(&sysctl___net)->oid_children )), .oid_children = { ((void *)0) }, .oid_number = ((-1)), .oid_kind = (2 | 0x00040000 | ((0x80000000|0x00080000))), .oid_arg1 = ( &max_sessions), .oid_arg2 = (0), .oid_name = ("iscsi_initiator_max_sessions" ), .oid_handler = (sysctl_handle_int), .oid_fmt = ("I"), .oid_descr = "Max sessions allowed" }; __asm__(".globl " "__start_set_sysctl_set" ); __asm__(".globl " "__stop_set_sysctl_set"); static void const * const __set_sysctl_set_sym_sysctl___net_iscsi_initiator_max_sessions __attribute__((__section__("set_" "sysctl_set"))) __attribute__ ((__used__)) = &(sysctl___net_iscsi_initiator_max_sessions ); _Static_assert(((((0x80000000|0x00080000)) & 0xf) == 0 || (((0x80000000|0x00080000)) & 0xf) == 2) && sizeof (int) == sizeof(*(&max_sessions)), "compile-time assertion failed" ) | |||
| 81 | &max_sessions, 0, "Max sessions allowed")static struct sysctl_oid sysctl___net_iscsi_initiator_max_sessions = { .oid_parent = ((&(&sysctl___net)->oid_children )), .oid_children = { ((void *)0) }, .oid_number = ((-1)), .oid_kind = (2 | 0x00040000 | ((0x80000000|0x00080000))), .oid_arg1 = ( &max_sessions), .oid_arg2 = (0), .oid_name = ("iscsi_initiator_max_sessions" ), .oid_handler = (sysctl_handle_int), .oid_fmt = ("I"), .oid_descr = "Max sessions allowed" }; __asm__(".globl " "__start_set_sysctl_set" ); __asm__(".globl " "__stop_set_sysctl_set"); static void const * const __set_sysctl_set_sym_sysctl___net_iscsi_initiator_max_sessions __attribute__((__section__("set_" "sysctl_set"))) __attribute__ ((__used__)) = &(sysctl___net_iscsi_initiator_max_sessions ); _Static_assert(((((0x80000000|0x00080000)) & 0xf) == 0 || (((0x80000000|0x00080000)) & 0xf) == 2) && sizeof (int) == sizeof(*(&max_sessions)), "compile-time assertion failed" ); | |||
| 82 | static int max_pdus = MAX_PDUS(64*256); | |||
| 83 | SYSCTL_INT(_net, OID_AUTO, iscsi_initiator_max_pdus, CTLFLAG_RDTUN,static struct sysctl_oid sysctl___net_iscsi_initiator_max_pdus = { .oid_parent = ((&(&sysctl___net)->oid_children )), .oid_children = { ((void *)0) }, .oid_number = ((-1)), .oid_kind = (2 | 0x00040000 | ((0x80000000|0x00080000))), .oid_arg1 = ( &max_pdus), .oid_arg2 = (0), .oid_name = ("iscsi_initiator_max_pdus" ), .oid_handler = (sysctl_handle_int), .oid_fmt = ("I"), .oid_descr = "Max PDU pool" }; __asm__(".globl " "__start_set_sysctl_set" ); __asm__(".globl " "__stop_set_sysctl_set"); static void const * const __set_sysctl_set_sym_sysctl___net_iscsi_initiator_max_pdus __attribute__((__section__("set_" "sysctl_set"))) __attribute__ ((__used__)) = &(sysctl___net_iscsi_initiator_max_pdus); _Static_assert (((((0x80000000|0x00080000)) & 0xf) == 0 || (((0x80000000 |0x00080000)) & 0xf) == 2) && sizeof(int) == sizeof (*(&max_pdus)), "compile-time assertion failed") | |||
| 84 | &max_pdus, 0, "Max PDU pool")static struct sysctl_oid sysctl___net_iscsi_initiator_max_pdus = { .oid_parent = ((&(&sysctl___net)->oid_children )), .oid_children = { ((void *)0) }, .oid_number = ((-1)), .oid_kind = (2 | 0x00040000 | ((0x80000000|0x00080000))), .oid_arg1 = ( &max_pdus), .oid_arg2 = (0), .oid_name = ("iscsi_initiator_max_pdus" ), .oid_handler = (sysctl_handle_int), .oid_fmt = ("I"), .oid_descr = "Max PDU pool" }; __asm__(".globl " "__start_set_sysctl_set" ); __asm__(".globl " "__stop_set_sysctl_set"); static void const * const __set_sysctl_set_sym_sysctl___net_iscsi_initiator_max_pdus __attribute__((__section__("set_" "sysctl_set"))) __attribute__ ((__used__)) = &(sysctl___net_iscsi_initiator_max_pdus); _Static_assert (((((0x80000000|0x00080000)) & 0xf) == 0 || (((0x80000000 |0x00080000)) & 0xf) == 2) && sizeof(int) == sizeof (*(&max_pdus)), "compile-time assertion failed"); | |||
| 85 | ||||
| 86 | static char isid[6+1] = { | |||
| 87 | 0x80, | |||
| 88 | 'D', | |||
| 89 | 'I', | |||
| 90 | 'B', | |||
| 91 | '0', | |||
| 92 | '0', | |||
| 93 | 0 | |||
| 94 | }; | |||
| 95 | ||||
| 96 | static int i_create_session(struct cdev *dev, int *ndev); | |||
| 97 | ||||
| 98 | static int i_ping(struct cdev *dev); | |||
| 99 | static int i_send(struct cdev *dev, caddr_t arg, struct thread *td); | |||
| 100 | static int i_recv(struct cdev *dev, caddr_t arg, struct thread *td); | |||
| 101 | static int i_setsoc(isc_session_t *sp, int fd, struct thread *td); | |||
| 102 | static int i_fullfeature(struct cdev *dev, int flag); | |||
| 103 | ||||
| 104 | static d_open_t iscsi_open; | |||
| 105 | static d_close_t iscsi_close; | |||
| 106 | static d_ioctl_t iscsi_ioctl; | |||
| 107 | #ifdef ISCSI_INITIATOR_DEBUG1 | |||
| 108 | static d_read_t iscsi_read; | |||
| 109 | #endif | |||
| 110 | ||||
| 111 | static struct cdevsw iscsi_cdevsw = { | |||
| 112 | .d_version = D_VERSION0x17122009, | |||
| 113 | .d_open = iscsi_open, | |||
| 114 | .d_close = iscsi_close, | |||
| 115 | .d_ioctl = iscsi_ioctl, | |||
| 116 | #ifdef ISCSI_INITIATOR_DEBUG1 | |||
| 117 | .d_read = iscsi_read, | |||
| 118 | #endif | |||
| 119 | .d_name = "iSCSI", | |||
| 120 | }; | |||
| 121 | ||||
| 122 | static int | |||
| 123 | iscsi_open(struct cdev *dev, int flags, int otype, struct thread *td) | |||
| 124 | { | |||
| 125 | debug_called(8)do {if(8 <= iscsi_debug) printf("%s: called\n", __func__); } while(0); | |||
| 126 | ||||
| 127 | debug(7, "dev=%d", dev2unit(dev))do {if(7 <= iscsi_debug) printf("%s: " "dev=%d" "\n", __func__ , ((dev)->si_drv0));} while(0); | |||
| 128 | ||||
| 129 | if(dev2unit(dev)((dev)->si_drv0) > max_sessions) { | |||
| 130 | // should not happen | |||
| 131 | return ENODEV19; | |||
| 132 | } | |||
| 133 | return 0; | |||
| 134 | } | |||
| 135 | ||||
| 136 | static int | |||
| 137 | iscsi_close(struct cdev *dev, int flag, int otyp, struct thread *td) | |||
| 138 | { | |||
| 139 | isc_session_t *sp; | |||
| 140 | ||||
| 141 | debug_called(8)do {if(8 <= iscsi_debug) printf("%s: called\n", __func__); } while(0); | |||
| 142 | ||||
| 143 | debug(3, "session=%d flag=%x", dev2unit(dev), flag)do {if(3 <= iscsi_debug) printf("%s: " "session=%d flag=%x" "\n", __func__ , ((dev)->si_drv0), flag);} while(0); | |||
| 144 | ||||
| 145 | if(dev2unit(dev)((dev)->si_drv0) == max_sessions) { | |||
| 146 | return 0; | |||
| 147 | } | |||
| 148 | sp = dev->si_drv2; | |||
| 149 | if(sp != NULL((void *)0)) { | |||
| 150 | sdebug(3, "sp->flags=%x", sp->flags )do {if(3 <= iscsi_debug) printf("%d] %s: " "sp->flags=%x" "\n", sp->sid, __func__ , sp->flags);} while(0); | |||
| 151 | /* | |||
| 152 | | if still in full phase, this probably means | |||
| 153 | | that something went really bad. | |||
| 154 | | it could be a result from 'shutdown', in which case | |||
| 155 | | we will ignore it (so buffers can be flushed). | |||
| 156 | | the problem is that there is no way of differentiating | |||
| 157 | | between a shutdown procedure and 'iscontrol' dying. | |||
| 158 | */ | |||
| 159 | if(sp->flags & ISC_FFPHASE(1 <<(8))) | |||
| 160 | // delay in case this is a shutdown. | |||
| 161 | tsleep(sp, PRIBIO, "isc-cls", 60*hz)_sleep((sp), ((void *)0), (((80) + 12)), ("isc-cls"), tick_sbt * (60*hz), 0, 0x0100); | |||
| 162 | ism_stop(sp); | |||
| 163 | } | |||
| 164 | debug(2, "done")do {if(2 <= iscsi_debug) printf("%s: " "done" "\n", __func__ );} while(0); | |||
| 165 | return 0; | |||
| 166 | } | |||
| 167 | ||||
| 168 | static int | |||
| 169 | iscsi_ioctl(struct cdev *dev, u_long cmd, caddr_t arg, int mode, struct thread *td) | |||
| 170 | { | |||
| 171 | struct isc_softc *sc; | |||
| 172 | isc_session_t *sp; | |||
| 173 | isc_opt_t *opt; | |||
| 174 | int error; | |||
| 175 | ||||
| 176 | debug_called(8)do {if(8 <= iscsi_debug) printf("%s: called\n", __func__); } while(0); | |||
| 177 | ||||
| 178 | error = 0; | |||
| 179 | if(dev2unit(dev)((dev)->si_drv0) == max_sessions) { | |||
| 180 | /* | |||
| 181 | | non Session commands | |||
| 182 | */ | |||
| 183 | sc = dev->si_drv1; | |||
| 184 | if(sc == NULL((void *)0)) | |||
| 185 | return ENXIO6; | |||
| 186 | ||||
| 187 | switch(cmd) { | |||
| 188 | case ISCSISETSES((unsigned long) ((0x40000000) | (((sizeof(int)) & ((1 << 13) - 1)) << 16) | ((('i')) << 8) | ((1)))): | |||
| 189 | error = i_create_session(dev, (int *)arg); | |||
| 190 | if(error == 0) | |||
| 191 | break; | |||
| 192 | ||||
| 193 | default: | |||
| 194 | error = ENXIO6; | |||
| 195 | } | |||
| 196 | return error; | |||
| 197 | } | |||
| 198 | /* | |||
| 199 | | session commands | |||
| 200 | */ | |||
| 201 | sp = dev->si_drv2; | |||
| 202 | if(sp == NULL((void *)0)) | |||
| 203 | return ENXIO6; | |||
| 204 | ||||
| 205 | sdebug(6, "dev=%d cmd=%d", dev2unit(dev), (int)(cmd & 0xff))do {if(6 <= iscsi_debug) printf("%d] %s: " "dev=%d cmd=%d" "\n", sp->sid, __func__ , ((dev)->si_drv0), (int)(cmd & 0xff));} while(0); | |||
| 206 | ||||
| 207 | switch(cmd) { | |||
| 208 | case ISCSISETSOC((unsigned long) ((0x80000000) | (((sizeof(int)) & ((1 << 13) - 1)) << 16) | ((('i')) << 8) | ((2)))): | |||
| 209 | error = i_setsoc(sp, *(u_int *)arg, td); | |||
| 210 | break; | |||
| 211 | ||||
| 212 | case ISCSISETOPT((unsigned long) ((0x80000000) | (((sizeof(isc_opt_t)) & ( (1 << 13) - 1)) << 16) | ((('i')) << 8) | ( (5)))): | |||
| 213 | opt = (isc_opt_t *)arg; | |||
| 214 | error = i_setopt(sp, opt); | |||
| 215 | break; | |||
| 216 | ||||
| 217 | case ISCSISEND((unsigned long) ((0x80000000) | (((sizeof(pdu_t)) & ((1 << 13) - 1)) << 16) | ((('i')) << 8) | ((10)))): | |||
| 218 | error = i_send(dev, arg, td); | |||
| 219 | break; | |||
| 220 | ||||
| 221 | case ISCSIRECV((unsigned long) (((0x80000000|0x40000000)) | (((sizeof(pdu_t )) & ((1 << 13) - 1)) << 16) | ((('i')) << 8) | ((11)))): | |||
| 222 | error = i_recv(dev, arg, td); | |||
| 223 | break; | |||
| 224 | ||||
| 225 | case ISCSIPING((unsigned long) ((0x20000000) | (((0) & ((1 << 13) - 1)) << 16) | ((('i')) << 8) | ((20)))): | |||
| 226 | error = i_ping(dev); | |||
| 227 | break; | |||
| 228 | ||||
| 229 | case ISCSISTART((unsigned long) ((0x20000000) | (((0) & ((1 << 13) - 1)) << 16) | ((('i')) << 8) | ((30)))): | |||
| 230 | error = sp->soc == NULL((void *)0)? ENOTCONN57: i_fullfeature(dev, 1); | |||
| 231 | if(error == 0) { | |||
| 232 | sp->proc = td->td_proc; | |||
| 233 | SYSCTL_ADD_INT(&sp->clist, SYSCTL_CHILDREN(sp->oid),({ int *__ptr = (&sp->proc->p_pid); _Static_assert( ((0x80000000) & 0xf) == 0 || ((0x80000000) & 0xf) == 2 , "compile-time assertion failed"); sysctl_add_oid(&sp-> clist, (&(sp->oid)->oid_children), (-1), "pid", 2 | 0x00040000 | (0x80000000), __ptr, sizeof(pid_t), sysctl_handle_int , "I", "control process id"); }) | |||
| 234 | OID_AUTO, "pid", CTLFLAG_RD,({ int *__ptr = (&sp->proc->p_pid); _Static_assert( ((0x80000000) & 0xf) == 0 || ((0x80000000) & 0xf) == 2 , "compile-time assertion failed"); sysctl_add_oid(&sp-> clist, (&(sp->oid)->oid_children), (-1), "pid", 2 | 0x00040000 | (0x80000000), __ptr, sizeof(pid_t), sysctl_handle_int , "I", "control process id"); }) | |||
| 235 | &sp->proc->p_pid, sizeof(pid_t), "control process id")({ int *__ptr = (&sp->proc->p_pid); _Static_assert( ((0x80000000) & 0xf) == 0 || ((0x80000000) & 0xf) == 2 , "compile-time assertion failed"); sysctl_add_oid(&sp-> clist, (&(sp->oid)->oid_children), (-1), "pid", 2 | 0x00040000 | (0x80000000), __ptr, sizeof(pid_t), sysctl_handle_int , "I", "control process id"); }); | |||
| 236 | } | |||
| 237 | break; | |||
| 238 | ||||
| 239 | case ISCSIRESTART((unsigned long) ((0x20000000) | (((0) & ((1 << 13) - 1)) << 16) | ((('i')) << 8) | ((31)))): | |||
| 240 | error = sp->soc == NULL((void *)0)? ENOTCONN57: i_fullfeature(dev, 2); | |||
| 241 | break; | |||
| 242 | ||||
| 243 | case ISCSISTOP((unsigned long) ((0x20000000) | (((0) & ((1 << 13) - 1)) << 16) | ((('i')) << 8) | ((32)))): | |||
| 244 | error = i_fullfeature(dev, 0); | |||
| 245 | break; | |||
| 246 | ||||
| 247 | case ISCSISIGNAL((unsigned long) ((0x80000000) | (((sizeof(int *)) & ((1 << 13) - 1)) << 16) | ((('i')) << 8) | ((21)))): { | |||
| 248 | int sig = *(int *)arg; | |||
| 249 | ||||
| 250 | if(sig < 0 || sig > _SIG_MAXSIG128) | |||
| 251 | error = EINVAL22; | |||
| 252 | else | |||
| 253 | sp->signal = sig; | |||
| 254 | break; | |||
| 255 | } | |||
| 256 | ||||
| 257 | case ISCSIGETCAM((unsigned long) ((0x40000000) | (((sizeof(iscsi_cam_t)) & ((1 << 13) - 1)) << 16) | ((('i')) << 8) | ((33)))): { | |||
| 258 | iscsi_cam_t *cp = (iscsi_cam_t *)arg; | |||
| 259 | ||||
| 260 | error = ic_getCamVals(sp, cp); | |||
| 261 | break; | |||
| 262 | } | |||
| 263 | ||||
| 264 | default: | |||
| 265 | error = ENOIOCTL(-3); | |||
| 266 | } | |||
| 267 | ||||
| 268 | return error; | |||
| 269 | } | |||
| 270 | ||||
| 271 | static int | |||
| 272 | iscsi_read(struct cdev *dev, struct uio *uio, int ioflag) | |||
| 273 | { | |||
| 274 | #ifdef ISCSI_INITIATOR_DEBUG1 | |||
| 275 | struct isc_softc *sc; | |||
| 276 | isc_session_t *sp; | |||
| 277 | pduq_t *pq; | |||
| 278 | char buf[1024]; | |||
| 279 | ||||
| 280 | sc = dev->si_drv1; | |||
| 281 | sp = dev->si_drv2; | |||
| 282 | if(dev2unit(dev)((dev)->si_drv0) == max_sessions) { | |||
| 283 | sprintf(buf, "/----- Session ------/\n"); | |||
| 284 | uiomove(buf, strlen(buf), uio); | |||
| 285 | int i = 0; | |||
| 286 | ||||
| 287 | TAILQ_FOREACH(sp, &sc->isc_sess, sp_link)for ((sp) = (((&sc->isc_sess))->tqh_first); (sp); ( sp) = (((sp))->sp_link.tqe_next)) { | |||
| 288 | if(uio->uio_resid == 0) | |||
| 289 | return 0; | |||
| 290 | sprintf(buf, "%03d] '%s' '%s'\n", i++, sp->opt.targetAddress, sp->opt.targetName); | |||
| 291 | uiomove(buf, strlen(buf), uio); | |||
| 292 | } | |||
| 293 | sprintf(buf, "free npdu_alloc=%d, npdu_max=%d\n", sc->npdu_alloc, sc->npdu_max); | |||
| 294 | uiomove(buf, strlen(buf), uio); | |||
| 295 | } | |||
| 296 | else { | |||
| 297 | int i = 0; | |||
| 298 | struct socket *so = sp->soc; | |||
| 299 | #define pukeit(i, pq)do { sprintf(buf, "%03d] %06x %02x %06x %06x %jd\n", i, (__builtin_constant_p (pq->pdu.ipdu.bhs.OpcodeSpecificFields[1]) ? (((__uint32_t )((__uint16_t)(__builtin_constant_p(((__uint32_t)(pq->pdu. ipdu.bhs.OpcodeSpecificFields[1])) & 0xffff) ? (__uint16_t )(((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [1])) & 0xffff)) << 8 | ((__uint16_t)(((__uint32_t) (pq->pdu.ipdu.bhs.OpcodeSpecificFields[1])) & 0xffff)) >> 8) : __bswap16_var(((__uint32_t)(pq->pdu.ipdu.bhs .OpcodeSpecificFields[1])) & 0xffff))) << 16) | ((__uint16_t )(__builtin_constant_p(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [1])) >> 16) ? (__uint16_t)(((__uint16_t)(((__uint32_t) (pq->pdu.ipdu.bhs.OpcodeSpecificFields[1])) >> 16)) << 8 | ((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [1])) >> 16)) >> 8) : __bswap16_var(((__uint32_t) (pq->pdu.ipdu.bhs.OpcodeSpecificFields[1])) >> 16))) ) : __bswap32_var(pq->pdu.ipdu.bhs.OpcodeSpecificFields[1] )), pq->pdu.ipdu.bhs.opcode, (__builtin_constant_p(pq-> pdu.ipdu.bhs.itt) ? (((__uint32_t)((__uint16_t)(__builtin_constant_p (((__uint32_t)(pq->pdu.ipdu.bhs.itt)) & 0xffff) ? (__uint16_t )(((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs.itt)) & 0xffff)) << 8 | ((__uint16_t)(((__uint32_t)(pq->pdu .ipdu.bhs.itt)) & 0xffff)) >> 8) : __bswap16_var((( __uint32_t)(pq->pdu.ipdu.bhs.itt)) & 0xffff))) << 16) | ((__uint16_t)(__builtin_constant_p(((__uint32_t)(pq-> pdu.ipdu.bhs.itt)) >> 16) ? (__uint16_t)(((__uint16_t)( ((__uint32_t)(pq->pdu.ipdu.bhs.itt)) >> 16)) << 8 | ((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs.itt)) >> 16)) >> 8) : __bswap16_var(((__uint32_t)(pq->pdu.ipdu .bhs.itt)) >> 16)))) : __bswap32_var(pq->pdu.ipdu.bhs .itt)), (__builtin_constant_p(pq->pdu.ipdu.bhs.OpcodeSpecificFields [2]) ? (((__uint32_t)((__uint16_t)(__builtin_constant_p(((__uint32_t )(pq->pdu.ipdu.bhs.OpcodeSpecificFields[2])) & 0xffff) ? (__uint16_t)(((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs .OpcodeSpecificFields[2])) & 0xffff)) << 8 | ((__uint16_t )(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields[2])) & 0xffff)) >> 8) : __bswap16_var(((__uint32_t)(pq-> pdu.ipdu.bhs.OpcodeSpecificFields[2])) & 0xffff))) << 16) | ((__uint16_t)(__builtin_constant_p(((__uint32_t)(pq-> pdu.ipdu.bhs.OpcodeSpecificFields[2])) >> 16) ? (__uint16_t )(((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [2])) >> 16)) << 8 | ((__uint16_t)(((__uint32_t)( pq->pdu.ipdu.bhs.OpcodeSpecificFields[2])) >> 16)) >> 8) : __bswap16_var(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [2])) >> 16)))) : __bswap32_var(pq->pdu.ipdu.bhs.OpcodeSpecificFields [2])), (intmax_t)pq->ts.sec); } while(0) do {\ | |||
| 300 | sprintf(buf, "%03d] %06x %02x %06x %06x %jd\n",\ | |||
| 301 | i, ntohl(pq->pdu.ipdu.bhs.CmdSN)(__builtin_constant_p(pq->pdu.ipdu.bhs.OpcodeSpecificFields [1]) ? (((__uint32_t)((__uint16_t)(__builtin_constant_p(((__uint32_t )(pq->pdu.ipdu.bhs.OpcodeSpecificFields[1])) & 0xffff) ? (__uint16_t)(((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs .OpcodeSpecificFields[1])) & 0xffff)) << 8 | ((__uint16_t )(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields[1])) & 0xffff)) >> 8) : __bswap16_var(((__uint32_t)(pq-> pdu.ipdu.bhs.OpcodeSpecificFields[1])) & 0xffff))) << 16) | ((__uint16_t)(__builtin_constant_p(((__uint32_t)(pq-> pdu.ipdu.bhs.OpcodeSpecificFields[1])) >> 16) ? (__uint16_t )(((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [1])) >> 16)) << 8 | ((__uint16_t)(((__uint32_t)( pq->pdu.ipdu.bhs.OpcodeSpecificFields[1])) >> 16)) >> 8) : __bswap16_var(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [1])) >> 16)))) : __bswap32_var(pq->pdu.ipdu.bhs.OpcodeSpecificFields [1])),\ | |||
| 302 | pq->pdu.ipdu.bhs.opcode, ntohl(pq->pdu.ipdu.bhs.itt)(__builtin_constant_p(pq->pdu.ipdu.bhs.itt) ? (((__uint32_t )((__uint16_t)(__builtin_constant_p(((__uint32_t)(pq->pdu. ipdu.bhs.itt)) & 0xffff) ? (__uint16_t)(((__uint16_t)(((__uint32_t )(pq->pdu.ipdu.bhs.itt)) & 0xffff)) << 8 | ((__uint16_t )(((__uint32_t)(pq->pdu.ipdu.bhs.itt)) & 0xffff)) >> 8) : __bswap16_var(((__uint32_t)(pq->pdu.ipdu.bhs.itt)) & 0xffff))) << 16) | ((__uint16_t)(__builtin_constant_p( ((__uint32_t)(pq->pdu.ipdu.bhs.itt)) >> 16) ? (__uint16_t )(((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs.itt)) >> 16)) << 8 | ((__uint16_t)(((__uint32_t)(pq->pdu.ipdu .bhs.itt)) >> 16)) >> 8) : __bswap16_var(((__uint32_t )(pq->pdu.ipdu.bhs.itt)) >> 16)))) : __bswap32_var(pq ->pdu.ipdu.bhs.itt)),\ | |||
| 303 | ntohl(pq->pdu.ipdu.bhs.ExpStSN)(__builtin_constant_p(pq->pdu.ipdu.bhs.OpcodeSpecificFields [2]) ? (((__uint32_t)((__uint16_t)(__builtin_constant_p(((__uint32_t )(pq->pdu.ipdu.bhs.OpcodeSpecificFields[2])) & 0xffff) ? (__uint16_t)(((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs .OpcodeSpecificFields[2])) & 0xffff)) << 8 | ((__uint16_t )(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields[2])) & 0xffff)) >> 8) : __bswap16_var(((__uint32_t)(pq-> pdu.ipdu.bhs.OpcodeSpecificFields[2])) & 0xffff))) << 16) | ((__uint16_t)(__builtin_constant_p(((__uint32_t)(pq-> pdu.ipdu.bhs.OpcodeSpecificFields[2])) >> 16) ? (__uint16_t )(((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [2])) >> 16)) << 8 | ((__uint16_t)(((__uint32_t)( pq->pdu.ipdu.bhs.OpcodeSpecificFields[2])) >> 16)) >> 8) : __bswap16_var(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [2])) >> 16)))) : __bswap32_var(pq->pdu.ipdu.bhs.OpcodeSpecificFields [2])),\ | |||
| 304 | (intmax_t)pq->ts.sec);\ | |||
| 305 | } while(0) | |||
| 306 | ||||
| 307 | sprintf(buf, "%d/%d /---- hld -----/\n", sp->stats.nhld, sp->stats.max_hld); | |||
| 308 | uiomove(buf, strlen(buf), uio); | |||
| 309 | TAILQ_FOREACH(pq, &sp->hld, pq_link)for ((pq) = (((&sp->hld))->tqh_first); (pq); (pq) = (((pq))->pq_link.tqe_next)) { | |||
| 310 | if(uio->uio_resid == 0) | |||
| 311 | return 0; | |||
| 312 | pukeit(i, pq)do { sprintf(buf, "%03d] %06x %02x %06x %06x %jd\n", i, (__builtin_constant_p (pq->pdu.ipdu.bhs.OpcodeSpecificFields[1]) ? (((__uint32_t )((__uint16_t)(__builtin_constant_p(((__uint32_t)(pq->pdu. ipdu.bhs.OpcodeSpecificFields[1])) & 0xffff) ? (__uint16_t )(((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [1])) & 0xffff)) << 8 | ((__uint16_t)(((__uint32_t) (pq->pdu.ipdu.bhs.OpcodeSpecificFields[1])) & 0xffff)) >> 8) : __bswap16_var(((__uint32_t)(pq->pdu.ipdu.bhs .OpcodeSpecificFields[1])) & 0xffff))) << 16) | ((__uint16_t )(__builtin_constant_p(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [1])) >> 16) ? (__uint16_t)(((__uint16_t)(((__uint32_t) (pq->pdu.ipdu.bhs.OpcodeSpecificFields[1])) >> 16)) << 8 | ((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [1])) >> 16)) >> 8) : __bswap16_var(((__uint32_t) (pq->pdu.ipdu.bhs.OpcodeSpecificFields[1])) >> 16))) ) : __bswap32_var(pq->pdu.ipdu.bhs.OpcodeSpecificFields[1] )), pq->pdu.ipdu.bhs.opcode, (__builtin_constant_p(pq-> pdu.ipdu.bhs.itt) ? (((__uint32_t)((__uint16_t)(__builtin_constant_p (((__uint32_t)(pq->pdu.ipdu.bhs.itt)) & 0xffff) ? (__uint16_t )(((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs.itt)) & 0xffff)) << 8 | ((__uint16_t)(((__uint32_t)(pq->pdu .ipdu.bhs.itt)) & 0xffff)) >> 8) : __bswap16_var((( __uint32_t)(pq->pdu.ipdu.bhs.itt)) & 0xffff))) << 16) | ((__uint16_t)(__builtin_constant_p(((__uint32_t)(pq-> pdu.ipdu.bhs.itt)) >> 16) ? (__uint16_t)(((__uint16_t)( ((__uint32_t)(pq->pdu.ipdu.bhs.itt)) >> 16)) << 8 | ((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs.itt)) >> 16)) >> 8) : __bswap16_var(((__uint32_t)(pq->pdu.ipdu .bhs.itt)) >> 16)))) : __bswap32_var(pq->pdu.ipdu.bhs .itt)), (__builtin_constant_p(pq->pdu.ipdu.bhs.OpcodeSpecificFields [2]) ? (((__uint32_t)((__uint16_t)(__builtin_constant_p(((__uint32_t )(pq->pdu.ipdu.bhs.OpcodeSpecificFields[2])) & 0xffff) ? (__uint16_t)(((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs .OpcodeSpecificFields[2])) & 0xffff)) << 8 | ((__uint16_t )(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields[2])) & 0xffff)) >> 8) : __bswap16_var(((__uint32_t)(pq-> pdu.ipdu.bhs.OpcodeSpecificFields[2])) & 0xffff))) << 16) | ((__uint16_t)(__builtin_constant_p(((__uint32_t)(pq-> pdu.ipdu.bhs.OpcodeSpecificFields[2])) >> 16) ? (__uint16_t )(((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [2])) >> 16)) << 8 | ((__uint16_t)(((__uint32_t)( pq->pdu.ipdu.bhs.OpcodeSpecificFields[2])) >> 16)) >> 8) : __bswap16_var(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [2])) >> 16)))) : __bswap32_var(pq->pdu.ipdu.bhs.OpcodeSpecificFields [2])), (intmax_t)pq->ts.sec); } while(0); i++; | |||
| 313 | uiomove(buf, strlen(buf), uio); | |||
| 314 | } | |||
| 315 | sprintf(buf, "%d/%d /---- rsp -----/\n", sp->stats.nrsp, sp->stats.max_rsp); | |||
| 316 | uiomove(buf, strlen(buf), uio); | |||
| 317 | i = 0; | |||
| 318 | TAILQ_FOREACH(pq, &sp->rsp, pq_link)for ((pq) = (((&sp->rsp))->tqh_first); (pq); (pq) = (((pq))->pq_link.tqe_next)) { | |||
| 319 | if(uio->uio_resid == 0) | |||
| 320 | return 0; | |||
| 321 | pukeit(i, pq)do { sprintf(buf, "%03d] %06x %02x %06x %06x %jd\n", i, (__builtin_constant_p (pq->pdu.ipdu.bhs.OpcodeSpecificFields[1]) ? (((__uint32_t )((__uint16_t)(__builtin_constant_p(((__uint32_t)(pq->pdu. ipdu.bhs.OpcodeSpecificFields[1])) & 0xffff) ? (__uint16_t )(((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [1])) & 0xffff)) << 8 | ((__uint16_t)(((__uint32_t) (pq->pdu.ipdu.bhs.OpcodeSpecificFields[1])) & 0xffff)) >> 8) : __bswap16_var(((__uint32_t)(pq->pdu.ipdu.bhs .OpcodeSpecificFields[1])) & 0xffff))) << 16) | ((__uint16_t )(__builtin_constant_p(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [1])) >> 16) ? (__uint16_t)(((__uint16_t)(((__uint32_t) (pq->pdu.ipdu.bhs.OpcodeSpecificFields[1])) >> 16)) << 8 | ((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [1])) >> 16)) >> 8) : __bswap16_var(((__uint32_t) (pq->pdu.ipdu.bhs.OpcodeSpecificFields[1])) >> 16))) ) : __bswap32_var(pq->pdu.ipdu.bhs.OpcodeSpecificFields[1] )), pq->pdu.ipdu.bhs.opcode, (__builtin_constant_p(pq-> pdu.ipdu.bhs.itt) ? (((__uint32_t)((__uint16_t)(__builtin_constant_p (((__uint32_t)(pq->pdu.ipdu.bhs.itt)) & 0xffff) ? (__uint16_t )(((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs.itt)) & 0xffff)) << 8 | ((__uint16_t)(((__uint32_t)(pq->pdu .ipdu.bhs.itt)) & 0xffff)) >> 8) : __bswap16_var((( __uint32_t)(pq->pdu.ipdu.bhs.itt)) & 0xffff))) << 16) | ((__uint16_t)(__builtin_constant_p(((__uint32_t)(pq-> pdu.ipdu.bhs.itt)) >> 16) ? (__uint16_t)(((__uint16_t)( ((__uint32_t)(pq->pdu.ipdu.bhs.itt)) >> 16)) << 8 | ((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs.itt)) >> 16)) >> 8) : __bswap16_var(((__uint32_t)(pq->pdu.ipdu .bhs.itt)) >> 16)))) : __bswap32_var(pq->pdu.ipdu.bhs .itt)), (__builtin_constant_p(pq->pdu.ipdu.bhs.OpcodeSpecificFields [2]) ? (((__uint32_t)((__uint16_t)(__builtin_constant_p(((__uint32_t )(pq->pdu.ipdu.bhs.OpcodeSpecificFields[2])) & 0xffff) ? (__uint16_t)(((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs .OpcodeSpecificFields[2])) & 0xffff)) << 8 | ((__uint16_t )(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields[2])) & 0xffff)) >> 8) : __bswap16_var(((__uint32_t)(pq-> pdu.ipdu.bhs.OpcodeSpecificFields[2])) & 0xffff))) << 16) | ((__uint16_t)(__builtin_constant_p(((__uint32_t)(pq-> pdu.ipdu.bhs.OpcodeSpecificFields[2])) >> 16) ? (__uint16_t )(((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [2])) >> 16)) << 8 | ((__uint16_t)(((__uint32_t)( pq->pdu.ipdu.bhs.OpcodeSpecificFields[2])) >> 16)) >> 8) : __bswap16_var(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [2])) >> 16)))) : __bswap32_var(pq->pdu.ipdu.bhs.OpcodeSpecificFields [2])), (intmax_t)pq->ts.sec); } while(0); i++; | |||
| 322 | uiomove(buf, strlen(buf), uio); | |||
| 323 | } | |||
| 324 | sprintf(buf, "%d/%d /---- csnd -----/\n", sp->stats.ncsnd, sp->stats.max_csnd); | |||
| 325 | i = 0; | |||
| 326 | uiomove(buf, strlen(buf), uio); | |||
| 327 | TAILQ_FOREACH(pq, &sp->csnd, pq_link)for ((pq) = (((&sp->csnd))->tqh_first); (pq); (pq) = (((pq))->pq_link.tqe_next)) { | |||
| 328 | if(uio->uio_resid == 0) | |||
| 329 | return 0; | |||
| 330 | pukeit(i, pq)do { sprintf(buf, "%03d] %06x %02x %06x %06x %jd\n", i, (__builtin_constant_p (pq->pdu.ipdu.bhs.OpcodeSpecificFields[1]) ? (((__uint32_t )((__uint16_t)(__builtin_constant_p(((__uint32_t)(pq->pdu. ipdu.bhs.OpcodeSpecificFields[1])) & 0xffff) ? (__uint16_t )(((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [1])) & 0xffff)) << 8 | ((__uint16_t)(((__uint32_t) (pq->pdu.ipdu.bhs.OpcodeSpecificFields[1])) & 0xffff)) >> 8) : __bswap16_var(((__uint32_t)(pq->pdu.ipdu.bhs .OpcodeSpecificFields[1])) & 0xffff))) << 16) | ((__uint16_t )(__builtin_constant_p(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [1])) >> 16) ? (__uint16_t)(((__uint16_t)(((__uint32_t) (pq->pdu.ipdu.bhs.OpcodeSpecificFields[1])) >> 16)) << 8 | ((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [1])) >> 16)) >> 8) : __bswap16_var(((__uint32_t) (pq->pdu.ipdu.bhs.OpcodeSpecificFields[1])) >> 16))) ) : __bswap32_var(pq->pdu.ipdu.bhs.OpcodeSpecificFields[1] )), pq->pdu.ipdu.bhs.opcode, (__builtin_constant_p(pq-> pdu.ipdu.bhs.itt) ? (((__uint32_t)((__uint16_t)(__builtin_constant_p (((__uint32_t)(pq->pdu.ipdu.bhs.itt)) & 0xffff) ? (__uint16_t )(((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs.itt)) & 0xffff)) << 8 | ((__uint16_t)(((__uint32_t)(pq->pdu .ipdu.bhs.itt)) & 0xffff)) >> 8) : __bswap16_var((( __uint32_t)(pq->pdu.ipdu.bhs.itt)) & 0xffff))) << 16) | ((__uint16_t)(__builtin_constant_p(((__uint32_t)(pq-> pdu.ipdu.bhs.itt)) >> 16) ? (__uint16_t)(((__uint16_t)( ((__uint32_t)(pq->pdu.ipdu.bhs.itt)) >> 16)) << 8 | ((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs.itt)) >> 16)) >> 8) : __bswap16_var(((__uint32_t)(pq->pdu.ipdu .bhs.itt)) >> 16)))) : __bswap32_var(pq->pdu.ipdu.bhs .itt)), (__builtin_constant_p(pq->pdu.ipdu.bhs.OpcodeSpecificFields [2]) ? (((__uint32_t)((__uint16_t)(__builtin_constant_p(((__uint32_t )(pq->pdu.ipdu.bhs.OpcodeSpecificFields[2])) & 0xffff) ? (__uint16_t)(((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs .OpcodeSpecificFields[2])) & 0xffff)) << 8 | ((__uint16_t )(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields[2])) & 0xffff)) >> 8) : __bswap16_var(((__uint32_t)(pq-> pdu.ipdu.bhs.OpcodeSpecificFields[2])) & 0xffff))) << 16) | ((__uint16_t)(__builtin_constant_p(((__uint32_t)(pq-> pdu.ipdu.bhs.OpcodeSpecificFields[2])) >> 16) ? (__uint16_t )(((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [2])) >> 16)) << 8 | ((__uint16_t)(((__uint32_t)( pq->pdu.ipdu.bhs.OpcodeSpecificFields[2])) >> 16)) >> 8) : __bswap16_var(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [2])) >> 16)))) : __bswap32_var(pq->pdu.ipdu.bhs.OpcodeSpecificFields [2])), (intmax_t)pq->ts.sec); } while(0); i++; | |||
| 331 | uiomove(buf, strlen(buf), uio); | |||
| 332 | } | |||
| 333 | sprintf(buf, "%d/%d /---- wsnd -----/\n", sp->stats.nwsnd, sp->stats.max_wsnd); | |||
| 334 | i = 0; | |||
| 335 | uiomove(buf, strlen(buf), uio); | |||
| 336 | TAILQ_FOREACH(pq, &sp->wsnd, pq_link)for ((pq) = (((&sp->wsnd))->tqh_first); (pq); (pq) = (((pq))->pq_link.tqe_next)) { | |||
| 337 | if(uio->uio_resid == 0) | |||
| 338 | return 0; | |||
| 339 | pukeit(i, pq)do { sprintf(buf, "%03d] %06x %02x %06x %06x %jd\n", i, (__builtin_constant_p (pq->pdu.ipdu.bhs.OpcodeSpecificFields[1]) ? (((__uint32_t )((__uint16_t)(__builtin_constant_p(((__uint32_t)(pq->pdu. ipdu.bhs.OpcodeSpecificFields[1])) & 0xffff) ? (__uint16_t )(((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [1])) & 0xffff)) << 8 | ((__uint16_t)(((__uint32_t) (pq->pdu.ipdu.bhs.OpcodeSpecificFields[1])) & 0xffff)) >> 8) : __bswap16_var(((__uint32_t)(pq->pdu.ipdu.bhs .OpcodeSpecificFields[1])) & 0xffff))) << 16) | ((__uint16_t )(__builtin_constant_p(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [1])) >> 16) ? (__uint16_t)(((__uint16_t)(((__uint32_t) (pq->pdu.ipdu.bhs.OpcodeSpecificFields[1])) >> 16)) << 8 | ((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [1])) >> 16)) >> 8) : __bswap16_var(((__uint32_t) (pq->pdu.ipdu.bhs.OpcodeSpecificFields[1])) >> 16))) ) : __bswap32_var(pq->pdu.ipdu.bhs.OpcodeSpecificFields[1] )), pq->pdu.ipdu.bhs.opcode, (__builtin_constant_p(pq-> pdu.ipdu.bhs.itt) ? (((__uint32_t)((__uint16_t)(__builtin_constant_p (((__uint32_t)(pq->pdu.ipdu.bhs.itt)) & 0xffff) ? (__uint16_t )(((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs.itt)) & 0xffff)) << 8 | ((__uint16_t)(((__uint32_t)(pq->pdu .ipdu.bhs.itt)) & 0xffff)) >> 8) : __bswap16_var((( __uint32_t)(pq->pdu.ipdu.bhs.itt)) & 0xffff))) << 16) | ((__uint16_t)(__builtin_constant_p(((__uint32_t)(pq-> pdu.ipdu.bhs.itt)) >> 16) ? (__uint16_t)(((__uint16_t)( ((__uint32_t)(pq->pdu.ipdu.bhs.itt)) >> 16)) << 8 | ((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs.itt)) >> 16)) >> 8) : __bswap16_var(((__uint32_t)(pq->pdu.ipdu .bhs.itt)) >> 16)))) : __bswap32_var(pq->pdu.ipdu.bhs .itt)), (__builtin_constant_p(pq->pdu.ipdu.bhs.OpcodeSpecificFields [2]) ? (((__uint32_t)((__uint16_t)(__builtin_constant_p(((__uint32_t )(pq->pdu.ipdu.bhs.OpcodeSpecificFields[2])) & 0xffff) ? (__uint16_t)(((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs .OpcodeSpecificFields[2])) & 0xffff)) << 8 | ((__uint16_t )(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields[2])) & 0xffff)) >> 8) : __bswap16_var(((__uint32_t)(pq-> pdu.ipdu.bhs.OpcodeSpecificFields[2])) & 0xffff))) << 16) | ((__uint16_t)(__builtin_constant_p(((__uint32_t)(pq-> pdu.ipdu.bhs.OpcodeSpecificFields[2])) >> 16) ? (__uint16_t )(((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [2])) >> 16)) << 8 | ((__uint16_t)(((__uint32_t)( pq->pdu.ipdu.bhs.OpcodeSpecificFields[2])) >> 16)) >> 8) : __bswap16_var(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [2])) >> 16)))) : __bswap32_var(pq->pdu.ipdu.bhs.OpcodeSpecificFields [2])), (intmax_t)pq->ts.sec); } while(0); i++; | |||
| 340 | uiomove(buf, strlen(buf), uio); | |||
| 341 | } | |||
| 342 | sprintf(buf, "%d/%d /---- isnd -----/\n", sp->stats.nisnd, sp->stats.max_isnd); | |||
| 343 | i = 0; | |||
| 344 | uiomove(buf, strlen(buf), uio); | |||
| 345 | TAILQ_FOREACH(pq, &sp->isnd, pq_link)for ((pq) = (((&sp->isnd))->tqh_first); (pq); (pq) = (((pq))->pq_link.tqe_next)) { | |||
| 346 | if(uio->uio_resid == 0) | |||
| 347 | return 0; | |||
| 348 | pukeit(i, pq)do { sprintf(buf, "%03d] %06x %02x %06x %06x %jd\n", i, (__builtin_constant_p (pq->pdu.ipdu.bhs.OpcodeSpecificFields[1]) ? (((__uint32_t )((__uint16_t)(__builtin_constant_p(((__uint32_t)(pq->pdu. ipdu.bhs.OpcodeSpecificFields[1])) & 0xffff) ? (__uint16_t )(((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [1])) & 0xffff)) << 8 | ((__uint16_t)(((__uint32_t) (pq->pdu.ipdu.bhs.OpcodeSpecificFields[1])) & 0xffff)) >> 8) : __bswap16_var(((__uint32_t)(pq->pdu.ipdu.bhs .OpcodeSpecificFields[1])) & 0xffff))) << 16) | ((__uint16_t )(__builtin_constant_p(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [1])) >> 16) ? (__uint16_t)(((__uint16_t)(((__uint32_t) (pq->pdu.ipdu.bhs.OpcodeSpecificFields[1])) >> 16)) << 8 | ((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [1])) >> 16)) >> 8) : __bswap16_var(((__uint32_t) (pq->pdu.ipdu.bhs.OpcodeSpecificFields[1])) >> 16))) ) : __bswap32_var(pq->pdu.ipdu.bhs.OpcodeSpecificFields[1] )), pq->pdu.ipdu.bhs.opcode, (__builtin_constant_p(pq-> pdu.ipdu.bhs.itt) ? (((__uint32_t)((__uint16_t)(__builtin_constant_p (((__uint32_t)(pq->pdu.ipdu.bhs.itt)) & 0xffff) ? (__uint16_t )(((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs.itt)) & 0xffff)) << 8 | ((__uint16_t)(((__uint32_t)(pq->pdu .ipdu.bhs.itt)) & 0xffff)) >> 8) : __bswap16_var((( __uint32_t)(pq->pdu.ipdu.bhs.itt)) & 0xffff))) << 16) | ((__uint16_t)(__builtin_constant_p(((__uint32_t)(pq-> pdu.ipdu.bhs.itt)) >> 16) ? (__uint16_t)(((__uint16_t)( ((__uint32_t)(pq->pdu.ipdu.bhs.itt)) >> 16)) << 8 | ((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs.itt)) >> 16)) >> 8) : __bswap16_var(((__uint32_t)(pq->pdu.ipdu .bhs.itt)) >> 16)))) : __bswap32_var(pq->pdu.ipdu.bhs .itt)), (__builtin_constant_p(pq->pdu.ipdu.bhs.OpcodeSpecificFields [2]) ? (((__uint32_t)((__uint16_t)(__builtin_constant_p(((__uint32_t )(pq->pdu.ipdu.bhs.OpcodeSpecificFields[2])) & 0xffff) ? (__uint16_t)(((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs .OpcodeSpecificFields[2])) & 0xffff)) << 8 | ((__uint16_t )(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields[2])) & 0xffff)) >> 8) : __bswap16_var(((__uint32_t)(pq-> pdu.ipdu.bhs.OpcodeSpecificFields[2])) & 0xffff))) << 16) | ((__uint16_t)(__builtin_constant_p(((__uint32_t)(pq-> pdu.ipdu.bhs.OpcodeSpecificFields[2])) >> 16) ? (__uint16_t )(((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [2])) >> 16)) << 8 | ((__uint16_t)(((__uint32_t)( pq->pdu.ipdu.bhs.OpcodeSpecificFields[2])) >> 16)) >> 8) : __bswap16_var(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [2])) >> 16)))) : __bswap32_var(pq->pdu.ipdu.bhs.OpcodeSpecificFields [2])), (intmax_t)pq->ts.sec); } while(0); i++; | |||
| 349 | uiomove(buf, strlen(buf), uio); | |||
| 350 | } | |||
| 351 | ||||
| 352 | sprintf(buf, "/---- Stats ---/\n"); | |||
| 353 | uiomove(buf, strlen(buf), uio); | |||
| 354 | ||||
| 355 | sprintf(buf, "recv=%d sent=%d\n", sp->stats.nrecv, sp->stats.nsent); | |||
| 356 | uiomove(buf, strlen(buf), uio); | |||
| 357 | ||||
| 358 | sprintf(buf, "flags=%x pdus: alloc=%d max=%d\n", | |||
| 359 | sp->flags, sc->npdu_alloc, sc->npdu_max); | |||
| 360 | uiomove(buf, strlen(buf), uio); | |||
| 361 | ||||
| 362 | sprintf(buf, "cws=%d last cmd=%x exp=%x max=%x stat=%x itt=%x\n", | |||
| 363 | sp->cws, sp->sn.cmd, sp->sn.expCmd, sp->sn.maxCmd, sp->sn.stat, sp->sn.itt); | |||
| 364 | uiomove(buf, strlen(buf), uio); | |||
| 365 | ||||
| 366 | sprintf(buf, "/---- socket -----/\nso_count=%d so_state=%x\n", so->so_count, so->so_state); | |||
| 367 | uiomove(buf, strlen(buf), uio); | |||
| 368 | ||||
| 369 | } | |||
| 370 | #endif | |||
| 371 | return 0; | |||
| 372 | } | |||
| 373 | ||||
| 374 | static int | |||
| 375 | i_ping(struct cdev *dev) | |||
| 376 | { | |||
| 377 | return 0; | |||
| 378 | } | |||
| 379 | /* | |||
| 380 | | low level I/O | |||
| 381 | */ | |||
| 382 | static int | |||
| 383 | i_setsoc(isc_session_t *sp, int fd, struct thread *td) | |||
| 384 | { | |||
| 385 | cap_rights_t rights; | |||
| 386 | int error = 0; | |||
| 387 | ||||
| 388 | if(sp->soc != NULL((void *)0)) | |||
| 389 | isc_stop_receiver(sp); | |||
| 390 | ||||
| 391 | error = fget(td, fd, cap_rights_init(&rights, CAP_SOCK_CLIENT)__cap_rights_init(0, &rights, (((1ULL << (57 + (0)) ) | (0x0000000080000000ULL)) | ((1ULL << (57 + (0))) | ( 0x0000000100000000ULL)) | ((1ULL << (57 + (0))) | (0x0000000200000000ULL )) | ((1ULL << (57 + (0))) | (0x0000000400000000ULL)) | ((1ULL << (57 + (0))) | (0x0000001000000000ULL)) | ((1ULL << (57 + (0))) | (0x0000000000000001ULL)) | ((1ULL << (57 + (0))) | (0x0000000000000002ULL)) | ((1ULL << (57 + (0))) | (0x0000002000000000ULL)) | ((1ULL << (57 + ( 0))) | (0x0000004000000000ULL))), 0ULL), &sp->fp); | |||
| 392 | if(error) | |||
| 393 | return error; | |||
| 394 | ||||
| 395 | error = fgetsock(td, fd, cap_rights_init(&rights, CAP_SOCK_CLIENT)__cap_rights_init(0, &rights, (((1ULL << (57 + (0)) ) | (0x0000000080000000ULL)) | ((1ULL << (57 + (0))) | ( 0x0000000100000000ULL)) | ((1ULL << (57 + (0))) | (0x0000000200000000ULL )) | ((1ULL << (57 + (0))) | (0x0000000400000000ULL)) | ((1ULL << (57 + (0))) | (0x0000001000000000ULL)) | ((1ULL << (57 + (0))) | (0x0000000000000001ULL)) | ((1ULL << (57 + (0))) | (0x0000000000000002ULL)) | ((1ULL << (57 + (0))) | (0x0000002000000000ULL)) | ((1ULL << (57 + ( 0))) | (0x0000004000000000ULL))), 0ULL), | |||
| 396 | &sp->soc, 0); | |||
| 397 | if(error == 0) { | |||
| 398 | sp->td = td; | |||
| 399 | isc_start_receiver(sp); | |||
| 400 | } | |||
| 401 | else { | |||
| 402 | fdrop(sp->fp, td)(refcount_release(&(sp->fp)->f_count) ? _fdrop((sp-> fp), (td)) : _fnoop()); | |||
| 403 | sp->fp = NULL((void *)0); | |||
| 404 | } | |||
| 405 | ||||
| 406 | return error; | |||
| 407 | } | |||
| 408 | ||||
| 409 | static int | |||
| 410 | i_send(struct cdev *dev, caddr_t arg, struct thread *td) | |||
| 411 | { | |||
| 412 | isc_session_t *sp = dev->si_drv2; | |||
| 413 | caddr_t bp; | |||
| 414 | pduq_t *pq; | |||
| 415 | pdu_t *pp; | |||
| 416 | int n, error; | |||
| 417 | ||||
| 418 | debug_called(8)do {if(8 <= iscsi_debug) printf("%s: called\n", __func__); } while(0); | |||
| 419 | ||||
| 420 | if(sp->soc == NULL((void *)0)) | |||
| 421 | return ENOTCONN57; | |||
| 422 | ||||
| 423 | if((pq = pdu_alloc(sp->isc, M_NOWAIT0x0001)) == NULL((void *)0)) | |||
| 424 | return EAGAIN35; | |||
| 425 | pp = &pq->pdu; | |||
| 426 | pq->pdu = *(pdu_t *)arg; | |||
| 427 | if((error = i_prepPDU(sp, pq)) != 0) | |||
| 428 | goto out; | |||
| 429 | ||||
| 430 | bp = NULL((void *)0); | |||
| 431 | if((pq->len - sizeof(union ipdu_u)) > 0) { | |||
| 432 | pq->buf = bp = malloc(pq->len - sizeof(union ipdu_u), M_ISCSIBUF, M_NOWAIT0x0001); | |||
| 433 | if(pq->buf == NULL((void *)0)) { | |||
| 434 | error = EAGAIN35; | |||
| 435 | goto out; | |||
| 436 | } | |||
| 437 | } | |||
| 438 | else | |||
| 439 | pq->buf = NULL((void *)0); // just in case? | |||
| 440 | ||||
| 441 | sdebug(2, "len=%d ahs_len=%d ds_len=%d buf=%zu@%p",do {if(2 <= iscsi_debug) printf("%d] %s: " "len=%d ahs_len=%d ds_len=%d buf=%zu@%p" "\n", sp->sid, __func__ , pq->len, pp->ahs_len, pp-> ds_len, pq->len - sizeof(union ipdu_u), bp);} while(0) | |||
| 442 | pq->len, pp->ahs_len, pp->ds_len, pq->len - sizeof(union ipdu_u), bp)do {if(2 <= iscsi_debug) printf("%d] %s: " "len=%d ahs_len=%d ds_len=%d buf=%zu@%p" "\n", sp->sid, __func__ , pq->len, pp->ahs_len, pp-> ds_len, pq->len - sizeof(union ipdu_u), bp);} while(0); | |||
| 443 | ||||
| 444 | if(pp->ahs_len) { | |||
| 445 | // XXX: never tested, looks suspicious | |||
| 446 | n = pp->ahs_len; | |||
| 447 | error = copyin(pp->ahs_addr, bp, n); | |||
| 448 | if(error != 0) { | |||
| 449 | sdebug(3, "copyin ahs: error=%d", error)do {if(3 <= iscsi_debug) printf("%d] %s: " "copyin ahs: error=%d" "\n", sp->sid, __func__ , error);} while(0); | |||
| 450 | goto out; | |||
| 451 | } | |||
| 452 | pp->ahs_addr = (ahs_t *)bp; | |||
| 453 | bp += n; | |||
| 454 | } | |||
| 455 | if(pp->ds_len) { | |||
| 456 | n = pp->ds_len; | |||
| 457 | error = copyin(pp->ds_addr, bp, n); | |||
| 458 | if(error != 0) { | |||
| 459 | sdebug(3, "copyin ds: error=%d", error)do {if(3 <= iscsi_debug) printf("%d] %s: " "copyin ds: error=%d" "\n", sp->sid, __func__ , error);} while(0); | |||
| 460 | goto out; | |||
| 461 | } | |||
| 462 | pp->ds_addr = bp; | |||
| 463 | bp += n; | |||
| 464 | while(n & 03) { | |||
| 465 | n++; | |||
| 466 | *bp++ = 0; | |||
| 467 | } | |||
| 468 | } | |||
| 469 | ||||
| 470 | error = isc_qout(sp, pq); | |||
| 471 | if(error == 0) | |||
| 472 | wakeup(&sp->flags); // XXX: to 'push' proc_out ... | |||
| 473 | out: | |||
| 474 | if(error) | |||
| 475 | pdu_free(sp->isc, pq); | |||
| 476 | ||||
| 477 | return error; | |||
| 478 | } | |||
| 479 | ||||
| 480 | static int | |||
| 481 | i_recv(struct cdev *dev, caddr_t arg, struct thread *td) | |||
| 482 | { | |||
| 483 | isc_session_t *sp = dev->si_drv2; | |||
| 484 | pduq_t *pq; | |||
| 485 | pdu_t *pp, *up; | |||
| 486 | caddr_t bp; | |||
| 487 | int error, mustfree, cnt; | |||
| 488 | size_t need, have, n; | |||
| 489 | ||||
| 490 | debug_called(8)do {if(8 <= iscsi_debug) printf("%s: called\n", __func__); } while(0); | |||
| 491 | ||||
| 492 | if(sp == NULL((void *)0)) | |||
| ||||
| 493 | return EIO5; | |||
| 494 | ||||
| 495 | if(sp->soc == NULL((void *)0)) | |||
| 496 | return ENOTCONN57; | |||
| 497 | cnt = 6; // XXX: maybe the user can request a time out? | |||
| 498 | mtx_lock(&sp->rsp_mtx)__mtx_lock_flags(&((((&sp->rsp_mtx))))->mtx_lock , ((0)), ("/usr/src/sys/modules/iscsi_initiator/../../dev/iscsi_initiator/iscsi.c" ), (498)); | |||
| 499 | while((pq = TAILQ_FIRST(&sp->rsp)((&sp->rsp)->tqh_first)) == NULL((void *)0)) { | |||
| 500 | msleep(&sp->rsp, &sp->rsp_mtx, PRIBIO, "isc_rsp", hz*10)_sleep((&sp->rsp), &(&sp->rsp_mtx)->lock_object , (((80) + 12)), ("isc_rsp"), tick_sbt * (hz*10), 0, 0x0100); | |||
| 501 | if(cnt-- == 0) break; // XXX: for now, needs work | |||
| 502 | } | |||
| 503 | if(pq != NULL((void *)0)) { | |||
| 504 | sp->stats.nrsp--; | |||
| 505 | TAILQ_REMOVE(&sp->rsp, pq, pq_link)do { ; ; ; ; if (((((pq))->pq_link.tqe_next)) != ((void *) 0)) (((pq))->pq_link.tqe_next)->pq_link.tqe_prev = (pq) ->pq_link.tqe_prev; else { (&sp->rsp)->tqh_last = (pq)->pq_link.tqe_prev; ; } *(pq)->pq_link.tqe_prev = ( ((pq))->pq_link.tqe_next); ; ; ; } while (0); | |||
| 506 | } | |||
| 507 | mtx_unlock(&sp->rsp_mtx)__mtx_unlock_flags(&((((&sp->rsp_mtx))))->mtx_lock , ((0)), ("/usr/src/sys/modules/iscsi_initiator/../../dev/iscsi_initiator/iscsi.c" ), (507)); | |||
| 508 | ||||
| 509 | sdebug(6, "cnt=%d", cnt)do {if(6 <= iscsi_debug) printf("%d] %s: " "cnt=%d" "\n", sp ->sid, __func__ , cnt);} while(0); | |||
| 510 | ||||
| 511 | if(pq == NULL((void *)0)) { | |||
| 512 | error = ENOTCONN57; | |||
| 513 | sdebug(3, "error=%d sp->flags=%x ", error, sp->flags)do {if(3 <= iscsi_debug) printf("%d] %s: " "error=%d sp->flags=%x " "\n", sp->sid, __func__ , error, sp->flags);} while(0); | |||
| 514 | return error; | |||
| 515 | } | |||
| 516 | up = (pdu_t *)arg; | |||
| 517 | pp = &pq->pdu; | |||
| 518 | up->ipdu = pp->ipdu; | |||
| 519 | n = 0; | |||
| 520 | up->ds_len = 0; | |||
| 521 | up->ahs_len = 0; | |||
| 522 | error = 0; | |||
| 523 | ||||
| 524 | if(pq->mp) { | |||
| 525 | u_int len; | |||
| 526 | ||||
| 527 | // Grr... | |||
| 528 | len = 0; | |||
| 529 | if(pp->ahs_len) { | |||
| 530 | len += pp->ahs_len; | |||
| 531 | } | |||
| 532 | if(pp->ds_len) { | |||
| 533 | len += pp->ds_len; | |||
| 534 | } | |||
| 535 | ||||
| 536 | mustfree = 0; | |||
| 537 | if(len > pq->mp->m_len) { | |||
| 538 | mustfree++; | |||
| 539 | bp = malloc(len, M_TMP, M_WAITOK0x0002); | |||
| 540 | sdebug(4, "need mbufcopy: %d", len)do {if(4 <= iscsi_debug) printf("%d] %s: " "need mbufcopy: %d" "\n", sp->sid, __func__ , len);} while(0); | |||
| 541 | i_mbufcopy(pq->mp, bp, len); | |||
| 542 | } | |||
| 543 | else | |||
| 544 | bp = mtod(pq->mp, caddr_t)((caddr_t)((pq->mp)->m_data)); | |||
| 545 | ||||
| 546 | if(pp->ahs_len) { | |||
| 547 | need = pp->ahs_len; | |||
| 548 | n = MIN(up->ahs_size, need)(((up->ahs_size)<(need))?(up->ahs_size):(need)); | |||
| 549 | error = copyout(bp, (caddr_t)up->ahs_addr, n); | |||
| 550 | up->ahs_len = n; | |||
| 551 | bp += need; | |||
| 552 | } | |||
| 553 | if(!error && pp->ds_len) { | |||
| 554 | need = pp->ds_len; | |||
| 555 | if((have = up->ds_size) == 0) { | |||
| 556 | have = up->ahs_size - n; | |||
| 557 | up->ds_addr = (caddr_t)up->ahs_addr + n; | |||
| 558 | } | |||
| 559 | n = MIN(have, need)(((have)<(need))?(have):(need)); | |||
| 560 | error = copyout(bp, (caddr_t)up->ds_addr, n); | |||
| ||||
| 561 | up->ds_len = n; | |||
| 562 | } | |||
| 563 | ||||
| 564 | if(mustfree) | |||
| 565 | free(bp, M_TMP); | |||
| 566 | } | |||
| 567 | ||||
| 568 | sdebug(6, "len=%d ahs_len=%d ds_len=%d", pq->len, pp->ahs_len, pp->ds_len)do {if(6 <= iscsi_debug) printf("%d] %s: " "len=%d ahs_len=%d ds_len=%d" "\n", sp->sid, __func__ , pq->len, pp->ahs_len, pp-> ds_len);} while(0); | |||
| 569 | ||||
| 570 | pdu_free(sp->isc, pq); | |||
| 571 | ||||
| 572 | return error; | |||
| 573 | } | |||
| 574 | ||||
| 575 | static int | |||
| 576 | i_fullfeature(struct cdev *dev, int flag) | |||
| 577 | { | |||
| 578 | isc_session_t *sp = dev->si_drv2; | |||
| 579 | int error; | |||
| 580 | ||||
| 581 | sdebug(2, "flag=%d", flag)do {if(2 <= iscsi_debug) printf("%d] %s: " "flag=%d" "\n", sp->sid, __func__ , flag);} while(0); | |||
| 582 | ||||
| 583 | error = 0; | |||
| 584 | switch(flag) { | |||
| 585 | case 0: // stop | |||
| 586 | sp->flags &= ~ISC_FFPHASE(1 <<(8)); | |||
| 587 | break; | |||
| 588 | case 1: // start | |||
| 589 | sp->flags |= ISC_FFPHASE(1 <<(8)); | |||
| 590 | error = ic_init(sp); | |||
| 591 | break; | |||
| 592 | case 2: // restart | |||
| 593 | sp->flags |= ISC_FFPHASE(1 <<(8)); | |||
| 594 | ism_restart(sp); | |||
| 595 | break; | |||
| 596 | } | |||
| 597 | return error; | |||
| 598 | } | |||
| 599 | ||||
| 600 | static int | |||
| 601 | i_create_session(struct cdev *dev, int *ndev) | |||
| 602 | { | |||
| 603 | struct isc_softc *sc = dev->si_drv1; | |||
| 604 | isc_session_t *sp; | |||
| 605 | int error, n; | |||
| 606 | ||||
| 607 | debug_called(8)do {if(8 <= iscsi_debug) printf("%s: called\n", __func__); } while(0); | |||
| 608 | ||||
| 609 | sp = malloc(sizeof(isc_session_t), M_ISCSI, M_WAITOK0x0002 | M_ZERO0x0100); | |||
| 610 | if(sp == NULL((void *)0)) | |||
| 611 | return ENOMEM12; | |||
| 612 | ||||
| 613 | sx_xlock(&sc->unit_sx)(void)_sx_xlock(((&sc->unit_sx)), 0, ("/usr/src/sys/modules/iscsi_initiator/../../dev/iscsi_initiator/iscsi.c" ), (613)); | |||
| 614 | if((n = alloc_unr(sc->unit)) < 0) { | |||
| 615 | sx_unlock(&sc->unit_sx)do { if (((((&sc->unit_sx))->sx_lock & ~((0x01 | 0x02 | 0x04 | 0x08) & ~0x01)) == (uintptr_t)(__curthread ()))) _sx_xunlock(((&sc->unit_sx)), ("/usr/src/sys/modules/iscsi_initiator/../../dev/iscsi_initiator/iscsi.c" ), (615)); else _sx_sunlock(((&sc->unit_sx)), ("/usr/src/sys/modules/iscsi_initiator/../../dev/iscsi_initiator/iscsi.c" ), (615)); } while (0); | |||
| 616 | free(sp, M_ISCSI); | |||
| 617 | xdebug("too many sessions!")printf(">>> %s: " "too many sessions!" "\n", __func__ ); | |||
| 618 | return EPERM1; | |||
| 619 | } | |||
| 620 | sx_unlock(&sc->unit_sx)do { if (((((&sc->unit_sx))->sx_lock & ~((0x01 | 0x02 | 0x04 | 0x08) & ~0x01)) == (uintptr_t)(__curthread ()))) _sx_xunlock(((&sc->unit_sx)), ("/usr/src/sys/modules/iscsi_initiator/../../dev/iscsi_initiator/iscsi.c" ), (620)); else _sx_sunlock(((&sc->unit_sx)), ("/usr/src/sys/modules/iscsi_initiator/../../dev/iscsi_initiator/iscsi.c" ), (620)); } while (0); | |||
| 621 | ||||
| 622 | mtx_lock(&sc->isc_mtx)__mtx_lock_flags(&((((&sc->isc_mtx))))->mtx_lock , ((0)), ("/usr/src/sys/modules/iscsi_initiator/../../dev/iscsi_initiator/iscsi.c" ), (622)); | |||
| 623 | TAILQ_INSERT_TAIL(&sc->isc_sess, sp, sp_link)do { ; (((sp))->sp_link.tqe_next) = ((void *)0); (sp)-> sp_link.tqe_prev = (&sc->isc_sess)->tqh_last; *(& sc->isc_sess)->tqh_last = (sp); (&sc->isc_sess)-> tqh_last = &(((sp))->sp_link.tqe_next); ; ; } while (0 ); | |||
| 624 | isc->nsess++; | |||
| 625 | mtx_unlock(&sc->isc_mtx)__mtx_unlock_flags(&((((&sc->isc_mtx))))->mtx_lock , ((0)), ("/usr/src/sys/modules/iscsi_initiator/../../dev/iscsi_initiator/iscsi.c" ), (625)); | |||
| 626 | ||||
| 627 | sp->dev = make_dev(&iscsi_cdevsw, n, UID_ROOT0, GID_WHEEL0, 0600, "iscsi%d", n); | |||
| 628 | *ndev = sp->sid = n; | |||
| 629 | sp->isc = sc; | |||
| 630 | sp->dev->si_drv1 = sc; | |||
| 631 | sp->dev->si_drv2 = sp; | |||
| 632 | ||||
| 633 | sp->opt.maxRecvDataSegmentLength = 8192; | |||
| 634 | sp->opt.maxXmitDataSegmentLength = 8192; | |||
| 635 | sp->opt.maxBurstLength = 65536; // 64k | |||
| 636 | sp->opt.maxluns = ISCSI_MAX_LUNS128; | |||
| 637 | ||||
| 638 | error = ism_start(sp); | |||
| 639 | ||||
| 640 | return error; | |||
| 641 | } | |||
| 642 | ||||
| 643 | #ifdef notused | |||
| 644 | static void | |||
| 645 | iscsi_counters(isc_session_t *sp) | |||
| 646 | { | |||
| 647 | int h, r, s; | |||
| 648 | pduq_t *pq; | |||
| 649 | ||||
| 650 | #define _puke(i, pq) do {\ | |||
| 651 | debug(2, "%03d] %06x %02x %x %ld %jd %x\n",\do {if(2 <= iscsi_debug) printf("%s: " "%03d] %06x %02x %x %ld %jd %x\n" "\n", __func__ , i, (__builtin_constant_p(pq->pdu.ipdu.bhs .OpcodeSpecificFields[1]) ? (((__uint32_t)((__uint16_t)(__builtin_constant_p (((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields[1])) & 0xffff) ? (__uint16_t)(((__uint16_t)(((__uint32_t)(pq->pdu .ipdu.bhs.OpcodeSpecificFields[1])) & 0xffff)) << 8 | ((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [1])) & 0xffff)) >> 8) : __bswap16_var(((__uint32_t )(pq->pdu.ipdu.bhs.OpcodeSpecificFields[1])) & 0xffff) )) << 16) | ((__uint16_t)(__builtin_constant_p(((__uint32_t )(pq->pdu.ipdu.bhs.OpcodeSpecificFields[1])) >> 16) ? (__uint16_t)(((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs .OpcodeSpecificFields[1])) >> 16)) << 8 | ((__uint16_t )(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields[1])) >> 16)) >> 8) : __bswap16_var(((__uint32_t)(pq-> pdu.ipdu.bhs.OpcodeSpecificFields[1])) >> 16)))) : __bswap32_var (pq->pdu.ipdu.bhs.OpcodeSpecificFields[1])), pq->pdu.ipdu .bhs.opcode, (__builtin_constant_p(pq->pdu.ipdu.bhs.itt) ? (((__uint32_t)((__uint16_t)(__builtin_constant_p(((__uint32_t )(pq->pdu.ipdu.bhs.itt)) & 0xffff) ? (__uint16_t)(((__uint16_t )(((__uint32_t)(pq->pdu.ipdu.bhs.itt)) & 0xffff)) << 8 | ((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs.itt)) & 0xffff)) >> 8) : __bswap16_var(((__uint32_t)(pq->pdu .ipdu.bhs.itt)) & 0xffff))) << 16) | ((__uint16_t)( __builtin_constant_p(((__uint32_t)(pq->pdu.ipdu.bhs.itt)) >> 16) ? (__uint16_t)(((__uint16_t)(((__uint32_t)(pq->pdu.ipdu .bhs.itt)) >> 16)) << 8 | ((__uint16_t)(((__uint32_t )(pq->pdu.ipdu.bhs.itt)) >> 16)) >> 8) : __bswap16_var (((__uint32_t)(pq->pdu.ipdu.bhs.itt)) >> 16)))) : __bswap32_var (pq->pdu.ipdu.bhs.itt)), (long)pq->ts.sec, pq->ts.frac , pq->flags);} while(0) | |||
| 652 | i, ntohl( pq->pdu.ipdu.bhs.CmdSN), \do {if(2 <= iscsi_debug) printf("%s: " "%03d] %06x %02x %x %ld %jd %x\n" "\n", __func__ , i, (__builtin_constant_p(pq->pdu.ipdu.bhs .OpcodeSpecificFields[1]) ? (((__uint32_t)((__uint16_t)(__builtin_constant_p (((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields[1])) & 0xffff) ? (__uint16_t)(((__uint16_t)(((__uint32_t)(pq->pdu .ipdu.bhs.OpcodeSpecificFields[1])) & 0xffff)) << 8 | ((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [1])) & 0xffff)) >> 8) : __bswap16_var(((__uint32_t )(pq->pdu.ipdu.bhs.OpcodeSpecificFields[1])) & 0xffff) )) << 16) | ((__uint16_t)(__builtin_constant_p(((__uint32_t )(pq->pdu.ipdu.bhs.OpcodeSpecificFields[1])) >> 16) ? (__uint16_t)(((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs .OpcodeSpecificFields[1])) >> 16)) << 8 | ((__uint16_t )(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields[1])) >> 16)) >> 8) : __bswap16_var(((__uint32_t)(pq-> pdu.ipdu.bhs.OpcodeSpecificFields[1])) >> 16)))) : __bswap32_var (pq->pdu.ipdu.bhs.OpcodeSpecificFields[1])), pq->pdu.ipdu .bhs.opcode, (__builtin_constant_p(pq->pdu.ipdu.bhs.itt) ? (((__uint32_t)((__uint16_t)(__builtin_constant_p(((__uint32_t )(pq->pdu.ipdu.bhs.itt)) & 0xffff) ? (__uint16_t)(((__uint16_t )(((__uint32_t)(pq->pdu.ipdu.bhs.itt)) & 0xffff)) << 8 | ((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs.itt)) & 0xffff)) >> 8) : __bswap16_var(((__uint32_t)(pq->pdu .ipdu.bhs.itt)) & 0xffff))) << 16) | ((__uint16_t)( __builtin_constant_p(((__uint32_t)(pq->pdu.ipdu.bhs.itt)) >> 16) ? (__uint16_t)(((__uint16_t)(((__uint32_t)(pq->pdu.ipdu .bhs.itt)) >> 16)) << 8 | ((__uint16_t)(((__uint32_t )(pq->pdu.ipdu.bhs.itt)) >> 16)) >> 8) : __bswap16_var (((__uint32_t)(pq->pdu.ipdu.bhs.itt)) >> 16)))) : __bswap32_var (pq->pdu.ipdu.bhs.itt)), (long)pq->ts.sec, pq->ts.frac , pq->flags);} while(0) | |||
| 653 | pq->pdu.ipdu.bhs.opcode, ntohl(pq->pdu.ipdu.bhs.itt),\do {if(2 <= iscsi_debug) printf("%s: " "%03d] %06x %02x %x %ld %jd %x\n" "\n", __func__ , i, (__builtin_constant_p(pq->pdu.ipdu.bhs .OpcodeSpecificFields[1]) ? (((__uint32_t)((__uint16_t)(__builtin_constant_p (((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields[1])) & 0xffff) ? (__uint16_t)(((__uint16_t)(((__uint32_t)(pq->pdu .ipdu.bhs.OpcodeSpecificFields[1])) & 0xffff)) << 8 | ((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [1])) & 0xffff)) >> 8) : __bswap16_var(((__uint32_t )(pq->pdu.ipdu.bhs.OpcodeSpecificFields[1])) & 0xffff) )) << 16) | ((__uint16_t)(__builtin_constant_p(((__uint32_t )(pq->pdu.ipdu.bhs.OpcodeSpecificFields[1])) >> 16) ? (__uint16_t)(((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs .OpcodeSpecificFields[1])) >> 16)) << 8 | ((__uint16_t )(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields[1])) >> 16)) >> 8) : __bswap16_var(((__uint32_t)(pq-> pdu.ipdu.bhs.OpcodeSpecificFields[1])) >> 16)))) : __bswap32_var (pq->pdu.ipdu.bhs.OpcodeSpecificFields[1])), pq->pdu.ipdu .bhs.opcode, (__builtin_constant_p(pq->pdu.ipdu.bhs.itt) ? (((__uint32_t)((__uint16_t)(__builtin_constant_p(((__uint32_t )(pq->pdu.ipdu.bhs.itt)) & 0xffff) ? (__uint16_t)(((__uint16_t )(((__uint32_t)(pq->pdu.ipdu.bhs.itt)) & 0xffff)) << 8 | ((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs.itt)) & 0xffff)) >> 8) : __bswap16_var(((__uint32_t)(pq->pdu .ipdu.bhs.itt)) & 0xffff))) << 16) | ((__uint16_t)( __builtin_constant_p(((__uint32_t)(pq->pdu.ipdu.bhs.itt)) >> 16) ? (__uint16_t)(((__uint16_t)(((__uint32_t)(pq->pdu.ipdu .bhs.itt)) >> 16)) << 8 | ((__uint16_t)(((__uint32_t )(pq->pdu.ipdu.bhs.itt)) >> 16)) >> 8) : __bswap16_var (((__uint32_t)(pq->pdu.ipdu.bhs.itt)) >> 16)))) : __bswap32_var (pq->pdu.ipdu.bhs.itt)), (long)pq->ts.sec, pq->ts.frac , pq->flags);} while(0) | |||
| 654 | (long)pq->ts.sec, pq->ts.frac, pq->flags)do {if(2 <= iscsi_debug) printf("%s: " "%03d] %06x %02x %x %ld %jd %x\n" "\n", __func__ , i, (__builtin_constant_p(pq->pdu.ipdu.bhs .OpcodeSpecificFields[1]) ? (((__uint32_t)((__uint16_t)(__builtin_constant_p (((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields[1])) & 0xffff) ? (__uint16_t)(((__uint16_t)(((__uint32_t)(pq->pdu .ipdu.bhs.OpcodeSpecificFields[1])) & 0xffff)) << 8 | ((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [1])) & 0xffff)) >> 8) : __bswap16_var(((__uint32_t )(pq->pdu.ipdu.bhs.OpcodeSpecificFields[1])) & 0xffff) )) << 16) | ((__uint16_t)(__builtin_constant_p(((__uint32_t )(pq->pdu.ipdu.bhs.OpcodeSpecificFields[1])) >> 16) ? (__uint16_t)(((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs .OpcodeSpecificFields[1])) >> 16)) << 8 | ((__uint16_t )(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields[1])) >> 16)) >> 8) : __bswap16_var(((__uint32_t)(pq-> pdu.ipdu.bhs.OpcodeSpecificFields[1])) >> 16)))) : __bswap32_var (pq->pdu.ipdu.bhs.OpcodeSpecificFields[1])), pq->pdu.ipdu .bhs.opcode, (__builtin_constant_p(pq->pdu.ipdu.bhs.itt) ? (((__uint32_t)((__uint16_t)(__builtin_constant_p(((__uint32_t )(pq->pdu.ipdu.bhs.itt)) & 0xffff) ? (__uint16_t)(((__uint16_t )(((__uint32_t)(pq->pdu.ipdu.bhs.itt)) & 0xffff)) << 8 | ((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs.itt)) & 0xffff)) >> 8) : __bswap16_var(((__uint32_t)(pq->pdu .ipdu.bhs.itt)) & 0xffff))) << 16) | ((__uint16_t)( __builtin_constant_p(((__uint32_t)(pq->pdu.ipdu.bhs.itt)) >> 16) ? (__uint16_t)(((__uint16_t)(((__uint32_t)(pq->pdu.ipdu .bhs.itt)) >> 16)) << 8 | ((__uint16_t)(((__uint32_t )(pq->pdu.ipdu.bhs.itt)) >> 16)) >> 8) : __bswap16_var (((__uint32_t)(pq->pdu.ipdu.bhs.itt)) >> 16)))) : __bswap32_var (pq->pdu.ipdu.bhs.itt)), (long)pq->ts.sec, pq->ts.frac , pq->flags);} while(0);\ | |||
| 655 | } while(0) | |||
| 656 | ||||
| 657 | h = r = s = 0; | |||
| 658 | TAILQ_FOREACH(pq, &sp->hld, pq_link)for ((pq) = (((&sp->hld))->tqh_first); (pq); (pq) = (((pq))->pq_link.tqe_next)) { | |||
| 659 | _puke(h, pq); | |||
| 660 | h++; | |||
| 661 | } | |||
| 662 | TAILQ_FOREACH(pq, &sp->rsp, pq_link)for ((pq) = (((&sp->rsp))->tqh_first); (pq); (pq) = (((pq))->pq_link.tqe_next)) r++; | |||
| 663 | TAILQ_FOREACH(pq, &sp->csnd, pq_link)for ((pq) = (((&sp->csnd))->tqh_first); (pq); (pq) = (((pq))->pq_link.tqe_next)) s++; | |||
| 664 | TAILQ_FOREACH(pq, &sp->wsnd, pq_link)for ((pq) = (((&sp->wsnd))->tqh_first); (pq); (pq) = (((pq))->pq_link.tqe_next)) s++; | |||
| 665 | TAILQ_FOREACH(pq, &sp->isnd, pq_link)for ((pq) = (((&sp->isnd))->tqh_first); (pq); (pq) = (((pq))->pq_link.tqe_next)) s++; | |||
| 666 | debug(2, "hld=%d rsp=%d snd=%d", h, r, s)do {if(2 <= iscsi_debug) printf("%s: " "hld=%d rsp=%d snd=%d" "\n", __func__ , h, r, s);} while(0); | |||
| 667 | } | |||
| 668 | #endif | |||
| 669 | ||||
| 670 | static void | |||
| 671 | iscsi_shutdown(void *v) | |||
| 672 | { | |||
| 673 | struct isc_softc *sc = v; | |||
| 674 | isc_session_t *sp; | |||
| 675 | int n; | |||
| 676 | ||||
| 677 | debug_called(8)do {if(8 <= iscsi_debug) printf("%s: called\n", __func__); } while(0); | |||
| 678 | if(sc == NULL((void *)0)) { | |||
| 679 | xdebug("sc is NULL!")printf(">>> %s: " "sc is NULL!" "\n", __func__); | |||
| 680 | return; | |||
| 681 | } | |||
| 682 | #ifdef DO_EVENTHANDLER | |||
| 683 | if(sc->eh == NULL((void *)0)) | |||
| 684 | debug(2, "sc->eh is NULL")do {if(2 <= iscsi_debug) printf("%s: " "sc->eh is NULL" "\n", __func__);} while(0); | |||
| 685 | else { | |||
| 686 | EVENTHANDLER_DEREGISTER(shutdown_pre_sync, sc->eh)do { struct eventhandler_list *_el; if ((_el = eventhandler_find_list ("shutdown_pre_sync")) != ((void *)0)) eventhandler_deregister (_el, sc->eh); } while(0); | |||
| 687 | debug(2, "done n=%d", sc->nsess)do {if(2 <= iscsi_debug) printf("%s: " "done n=%d" "\n", __func__ , sc->nsess);} while(0); | |||
| 688 | } | |||
| 689 | #endif | |||
| 690 | n = 0; | |||
| 691 | TAILQ_FOREACH(sp, &sc->isc_sess, sp_link)for ((sp) = (((&sc->isc_sess))->tqh_first); (sp); ( sp) = (((sp))->sp_link.tqe_next)) { | |||
| 692 | debug(2, "%2d] sp->flags=0x%08x", n, sp->flags)do {if(2 <= iscsi_debug) printf("%s: " "%2d] sp->flags=0x%08x" "\n", __func__ , n, sp->flags);} while(0); | |||
| 693 | n++; | |||
| 694 | } | |||
| 695 | debug(2, "done")do {if(2 <= iscsi_debug) printf("%s: " "done" "\n", __func__ );} while(0); | |||
| 696 | } | |||
| 697 | ||||
| 698 | static void | |||
| 699 | free_pdus(struct isc_softc *sc) | |||
| 700 | { | |||
| 701 | debug_called(8)do {if(8 <= iscsi_debug) printf("%s: called\n", __func__); } while(0); | |||
| 702 | ||||
| 703 | if(sc->pdu_zone != NULL((void *)0)) { | |||
| 704 | uma_zdestroy(sc->pdu_zone); | |||
| 705 | sc->pdu_zone = NULL((void *)0); | |||
| 706 | } | |||
| 707 | } | |||
| 708 | ||||
| 709 | static int | |||
| 710 | iscsi_start(void) | |||
| 711 | { | |||
| 712 | debug_called(8)do {if(8 <= iscsi_debug) printf("%s: called\n", __func__); } while(0); | |||
| 713 | ||||
| 714 | isc = malloc(sizeof(struct isc_softc), M_ISCSI, M_ZERO0x0100|M_WAITOK0x0002); | |||
| 715 | mtx_init(&isc->isc_mtx, "iscsi-isc", NULL, MTX_DEF)_mtx_init(&(&isc->isc_mtx)->mtx_lock, "iscsi-isc" , ((void *)0), 0x00000000); | |||
| 716 | ||||
| 717 | TAILQ_INIT(&isc->isc_sess)do { (((&isc->isc_sess))->tqh_first) = ((void *)0); (&isc->isc_sess)->tqh_last = &(((&isc-> isc_sess))->tqh_first); ; } while (0); | |||
| 718 | /* | |||
| 719 | | now init the free pdu list | |||
| 720 | */ | |||
| 721 | isc->pdu_zone = uma_zcreate("pdu", sizeof(pduq_t), | |||
| 722 | NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0), | |||
| 723 | 0, 0); | |||
| 724 | uma_zone_set_max(isc->pdu_zone, max_pdus); | |||
| 725 | isc->unit = new_unrhdr(0, max_sessions-1, NULL((void *)0)); | |||
| 726 | sx_init(&isc->unit_sx, "iscsi sx")sx_init_flags((&isc->unit_sx), ("iscsi sx"), 0); | |||
| 727 | ||||
| 728 | #ifdef DO_EVENTHANDLER | |||
| 729 | if((isc->eh = EVENTHANDLER_REGISTER(shutdown_pre_sync, iscsi_shutdown,eventhandler_register(((void *)0), "shutdown_pre_sync", iscsi_shutdown , sc, 10000 -1) | |||
| 730 | sc, SHUTDOWN_PRI_DEFAULT-1)eventhandler_register(((void *)0), "shutdown_pre_sync", iscsi_shutdown , sc, 10000 -1)) == NULL((void *)0)) | |||
| 731 | xdebug("shutdown event registration failed\n")printf(">>> %s: " "shutdown event registration failed\n" "\n", __func__); | |||
| 732 | #endif | |||
| 733 | /* | |||
| 734 | | sysctl stuff | |||
| 735 | */ | |||
| 736 | sysctl_ctx_init(&isc->clist); | |||
| 737 | isc->oid = SYSCTL_ADD_NODE(&isc->clist,({ _Static_assert(((0x80000000) & 0xf) == 0 || ((0x80000000 ) & 0xf) == 1, "compile-time assertion failed"); sysctl_add_oid (&isc->clist, (&sysctl___net.oid_children), (-1), "iscsi_initiator" , 1|(0x80000000), ((void *)0), 0, 0, "N", "iSCSI Subsystem"); }) | |||
| 738 | SYSCTL_STATIC_CHILDREN(_net),({ _Static_assert(((0x80000000) & 0xf) == 0 || ((0x80000000 ) & 0xf) == 1, "compile-time assertion failed"); sysctl_add_oid (&isc->clist, (&sysctl___net.oid_children), (-1), "iscsi_initiator" , 1|(0x80000000), ((void *)0), 0, 0, "N", "iSCSI Subsystem"); }) | |||
| 739 | OID_AUTO,({ _Static_assert(((0x80000000) & 0xf) == 0 || ((0x80000000 ) & 0xf) == 1, "compile-time assertion failed"); sysctl_add_oid (&isc->clist, (&sysctl___net.oid_children), (-1), "iscsi_initiator" , 1|(0x80000000), ((void *)0), 0, 0, "N", "iSCSI Subsystem"); }) | |||
| 740 | "iscsi_initiator",({ _Static_assert(((0x80000000) & 0xf) == 0 || ((0x80000000 ) & 0xf) == 1, "compile-time assertion failed"); sysctl_add_oid (&isc->clist, (&sysctl___net.oid_children), (-1), "iscsi_initiator" , 1|(0x80000000), ((void *)0), 0, 0, "N", "iSCSI Subsystem"); }) | |||
| 741 | CTLFLAG_RD,({ _Static_assert(((0x80000000) & 0xf) == 0 || ((0x80000000 ) & 0xf) == 1, "compile-time assertion failed"); sysctl_add_oid (&isc->clist, (&sysctl___net.oid_children), (-1), "iscsi_initiator" , 1|(0x80000000), ((void *)0), 0, 0, "N", "iSCSI Subsystem"); }) | |||
| 742 | 0,({ _Static_assert(((0x80000000) & 0xf) == 0 || ((0x80000000 ) & 0xf) == 1, "compile-time assertion failed"); sysctl_add_oid (&isc->clist, (&sysctl___net.oid_children), (-1), "iscsi_initiator" , 1|(0x80000000), ((void *)0), 0, 0, "N", "iSCSI Subsystem"); }) | |||
| 743 | "iSCSI Subsystem")({ _Static_assert(((0x80000000) & 0xf) == 0 || ((0x80000000 ) & 0xf) == 1, "compile-time assertion failed"); sysctl_add_oid (&isc->clist, (&sysctl___net.oid_children), (-1), "iscsi_initiator" , 1|(0x80000000), ((void *)0), 0, 0, "N", "iSCSI Subsystem"); }); | |||
| 744 | ||||
| 745 | SYSCTL_ADD_STRING(&isc->clist,({ char *__arg = (iscsi_driver_version); _Static_assert(((0x80000000 ) & 0xf) == 0 || ((0x80000000) & 0xf) == 3, "compile-time assertion failed" ); sysctl_add_oid(&isc->clist, (&(isc->oid)-> oid_children), (-1), "driver_version", 3|(0x80000000), __arg, 0, sysctl_handle_string, "A", "iscsi driver version"); }) | |||
| 746 | SYSCTL_CHILDREN(isc->oid),({ char *__arg = (iscsi_driver_version); _Static_assert(((0x80000000 ) & 0xf) == 0 || ((0x80000000) & 0xf) == 3, "compile-time assertion failed" ); sysctl_add_oid(&isc->clist, (&(isc->oid)-> oid_children), (-1), "driver_version", 3|(0x80000000), __arg, 0, sysctl_handle_string, "A", "iscsi driver version"); }) | |||
| 747 | OID_AUTO,({ char *__arg = (iscsi_driver_version); _Static_assert(((0x80000000 ) & 0xf) == 0 || ((0x80000000) & 0xf) == 3, "compile-time assertion failed" ); sysctl_add_oid(&isc->clist, (&(isc->oid)-> oid_children), (-1), "driver_version", 3|(0x80000000), __arg, 0, sysctl_handle_string, "A", "iscsi driver version"); }) | |||
| 748 | "driver_version",({ char *__arg = (iscsi_driver_version); _Static_assert(((0x80000000 ) & 0xf) == 0 || ((0x80000000) & 0xf) == 3, "compile-time assertion failed" ); sysctl_add_oid(&isc->clist, (&(isc->oid)-> oid_children), (-1), "driver_version", 3|(0x80000000), __arg, 0, sysctl_handle_string, "A", "iscsi driver version"); }) | |||
| 749 | CTLFLAG_RD,({ char *__arg = (iscsi_driver_version); _Static_assert(((0x80000000 ) & 0xf) == 0 || ((0x80000000) & 0xf) == 3, "compile-time assertion failed" ); sysctl_add_oid(&isc->clist, (&(isc->oid)-> oid_children), (-1), "driver_version", 3|(0x80000000), __arg, 0, sysctl_handle_string, "A", "iscsi driver version"); }) | |||
| 750 | iscsi_driver_version,({ char *__arg = (iscsi_driver_version); _Static_assert(((0x80000000 ) & 0xf) == 0 || ((0x80000000) & 0xf) == 3, "compile-time assertion failed" ); sysctl_add_oid(&isc->clist, (&(isc->oid)-> oid_children), (-1), "driver_version", 3|(0x80000000), __arg, 0, sysctl_handle_string, "A", "iscsi driver version"); }) | |||
| 751 | 0,({ char *__arg = (iscsi_driver_version); _Static_assert(((0x80000000 ) & 0xf) == 0 || ((0x80000000) & 0xf) == 3, "compile-time assertion failed" ); sysctl_add_oid(&isc->clist, (&(isc->oid)-> oid_children), (-1), "driver_version", 3|(0x80000000), __arg, 0, sysctl_handle_string, "A", "iscsi driver version"); }) | |||
| 752 | "iscsi driver version")({ char *__arg = (iscsi_driver_version); _Static_assert(((0x80000000 ) & 0xf) == 0 || ((0x80000000) & 0xf) == 3, "compile-time assertion failed" ); sysctl_add_oid(&isc->clist, (&(isc->oid)-> oid_children), (-1), "driver_version", 3|(0x80000000), __arg, 0, sysctl_handle_string, "A", "iscsi driver version"); }); | |||
| 753 | ||||
| 754 | SYSCTL_ADD_STRING(&isc->clist,({ char *__arg = (isid); _Static_assert((((0x80000000|0x40000000 )) & 0xf) == 0 || (((0x80000000|0x40000000)) & 0xf) == 3, "compile-time assertion failed"); sysctl_add_oid(&isc ->clist, (&(isc->oid)->oid_children), (-1), "isid" , 3|((0x80000000|0x40000000)), __arg, 6+1, sysctl_handle_string , "A", "initiator part of the Session Identifier"); }) | |||
| 755 | SYSCTL_CHILDREN(isc->oid),({ char *__arg = (isid); _Static_assert((((0x80000000|0x40000000 )) & 0xf) == 0 || (((0x80000000|0x40000000)) & 0xf) == 3, "compile-time assertion failed"); sysctl_add_oid(&isc ->clist, (&(isc->oid)->oid_children), (-1), "isid" , 3|((0x80000000|0x40000000)), __arg, 6+1, sysctl_handle_string , "A", "initiator part of the Session Identifier"); }) | |||
| 756 | OID_AUTO,({ char *__arg = (isid); _Static_assert((((0x80000000|0x40000000 )) & 0xf) == 0 || (((0x80000000|0x40000000)) & 0xf) == 3, "compile-time assertion failed"); sysctl_add_oid(&isc ->clist, (&(isc->oid)->oid_children), (-1), "isid" , 3|((0x80000000|0x40000000)), __arg, 6+1, sysctl_handle_string , "A", "initiator part of the Session Identifier"); }) | |||
| 757 | "isid",({ char *__arg = (isid); _Static_assert((((0x80000000|0x40000000 )) & 0xf) == 0 || (((0x80000000|0x40000000)) & 0xf) == 3, "compile-time assertion failed"); sysctl_add_oid(&isc ->clist, (&(isc->oid)->oid_children), (-1), "isid" , 3|((0x80000000|0x40000000)), __arg, 6+1, sysctl_handle_string , "A", "initiator part of the Session Identifier"); }) | |||
| 758 | CTLFLAG_RW,({ char *__arg = (isid); _Static_assert((((0x80000000|0x40000000 )) & 0xf) == 0 || (((0x80000000|0x40000000)) & 0xf) == 3, "compile-time assertion failed"); sysctl_add_oid(&isc ->clist, (&(isc->oid)->oid_children), (-1), "isid" , 3|((0x80000000|0x40000000)), __arg, 6+1, sysctl_handle_string , "A", "initiator part of the Session Identifier"); }) | |||
| 759 | isid,({ char *__arg = (isid); _Static_assert((((0x80000000|0x40000000 )) & 0xf) == 0 || (((0x80000000|0x40000000)) & 0xf) == 3, "compile-time assertion failed"); sysctl_add_oid(&isc ->clist, (&(isc->oid)->oid_children), (-1), "isid" , 3|((0x80000000|0x40000000)), __arg, 6+1, sysctl_handle_string , "A", "initiator part of the Session Identifier"); }) | |||
| 760 | 6+1,({ char *__arg = (isid); _Static_assert((((0x80000000|0x40000000 )) & 0xf) == 0 || (((0x80000000|0x40000000)) & 0xf) == 3, "compile-time assertion failed"); sysctl_add_oid(&isc ->clist, (&(isc->oid)->oid_children), (-1), "isid" , 3|((0x80000000|0x40000000)), __arg, 6+1, sysctl_handle_string , "A", "initiator part of the Session Identifier"); }) | |||
| 761 | "initiator part of the Session Identifier")({ char *__arg = (isid); _Static_assert((((0x80000000|0x40000000 )) & 0xf) == 0 || (((0x80000000|0x40000000)) & 0xf) == 3, "compile-time assertion failed"); sysctl_add_oid(&isc ->clist, (&(isc->oid)->oid_children), (-1), "isid" , 3|((0x80000000|0x40000000)), __arg, 6+1, sysctl_handle_string , "A", "initiator part of the Session Identifier"); }); | |||
| 762 | ||||
| 763 | SYSCTL_ADD_INT(&isc->clist,({ int *__ptr = (&isc->nsess); _Static_assert(((0x80000000 ) & 0xf) == 0 || ((0x80000000) & 0xf) == 2, "compile-time assertion failed" ); sysctl_add_oid(&isc->clist, (&(isc->oid)-> oid_children), (-1), "sessions", 2 | 0x00040000 | (0x80000000 ), __ptr, sizeof(isc->nsess), sysctl_handle_int, "I", "number of active session" ); }) | |||
| 764 | SYSCTL_CHILDREN(isc->oid),({ int *__ptr = (&isc->nsess); _Static_assert(((0x80000000 ) & 0xf) == 0 || ((0x80000000) & 0xf) == 2, "compile-time assertion failed" ); sysctl_add_oid(&isc->clist, (&(isc->oid)-> oid_children), (-1), "sessions", 2 | 0x00040000 | (0x80000000 ), __ptr, sizeof(isc->nsess), sysctl_handle_int, "I", "number of active session" ); }) | |||
| 765 | OID_AUTO,({ int *__ptr = (&isc->nsess); _Static_assert(((0x80000000 ) & 0xf) == 0 || ((0x80000000) & 0xf) == 2, "compile-time assertion failed" ); sysctl_add_oid(&isc->clist, (&(isc->oid)-> oid_children), (-1), "sessions", 2 | 0x00040000 | (0x80000000 ), __ptr, sizeof(isc->nsess), sysctl_handle_int, "I", "number of active session" ); }) | |||
| 766 | "sessions",({ int *__ptr = (&isc->nsess); _Static_assert(((0x80000000 ) & 0xf) == 0 || ((0x80000000) & 0xf) == 2, "compile-time assertion failed" ); sysctl_add_oid(&isc->clist, (&(isc->oid)-> oid_children), (-1), "sessions", 2 | 0x00040000 | (0x80000000 ), __ptr, sizeof(isc->nsess), sysctl_handle_int, "I", "number of active session" ); }) | |||
| 767 | CTLFLAG_RD,({ int *__ptr = (&isc->nsess); _Static_assert(((0x80000000 ) & 0xf) == 0 || ((0x80000000) & 0xf) == 2, "compile-time assertion failed" ); sysctl_add_oid(&isc->clist, (&(isc->oid)-> oid_children), (-1), "sessions", 2 | 0x00040000 | (0x80000000 ), __ptr, sizeof(isc->nsess), sysctl_handle_int, "I", "number of active session" ); }) | |||
| 768 | &isc->nsess,({ int *__ptr = (&isc->nsess); _Static_assert(((0x80000000 ) & 0xf) == 0 || ((0x80000000) & 0xf) == 2, "compile-time assertion failed" ); sysctl_add_oid(&isc->clist, (&(isc->oid)-> oid_children), (-1), "sessions", 2 | 0x00040000 | (0x80000000 ), __ptr, sizeof(isc->nsess), sysctl_handle_int, "I", "number of active session" ); }) | |||
| 769 | sizeof(isc->nsess),({ int *__ptr = (&isc->nsess); _Static_assert(((0x80000000 ) & 0xf) == 0 || ((0x80000000) & 0xf) == 2, "compile-time assertion failed" ); sysctl_add_oid(&isc->clist, (&(isc->oid)-> oid_children), (-1), "sessions", 2 | 0x00040000 | (0x80000000 ), __ptr, sizeof(isc->nsess), sysctl_handle_int, "I", "number of active session" ); }) | |||
| 770 | "number of active session")({ int *__ptr = (&isc->nsess); _Static_assert(((0x80000000 ) & 0xf) == 0 || ((0x80000000) & 0xf) == 2, "compile-time assertion failed" ); sysctl_add_oid(&isc->clist, (&(isc->oid)-> oid_children), (-1), "sessions", 2 | 0x00040000 | (0x80000000 ), __ptr, sizeof(isc->nsess), sysctl_handle_int, "I", "number of active session" ); }); | |||
| 771 | ||||
| 772 | #ifdef ISCSI_INITIATOR_DEBUG1 | |||
| 773 | mtx_init(&iscsi_dbg_mtx, "iscsi_dbg", NULL, MTX_DEF)_mtx_init(&(&iscsi_dbg_mtx)->mtx_lock, "iscsi_dbg" , ((void *)0), 0x00000000); | |||
| 774 | #endif | |||
| 775 | ||||
| 776 | isc->dev = make_dev_credf(MAKEDEV_CHECKNAME0x20, &iscsi_cdevsw, max_sessions, | |||
| 777 | NULL((void *)0), UID_ROOT0, GID_WHEEL0, 0600, "iscsi"); | |||
| 778 | if (isc->dev == NULL((void *)0)) { | |||
| 779 | xdebug("iscsi_initiator: make_dev_credf failed")printf(">>> %s: " "iscsi_initiator: make_dev_credf failed" "\n", __func__); | |||
| 780 | return (EEXIST17); | |||
| 781 | } | |||
| 782 | isc->dev->si_drv1 = isc; | |||
| 783 | ||||
| 784 | printf("iscsi: version %s\n", iscsi_driver_version); | |||
| 785 | return (0); | |||
| 786 | } | |||
| 787 | ||||
| 788 | /* | |||
| 789 | | Notes: | |||
| 790 | | unload SHOULD fail if there is activity | |||
| 791 | | activity: there is/are active session/s | |||
| 792 | */ | |||
| 793 | static void | |||
| 794 | iscsi_stop(void) | |||
| 795 | { | |||
| 796 | isc_session_t *sp, *sp_tmp; | |||
| 797 | ||||
| 798 | debug_called(8)do {if(8 <= iscsi_debug) printf("%s: called\n", __func__); } while(0); | |||
| 799 | ||||
| 800 | /* | |||
| 801 | | go through all the sessions | |||
| 802 | | Note: close should have done this ... | |||
| 803 | */ | |||
| 804 | TAILQ_FOREACH_SAFE(sp, &isc->isc_sess, sp_link, sp_tmp)for ((sp) = (((&isc->isc_sess))->tqh_first); (sp) && ((sp_tmp) = (((sp))->sp_link.tqe_next), 1); (sp) = (sp_tmp )) { | |||
| 805 | //XXX: check for activity ... | |||
| 806 | ism_stop(sp); | |||
| 807 | } | |||
| 808 | mtx_destroy(&isc->isc_mtx)_mtx_destroy(&(&isc->isc_mtx)->mtx_lock); | |||
| 809 | sx_destroy(&isc->unit_sx); | |||
| 810 | ||||
| 811 | free_pdus(isc); | |||
| 812 | ||||
| 813 | if(isc->dev) | |||
| 814 | destroy_dev(isc->dev); | |||
| 815 | ||||
| 816 | if(sysctl_ctx_free(&isc->clist)) | |||
| 817 | xdebug("sysctl_ctx_free failed")printf(">>> %s: " "sysctl_ctx_free failed" "\n", __func__ ); | |||
| 818 | ||||
| 819 | iscsi_shutdown(isc); // XXX: check EVENTHANDLER_ ... | |||
| 820 | ||||
| 821 | #ifdef ISCSI_INITIATOR_DEBUG1 | |||
| 822 | mtx_destroy(&iscsi_dbg_mtx)_mtx_destroy(&(&iscsi_dbg_mtx)->mtx_lock); | |||
| 823 | #endif | |||
| 824 | ||||
| 825 | free(isc, M_ISCSI); | |||
| 826 | } | |||
| 827 | ||||
| 828 | static int | |||
| 829 | iscsi_modevent(module_t mod, int what, void *arg) | |||
| 830 | { | |||
| 831 | int error = 0; | |||
| 832 | ||||
| 833 | debug_called(8)do {if(8 <= iscsi_debug) printf("%s: called\n", __func__); } while(0); | |||
| 834 | ||||
| 835 | switch(what) { | |||
| 836 | case MOD_LOAD: | |||
| 837 | error = iscsi_start(); | |||
| 838 | break; | |||
| 839 | ||||
| 840 | case MOD_QUIESCE: | |||
| 841 | if(isc->nsess) { | |||
| 842 | xdebug("iscsi module busy(nsess=%d), cannot unload", isc->nsess)printf(">>> %s: " "iscsi module busy(nsess=%d), cannot unload" "\n", __func__ , isc->nsess); | |||
| 843 | log(LOG_ERR3, "iscsi module busy, cannot unload"); | |||
| 844 | } | |||
| 845 | return isc->nsess; | |||
| 846 | ||||
| 847 | case MOD_SHUTDOWN: | |||
| 848 | break; | |||
| 849 | ||||
| 850 | case MOD_UNLOAD: | |||
| 851 | iscsi_stop(); | |||
| 852 | break; | |||
| 853 | ||||
| 854 | default: | |||
| 855 | break; | |||
| 856 | } | |||
| 857 | return (error); | |||
| 858 | } | |||
| 859 | ||||
| 860 | moduledata_t iscsi_mod = { | |||
| 861 | "iscsi_initiator", | |||
| 862 | (modeventhand_t) iscsi_modevent, | |||
| 863 | 0 | |||
| 864 | }; | |||
| 865 | ||||
| 866 | #ifdef ISCSI_ROOT | |||
| 867 | static void | |||
| 868 | iscsi_rootconf(void) | |||
| 869 | { | |||
| 870 | #if 0 | |||
| 871 | nfs_setup_diskless(); | |||
| 872 | if (nfs_diskless_valid) | |||
| 873 | rootdevnames[0] = "nfs:"; | |||
| 874 | #endif | |||
| 875 | printf("** iscsi_rootconf **\n"); | |||
| 876 | } | |||
| 877 | ||||
| 878 | SYSINIT(cpu_rootconf1, SI_SUB_ROOT_CONF, SI_ORDER_FIRST, iscsi_rootconf, NULL)static struct sysinit cpu_rootconf1_sys_init = { SI_SUB_ROOT_CONF , SI_ORDER_FIRST, (sysinit_cfunc_t)(sysinit_nfunc_t)iscsi_rootconf , ((void *)(((void *)0))) }; __asm__(".globl " "__start_set_sysinit_set" ); __asm__(".globl " "__stop_set_sysinit_set"); static void const * const __set_sysinit_set_sym_cpu_rootconf1_sys_init __attribute__ ((__section__("set_" "sysinit_set"))) __attribute__((__used__ )) = &(cpu_rootconf1_sys_init) | |||
| 879 | #endif | |||
| 880 | ||||
| 881 | DECLARE_MODULE(iscsi_initiator, iscsi_mod, SI_SUB_DRIVERS, SI_ORDER_MIDDLE)static struct mod_depend _iscsi_initiator_depend_on_kernel __attribute__ ((__section__(".data"))) = { 1100122, 1100122, (((((1100122)+ ((100000)-1))/(100000))*(100000)) - 1) }; static struct mod_metadata _mod_metadata_md_iscsi_initiator_on_kernel = { 1, 1, &_iscsi_initiator_depend_on_kernel , "kernel" }; __asm__(".globl " "__start_set_modmetadata_set" ); __asm__(".globl " "__stop_set_modmetadata_set"); static void const * const __set_modmetadata_set_sym__mod_metadata_md_iscsi_initiator_on_kernel __attribute__((__section__("set_" "modmetadata_set"))) __attribute__ ((__used__)) = &(_mod_metadata_md_iscsi_initiator_on_kernel ); static struct mod_metadata _mod_metadata_md_iscsi_initiator = { 1, 2, &iscsi_mod, "iscsi_initiator" }; __asm__(".globl " "__start_set_modmetadata_set"); __asm__(".globl " "__stop_set_modmetadata_set" ); static void const * const __set_modmetadata_set_sym__mod_metadata_md_iscsi_initiator __attribute__((__section__("set_" "modmetadata_set"))) __attribute__ ((__used__)) = &(_mod_metadata_md_iscsi_initiator); static struct sysinit iscsi_initiatormodule_sys_init = { SI_SUB_DRIVERS , SI_ORDER_MIDDLE, (sysinit_cfunc_t)(sysinit_nfunc_t)module_register_init , ((void *)(&iscsi_mod)) }; __asm__(".globl " "__start_set_sysinit_set" ); __asm__(".globl " "__stop_set_sysinit_set"); static void const * const __set_sysinit_set_sym_iscsi_initiatormodule_sys_init __attribute__((__section__("set_" "sysinit_set"))) __attribute__ ((__used__)) = &(iscsi_initiatormodule_sys_init); struct __hack; | |||
| 882 | MODULE_DEPEND(iscsi_initiator, cam, 1, 1, 1)static struct mod_depend _iscsi_initiator_depend_on_cam __attribute__ ((__section__(".data"))) = { 1, 1, 1 }; static struct mod_metadata _mod_metadata_md_iscsi_initiator_on_cam = { 1, 1, &_iscsi_initiator_depend_on_cam , "cam" }; __asm__(".globl " "__start_set_modmetadata_set"); __asm__ (".globl " "__stop_set_modmetadata_set"); static void const * const __set_modmetadata_set_sym__mod_metadata_md_iscsi_initiator_on_cam __attribute__((__section__("set_" "modmetadata_set"))) __attribute__ ((__used__)) = &(_mod_metadata_md_iscsi_initiator_on_cam); |
| 1 | /*- |
| 2 | * Copyright (c) 2005-2011 Daniel Braniss <[email protected]> |
| 3 | * All rights reserved. |
| 4 | * |
| 5 | * Redistribution and use in source and binary forms, with or without |
| 6 | * modification, are permitted provided that the following conditions |
| 7 | * are met: |
| 8 | * 1. Redistributions of source code must retain the above copyright |
| 9 | * notice, this list of conditions and the following disclaimer. |
| 10 | * 2. Redistributions in binary form must reproduce the above copyright |
| 11 | * notice, this list of conditions and the following disclaimer in the |
| 12 | * documentation and/or other materials provided with the distribution. |
| 13 | * |
| 14 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND |
| 15 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| 16 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| 17 | * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE |
| 18 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
| 19 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
| 20 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
| 21 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
| 22 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
| 23 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
| 24 | * SUCH DAMAGE. |
| 25 | * |
| 26 | * $FreeBSD: releng/11.0/sys/dev/iscsi_initiator/iscsivar.h 234233 2012-04-13 18:21:56Z jpaetzel $ |
| 27 | */ |
| 28 | |
| 29 | /* |
| 30 | | $Id: iscsivar.h 743 2009-08-08 10:54:53Z danny $ |
| 31 | */ |
| 32 | #define ISCSI_MAX_LUNS128 128 // don't touch this |
| 33 | #if ISCSI_MAX_LUNS128 > 8 |
| 34 | /* |
| 35 | | for this to work |
| 36 | | sysctl kern.cam.cam_srch_hi=1 |
| 37 | */ |
| 38 | #endif |
| 39 | |
| 40 | #ifndef ISCSI_INITIATOR_DEBUG1 |
| 41 | #define ISCSI_INITIATOR_DEBUG1 1 |
| 42 | #endif |
| 43 | |
| 44 | #ifdef ISCSI_INITIATOR_DEBUG1 |
| 45 | extern int iscsi_debug; |
| 46 | #define debug(level, fmt, args...)do {if(level <= iscsi_debug) printf("%s: " fmt "\n", __func__ , args...);} while(0) do {if(level <= iscsi_debug)\ |
| 47 | printf("%s: " fmt "\n", __func__ , ##args);} while(0) |
| 48 | #define sdebug(level, fmt, args...)do {if(level <= iscsi_debug) printf("%d] %s: " fmt "\n", sp ->sid, __func__ , args...);} while(0) do {if(level <= iscsi_debug)\ |
| 49 | printf("%d] %s: " fmt "\n", sp->sid, __func__ , ##args);} while(0) |
| 50 | #define debug_called(level)do {if(level <= iscsi_debug) printf("%s: called\n", __func__ );} while(0) do {if(level <= iscsi_debug)\ |
| 51 | printf("%s: called\n", __func__);} while(0) |
| 52 | #else |
| 53 | #define debug(level, fmt, args...)do {if(level <= iscsi_debug) printf("%s: " fmt "\n", __func__ , args...);} while(0) |
| 54 | #define debug_called(level)do {if(level <= iscsi_debug) printf("%s: called\n", __func__ );} while(0) |
| 55 | #define sdebug(level, fmt, args...)do {if(level <= iscsi_debug) printf("%d] %s: " fmt "\n", sp ->sid, __func__ , args...);} while(0) |
| 56 | #endif /* ISCSI_INITIATOR_DEBUG */ |
| 57 | |
| 58 | #define xdebug(fmt, args...)printf(">>> %s: " fmt "\n", __func__ , args...) printf(">>> %s: " fmt "\n", __func__ , ##args) |
| 59 | |
| 60 | #define MAX_SESSIONS64 ISCSI_MAX_TARGETS64 |
| 61 | #define MAX_PDUS(64*256) (MAX_SESSIONS64*256) // XXX: at the moment this is arbitrary |
| 62 | |
| 63 | typedef uint32_t digest_t(const void *, int len, uint32_t ocrc); |
| 64 | |
| 65 | MALLOC_DECLARE(M_ISCSI)extern struct malloc_type M_ISCSI[1]; |
| 66 | MALLOC_DECLARE(M_ISCSIBUF)extern struct malloc_type M_ISCSIBUF[1]; |
| 67 | |
| 68 | #define ISOK2DIG(dig, pp)((dig != ((void *)0)) && ((pp->ipdu.bhs.opcode & 0x1f) != 0x03)) ((dig != NULL((void *)0)) && ((pp->ipdu.bhs.opcode & 0x1f) != ISCSI_LOGIN_CMD0x03)) |
| 69 | |
| 70 | #ifndef BIT |
| 71 | #define BIT(n)(1 <<(n)) (1 <<(n)) |
| 72 | #endif |
| 73 | |
| 74 | #define ISC_SM_RUN(1 <<(0)) BIT(0)(1 <<(0)) |
| 75 | #define ISC_SM_RUNNING(1 <<(1)) BIT(1)(1 <<(1)) |
| 76 | |
| 77 | #define ISC_LINK_UP(1 <<(2)) BIT(2)(1 <<(2)) |
| 78 | #define ISC_CON_RUN(1 <<(3)) BIT(3)(1 <<(3)) |
| 79 | #define ISC_CON_RUNNING(1 <<(4)) BIT(4)(1 <<(4)) |
| 80 | #define ISC_KILL(1 <<(5)) BIT(5)(1 <<(5)) |
| 81 | #define ISC_OQNOTEMPTY(1 <<(6)) BIT(6)(1 <<(6)) |
| 82 | #define ISC_OWAITING(1 <<(7)) BIT(7)(1 <<(7)) |
| 83 | #define ISC_FFPHASE(1 <<(8)) BIT(8)(1 <<(8)) |
| 84 | |
| 85 | #define ISC_CAMDEVS(1 <<(9)) BIT(9)(1 <<(9)) |
| 86 | #define ISC_SCANWAIT(1 <<(10)) BIT(10)(1 <<(10)) |
| 87 | |
| 88 | #define ISC_MEMWAIT(1 <<(11)) BIT(11)(1 <<(11)) |
| 89 | #define ISC_SIGNALED(1 <<(12)) BIT(12)(1 <<(12)) |
| 90 | |
| 91 | #define ISC_HOLD(1 <<(15)) BIT(15)(1 <<(15)) |
| 92 | #define ISC_HOLDED(1 <<(16)) BIT(16)(1 <<(16)) |
| 93 | |
| 94 | #define ISC_SHUTDOWN(1 <<(31)) BIT(31)(1 <<(31)) |
| 95 | |
| 96 | /* |
| 97 | | some stats |
| 98 | */ |
| 99 | struct i_stats { |
| 100 | int npdu; // number of pdus malloc'ed. |
| 101 | int nrecv; // unprocessed received pdus |
| 102 | int nsent; // sent pdus |
| 103 | |
| 104 | int nrsp, max_rsp; |
| 105 | int nrsv, max_rsv; |
| 106 | int ncsnd, max_csnd; |
| 107 | int nisnd, max_isnd; |
| 108 | int nwsnd, max_wsnd; |
| 109 | int nhld, max_hld; |
| 110 | |
| 111 | struct bintime t_sent; |
| 112 | struct bintime t_recv; |
| 113 | }; |
| 114 | |
| 115 | /* |
| 116 | | one per 'session' |
| 117 | */ |
| 118 | |
| 119 | typedef TAILQ_HEAD(, pduq)struct { struct pduq *tqh_first; struct pduq **tqh_last; } queue_t; |
| 120 | |
| 121 | typedef struct isc_session { |
| 122 | TAILQ_ENTRY(isc_session)struct { struct isc_session *tqe_next; struct isc_session **tqe_prev ; } sp_link; |
| 123 | int flags; |
| 124 | struct cdev *dev; |
| 125 | struct socket *soc; |
| 126 | struct file *fp; |
| 127 | struct thread *td; |
| 128 | |
| 129 | struct proc *proc; // the userland process |
| 130 | int signal; |
| 131 | struct proc *soc_proc; |
| 132 | struct proc *stp; // the sm thread |
| 133 | |
| 134 | struct isc_softc *isc; |
| 135 | |
| 136 | digest_t *hdrDigest; // the digest alg. if any |
| 137 | digest_t *dataDigest; // the digest alg. if any |
| 138 | |
| 139 | int sid; // Session ID |
| 140 | sn_t sn; // sequence number stuff; |
| 141 | int cws; // current window size |
| 142 | |
| 143 | int target_nluns; // this and target_lun are |
| 144 | // hopefully temporal till I |
| 145 | // figure out a better way. |
| 146 | int target_lun[ISCSI_MAX_LUNS128/(sizeof(int)*8) + 1]; |
| 147 | |
| 148 | struct mtx rsp_mtx; |
| 149 | struct mtx rsv_mtx; |
| 150 | struct mtx snd_mtx; |
| 151 | struct mtx hld_mtx; |
| 152 | struct mtx io_mtx; |
| 153 | queue_t rsp; |
| 154 | queue_t rsv; |
| 155 | queue_t csnd; |
| 156 | queue_t isnd; |
| 157 | queue_t wsnd; |
| 158 | queue_t hld; |
| 159 | |
| 160 | isc_opt_t opt; // negotiable values |
| 161 | |
| 162 | struct i_stats stats; |
| 163 | bhs_t bhs; |
| 164 | struct uio uio; |
| 165 | struct iovec iov; |
| 166 | /* |
| 167 | | cam stuff |
| 168 | */ |
| 169 | struct cam_sim *cam_sim; |
| 170 | struct cam_path *cam_path; |
| 171 | struct mtx cam_mtx; |
| 172 | /* |
| 173 | | sysctl stuff |
| 174 | */ |
| 175 | struct sysctl_ctx_list clist; |
| 176 | struct sysctl_oid *oid; |
| 177 | int douio; //XXX: turn on/off uio on read |
| 178 | } isc_session_t; |
| 179 | |
| 180 | typedef struct pduq { |
| 181 | TAILQ_ENTRY(pduq)struct { struct pduq *tqe_next; struct pduq **tqe_prev; } pq_link; |
| 182 | |
| 183 | caddr_t buf; |
| 184 | u_int len; // the total length of the pdu |
| 185 | pdu_t pdu; |
| 186 | union ccb *ccb; |
| 187 | |
| 188 | struct uio uio; |
| 189 | struct iovec iov[5]; // XXX: careful ... |
| 190 | struct mbuf *mp; |
| 191 | struct bintime ts; |
| 192 | queue_t *pduq; |
| 193 | } pduq_t; |
| 194 | /* |
| 195 | */ |
| 196 | struct isc_softc { |
| 197 | struct mtx isc_mtx; |
| 198 | TAILQ_HEAD(,isc_session)struct { struct isc_session *tqh_first; struct isc_session ** tqh_last; } isc_sess; |
| 199 | int nsess; |
| 200 | struct cdev *dev; |
| 201 | char isid[6]; // Initiator Session ID (48 bits) |
| 202 | struct unrhdr *unit; |
| 203 | struct sx unit_sx; |
| 204 | |
| 205 | uma_zone_t pdu_zone; // pool of free pdu's |
| 206 | TAILQ_HEAD(,pduq)struct { struct pduq *tqh_first; struct pduq **tqh_last; } freepdu; |
| 207 | |
| 208 | #ifdef ISCSI_INITIATOR_DEBUG1 |
| 209 | int npdu_alloc, npdu_max; // for instrumentation |
| 210 | #endif |
| 211 | #ifdef DO_EVENTHANDLER |
| 212 | eventhandler_tag eh; |
| 213 | #endif |
| 214 | /* |
| 215 | | sysctl stuff |
| 216 | */ |
| 217 | struct sysctl_ctx_list clist; |
| 218 | struct sysctl_oid *oid; |
| 219 | }; |
| 220 | |
| 221 | #ifdef ISCSI_INITIATOR_DEBUG1 |
| 222 | extern struct mtx iscsi_dbg_mtx; |
| 223 | #endif |
| 224 | |
| 225 | void isc_start_receiver(isc_session_t *sp); |
| 226 | void isc_stop_receiver(isc_session_t *sp); |
| 227 | |
| 228 | int isc_sendPDU(isc_session_t *sp, pduq_t *pq); |
| 229 | int isc_qout(isc_session_t *sp, pduq_t *pq); |
| 230 | int i_prepPDU(isc_session_t *sp, pduq_t *pq); |
| 231 | |
| 232 | int ism_fullfeature(struct cdev *dev, int flag); |
| 233 | |
| 234 | int i_pdu_flush(isc_session_t *sc); |
| 235 | int i_setopt(isc_session_t *sp, isc_opt_t *opt); |
| 236 | void i_freeopt(isc_opt_t *opt); |
| 237 | |
| 238 | int ic_init(isc_session_t *sp); |
| 239 | void ic_destroy(isc_session_t *sp); |
| 240 | void ic_lost_target(isc_session_t *sp, int target); |
| 241 | int ic_getCamVals(isc_session_t *sp, iscsi_cam_t *cp); |
| 242 | |
| 243 | void ism_recv(isc_session_t *sp, pduq_t *pq); |
| 244 | int ism_start(isc_session_t *sp); |
| 245 | void ism_restart(isc_session_t *sp); |
| 246 | void ism_stop(isc_session_t *sp); |
| 247 | |
| 248 | int scsi_encap(struct cam_sim *sim, union ccb *ccb); |
| 249 | int scsi_decap(isc_session_t *sp, pduq_t *opq, pduq_t *pq); |
| 250 | void iscsi_r2t(isc_session_t *sp, pduq_t *opq, pduq_t *pq); |
| 251 | void iscsi_done(isc_session_t *sp, pduq_t *opq, pduq_t *pq); |
| 252 | void iscsi_reject(isc_session_t *sp, pduq_t *opq, pduq_t *pq); |
| 253 | void iscsi_async(isc_session_t *sp, pduq_t *pq); |
| 254 | void iscsi_cleanup(isc_session_t *sp); |
| 255 | int iscsi_requeue(isc_session_t *sp); |
| 256 | |
| 257 | // Serial Number Arithmetic |
| 258 | #define _MAXINCR0x7FFFFFFF 0x7FFFFFFF // 2 ^ 31 - 1 |
| 259 | #define SNA_GT(i1, i2)((i1 != i2) && ( (i1 < i2 && i2 - i1 > 0x7FFFFFFF ) || (i1 > i2 && i1 - i2 < 0x7FFFFFFF))?1: 0) ((i1 != i2) && (\ |
| 260 | (i1 < i2 && i2 - i1 > _MAXINCR0x7FFFFFFF) ||\ |
| 261 | (i1 > i2 && i1 - i2 < _MAXINCR0x7FFFFFFF))?1: 0) |
| 262 | |
| 263 | /* |
| 264 | | inlines |
| 265 | */ |
| 266 | #ifdef _CAM_CAM_XPT_SIM_H |
| 267 | |
| 268 | #if __FreeBSD_version1100122 < 600000 |
| 269 | #define CAM_LOCK(arg) |
| 270 | #define CAM_ULOCK(arg) |
| 271 | |
| 272 | static __inline void |
| 273 | XPT_DONE(isc_session_t *sp, union ccb *ccb) |
| 274 | { |
| 275 | mtx_lock(&Giant)__mtx_lock_flags(&((((&Giant))))->mtx_lock, ((0)), ("/usr/src/sys/dev/iscsi_initiator/iscsivar.h"), (275)); |
| 276 | xpt_done(ccb); |
| 277 | mtx_unlock(&Giant)__mtx_unlock_flags(&((((&Giant))))->mtx_lock, ((0) ), ("/usr/src/sys/dev/iscsi_initiator/iscsivar.h"), (277)); |
| 278 | } |
| 279 | #elif __FreeBSD_version1100122 >= 700000 |
| 280 | #define CAM_LOCK(arg) mtx_lock(&arg->cam_mtx)__mtx_lock_flags(&((((&arg->cam_mtx))))->mtx_lock , ((0)), ("/usr/src/sys/dev/iscsi_initiator/iscsivar.h"), (280 )) |
| 281 | #define CAM_UNLOCK(arg) mtx_unlock(&arg->cam_mtx)__mtx_unlock_flags(&((((&arg->cam_mtx))))->mtx_lock , ((0)), ("/usr/src/sys/dev/iscsi_initiator/iscsivar.h"), (281 )) |
| 282 | |
| 283 | static __inline void |
| 284 | XPT_DONE(isc_session_t *sp, union ccb *ccb) |
| 285 | { |
| 286 | CAM_LOCK(sp); |
| 287 | xpt_done(ccb); |
| 288 | CAM_UNLOCK(sp); |
| 289 | } |
| 290 | #else |
| 291 | //__FreeBSD_version >= 600000 |
| 292 | #define CAM_LOCK(arg) |
| 293 | #define CAM_UNLOCK(arg) |
| 294 | #define XPT_DONE(ignore, arg) xpt_done(arg) |
| 295 | #endif |
| 296 | |
| 297 | #endif /* _CAM_CAM_XPT_SIM_H */ |
| 298 | |
| 299 | static __inline pduq_t * |
| 300 | pdu_alloc(struct isc_softc *isc, int wait) |
| 301 | { |
| 302 | pduq_t *pq; |
| 303 | |
| 304 | pq = (pduq_t *)uma_zalloc(isc->pdu_zone, wait /* M_WAITOK or M_NOWAIT*/); |
| 305 | if(pq == NULL((void *)0)) { |
| 306 | debug(7, "out of mem")do {if(7 <= iscsi_debug) printf("%s: " "out of mem" "\n", __func__ );} while(0); |
| 307 | return NULL((void *)0); |
| 308 | } |
| 309 | #ifdef ISCSI_INITIATOR_DEBUG1 |
| 310 | mtx_lock(&iscsi_dbg_mtx)__mtx_lock_flags(&((((&iscsi_dbg_mtx))))->mtx_lock , ((0)), ("/usr/src/sys/dev/iscsi_initiator/iscsivar.h"), (310 )); |
| 311 | isc->npdu_alloc++; |
| 312 | if(isc->npdu_alloc > isc->npdu_max) |
| 313 | isc->npdu_max = isc->npdu_alloc; |
| 314 | mtx_unlock(&iscsi_dbg_mtx)__mtx_unlock_flags(&((((&iscsi_dbg_mtx))))->mtx_lock , ((0)), ("/usr/src/sys/dev/iscsi_initiator/iscsivar.h"), (314 )); |
| 315 | #endif |
| 316 | memset(pq, 0, sizeof(pduq_t)); |
| 317 | |
| 318 | return pq; |
| 319 | } |
| 320 | |
| 321 | static __inline void |
| 322 | pdu_free(struct isc_softc *isc, pduq_t *pq) |
| 323 | { |
| 324 | if(pq->mp) |
| 325 | m_freem(pq->mp); |
| 326 | #ifdef NO_USE_MBUF |
| 327 | if(pq->buf != NULL((void *)0)) |
| 328 | free(pq->buf, M_ISCSIBUF); |
| 329 | #endif |
| 330 | uma_zfree(isc->pdu_zone, pq); |
| 331 | #ifdef ISCSI_INITIATOR_DEBUG1 |
| 332 | mtx_lock(&iscsi_dbg_mtx)__mtx_lock_flags(&((((&iscsi_dbg_mtx))))->mtx_lock , ((0)), ("/usr/src/sys/dev/iscsi_initiator/iscsivar.h"), (332 )); |
| 333 | isc->npdu_alloc--; |
| 334 | mtx_unlock(&iscsi_dbg_mtx)__mtx_unlock_flags(&((((&iscsi_dbg_mtx))))->mtx_lock , ((0)), ("/usr/src/sys/dev/iscsi_initiator/iscsivar.h"), (334 )); |
| 335 | #endif |
| 336 | } |
| 337 | |
| 338 | static __inline void |
| 339 | i_nqueue_rsp(isc_session_t *sp, pduq_t *pq) |
| 340 | { |
| 341 | mtx_lock(&sp->rsp_mtx)__mtx_lock_flags(&((((&sp->rsp_mtx))))->mtx_lock , ((0)), ("/usr/src/sys/dev/iscsi_initiator/iscsivar.h"), (341 )); |
| 342 | if(++sp->stats.nrsp > sp->stats.max_rsp) |
| 343 | sp->stats.max_rsp = sp->stats.nrsp; |
| 344 | TAILQ_INSERT_TAIL(&sp->rsp, pq, pq_link)do { ; (((pq))->pq_link.tqe_next) = ((void *)0); (pq)-> pq_link.tqe_prev = (&sp->rsp)->tqh_last; *(&sp-> rsp)->tqh_last = (pq); (&sp->rsp)->tqh_last = & (((pq))->pq_link.tqe_next); ; ; } while (0); |
| 345 | mtx_unlock(&sp->rsp_mtx)__mtx_unlock_flags(&((((&sp->rsp_mtx))))->mtx_lock , ((0)), ("/usr/src/sys/dev/iscsi_initiator/iscsivar.h"), (345 )); |
| 346 | } |
| 347 | |
| 348 | static __inline pduq_t * |
| 349 | i_dqueue_rsp(isc_session_t *sp) |
| 350 | { |
| 351 | pduq_t *pq; |
| 352 | |
| 353 | mtx_lock(&sp->rsp_mtx)__mtx_lock_flags(&((((&sp->rsp_mtx))))->mtx_lock , ((0)), ("/usr/src/sys/dev/iscsi_initiator/iscsivar.h"), (353 )); |
| 354 | if((pq = TAILQ_FIRST(&sp->rsp)((&sp->rsp)->tqh_first)) != NULL((void *)0)) { |
| 355 | sp->stats.nrsp--; |
| 356 | TAILQ_REMOVE(&sp->rsp, pq, pq_link)do { ; ; ; ; if (((((pq))->pq_link.tqe_next)) != ((void *) 0)) (((pq))->pq_link.tqe_next)->pq_link.tqe_prev = (pq) ->pq_link.tqe_prev; else { (&sp->rsp)->tqh_last = (pq)->pq_link.tqe_prev; ; } *(pq)->pq_link.tqe_prev = ( ((pq))->pq_link.tqe_next); ; ; ; } while (0); |
| 357 | } |
| 358 | mtx_unlock(&sp->rsp_mtx)__mtx_unlock_flags(&((((&sp->rsp_mtx))))->mtx_lock , ((0)), ("/usr/src/sys/dev/iscsi_initiator/iscsivar.h"), (358 )); |
| 359 | |
| 360 | return pq; |
| 361 | } |
| 362 | |
| 363 | static __inline void |
| 364 | i_nqueue_rsv(isc_session_t *sp, pduq_t *pq) |
| 365 | { |
| 366 | mtx_lock(&sp->rsv_mtx)__mtx_lock_flags(&((((&sp->rsv_mtx))))->mtx_lock , ((0)), ("/usr/src/sys/dev/iscsi_initiator/iscsivar.h"), (366 )); |
| 367 | if(++sp->stats.nrsv > sp->stats.max_rsv) |
| 368 | sp->stats.max_rsv = sp->stats.nrsv; |
| 369 | TAILQ_INSERT_TAIL(&sp->rsv, pq, pq_link)do { ; (((pq))->pq_link.tqe_next) = ((void *)0); (pq)-> pq_link.tqe_prev = (&sp->rsv)->tqh_last; *(&sp-> rsv)->tqh_last = (pq); (&sp->rsv)->tqh_last = & (((pq))->pq_link.tqe_next); ; ; } while (0); |
| 370 | mtx_unlock(&sp->rsv_mtx)__mtx_unlock_flags(&((((&sp->rsv_mtx))))->mtx_lock , ((0)), ("/usr/src/sys/dev/iscsi_initiator/iscsivar.h"), (370 )); |
| 371 | } |
| 372 | |
| 373 | static __inline pduq_t * |
| 374 | i_dqueue_rsv(isc_session_t *sp) |
| 375 | { |
| 376 | pduq_t *pq; |
| 377 | |
| 378 | mtx_lock(&sp->rsv_mtx)__mtx_lock_flags(&((((&sp->rsv_mtx))))->mtx_lock , ((0)), ("/usr/src/sys/dev/iscsi_initiator/iscsivar.h"), (378 )); |
| 379 | if((pq = TAILQ_FIRST(&sp->rsv)((&sp->rsv)->tqh_first)) != NULL((void *)0)) { |
| 380 | sp->stats.nrsv--; |
| 381 | TAILQ_REMOVE(&sp->rsv, pq, pq_link)do { ; ; ; ; if (((((pq))->pq_link.tqe_next)) != ((void *) 0)) (((pq))->pq_link.tqe_next)->pq_link.tqe_prev = (pq) ->pq_link.tqe_prev; else { (&sp->rsv)->tqh_last = (pq)->pq_link.tqe_prev; ; } *(pq)->pq_link.tqe_prev = ( ((pq))->pq_link.tqe_next); ; ; ; } while (0); |
| 382 | } |
| 383 | mtx_unlock(&sp->rsv_mtx)__mtx_unlock_flags(&((((&sp->rsv_mtx))))->mtx_lock , ((0)), ("/usr/src/sys/dev/iscsi_initiator/iscsivar.h"), (383 )); |
| 384 | |
| 385 | return pq; |
| 386 | } |
| 387 | |
| 388 | static __inline void |
| 389 | i_nqueue_csnd(isc_session_t *sp, pduq_t *pq) |
| 390 | { |
| 391 | mtx_lock(&sp->snd_mtx)__mtx_lock_flags(&((((&sp->snd_mtx))))->mtx_lock , ((0)), ("/usr/src/sys/dev/iscsi_initiator/iscsivar.h"), (391 )); |
| 392 | if(++sp->stats.ncsnd > sp->stats.max_csnd) |
| 393 | sp->stats.max_csnd = sp->stats.ncsnd; |
| 394 | TAILQ_INSERT_TAIL(&sp->csnd, pq, pq_link)do { ; (((pq))->pq_link.tqe_next) = ((void *)0); (pq)-> pq_link.tqe_prev = (&sp->csnd)->tqh_last; *(&sp ->csnd)->tqh_last = (pq); (&sp->csnd)->tqh_last = &(((pq))->pq_link.tqe_next); ; ; } while (0); |
| 395 | mtx_unlock(&sp->snd_mtx)__mtx_unlock_flags(&((((&sp->snd_mtx))))->mtx_lock , ((0)), ("/usr/src/sys/dev/iscsi_initiator/iscsivar.h"), (395 )); |
| 396 | } |
| 397 | |
| 398 | static __inline pduq_t * |
| 399 | i_dqueue_csnd(isc_session_t *sp) |
| 400 | { |
| 401 | pduq_t *pq; |
| 402 | |
| 403 | mtx_lock(&sp->snd_mtx)__mtx_lock_flags(&((((&sp->snd_mtx))))->mtx_lock , ((0)), ("/usr/src/sys/dev/iscsi_initiator/iscsivar.h"), (403 )); |
| 404 | if((pq = TAILQ_FIRST(&sp->csnd)((&sp->csnd)->tqh_first)) != NULL((void *)0)) { |
| 405 | sp->stats.ncsnd--; |
| 406 | TAILQ_REMOVE(&sp->csnd, pq, pq_link)do { ; ; ; ; if (((((pq))->pq_link.tqe_next)) != ((void *) 0)) (((pq))->pq_link.tqe_next)->pq_link.tqe_prev = (pq) ->pq_link.tqe_prev; else { (&sp->csnd)->tqh_last = (pq)->pq_link.tqe_prev; ; } *(pq)->pq_link.tqe_prev = (((pq))->pq_link.tqe_next); ; ; ; } while (0); |
| 407 | } |
| 408 | mtx_unlock(&sp->snd_mtx)__mtx_unlock_flags(&((((&sp->snd_mtx))))->mtx_lock , ((0)), ("/usr/src/sys/dev/iscsi_initiator/iscsivar.h"), (408 )); |
| 409 | |
| 410 | return pq; |
| 411 | } |
| 412 | |
| 413 | static __inline void |
| 414 | i_nqueue_isnd(isc_session_t *sp, pduq_t *pq) |
| 415 | { |
| 416 | mtx_lock(&sp->snd_mtx)__mtx_lock_flags(&((((&sp->snd_mtx))))->mtx_lock , ((0)), ("/usr/src/sys/dev/iscsi_initiator/iscsivar.h"), (416 )); |
| 417 | if(++sp->stats.nisnd > sp->stats.max_isnd) |
| 418 | sp->stats.max_isnd = sp->stats.nisnd; |
| 419 | TAILQ_INSERT_TAIL(&sp->isnd, pq, pq_link)do { ; (((pq))->pq_link.tqe_next) = ((void *)0); (pq)-> pq_link.tqe_prev = (&sp->isnd)->tqh_last; *(&sp ->isnd)->tqh_last = (pq); (&sp->isnd)->tqh_last = &(((pq))->pq_link.tqe_next); ; ; } while (0); |
| 420 | mtx_unlock(&sp->snd_mtx)__mtx_unlock_flags(&((((&sp->snd_mtx))))->mtx_lock , ((0)), ("/usr/src/sys/dev/iscsi_initiator/iscsivar.h"), (420 )); |
| 421 | } |
| 422 | |
| 423 | static __inline pduq_t * |
| 424 | i_dqueue_isnd(isc_session_t *sp) |
| 425 | { |
| 426 | pduq_t *pq; |
| 427 | |
| 428 | mtx_lock(&sp->snd_mtx)__mtx_lock_flags(&((((&sp->snd_mtx))))->mtx_lock , ((0)), ("/usr/src/sys/dev/iscsi_initiator/iscsivar.h"), (428 )); |
| 429 | if((pq = TAILQ_FIRST(&sp->isnd)((&sp->isnd)->tqh_first)) != NULL((void *)0)) { |
| 430 | sp->stats.nisnd--; |
| 431 | TAILQ_REMOVE(&sp->isnd, pq, pq_link)do { ; ; ; ; if (((((pq))->pq_link.tqe_next)) != ((void *) 0)) (((pq))->pq_link.tqe_next)->pq_link.tqe_prev = (pq) ->pq_link.tqe_prev; else { (&sp->isnd)->tqh_last = (pq)->pq_link.tqe_prev; ; } *(pq)->pq_link.tqe_prev = (((pq))->pq_link.tqe_next); ; ; ; } while (0); |
| 432 | } |
| 433 | mtx_unlock(&sp->snd_mtx)__mtx_unlock_flags(&((((&sp->snd_mtx))))->mtx_lock , ((0)), ("/usr/src/sys/dev/iscsi_initiator/iscsivar.h"), (433 )); |
| 434 | |
| 435 | return pq; |
| 436 | } |
| 437 | |
| 438 | static __inline void |
| 439 | i_nqueue_wsnd(isc_session_t *sp, pduq_t *pq) |
| 440 | { |
| 441 | mtx_lock(&sp->snd_mtx)__mtx_lock_flags(&((((&sp->snd_mtx))))->mtx_lock , ((0)), ("/usr/src/sys/dev/iscsi_initiator/iscsivar.h"), (441 )); |
| 442 | if(++sp->stats.nwsnd > sp->stats.max_wsnd) |
| 443 | sp->stats.max_wsnd = sp->stats.nwsnd; |
| 444 | TAILQ_INSERT_TAIL(&sp->wsnd, pq, pq_link)do { ; (((pq))->pq_link.tqe_next) = ((void *)0); (pq)-> pq_link.tqe_prev = (&sp->wsnd)->tqh_last; *(&sp ->wsnd)->tqh_last = (pq); (&sp->wsnd)->tqh_last = &(((pq))->pq_link.tqe_next); ; ; } while (0); |
| 445 | mtx_unlock(&sp->snd_mtx)__mtx_unlock_flags(&((((&sp->snd_mtx))))->mtx_lock , ((0)), ("/usr/src/sys/dev/iscsi_initiator/iscsivar.h"), (445 )); |
| 446 | } |
| 447 | |
| 448 | static __inline pduq_t * |
| 449 | i_dqueue_wsnd(isc_session_t *sp) |
| 450 | { |
| 451 | pduq_t *pq; |
| 452 | |
| 453 | mtx_lock(&sp->snd_mtx)__mtx_lock_flags(&((((&sp->snd_mtx))))->mtx_lock , ((0)), ("/usr/src/sys/dev/iscsi_initiator/iscsivar.h"), (453 )); |
| 454 | if((pq = TAILQ_FIRST(&sp->wsnd)((&sp->wsnd)->tqh_first)) != NULL((void *)0)) { |
| 455 | sp->stats.nwsnd--; |
| 456 | TAILQ_REMOVE(&sp->wsnd, pq, pq_link)do { ; ; ; ; if (((((pq))->pq_link.tqe_next)) != ((void *) 0)) (((pq))->pq_link.tqe_next)->pq_link.tqe_prev = (pq) ->pq_link.tqe_prev; else { (&sp->wsnd)->tqh_last = (pq)->pq_link.tqe_prev; ; } *(pq)->pq_link.tqe_prev = (((pq))->pq_link.tqe_next); ; ; ; } while (0); |
| 457 | } |
| 458 | mtx_unlock(&sp->snd_mtx)__mtx_unlock_flags(&((((&sp->snd_mtx))))->mtx_lock , ((0)), ("/usr/src/sys/dev/iscsi_initiator/iscsivar.h"), (458 )); |
| 459 | |
| 460 | return pq; |
| 461 | } |
| 462 | |
| 463 | static __inline pduq_t * |
| 464 | i_dqueue_snd(isc_session_t *sp, int which) |
| 465 | { |
| 466 | pduq_t *pq; |
| 467 | |
| 468 | pq = NULL((void *)0); |
| 469 | mtx_lock(&sp->snd_mtx)__mtx_lock_flags(&((((&sp->snd_mtx))))->mtx_lock , ((0)), ("/usr/src/sys/dev/iscsi_initiator/iscsivar.h"), (469 )); |
| 470 | if((which & BIT(0)(1 <<(0))) && (pq = TAILQ_FIRST(&sp->isnd)((&sp->isnd)->tqh_first)) != NULL((void *)0)) { |
| 471 | sp->stats.nisnd--; |
| 472 | TAILQ_REMOVE(&sp->isnd, pq, pq_link)do { ; ; ; ; if (((((pq))->pq_link.tqe_next)) != ((void *) 0)) (((pq))->pq_link.tqe_next)->pq_link.tqe_prev = (pq) ->pq_link.tqe_prev; else { (&sp->isnd)->tqh_last = (pq)->pq_link.tqe_prev; ; } *(pq)->pq_link.tqe_prev = (((pq))->pq_link.tqe_next); ; ; ; } while (0); |
| 473 | pq->pduq = &sp->isnd; // remember where you came from |
| 474 | } else |
| 475 | if((which & BIT(1)(1 <<(1))) && (pq = TAILQ_FIRST(&sp->wsnd)((&sp->wsnd)->tqh_first)) != NULL((void *)0)) { |
| 476 | sp->stats.nwsnd--; |
| 477 | TAILQ_REMOVE(&sp->wsnd, pq, pq_link)do { ; ; ; ; if (((((pq))->pq_link.tqe_next)) != ((void *) 0)) (((pq))->pq_link.tqe_next)->pq_link.tqe_prev = (pq) ->pq_link.tqe_prev; else { (&sp->wsnd)->tqh_last = (pq)->pq_link.tqe_prev; ; } *(pq)->pq_link.tqe_prev = (((pq))->pq_link.tqe_next); ; ; ; } while (0); |
| 478 | pq->pduq = &sp->wsnd; // remember where you came from |
| 479 | } else |
| 480 | if((which & BIT(2)(1 <<(2))) && (pq = TAILQ_FIRST(&sp->csnd)((&sp->csnd)->tqh_first)) != NULL((void *)0)) { |
| 481 | sp->stats.ncsnd--; |
| 482 | TAILQ_REMOVE(&sp->csnd, pq, pq_link)do { ; ; ; ; if (((((pq))->pq_link.tqe_next)) != ((void *) 0)) (((pq))->pq_link.tqe_next)->pq_link.tqe_prev = (pq) ->pq_link.tqe_prev; else { (&sp->csnd)->tqh_last = (pq)->pq_link.tqe_prev; ; } *(pq)->pq_link.tqe_prev = (((pq))->pq_link.tqe_next); ; ; ; } while (0); |
| 483 | pq->pduq = &sp->csnd; // remember where you came from |
| 484 | } |
| 485 | mtx_unlock(&sp->snd_mtx)__mtx_unlock_flags(&((((&sp->snd_mtx))))->mtx_lock , ((0)), ("/usr/src/sys/dev/iscsi_initiator/iscsivar.h"), (485 )); |
| 486 | |
| 487 | return pq; |
| 488 | } |
| 489 | |
| 490 | static __inline void |
| 491 | i_rqueue_pdu(isc_session_t *sp, pduq_t *pq) |
| 492 | { |
| 493 | mtx_lock(&sp->snd_mtx)__mtx_lock_flags(&((((&sp->snd_mtx))))->mtx_lock , ((0)), ("/usr/src/sys/dev/iscsi_initiator/iscsivar.h"), (493 )); |
| 494 | KASSERT(pq->pduq != NULL, ("pq->pduq is NULL"))do { } while (0); |
| 495 | TAILQ_INSERT_TAIL(pq->pduq, pq, pq_link)do { ; (((pq))->pq_link.tqe_next) = ((void *)0); (pq)-> pq_link.tqe_prev = (pq->pduq)->tqh_last; *(pq->pduq) ->tqh_last = (pq); (pq->pduq)->tqh_last = &(((pq ))->pq_link.tqe_next); ; ; } while (0); |
| 496 | mtx_unlock(&sp->snd_mtx)__mtx_unlock_flags(&((((&sp->snd_mtx))))->mtx_lock , ((0)), ("/usr/src/sys/dev/iscsi_initiator/iscsivar.h"), (496 )); |
| 497 | } |
| 498 | |
| 499 | /* |
| 500 | | Waiting for ACK (or something :-) |
| 501 | */ |
| 502 | static __inline void |
| 503 | i_nqueue_hld(isc_session_t *sp, pduq_t *pq) |
| 504 | { |
| 505 | getbintime(&pq->ts); |
| 506 | mtx_lock(&sp->hld_mtx)__mtx_lock_flags(&((((&sp->hld_mtx))))->mtx_lock , ((0)), ("/usr/src/sys/dev/iscsi_initiator/iscsivar.h"), (506 )); |
| 507 | if(++sp->stats.nhld > sp->stats.max_hld) |
| 508 | sp->stats.max_hld = sp->stats.nhld; |
| 509 | TAILQ_INSERT_TAIL(&sp->hld, pq, pq_link)do { ; (((pq))->pq_link.tqe_next) = ((void *)0); (pq)-> pq_link.tqe_prev = (&sp->hld)->tqh_last; *(&sp-> hld)->tqh_last = (pq); (&sp->hld)->tqh_last = & (((pq))->pq_link.tqe_next); ; ; } while (0); |
| 510 | mtx_unlock(&sp->hld_mtx)__mtx_unlock_flags(&((((&sp->hld_mtx))))->mtx_lock , ((0)), ("/usr/src/sys/dev/iscsi_initiator/iscsivar.h"), (510 )); |
| 511 | return; |
| 512 | } |
| 513 | |
| 514 | static __inline void |
| 515 | i_remove_hld(isc_session_t *sp, pduq_t *pq) |
| 516 | { |
| 517 | mtx_lock(&sp->hld_mtx)__mtx_lock_flags(&((((&sp->hld_mtx))))->mtx_lock , ((0)), ("/usr/src/sys/dev/iscsi_initiator/iscsivar.h"), (517 )); |
| 518 | sp->stats.nhld--; |
| 519 | TAILQ_REMOVE(&sp->hld, pq, pq_link)do { ; ; ; ; if (((((pq))->pq_link.tqe_next)) != ((void *) 0)) (((pq))->pq_link.tqe_next)->pq_link.tqe_prev = (pq) ->pq_link.tqe_prev; else { (&sp->hld)->tqh_last = (pq)->pq_link.tqe_prev; ; } *(pq)->pq_link.tqe_prev = ( ((pq))->pq_link.tqe_next); ; ; ; } while (0); |
| 520 | mtx_unlock(&sp->hld_mtx)__mtx_unlock_flags(&((((&sp->hld_mtx))))->mtx_lock , ((0)), ("/usr/src/sys/dev/iscsi_initiator/iscsivar.h"), (520 )); |
| 521 | } |
| 522 | |
| 523 | static __inline pduq_t * |
| 524 | i_dqueue_hld(isc_session_t *sp) |
| 525 | { |
| 526 | pduq_t *pq; |
| 527 | |
| 528 | mtx_lock(&sp->hld_mtx)__mtx_lock_flags(&((((&sp->hld_mtx))))->mtx_lock , ((0)), ("/usr/src/sys/dev/iscsi_initiator/iscsivar.h"), (528 )); |
| 529 | if((pq = TAILQ_FIRST(&sp->hld)((&sp->hld)->tqh_first)) != NULL((void *)0)) { |
| 530 | sp->stats.nhld--; |
| 531 | TAILQ_REMOVE(&sp->hld, pq, pq_link)do { ; ; ; ; if (((((pq))->pq_link.tqe_next)) != ((void *) 0)) (((pq))->pq_link.tqe_next)->pq_link.tqe_prev = (pq) ->pq_link.tqe_prev; else { (&sp->hld)->tqh_last = (pq)->pq_link.tqe_prev; ; } *(pq)->pq_link.tqe_prev = ( ((pq))->pq_link.tqe_next); ; ; ; } while (0); |
| 532 | } |
| 533 | mtx_unlock(&sp->hld_mtx)__mtx_unlock_flags(&((((&sp->hld_mtx))))->mtx_lock , ((0)), ("/usr/src/sys/dev/iscsi_initiator/iscsivar.h"), (533 )); |
| 534 | |
| 535 | return pq; |
| 536 | } |
| 537 | |
| 538 | static __inline pduq_t * |
| 539 | i_search_hld(isc_session_t *sp, int itt, int keep) |
| 540 | { |
| 541 | pduq_t *pq, *tmp; |
| 542 | |
| 543 | pq = NULL((void *)0); |
| 544 | |
| 545 | mtx_lock(&sp->hld_mtx)__mtx_lock_flags(&((((&sp->hld_mtx))))->mtx_lock , ((0)), ("/usr/src/sys/dev/iscsi_initiator/iscsivar.h"), (545 )); |
| 546 | TAILQ_FOREACH_SAFE(pq, &sp->hld, pq_link, tmp)for ((pq) = (((&sp->hld))->tqh_first); (pq) && ((tmp) = (((pq))->pq_link.tqe_next), 1); (pq) = (tmp)) { |
| 547 | if(pq->pdu.ipdu.bhs.itt == itt) { |
| 548 | if(!keep) { |
| 549 | sp->stats.nhld--; |
| 550 | TAILQ_REMOVE(&sp->hld, pq, pq_link)do { ; ; ; ; if (((((pq))->pq_link.tqe_next)) != ((void *) 0)) (((pq))->pq_link.tqe_next)->pq_link.tqe_prev = (pq) ->pq_link.tqe_prev; else { (&sp->hld)->tqh_last = (pq)->pq_link.tqe_prev; ; } *(pq)->pq_link.tqe_prev = ( ((pq))->pq_link.tqe_next); ; ; ; } while (0); |
| 551 | } |
| 552 | break; |
| 553 | } |
| 554 | } |
| 555 | mtx_unlock(&sp->hld_mtx)__mtx_unlock_flags(&((((&sp->hld_mtx))))->mtx_lock , ((0)), ("/usr/src/sys/dev/iscsi_initiator/iscsivar.h"), (555 )); |
| 556 | |
| 557 | return pq; |
| 558 | } |
| 559 | |
| 560 | static __inline void |
| 561 | i_acked_hld(isc_session_t *sp, pdu_t *op) |
| 562 | { |
| 563 | pduq_t *pq, *tmp; |
| 564 | u_int exp = sp->sn.expCmd; |
| 565 | |
| 566 | pq = NULL((void *)0); |
| 567 | mtx_lock(&sp->hld_mtx)__mtx_lock_flags(&((((&sp->hld_mtx))))->mtx_lock , ((0)), ("/usr/src/sys/dev/iscsi_initiator/iscsivar.h"), (567 )); |
| 568 | TAILQ_FOREACH_SAFE(pq, &sp->hld, pq_link, tmp)for ((pq) = (((&sp->hld))->tqh_first); (pq) && ((tmp) = (((pq))->pq_link.tqe_next), 1); (pq) = (tmp)) { |
| 569 | if((op && op->ipdu.bhs.itt == pq->pdu.ipdu.bhs.itt) |
| 570 | || (pq->ccb == NULL((void *)0) |
| 571 | && (pq->pdu.ipdu.bhs.opcode != ISCSI_WRITE_DATA0x05) |
| 572 | && SNA_GT(exp, ntohl(pq->pdu.ipdu.bhs.ExpStSN))((exp != (__builtin_constant_p(pq->pdu.ipdu.bhs.OpcodeSpecificFields [2]) ? (((__uint32_t)((__uint16_t)(__builtin_constant_p(((__uint32_t )(pq->pdu.ipdu.bhs.OpcodeSpecificFields[2])) & 0xffff) ? (__uint16_t)(((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs .OpcodeSpecificFields[2])) & 0xffff)) << 8 | ((__uint16_t )(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields[2])) & 0xffff)) >> 8) : __bswap16_var(((__uint32_t)(pq-> pdu.ipdu.bhs.OpcodeSpecificFields[2])) & 0xffff))) << 16) | ((__uint16_t)(__builtin_constant_p(((__uint32_t)(pq-> pdu.ipdu.bhs.OpcodeSpecificFields[2])) >> 16) ? (__uint16_t )(((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [2])) >> 16)) << 8 | ((__uint16_t)(((__uint32_t)( pq->pdu.ipdu.bhs.OpcodeSpecificFields[2])) >> 16)) >> 8) : __bswap16_var(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [2])) >> 16)))) : __bswap32_var(pq->pdu.ipdu.bhs.OpcodeSpecificFields [2]))) && ( (exp < (__builtin_constant_p(pq->pdu .ipdu.bhs.OpcodeSpecificFields[2]) ? (((__uint32_t)((__uint16_t )(__builtin_constant_p(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [2])) & 0xffff) ? (__uint16_t)(((__uint16_t)(((__uint32_t )(pq->pdu.ipdu.bhs.OpcodeSpecificFields[2])) & 0xffff) ) << 8 | ((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs .OpcodeSpecificFields[2])) & 0xffff)) >> 8) : __bswap16_var (((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields[2])) & 0xffff))) << 16) | ((__uint16_t)(__builtin_constant_p( ((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields[2])) >> 16) ? (__uint16_t)(((__uint16_t)(((__uint32_t)(pq->pdu.ipdu .bhs.OpcodeSpecificFields[2])) >> 16)) << 8 | ((__uint16_t )(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields[2])) >> 16)) >> 8) : __bswap16_var(((__uint32_t)(pq-> pdu.ipdu.bhs.OpcodeSpecificFields[2])) >> 16)))) : __bswap32_var (pq->pdu.ipdu.bhs.OpcodeSpecificFields[2])) && (__builtin_constant_p (pq->pdu.ipdu.bhs.OpcodeSpecificFields[2]) ? (((__uint32_t )((__uint16_t)(__builtin_constant_p(((__uint32_t)(pq->pdu. ipdu.bhs.OpcodeSpecificFields[2])) & 0xffff) ? (__uint16_t )(((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [2])) & 0xffff)) << 8 | ((__uint16_t)(((__uint32_t) (pq->pdu.ipdu.bhs.OpcodeSpecificFields[2])) & 0xffff)) >> 8) : __bswap16_var(((__uint32_t)(pq->pdu.ipdu.bhs .OpcodeSpecificFields[2])) & 0xffff))) << 16) | ((__uint16_t )(__builtin_constant_p(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [2])) >> 16) ? (__uint16_t)(((__uint16_t)(((__uint32_t) (pq->pdu.ipdu.bhs.OpcodeSpecificFields[2])) >> 16)) << 8 | ((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [2])) >> 16)) >> 8) : __bswap16_var(((__uint32_t) (pq->pdu.ipdu.bhs.OpcodeSpecificFields[2])) >> 16))) ) : __bswap32_var(pq->pdu.ipdu.bhs.OpcodeSpecificFields[2] )) - exp > 0x7FFFFFFF) || (exp > (__builtin_constant_p( pq->pdu.ipdu.bhs.OpcodeSpecificFields[2]) ? (((__uint32_t) ((__uint16_t)(__builtin_constant_p(((__uint32_t)(pq->pdu.ipdu .bhs.OpcodeSpecificFields[2])) & 0xffff) ? (__uint16_t)(( (__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [2])) & 0xffff)) << 8 | ((__uint16_t)(((__uint32_t) (pq->pdu.ipdu.bhs.OpcodeSpecificFields[2])) & 0xffff)) >> 8) : __bswap16_var(((__uint32_t)(pq->pdu.ipdu.bhs .OpcodeSpecificFields[2])) & 0xffff))) << 16) | ((__uint16_t )(__builtin_constant_p(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [2])) >> 16) ? (__uint16_t)(((__uint16_t)(((__uint32_t) (pq->pdu.ipdu.bhs.OpcodeSpecificFields[2])) >> 16)) << 8 | ((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [2])) >> 16)) >> 8) : __bswap16_var(((__uint32_t) (pq->pdu.ipdu.bhs.OpcodeSpecificFields[2])) >> 16))) ) : __bswap32_var(pq->pdu.ipdu.bhs.OpcodeSpecificFields[2] )) && exp - (__builtin_constant_p(pq->pdu.ipdu.bhs .OpcodeSpecificFields[2]) ? (((__uint32_t)((__uint16_t)(__builtin_constant_p (((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields[2])) & 0xffff) ? (__uint16_t)(((__uint16_t)(((__uint32_t)(pq->pdu .ipdu.bhs.OpcodeSpecificFields[2])) & 0xffff)) << 8 | ((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields [2])) & 0xffff)) >> 8) : __bswap16_var(((__uint32_t )(pq->pdu.ipdu.bhs.OpcodeSpecificFields[2])) & 0xffff) )) << 16) | ((__uint16_t)(__builtin_constant_p(((__uint32_t )(pq->pdu.ipdu.bhs.OpcodeSpecificFields[2])) >> 16) ? (__uint16_t)(((__uint16_t)(((__uint32_t)(pq->pdu.ipdu.bhs .OpcodeSpecificFields[2])) >> 16)) << 8 | ((__uint16_t )(((__uint32_t)(pq->pdu.ipdu.bhs.OpcodeSpecificFields[2])) >> 16)) >> 8) : __bswap16_var(((__uint32_t)(pq-> pdu.ipdu.bhs.OpcodeSpecificFields[2])) >> 16)))) : __bswap32_var (pq->pdu.ipdu.bhs.OpcodeSpecificFields[2])) < 0x7FFFFFFF ))?1: 0))) { |
| 573 | sp->stats.nhld--; |
| 574 | TAILQ_REMOVE(&sp->hld, pq, pq_link)do { ; ; ; ; if (((((pq))->pq_link.tqe_next)) != ((void *) 0)) (((pq))->pq_link.tqe_next)->pq_link.tqe_prev = (pq) ->pq_link.tqe_prev; else { (&sp->hld)->tqh_last = (pq)->pq_link.tqe_prev; ; } *(pq)->pq_link.tqe_prev = ( ((pq))->pq_link.tqe_next); ; ; ; } while (0); |
| 575 | pdu_free(sp->isc, pq); |
| 576 | } |
| 577 | } |
| 578 | mtx_unlock(&sp->hld_mtx)__mtx_unlock_flags(&((((&sp->hld_mtx))))->mtx_lock , ((0)), ("/usr/src/sys/dev/iscsi_initiator/iscsivar.h"), (578 )); |
| 579 | } |
| 580 | |
| 581 | static __inline void |
| 582 | i_mbufcopy(struct mbuf *mp, caddr_t dp, int len) |
| 583 | { |
| 584 | struct mbuf *m; |
| 585 | caddr_t bp; |
| 586 | |
| 587 | for(m = mp; m != NULL((void *)0); m = m->m_next) { |
| 588 | bp = mtod(m, caddr_t)((caddr_t)((m)->m_data)); |
| 589 | /* |
| 590 | | the pdu is word (4 octed) aligned |
| 591 | | so len <= packet |
| 592 | */ |
| 593 | memcpy(dp, bp, MIN(len, m->m_len)(((len)<(m->m_len))?(len):(m->m_len))); |
| 594 | dp += m->m_len; |
| 595 | len -= m->m_len; |
| 596 | if(len <= 0) |
| 597 | break; |
| 598 | } |
| 599 | } |