open-iscsi/linux-iscsi-5 Initiator: open-iscsi-headers.patch
PATCH 3/7 open-iscsi/linux-iscsi-5 Initiator: open-iscsi-headers.patch
open-iscsi-headers.patch - common header files:
- iscsi_if.h (user/kernel #defines and user/kernel events);
- iscsi_proto.h (RFC3720 #defines and types);
- scsi_transport_iscsi.h (transport API, transport #defines and types).
include/scsi/iscsi_if.h new file +245 -0
@@ -0,0 +1,245 @@ +/* +* iSCSI User/Kernel Shares (Defines, Constants, Protocol definitions, etc) +* +* Copyright (C) 2005 Dmitry Yusupov +* Copyright (C) 2005 Alex Aizman +* maintained by [email protected] +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published +* by the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, but +* WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* General Public License for more details. +* +* See the file COPYING included with this distribution for more details. +*/ + +#ifndef ISCSI_IF_H +#define ISCSI_IF_H + +#include <scsi/iscsi_proto.h> + +#define UEVENT_BASE 10 +#define KEVENT_BASE 100 +#define ISCSI_ERR_BASE 1000 + +enum iscsi_uevent_e { +ISCSI_UEVENT_UNKNOWN =0 , + +/* down events */ +ISCSI_UEVENT_CREATE_SESSION =UEVENT_BASE +1 , +ISCSI_UEVENT_DESTROY_SESSION =UEVENT_BASE +2 , +ISCSI_UEVENT_CREATE_CONN =UEVENT_BASE +3 , +ISCSI_UEVENT_DESTROY_CONN =UEVENT_BASE +4 , +ISCSI_UEVENT_BIND_CONN =UEVENT_BASE +5 , +ISCSI_UEVENT_SET_PARAM =UEVENT_BASE +6 , +ISCSI_UEVENT_START_CONN =UEVENT_BASE +7 , +ISCSI_UEVENT_STOP_CONN =UEVENT_BASE +8 , +ISCSI_UEVENT_SEND_PDU =UEVENT_BASE +9 , +ISCSI_UEVENT_GET_STATS =UEVENT_BASE +10 , +ISCSI_UEVENT_GET_PARAM =UEVENT_BASE +11 , + +/* up events */ +ISCSI_KEVENT_RECV_PDU =KEVENT_BASE +1 , +ISCSI_KEVENT_CONN_ERROR =KEVENT_BASE +2 , +ISCSI_KEVENT_IF_ERROR =KEVENT_BASE +3 , +}; + +struct iscsi_uevent { +uint32_t type;/* k/u events type */ +uint32_t iferror;/* carries interface or resource errors */ +uint64_t transport_handle; + +union { +/* messages u -> k */ +struct msg_create_session { +uint32_t initial_cmdsn; + } c_session; +struct msg_destroy_session { +uint64_t session_handle; +uint32_t sid; + } d_session; +struct msg_create_conn { +uint64_t session_handle; +uint32_t cid; +uint32_t sid; + } c_conn; +struct msg_bind_conn { +uint64_t session_handle; +uint64_t conn_handle; +uint32_t transport_fd; +uint32_t is_leading; + } b_conn; +struct msg_destroy_conn { +uint64_t conn_handle; +uint32_t cid; + } d_conn; +struct msg_send_pdu { +uint32_t hdr_size; +uint32_t data_size; +uint64_t conn_handle; + } send_pdu; +struct msg_set_param { +uint64_t conn_handle; +uint32_t param;/* enum iscsi_param */ +uint32_t value; + } set_param; +struct msg_start_conn { +uint64_t conn_handle; + } start_conn; +struct msg_stop_conn { +uint64_t conn_handle; +uint32_t flag; + } stop_conn; +struct msg_get_stats { +uint64_t conn_handle; + } get_stats; + } u; +union { +/* messages k -> u */ +uint64_t handle; +int retcode; +struct msg_create_session_ret { +uint64_t session_handle; +uint32_t sid; + } c_session_ret; +struct msg_recv_req { +uint64_t recv_handle; +uint64_t conn_handle; + } recv_req; +struct msg_conn_error { +uint64_t conn_handle; +uint32_t error;/* enum iscsi_err */ + } connerror; + } r; +} __attribute__ ((aligned (sizeof (uint64_t )))); + +/* +* Common error codes +*/ +enum iscsi_err { +ISCSI_OK =0 , + +ISCSI_ERR_DATASN =ISCSI_ERR_BASE +1 , +ISCSI_ERR_DATA_OFFSET =ISCSI_ERR_BASE +2 , +ISCSI_ERR_MAX_CMDSN =ISCSI_ERR_BASE +3 , +ISCSI_ERR_EXP_CMDSN =ISCSI_ERR_BASE +4 , +ISCSI_ERR_BAD_OPCODE =ISCSI_ERR_BASE +5 , +ISCSI_ERR_DATALEN =ISCSI_ERR_BASE +6 , +ISCSI_ERR_AHSLEN =ISCSI_ERR_BASE +7 , +ISCSI_ERR_PROTO =ISCSI_ERR_BASE +8 , +ISCSI_ERR_LUN =ISCSI_ERR_BASE +9 , +ISCSI_ERR_BAD_ITT =ISCSI_ERR_BASE +10 , +ISCSI_ERR_CONN_FAILED =ISCSI_ERR_BASE +11 , +ISCSI_ERR_R2TSN =ISCSI_ERR_BASE +12 , +ISCSI_ERR_SESSION_FAILED =ISCSI_ERR_BASE +13 , +ISCSI_ERR_HDR_DGST =ISCSI_ERR_BASE +14 , +ISCSI_ERR_DATA_DGST =ISCSI_ERR_BASE +15 , +ISCSI_ERR_PARAM_NOT_FOUND =ISCSI_ERR_BASE +16 +}; + +/* +* iSCSI Parameters (RFC3720) +*/ +enum iscsi_param { +ISCSI_PARAM_MAX_RECV_DLENGTH =0 , +ISCSI_PARAM_MAX_XMIT_DLENGTH =1 , +ISCSI_PARAM_HDRDGST_EN =2 , +ISCSI_PARAM_DATADGST_EN =3 , +ISCSI_PARAM_INITIAL_R2T_EN =4 , +ISCSI_PARAM_MAX_R2T =5 , +ISCSI_PARAM_IMM_DATA_EN =6 , +ISCSI_PARAM_FIRST_BURST =7 , +ISCSI_PARAM_MAX_BURST =8 , +ISCSI_PARAM_PDU_INORDER_EN =9 , +ISCSI_PARAM_DATASEQ_INORDER_EN =10 , +ISCSI_PARAM_ERL =11 , +ISCSI_PARAM_IFMARKER_EN =12 , +ISCSI_PARAM_OFMARKER_EN =13 , +}; +#define ISCSI_PARAM_MAX 14 + +typedef uint64_t iscsi_sessionh_t ;/* iSCSI Data-Path session handle */ +typedef uint64_t iscsi_connh_t ;/* iSCSI Data-Path connection handle */ + +#define iscsi_ptr (_handle) ((void*)(unsigned long)_handle) +#define iscsi_handle (_ptr) ((uint64_t)(unsigned long)_ptr) +#define iscsi_hostdata (_hostdata) ((void*)_hostdata + sizeof(unsigned long)) + +/* +* These flags presents iSCSI Data-Path capabilities. +*/ +#define CAP_RECOVERY_L0 0x1 +#define CAP_RECOVERY_L1 0x2 +#define CAP_RECOVERY_L2 0x4 +#define CAP_MULTI_R2T 0x8 +#define CAP_HDRDGST 0x10 +#define CAP_DATADGST 0x20 +#define CAP_MULTI_CONN 0x40 +#define CAP_TEXT_NEGO 0x80 +#define CAP_MARKERS 0x100 + +/* +* These flags describes reason of stop_conn() call +*/ +#define STOP_CONN_TERM 0x1 +#define STOP_CONN_SUSPEND 0x2 +#define STOP_CONN_RECOVER 0x3 + +#define ISCSI_STATS_CUSTOM_MAX 32 +#define ISCSI_STATS_CUSTOM_DESC_MAX 64 +struct iscsi_stats_custom { +char desc[ISCSI_STATS_CUSTOM_DESC_MAX ]; +uint64_t value; +}; + +/* +* struct iscsi_stats - iSCSI Statistics (iSCSI MIB) +* +* Note: this structure contains counters collected on per-connection basis. +*/ +struct iscsi_stats { +/* octets */ +uint64_t txdata_octets; +uint64_t rxdata_octets; + +/* xmit pdus */ +uint32_t noptx_pdus; +uint32_t scsicmd_pdus; +uint32_t tmfcmd_pdus; +uint32_t login_pdus; +uint32_t text_pdus; +uint32_t dataout_pdus; +uint32_t logout_pdus; +uint32_t snack_pdus; + +/* recv pdus */ +uint32_t noprx_pdus; +uint32_t scsirsp_pdus; +uint32_t tmfrsp_pdus; +uint32_t textrsp_pdus; +uint32_t datain_pdus; +uint32_t logoutrsp_pdus; +uint32_t r2t_pdus; +uint32_t async_pdus; +uint32_t rjt_pdus; + +/* errors */ +uint32_t digest_err; +uint32_t timeout_err; + +/* +* iSCSI Custom Statistics support, i.e. Transport could +* extend existing MIB statistics with its own specific statistics +* up to ISCSI_STATS_CUSTOM_MAX +*/ +uint32_t custom_length; +struct iscsi_stats_custom custom[0 ] + __attribute__ ((aligned (sizeof (uint64_t )))); +}; + +#endif
include/scsi/iscsi_proto.h new file +566 -0
566 lines not on this page · raw message
include/scsi/scsi_transport_iscsi.h +3 -2
@@ -1,8 +1,10 @@ -/* +/* * iSCSI transport class definitions * * Copyright (C) IBM Corporation, 2004 -* Copyright (C) Mike Christie, 2004 +* Copyright (C) Mike Christie, 2004 - 2005 +* Copyright (C) Dmitry Yusupov, 2004 - 2005 +* Copyright (C) Alex Aizman, 2004 - 2005 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by
@@ -21,158 +23,64 @@
#ifndef SCSI_TRANSPORT_ISCSI_H
#define SCSI_TRANSPORT_ISCSI_H
-#include <linux/config.h>
-#include <linux/in6.h>
-#include <linux/in.h>
-
-struct scsi_transport_template;
+#include <scsi/iscsi_if.h>
-struct iscsi_class_session {
- uint8_t isid[6];
- uint16_t tsih;
- int header_digest; /* 1 CRC32, 0 None */
- int data_digest; /* 1 CRC32, 0 None */
- uint16_t tpgt;
- union {
- struct in6_addr sin6_addr;
- struct in_addr sin_addr;
- } u;
- sa_family_t addr_type; /* must be AF_INET or AF_INET6 */
- uint16_t port; /* must be in network byte order */
- int initial_r2t; /* 1 Yes, 0 No */
- int immediate_data; /* 1 Yes, 0 No */
- uint32_t max_recv_data_segment_len;
- uint32_t max_burst_len;
- uint32_t first_burst_len;
- uint16_t def_time2wait;
- uint16_t def_time2retain;
- uint16_t max_outstanding_r2t;
- int data_pdu_in_order; /* 1 Yes, 0 No */
- int data_sequence_in_order; /* 1 Yes, 0 No */
- int erl;
+/**
+ * struct iscsi_transport - iSCSI Transport template
+ *
+ * @name: transport name
+ * @caps: iSCSI Data-Path capabilities
+ * @create_session: create new iSCSI session object
+ * @destroy_session: destroy existing iSCSI session object
+ * @create_conn: create new iSCSI connection
+ * @bind_conn: associate this connection with existing iSCSI session
+ * and specified transport descriptor
+ * @destroy_conn: destroy inactive iSCSI connection
+ * @set_param: set iSCSI Data-Path operational parameter
+ * @start_conn: set connection to be operational
+ * @stop_conn: suspend/recover/terminate connection
+ * @send_pdu: send iSCSI PDU, Login, Logout, NOP-Out, Reject, Text.
+ *
+ * Template API provided by iSCSI Transport
+ */
+struct iscsi_transport {
+ struct module *owner;
+ char *name;
+ unsigned int caps;
+ struct scsi_host_template *host_template;
+ int hostdata_size;
+ int max_lun;
+ unsigned int max_conn;
+ unsigned int max_cmd_len;
+ iscsi_sessionh_t (*create_session) (uint32_t initial_cmdsn,
+ struct Scsi_Host *shost);
+ void (*destroy_session) (iscsi_sessionh_t session);
+ iscsi_connh_t (*create_conn) (iscsi_sessionh_t session, uint32_t cid);
+ int (*bind_conn) (iscsi_sessionh_t session, iscsi_connh_t conn,
+ uint32_t transport_fd, int is_leading);
+ int (*start_conn) (iscsi_connh_t conn);
+ void (*stop_conn) (iscsi_connh_t conn, int flag);
+ void (*destroy_conn) (iscsi_connh_t conn);
+ int (*set_param) (iscsi_connh_t conn, enum iscsi_param param,
+ uint32_t value);
+ int (*get_param) (iscsi_connh_t conn, enum iscsi_param param,
+ uint32_t *value);
+ int (*send_pdu) (iscsi_connh_t conn, struct iscsi_hdr *hdr,
+ char *data, uint32_t data_size);
+ void (*get_stats) (iscsi_connh_t conn, struct iscsi_stats *stats);
};
/*
- * accessor macros
+ * transport registration upcalls
*/
-#define iscsi_isid(x) \
- (((struct iscsi_class_session *)&(x)->starget_data)->isid)
-#define iscsi_tsih(x) \
- (((struct iscsi_class_session *)&(x)->starget_data)->tsih)
-#define iscsi_header_digest(x) \
- (((struct iscsi_class_session *)&(x)->starget_data)->header_digest)
-#define iscsi_data_digest(x) \
- (((struct iscsi_class_session *)&(x)->starget_data)->data_digest)
-#define iscsi_port(x) \
- (((struct iscsi_class_session *)&(x)->starget_data)->port)
-#define iscsi_addr_type(x) \
- (((struct iscsi_class_session *)&(x)->starget_data)->addr_type)
-#define iscsi_sin_addr(x) \
- (((struct iscsi_class_session *)&(x)->starget_data)->u.sin_addr)
-#define iscsi_sin6_addr(x) \
- (((struct iscsi_class_session *)&(x)->starget_data)->u.sin6_addr)
-#define iscsi_tpgt(x) \
- (((struct iscsi_class_session *)&(x)->starget_data)->tpgt)
-#define iscsi_initial_r2t(x) \
- (((struct iscsi_class_session *)&(x)->starget_data)->initial_r2t)
-#define iscsi_immediate_data(x) \
- (((struct iscsi_class_session *)&(x)->starget_data)->immediate_data)
-#define iscsi_max_recv_data_segment_len(x) \
- (((struct iscsi_class_session *)&(x)->starget_data)->max_recv_data_segment_len)
-#define iscsi_max_burst_len(x) \
- (((struct iscsi_class_session *)&(x)->starget_data)->max_burst_len)
-#define iscsi_first_burst_len(x) \
- (((struct iscsi_class_session *)&(x)->starget_data)->first_burst_len)
-#define iscsi_def_time2wait(x) \
- (((struct iscsi_class_session *)&(x)->starget_data)->def_time2wait)
-#define iscsi_def_time2retain(x) \
- (((struct iscsi_class_session *)&(x)->starget_data)->def_time2retain)
-#define iscsi_max_outstanding_r2t(x) \
- (((struct iscsi_class_session *)&(x)->starget_data)->max_outstanding_r2t)
-#define iscsi_data_pdu_in_order(x) \
- (((struct iscsi_class_session *)&(x)->starget_data)->data_pdu_in_order)
-#define iscsi_data_sequence_in_order(x) \
- (((struct iscsi_class_session *)&(x)->starget_data)->data_sequence_in_order)
-#define iscsi_erl(x) \
- (((struct iscsi_class_session *)&(x)->starget_data)->erl)
+extern int iscsi_register_transport(struct iscsi_transport *tt); +extern int iscsi_unregister_transport(struct iscsi_transport *tt);
/*
- * The functions by which the transport class and the driver communicate
+ * control plane upcalls
*/
-struct iscsi_function_template {
- /*
- * target attrs
- */
- void (*get_isid)(struct scsi_target *);
- void (*get_tsih)(struct scsi_target *);
- void (*get_header_digest)(struct scsi_target *);
- void (*get_data_digest)(struct scsi_target *);
- void (*get_port)(struct scsi_target *);
- void (*get_tpgt)(struct scsi_target *);
- /*
- * In get_ip_address the lld must set the address and
- * the address type
- */
- void (*get_ip_address)(struct scsi_target *);
- /*
- * The lld should snprintf the name or alias to the buffer
- */
- ssize_t (*get_target_name)(struct scsi_target *, char *, ssize_t);
- ssize_t (*get_target_alias)(struct scsi_target *, char *, ssize_t);
- void (*get_initial_r2t)(struct scsi_target *);
- void (*get_immediate_data)(struct scsi_target *);
- void (*get_max_recv_data_segment_len)(struct scsi_target *);
- void (*get_max_burst_len)(struct scsi_target *);
- void (*get_first_burst_len)(struct scsi_target *);
- void (*get_def_time2wait)(struct scsi_target *);
- void (*get_def_time2retain)(struct scsi_target *);
- void (*get_max_outstanding_r2t)(struct scsi_target *);
- void (*get_data_pdu_in_order)(struct scsi_target *);
- void (*get_data_sequence_in_order)(struct scsi_target *);
- void (*get_erl)(struct scsi_target *);
-
- /*
- * host atts
- */
-
- /*
- * The lld should snprintf the name or alias to the buffer
- */
- ssize_t (*get_initiator_alias)(struct Scsi_Host *, char *, ssize_t);
- ssize_t (*get_initiator_name)(struct Scsi_Host *, char *, ssize_t);
- /*
- * The driver sets these to tell the transport class it
- * wants the attributes displayed in sysfs. If the show_ flag
- * is not set, the attribute will be private to the transport
- * class. We could probably just test if a get_ fn was set
- * since we only use the values for sysfs but this is how
- * fc does it too.
- */
- unsigned long show_isid:1;
- unsigned long show_tsih:1;
- unsigned long show_header_digest:1;
- unsigned long show_data_digest:1;
- unsigned long show_port:1;
- unsigned long show_tpgt:1;
- unsigned long show_ip_address:1;
- unsigned long show_target_name:1;
- unsigned long show_target_alias:1;
- unsigned long show_initial_r2t:1;
- unsigned long show_immediate_data:1;
- unsigned long show_max_recv_data_segment_len:1;
- unsigned long show_max_burst_len:1;
- unsigned long show_first_burst_len:1;
- unsigned long show_def_time2wait:1;
- unsigned long show_def_time2retain:1;
- unsigned long show_max_outstanding_r2t:1;
- unsigned long show_data_pdu_in_order:1;
- unsigned long show_data_sequence_in_order:1;
- unsigned long show_erl:1;
- unsigned long show_initiator_name:1;
- unsigned long show_initiator_alias:1;
-};
-
-struct scsi_transport_template *iscsi_attach_transport(struct iscsi_function_template *); -void iscsi_release_transport(struct scsi_transport_template *);
+extern void iscsi_conn_error(iscsi_connh_t conn, enum iscsi_err error); +extern int iscsi_recv_pdu(iscsi_connh_t conn, struct iscsi_hdr *hdr,
+ char *data, uint32_t data_size);
#endif