From c4d87335a8ac1e3af208e479a8da623516686f90 Mon Sep 17 00:00:00 2001 From: Josh Paetzel Date: Fri, 13 Apr 2012 18:21:56 +0000 Subject: [PATCH] Update to version 2.3.1.0 Obtained from: Daniel Braniss --- sbin/iscontrol/Makefile | 2 +- sbin/iscontrol/iscontrol.8 | 2 +- sbin/iscontrol/iscontrol.c | 20 +++++- sbin/iscontrol/iscsi.conf.5 | 2 +- share/man/man4/iscsi_initiator.4 | 35 +++++----- sys/dev/iscsi/initiator/isc_subr.c | 100 ++++++++++++++++++++++++++- sys/dev/iscsi/initiator/iscsi.c | 21 ++++-- sys/dev/iscsi/initiator/iscsi_subr.c | 10 ++- sys/dev/iscsi/initiator/iscsivar.h | 14 ++-- sys/modules/iscsi/initiator/Makefile | 12 ++-- 10 files changed, 176 insertions(+), 42 deletions(-) diff --git a/sbin/iscontrol/Makefile b/sbin/iscontrol/Makefile index 1830ad935a7a..05085b97cba7 100644 --- a/sbin/iscontrol/Makefile +++ b/sbin/iscontrol/Makefile @@ -8,7 +8,7 @@ S= ${.CURDIR}/../../sys WARNS?= 3 CFLAGS += -I$S -#CFLAGS += -g -DDEBUG +CFLAGS += -g -DDEBUG MAN= iscsi.conf.5 iscontrol.8 diff --git a/sbin/iscontrol/iscontrol.8 b/sbin/iscontrol/iscontrol.8 index d2e8bdddd3d0..f68381571df7 100644 --- a/sbin/iscontrol/iscontrol.8 +++ b/sbin/iscontrol/iscontrol.8 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd February 22, 2007 +.Dd August 9, 2010 .Dt ISCONTROL 8 .Os .Sh NAME diff --git a/sbin/iscontrol/iscontrol.c b/sbin/iscontrol/iscontrol.c index c7bda0e13fc1..96f2cbf8e6a8 100644 --- a/sbin/iscontrol/iscontrol.c +++ b/sbin/iscontrol/iscontrol.c @@ -56,6 +56,8 @@ __FBSDID("$FreeBSD$"); #include #include "iscontrol.h" +static char version[] = "2.3.1"; // keep in sync with iscsi_initiator + #define USAGE "[-v] [-d] [-c config] [-n name] [-t target] [-p pidfile]" #define OPTIONS "vdc:t:n:p:" @@ -124,9 +126,10 @@ int main(int cc, char **vv) { int ch, disco; - char *pname, *pidfile, *p, *q, *ta, *kw; + char *pname, *pidfile, *p, *q, *ta, *kw, *v; isc_opt_t *op; FILE *fd; + size_t n; op = &opvals; iscsidev = "/dev/"ISCSIDEV; @@ -138,6 +141,21 @@ main(int cc, char **vv) kw = ta = 0; disco = 0; pidfile = NULL; + /* + | check for driver & controller version match + */ + n = 0; + if(sysctlbyname("net.iscsi_initiator.driver_version", 0, &n, 0, 0) != 0) + perror("sysctlbyname"); + v = malloc(n+1); + if(sysctlbyname("net.iscsi_initiator.driver_version", v, &n, 0, 0) != 0) + perror("sysctlbyname"); + + if(strncmp(version, v, 3)) { + fprintf(stderr, "versions missmatch\n"); + exit(1); + } + while((ch = getopt(cc, vv, OPTIONS)) != -1) { switch(ch) { diff --git a/sbin/iscontrol/iscsi.conf.5 b/sbin/iscontrol/iscsi.conf.5 index c1f320fbf1bb..751a594c52ee 100644 --- a/sbin/iscontrol/iscsi.conf.5 +++ b/sbin/iscontrol/iscsi.conf.5 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd February 25, 2012 +.Dd June 5, 2007 .Dt ISCSI.CONF 5 .Os .Sh NAME diff --git a/share/man/man4/iscsi_initiator.4 b/share/man/man4/iscsi_initiator.4 index b937f6b55bab..a862c02bf8c5 100644 --- a/share/man/man4/iscsi_initiator.4 +++ b/share/man/man4/iscsi_initiator.4 @@ -1,4 +1,4 @@ -.\" Copyright (c) 2007 Daniel Braniss +.\" Copyright (c) 2007-2010 Daniel Braniss .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without @@ -24,9 +24,9 @@ .\" .\" $FreeBSD$ .\" -.Dd May 9, 2010 -.Dt ISCSI_INITIATOR 4 +.Dd August 3, 2010 .Os +.Dt ISCSI_INITIATOR 4 .Sh NAME .Nm iscsi_initiator .Nd kernel driver for the iSCSI protocol @@ -48,38 +48,36 @@ iscsi_initiator_load="YES" The .Nm implements the kernel side of the Internet SCSI (iSCSI) network -protocol standard. -The userland companion is +protocol standard, the user land companion is .Xr iscontrol 8 , and permits access to remote .Em virtual SCSI devices via .Xr cam 4 . .Sh SYSCTL VARIABLES -.Bl -tag -width "net.iscsi.n.targedaddress" +.Bl -tag -width ".Va net.iscsi.n.targeaddress" .It Va debug.iscsi_initiator set the debug-level, 0 means no debugging, 9 for maximum. .It Va net.iscsi.isid the initiator part of the Session Identifier. -.El -.Pp -The following are informative only: -.Bl -tag -width "net.iscsi.n.targedaddress" +.It Va "kern.cam.cam_srch_hi=1" +allow search above LUN 7 for SCSI3 and greater devices. +.It "the following are informative only:" .It Va net.iscsi.driver_version the current version of the driver. .It Va net.iscsi.sessions the number of current active sessions. .It Va net.iscsi.n.targetname -the target name of session +is the targe name of session .Em n . -.It Va net.iscsi.n.targedaddress -the IP address of the target of session +.It Va net.iscsi.n.targeaddress +is the IP address of the target of session .Em n . .It Va net.iscsi.n.stats -statistics for session -.Em n +are some statistics for session +.EM n .It Va net.iscsi.n.pid -the +is the .Em "process id" of the userland side of session .Em n , @@ -87,11 +85,11 @@ see .Xr iscontrol 8 . .El .Sh FILES -The +The .Nm driver creates the following: -.Pp .Bl -tag -width ".Pa /dev/iscsi%dxx" -compact +.Pp .It Pa /dev/iscsi used to create new sessions. .It Pa /dev/iscsi%d @@ -105,5 +103,6 @@ for each new session. iSCSI RFC 3720 .\" .Sh HISTORY .\" .Sh AUTHORS +This software was written by Daniel Braniss .Sh BUGS The lun discovery method is old-fashioned. diff --git a/sys/dev/iscsi/initiator/isc_subr.c b/sys/dev/iscsi/initiator/isc_subr.c index 4d75a87d7de7..d7f0d2754dcd 100644 --- a/sys/dev/iscsi/initiator/isc_subr.c +++ b/sys/dev/iscsi/initiator/isc_subr.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2005-2010 Daniel Braniss + * Copyright (c) 2005-2011 Daniel Braniss * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -77,6 +77,104 @@ i_strdupin(char *s, size_t maxlen) return q; } +#if __FreeBSD_version < 800000 +/*****************************************************************/ +/* */ +/* CRC LOOKUP TABLE */ +/* ================ */ +/* The following CRC lookup table was generated automagically */ +/* by the Rocksoft^tm Model CRC Algorithm Table Generation */ +/* Program V1.0 using the following model parameters: */ +/* */ +/* Width : 4 bytes. */ +/* Poly : 0x1EDC6F41L */ +/* Reverse : TRUE. */ +/* */ +/* For more information on the Rocksoft^tm Model CRC Algorithm, */ +/* see the document titled "A Painless Guide to CRC Error */ +/* Detection Algorithms" by Ross Williams */ +/* (ross@guest.adelaide.edu.au.). This document is likely to be */ +/* in the FTP archive "ftp.adelaide.edu.au/pub/rocksoft". */ +/* */ +/*****************************************************************/ + +static uint32_t crc32Table[256] = { + 0x00000000L, 0xF26B8303L, 0xE13B70F7L, 0x1350F3F4L, + 0xC79A971FL, 0x35F1141CL, 0x26A1E7E8L, 0xD4CA64EBL, + 0x8AD958CFL, 0x78B2DBCCL, 0x6BE22838L, 0x9989AB3BL, + 0x4D43CFD0L, 0xBF284CD3L, 0xAC78BF27L, 0x5E133C24L, + 0x105EC76FL, 0xE235446CL, 0xF165B798L, 0x030E349BL, + 0xD7C45070L, 0x25AFD373L, 0x36FF2087L, 0xC494A384L, + 0x9A879FA0L, 0x68EC1CA3L, 0x7BBCEF57L, 0x89D76C54L, + 0x5D1D08BFL, 0xAF768BBCL, 0xBC267848L, 0x4E4DFB4BL, + 0x20BD8EDEL, 0xD2D60DDDL, 0xC186FE29L, 0x33ED7D2AL, + 0xE72719C1L, 0x154C9AC2L, 0x061C6936L, 0xF477EA35L, + 0xAA64D611L, 0x580F5512L, 0x4B5FA6E6L, 0xB93425E5L, + 0x6DFE410EL, 0x9F95C20DL, 0x8CC531F9L, 0x7EAEB2FAL, + 0x30E349B1L, 0xC288CAB2L, 0xD1D83946L, 0x23B3BA45L, + 0xF779DEAEL, 0x05125DADL, 0x1642AE59L, 0xE4292D5AL, + 0xBA3A117EL, 0x4851927DL, 0x5B016189L, 0xA96AE28AL, + 0x7DA08661L, 0x8FCB0562L, 0x9C9BF696L, 0x6EF07595L, + 0x417B1DBCL, 0xB3109EBFL, 0xA0406D4BL, 0x522BEE48L, + 0x86E18AA3L, 0x748A09A0L, 0x67DAFA54L, 0x95B17957L, + 0xCBA24573L, 0x39C9C670L, 0x2A993584L, 0xD8F2B687L, + 0x0C38D26CL, 0xFE53516FL, 0xED03A29BL, 0x1F682198L, + 0x5125DAD3L, 0xA34E59D0L, 0xB01EAA24L, 0x42752927L, + 0x96BF4DCCL, 0x64D4CECFL, 0x77843D3BL, 0x85EFBE38L, + 0xDBFC821CL, 0x2997011FL, 0x3AC7F2EBL, 0xC8AC71E8L, + 0x1C661503L, 0xEE0D9600L, 0xFD5D65F4L, 0x0F36E6F7L, + 0x61C69362L, 0x93AD1061L, 0x80FDE395L, 0x72966096L, + 0xA65C047DL, 0x5437877EL, 0x4767748AL, 0xB50CF789L, + 0xEB1FCBADL, 0x197448AEL, 0x0A24BB5AL, 0xF84F3859L, + 0x2C855CB2L, 0xDEEEDFB1L, 0xCDBE2C45L, 0x3FD5AF46L, + 0x7198540DL, 0x83F3D70EL, 0x90A324FAL, 0x62C8A7F9L, + 0xB602C312L, 0x44694011L, 0x5739B3E5L, 0xA55230E6L, + 0xFB410CC2L, 0x092A8FC1L, 0x1A7A7C35L, 0xE811FF36L, + 0x3CDB9BDDL, 0xCEB018DEL, 0xDDE0EB2AL, 0x2F8B6829L, + 0x82F63B78L, 0x709DB87BL, 0x63CD4B8FL, 0x91A6C88CL, + 0x456CAC67L, 0xB7072F64L, 0xA457DC90L, 0x563C5F93L, + 0x082F63B7L, 0xFA44E0B4L, 0xE9141340L, 0x1B7F9043L, + 0xCFB5F4A8L, 0x3DDE77ABL, 0x2E8E845FL, 0xDCE5075CL, + 0x92A8FC17L, 0x60C37F14L, 0x73938CE0L, 0x81F80FE3L, + 0x55326B08L, 0xA759E80BL, 0xB4091BFFL, 0x466298FCL, + 0x1871A4D8L, 0xEA1A27DBL, 0xF94AD42FL, 0x0B21572CL, + 0xDFEB33C7L, 0x2D80B0C4L, 0x3ED04330L, 0xCCBBC033L, + 0xA24BB5A6L, 0x502036A5L, 0x4370C551L, 0xB11B4652L, + 0x65D122B9L, 0x97BAA1BAL, 0x84EA524EL, 0x7681D14DL, + 0x2892ED69L, 0xDAF96E6AL, 0xC9A99D9EL, 0x3BC21E9DL, + 0xEF087A76L, 0x1D63F975L, 0x0E330A81L, 0xFC588982L, + 0xB21572C9L, 0x407EF1CAL, 0x532E023EL, 0xA145813DL, + 0x758FE5D6L, 0x87E466D5L, 0x94B49521L, 0x66DF1622L, + 0x38CC2A06L, 0xCAA7A905L, 0xD9F75AF1L, 0x2B9CD9F2L, + 0xFF56BD19L, 0x0D3D3E1AL, 0x1E6DCDEEL, 0xEC064EEDL, + 0xC38D26C4L, 0x31E6A5C7L, 0x22B65633L, 0xD0DDD530L, + 0x0417B1DBL, 0xF67C32D8L, 0xE52CC12CL, 0x1747422FL, + 0x49547E0BL, 0xBB3FFD08L, 0xA86F0EFCL, 0x5A048DFFL, + 0x8ECEE914L, 0x7CA56A17L, 0x6FF599E3L, 0x9D9E1AE0L, + 0xD3D3E1ABL, 0x21B862A8L, 0x32E8915CL, 0xC083125FL, + 0x144976B4L, 0xE622F5B7L, 0xF5720643L, 0x07198540L, + 0x590AB964L, 0xAB613A67L, 0xB831C993L, 0x4A5A4A90L, + 0x9E902E7BL, 0x6CFBAD78L, 0x7FAB5E8CL, 0x8DC0DD8FL, + 0xE330A81AL, 0x115B2B19L, 0x020BD8EDL, 0xF0605BEEL, + 0x24AA3F05L, 0xD6C1BC06L, 0xC5914FF2L, 0x37FACCF1L, + 0x69E9F0D5L, 0x9B8273D6L, 0x88D28022L, 0x7AB90321L, + 0xAE7367CAL, 0x5C18E4C9L, 0x4F48173DL, 0xBD23943EL, + 0xF36E6F75L, 0x0105EC76L, 0x12551F82L, 0xE03E9C81L, + 0x34F4F86AL, 0xC69F7B69L, 0xD5CF889DL, 0x27A40B9EL, + 0x79B737BAL, 0x8BDCB4B9L, 0x988C474DL, 0x6AE7C44EL, + 0xBE2DA0A5L, 0x4C4623A6L, 0x5F16D052L, 0xAD7D5351L +}; + +static __inline int +calculate_crc32c(uint32_t crc, const void *buf, size_t size) +{ + const uint8_t *p = buf; + + while (size--) + crc = crc32Table[(crc ^ *p++) & 0xff] ^ (crc >> 8); + return crc; +} +#endif static uint32_t i_crc32c(const void *buf, size_t size, uint32_t crc) diff --git a/sys/dev/iscsi/initiator/iscsi.c b/sys/dev/iscsi/initiator/iscsi.c index 4c06b9852592..a93a68577f79 100644 --- a/sys/dev/iscsi/initiator/iscsi.c +++ b/sys/dev/iscsi/initiator/iscsi.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2005-2010 Daniel Braniss + * Copyright (c) 2005-2011 Daniel Braniss * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -60,7 +60,7 @@ __FBSDID("$FreeBSD$"); #include #include -static char *iscsi_driver_version = "2.2.4.2"; +static char *iscsi_driver_version = "2.3.1"; static struct isc_softc *isc; @@ -231,8 +231,8 @@ iscsi_ioctl(struct cdev *dev, u_long cmd, caddr_t arg, int mode, struct thread * if(error == 0) { sp->proc = td->td_proc; SYSCTL_ADD_INT(&sp->clist, SYSCTL_CHILDREN(sp->oid), - OID_AUTO, "pid", CTLFLAG_RD, - &sp->proc->p_pid, sizeof(pid_t), "control process id"); + OID_AUTO, "pid", CTLFLAG_RD, + &sp->proc->p_pid, sizeof(pid_t), "control process id"); } break; @@ -290,8 +290,7 @@ iscsi_read(struct cdev *dev, struct uio *uio, int ioflag) sprintf(buf, "%03d] '%s' '%s'\n", i++, sp->opt.targetAddress, sp->opt.targetName); uiomove(buf, strlen(buf), uio); } - sprintf(buf, "%d/%d /---- free -----/\n", sc->npdu_alloc, sc->npdu_max); - i = 0; + sprintf(buf, "free npdu_alloc=%d, npdu_max=%d\n", sc->npdu_alloc, sc->npdu_max); uiomove(buf, strlen(buf), uio); } else { @@ -696,7 +695,6 @@ iscsi_shutdown(void *v) static void free_pdus(struct isc_softc *sc) { - debug_called(8); if(sc->pdu_zone != NULL) { @@ -777,6 +775,10 @@ iscsi_start(void) sizeof(isc->nsess), "number of active session"); +#ifdef ISCSI_INITIATOR_DEBUG + mtx_init(&iscsi_dbg_mtx, "iscsi_dbg", NULL, MTX_DEF); +#endif + printf("iscsi: version %s\n", iscsi_driver_version); } @@ -814,6 +816,11 @@ iscsi_stop(void) xdebug("sysctl_ctx_free failed"); iscsi_shutdown(isc); // XXX: check EVENTHANDLER_ ... + +#ifdef ISCSI_INITIATOR_DEBUG + mtx_destroy(&iscsi_dbg_mtx); +#endif + free(isc, M_ISCSI); } diff --git a/sys/dev/iscsi/initiator/iscsi_subr.c b/sys/dev/iscsi/initiator/iscsi_subr.c index 939bafcf05d3..013b16e12479 100644 --- a/sys/dev/iscsi/initiator/iscsi_subr.c +++ b/sys/dev/iscsi/initiator/iscsi_subr.c @@ -154,7 +154,7 @@ getSenseData(u_int status, union ccb *ccb, pduq_t *pq) scsi_rsp_t *cmd = &pp->ipdu.scsi_rsp; caddr_t bp; int sense_len, mustfree = 0; - int error_code, sense_key, asc, ascq; + int error_code, sense_key, asc, ascq; bp = mtod(pq->mp, caddr_t); if((sense_len = scsi_2btoul(bp)) == 0) @@ -176,9 +176,8 @@ getSenseData(u_int status, union ccb *ccb, pduq_t *pq) scsi->sense_resid = 0; if(cmd->flag & (BIT(1)|BIT(2))) scsi->sense_resid = ntohl(pp->ipdu.scsi_rsp.rcnt); - scsi_extract_sense_len(sense, scsi->sense_len - scsi->sense_resid, - &error_code, &sense_key, &asc, &ascq, /*show_errors*/ 1); + &error_code, &sense_key, &asc, &ascq, /*show_errors*/ 1); debug(3, "sense_len=%d rcnt=%d sense_resid=%d dsl=%d error_code=%x flags=%x", sense_len, @@ -479,6 +478,8 @@ scsi_encap(struct cam_sim *sim, union ccb *ccb) cmd = &pq->pdu.ipdu.scsi_req; cmd->opcode = ISCSI_SCSI_CMD; cmd->F = 1; +#if 0 +// this breaks at least Isilon's iscsi target. /* | map tag option, default is UNTAGGED */ @@ -488,6 +489,9 @@ scsi_encap(struct cam_sim *sim, union ccb *ccb) case MSG_ORDERED_Q_TAG: cmd->attr = iSCSI_TASK_ORDER; break; case MSG_ACA_TASK: cmd->attr = iSCSI_TASK_ACA; break; } +#else + cmd->attr = iSCSI_TASK_SIMPLE; +#endif dwl(sp, ccb_h->target_lun, (u_char *)&cmd->lun); diff --git a/sys/dev/iscsi/initiator/iscsivar.h b/sys/dev/iscsi/initiator/iscsivar.h index 875d7ad1974b..681ad7053e0b 100644 --- a/sys/dev/iscsi/initiator/iscsivar.h +++ b/sys/dev/iscsi/initiator/iscsivar.h @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2005-2010 Daniel Braniss + * Copyright (c) 2005-2011 Daniel Braniss * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -203,6 +203,8 @@ struct isc_softc { struct sx unit_sx; uma_zone_t pdu_zone; // pool of free pdu's + TAILQ_HEAD(,pduq) freepdu; + #ifdef ISCSI_INITIATOR_DEBUG int npdu_alloc, npdu_max; // for instrumentation #endif @@ -305,9 +307,11 @@ pdu_alloc(struct isc_softc *isc, int wait) return NULL; } #ifdef ISCSI_INITIATOR_DEBUG + mtx_lock(&iscsi_dbg_mtx); isc->npdu_alloc++; if(isc->npdu_alloc > isc->npdu_max) isc->npdu_max = isc->npdu_alloc; + mtx_unlock(&iscsi_dbg_mtx); #endif memset(pq, 0, sizeof(pduq_t)); @@ -322,11 +326,13 @@ pdu_free(struct isc_softc *isc, pduq_t *pq) #ifdef NO_USE_MBUF if(pq->buf != NULL) free(pq->buf, M_ISCSIBUF); -#endif -#ifdef ISCSI_INITIATOR_DEBUG - isc->npdu_alloc--; #endif uma_zfree(isc->pdu_zone, pq); +#ifdef ISCSI_INITIATOR_DEBUG + mtx_lock(&iscsi_dbg_mtx); + isc->npdu_alloc--; + mtx_unlock(&iscsi_dbg_mtx); +#endif } static __inline void diff --git a/sys/modules/iscsi/initiator/Makefile b/sys/modules/iscsi/initiator/Makefile index 3295c7b6f517..092ddea61c26 100644 --- a/sys/modules/iscsi/initiator/Makefile +++ b/sys/modules/iscsi/initiator/Makefile @@ -1,14 +1,16 @@ # $FreeBSD$ -.PATH: ${.CURDIR}/../../../dev/iscsi/initiator +S= ${.CURDIR}/../../.. +.PATH: $S/dev/iscsi/initiator + KMOD=iscsi_initiator SRCS= iscsi.h iscsivar.h SRCS+= iscsi.c isc_cam.c isc_soc.c isc_sm.c isc_subr.c iscsi_subr.c SRCS+= opt_cam.h opt_iscsi_initiator.h SRCS+= bus_if.h device_if.h - -# Debugging -# CFLAGS+= -DISCSI_INITIATOR_DEBUG=9 - +#CFLAGS+= -DNO_USE_MBUF +CFLAGS+= -DISCSI_INITIATOR_DEBUG=2 +CFLAGS+= -I$S +CFLAGS+= -DINVARIANTS .include