Path: blob/master/include/scsi/scsi_transport_iscsi.h
10820 views
/*1* iSCSI transport class definitions2*3* Copyright (C) IBM Corporation, 20044* Copyright (C) Mike Christie, 2004 - 20065* Copyright (C) Dmitry Yusupov, 2004 - 20056* Copyright (C) Alex Aizman, 2004 - 20057*8* This program is free software; you can redistribute it and/or modify9* it under the terms of the GNU General Public License as published by10* the Free Software Foundation; either version 2 of the License, or11* (at your option) any later version.12*13* This program is distributed in the hope that it will be useful,14* but WITHOUT ANY WARRANTY; without even the implied warranty of15* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the16* GNU General Public License for more details.17*18* You should have received a copy of the GNU General Public License19* along with this program; if not, write to the Free Software20* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.21*/22#ifndef SCSI_TRANSPORT_ISCSI_H23#define SCSI_TRANSPORT_ISCSI_H2425#include <linux/device.h>26#include <linux/list.h>27#include <linux/mutex.h>28#include <scsi/iscsi_if.h>2930struct scsi_transport_template;31struct iscsi_transport;32struct iscsi_endpoint;33struct Scsi_Host;34struct scsi_cmnd;35struct iscsi_cls_conn;36struct iscsi_conn;37struct iscsi_task;38struct sockaddr;3940/**41* struct iscsi_transport - iSCSI Transport template42*43* @name: transport name44* @caps: iSCSI Data-Path capabilities45* @create_session: create new iSCSI session object46* @destroy_session: destroy existing iSCSI session object47* @create_conn: create new iSCSI connection48* @bind_conn: associate this connection with existing iSCSI session49* and specified transport descriptor50* @destroy_conn: destroy inactive iSCSI connection51* @set_param: set iSCSI parameter. Return 0 on success, -ENODATA52* when param is not supported, and a -Exx value on other53* error.54* @get_param get iSCSI parameter. Must return number of bytes55* copied to buffer on success, -ENODATA when param56* is not supported, and a -Exx value on other error57* @start_conn: set connection to be operational58* @stop_conn: suspend/recover/terminate connection59* @send_pdu: send iSCSI PDU, Login, Logout, NOP-Out, Reject, Text.60* @session_recovery_timedout: notify LLD a block during recovery timed out61* @init_task: Initialize a iscsi_task and any internal structs.62* When offloading the data path, this is called from63* queuecommand with the session lock, or from the64* iscsi_conn_send_pdu context with the session lock.65* When not offloading the data path, this is called66* from the scsi work queue without the session lock.67* @xmit_task Requests LLD to transfer cmd task. Returns 0 or the68* the number of bytes transferred on success, and -Exyz69* value on error. When offloading the data path, this70* is called from queuecommand with the session lock, or71* from the iscsi_conn_send_pdu context with the session72* lock. When not offloading the data path, this is called73* from the scsi work queue without the session lock.74* @cleanup_task: requests LLD to fail task. Called with session lock75* and after the connection has been suspended and76* terminated during recovery. If called77* from abort task then connection is not suspended78* or terminated but sk_callback_lock is held79*80* Template API provided by iSCSI Transport81*/82struct iscsi_transport {83struct module *owner;84char *name;85unsigned int caps;86/* LLD sets this to indicate what values it can export to sysfs */87uint64_t param_mask;88uint64_t host_param_mask;89struct iscsi_cls_session *(*create_session) (struct iscsi_endpoint *ep,90uint16_t cmds_max, uint16_t qdepth,91uint32_t sn);92void (*destroy_session) (struct iscsi_cls_session *session);93struct iscsi_cls_conn *(*create_conn) (struct iscsi_cls_session *sess,94uint32_t cid);95int (*bind_conn) (struct iscsi_cls_session *session,96struct iscsi_cls_conn *cls_conn,97uint64_t transport_eph, int is_leading);98int (*start_conn) (struct iscsi_cls_conn *conn);99void (*stop_conn) (struct iscsi_cls_conn *conn, int flag);100void (*destroy_conn) (struct iscsi_cls_conn *conn);101int (*set_param) (struct iscsi_cls_conn *conn, enum iscsi_param param,102char *buf, int buflen);103int (*get_ep_param) (struct iscsi_endpoint *ep, enum iscsi_param param,104char *buf);105int (*get_conn_param) (struct iscsi_cls_conn *conn,106enum iscsi_param param, char *buf);107int (*get_session_param) (struct iscsi_cls_session *session,108enum iscsi_param param, char *buf);109int (*get_host_param) (struct Scsi_Host *shost,110enum iscsi_host_param param, char *buf);111int (*set_host_param) (struct Scsi_Host *shost,112enum iscsi_host_param param, char *buf,113int buflen);114int (*send_pdu) (struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr,115char *data, uint32_t data_size);116void (*get_stats) (struct iscsi_cls_conn *conn,117struct iscsi_stats *stats);118119int (*init_task) (struct iscsi_task *task);120int (*xmit_task) (struct iscsi_task *task);121void (*cleanup_task) (struct iscsi_task *task);122123int (*alloc_pdu) (struct iscsi_task *task, uint8_t opcode);124int (*xmit_pdu) (struct iscsi_task *task);125int (*init_pdu) (struct iscsi_task *task, unsigned int offset,126unsigned int count);127void (*parse_pdu_itt) (struct iscsi_conn *conn, itt_t itt,128int *index, int *age);129130void (*session_recovery_timedout) (struct iscsi_cls_session *session);131struct iscsi_endpoint *(*ep_connect) (struct Scsi_Host *shost,132struct sockaddr *dst_addr,133int non_blocking);134int (*ep_poll) (struct iscsi_endpoint *ep, int timeout_ms);135void (*ep_disconnect) (struct iscsi_endpoint *ep);136int (*tgt_dscvr) (struct Scsi_Host *shost, enum iscsi_tgt_dscvr type,137uint32_t enable, struct sockaddr *dst_addr);138int (*set_path) (struct Scsi_Host *shost, struct iscsi_path *params);139};140141/*142* transport registration upcalls143*/144extern struct scsi_transport_template *iscsi_register_transport(struct iscsi_transport *tt);145extern int iscsi_unregister_transport(struct iscsi_transport *tt);146147/*148* control plane upcalls149*/150extern void iscsi_conn_error_event(struct iscsi_cls_conn *conn,151enum iscsi_err error);152extern int iscsi_recv_pdu(struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr,153char *data, uint32_t data_size);154155extern int iscsi_offload_mesg(struct Scsi_Host *shost,156struct iscsi_transport *transport, uint32_t type,157char *data, uint16_t data_size);158159struct iscsi_cls_conn {160struct list_head conn_list; /* item in connlist */161void *dd_data; /* LLD private data */162struct iscsi_transport *transport;163uint32_t cid; /* connection id */164struct mutex ep_mutex;165struct iscsi_endpoint *ep;166167struct device dev; /* sysfs transport/container device */168};169170#define iscsi_dev_to_conn(_dev) \171container_of(_dev, struct iscsi_cls_conn, dev)172173#define iscsi_conn_to_session(_conn) \174iscsi_dev_to_session(_conn->dev.parent)175176/* iscsi class session state */177enum {178ISCSI_SESSION_LOGGED_IN,179ISCSI_SESSION_FAILED,180ISCSI_SESSION_FREE,181};182183#define ISCSI_MAX_TARGET -1184185struct iscsi_cls_session {186struct list_head sess_list; /* item in session_list */187struct iscsi_transport *transport;188spinlock_t lock;189struct work_struct block_work;190struct work_struct unblock_work;191struct work_struct scan_work;192struct work_struct unbind_work;193194/* recovery fields */195int recovery_tmo;196struct delayed_work recovery_work;197198unsigned int target_id;199200int state;201int sid; /* session id */202void *dd_data; /* LLD private data */203struct device dev; /* sysfs transport/container device */204};205206#define iscsi_dev_to_session(_dev) \207container_of(_dev, struct iscsi_cls_session, dev)208209#define iscsi_session_to_shost(_session) \210dev_to_shost(_session->dev.parent)211212#define starget_to_session(_stgt) \213iscsi_dev_to_session(_stgt->dev.parent)214215struct iscsi_cls_host {216atomic_t nr_scans;217struct mutex mutex;218};219220extern void iscsi_host_for_each_session(struct Scsi_Host *shost,221void (*fn)(struct iscsi_cls_session *));222223struct iscsi_endpoint {224void *dd_data; /* LLD private data */225struct device dev;226uint64_t id;227struct iscsi_cls_conn *conn;228};229230/*231* session and connection functions that can be used by HW iSCSI LLDs232*/233#define iscsi_cls_session_printk(prefix, _cls_session, fmt, a...) \234dev_printk(prefix, &(_cls_session)->dev, fmt, ##a)235236#define iscsi_cls_conn_printk(prefix, _cls_conn, fmt, a...) \237dev_printk(prefix, &(_cls_conn)->dev, fmt, ##a)238239extern int iscsi_session_chkready(struct iscsi_cls_session *session);240extern struct iscsi_cls_session *iscsi_alloc_session(struct Scsi_Host *shost,241struct iscsi_transport *transport, int dd_size);242extern int iscsi_add_session(struct iscsi_cls_session *session,243unsigned int target_id);244extern int iscsi_session_event(struct iscsi_cls_session *session,245enum iscsi_uevent_e event);246extern struct iscsi_cls_session *iscsi_create_session(struct Scsi_Host *shost,247struct iscsi_transport *t,248int dd_size,249unsigned int target_id);250extern void iscsi_remove_session(struct iscsi_cls_session *session);251extern void iscsi_free_session(struct iscsi_cls_session *session);252extern int iscsi_destroy_session(struct iscsi_cls_session *session);253extern struct iscsi_cls_conn *iscsi_create_conn(struct iscsi_cls_session *sess,254int dd_size, uint32_t cid);255extern int iscsi_destroy_conn(struct iscsi_cls_conn *conn);256extern void iscsi_unblock_session(struct iscsi_cls_session *session);257extern void iscsi_block_session(struct iscsi_cls_session *session);258extern int iscsi_scan_finished(struct Scsi_Host *shost, unsigned long time);259extern struct iscsi_endpoint *iscsi_create_endpoint(int dd_size);260extern void iscsi_destroy_endpoint(struct iscsi_endpoint *ep);261extern struct iscsi_endpoint *iscsi_lookup_endpoint(u64 handle);262extern int iscsi_block_scsi_eh(struct scsi_cmnd *cmd);263264#endif265266267