diff usr/src/cmd/iscsi/iscsitgtd/iscsi_conn.h @ 0:c9caec207d52 b86

Initial porting based on b86
author Koji Uno <koji.uno@sun.com>
date Tue, 02 Jun 2009 18:56:50 +0900
parents
children 1a15d5aaf794
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usr/src/cmd/iscsi/iscsitgtd/iscsi_conn.h	Tue Jun 02 18:56:50 2009 +0900
@@ -0,0 +1,216 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _TARGET_CONN_H
+#define	_TARGET_CONN_H
+
+#pragma ident	"@(#)iscsi_conn.h	1.1	06/06/20 SMI"
+
+/*
+ * Block comment which describes the contents of this file.
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <sys/iscsi_protocol.h>
+#include <sys/socket.h>
+#include "queue.h"
+#include "iscsi_sess.h"
+#include "iscsi_cmd.h"
+
+#define	LBUFSIZE 80
+
+#define	TARGET_LOCATION			"targets"
+/*
+ * Currently I'm having some problems with network reads/write when the
+ * data size is larger than 8k. To work around this problem I set the
+ * various negotiation parameters during login to limit things to 8k.
+ */
+
+#define	NETWORK_SNDRCV		65536
+#define	NETWORK_SNDRCV_STR	"65536"
+
+typedef enum iscsi_state {
+	S1_FREE,
+	/* S2_XPT_WAIT, Not possible for target */
+	S3_XPT_UP,
+	S4_IN_LOGIN,
+	S5_LOGGED_IN,
+	S6_IN_LOGOUT,
+	S7_LOGOUT_REQUESTED,
+	S8_CLEANUP_WAIT
+} iscsi_state_t;
+
+typedef enum iscsi_transition {
+	T3, T4, T5, T6, T7, T8,
+	T9, T10, T11, T12, T13, T15,
+	T16, T17, T18
+} iscsi_transition_t;
+
+/*
+ * When grabbing mutex's make sure to grab c_mutex before c_mutex_state
+ * if you need to grab both.
+ */
+typedef struct iscsi_conn {
+	int		c_fd;
+
+	/*
+	 * This is a linked list of all connections. Not just the connections
+	 * associated with a particular session.
+	 */
+	struct iscsi_conn	*c_next,
+				*c_prev;
+
+	target_queue_t	*c_mgmtq;
+
+	/*
+	 * Time as reported by time(2) when this connection was started.
+	 */
+	time_t		c_up_at;
+
+	/*
+	 * This queue is used to accept notification that incoming packets
+	 * are available and command completion status from Session.
+	 */
+	target_queue_t	*c_dataq;
+
+	/*
+	 * Messages are sent to Session, and from there onto STE, using
+	 * this queue.
+	 */
+	target_queue_t	*c_sessq;
+
+	iscsi_sess_t	*c_sess;
+
+	pthread_mutex_t	c_state_mutex;
+	iscsi_state_t	c_state;
+
+	/*
+	 * Protected by c_mutex
+	 */
+	int		c_statsn;
+
+	int		c_cid;
+
+	/*
+	 * Pointer to data buffer used to store text messages which have
+	 * the 'C' bit set. Since the text data separates name/value pairs
+	 * with a '\0' strlen can't be used to determine the amount of space
+	 * used so we keep the length in c_text_len;
+	 */
+	char		*c_text_area;
+	int		c_text_len;
+	int		c_text_sent;
+
+	sema_t		c_datain;
+	pthread_t	c_thr_id_poller,
+			c_thr_id_process;
+
+	pthread_mutex_t	c_mutex;
+	iscsi_cmd_t	*c_cmd_head;
+	iscsi_cmd_t	*c_cmd_tail;
+
+	struct sockaddr_storage	c_initiator_sockaddr;
+	struct sockaddr_storage c_target_sockaddr;
+
+	int		c_num;
+
+	int		c_auth_pass	: 1;
+
+	int		c_cmds_active;
+
+	/*
+	 * A performance issue has been found when the backing store
+	 * is UFS. Because of the indirect blocks used by UFS large files
+	 * (many GBs in size) perform poorly. This in turn can cause the
+	 * initiator to issue commands which don't complete in time. So,
+	 * we'll monitor the completion times for commands if if it's
+	 * increasing the command window will be reduced.
+	 * The avg_sum is in nanoseconds. This will wrap once every 584
+	 * years.
+	 */
+	uint64_t	c_cmds_avg_cnt;
+	hrtime_t	c_cmds_avg_sum;
+
+	/*
+	 * During an orderly shutdown the logout response is created when
+	 * we receive the logout request. We must however wait for all I/O
+	 * to complete before processing the data else we'll loose data
+	 * which the initiator believes was successfully transferred.
+	 * Once the STE and sessions have closed they will send a shutdown
+	 * complete message. At that point the transmit side of the connection
+	 * will set the state to T13 which pushes this message out.
+	 * Unfortunately we need information from the Logout Request PDU
+	 * to create the Logout Response PDU. Otherwise the response could
+	 * be generated on the fly in the T13 state handler. By creating
+	 * the response PDU and saving a pointer gives us some flexibility
+	 * in the future if the final outgoing packet needs to change.
+	 * Otherwise, storing that one bit of information from the request
+	 * PDU might become dated.
+	 */
+	iscsi_hdr_t	*c_last_pkg;
+
+	/*
+	 * Connection parameters
+	 */
+	Boolean_t	c_header_digest,
+			c_data_digest,
+			c_ifmarker,
+			c_ofmarker,
+			c_initialR2T,
+			c_immediate_data,
+			c_data_pdu_in_order,
+			c_data_sequence_in_order;
+	int		c_tpgt,
+			c_maxcmdsn,
+			c_max_recv_data,
+			c_default_time_2_wait,
+			c_default_time_2_retain,
+			c_erl,
+			c_max_burst_len,
+			c_first_burst_len,
+			c_max_outstanding_r2t,
+			c_max_connections;
+	char		*c_targ_alias,
+			*auth_text;
+	int		auth_text_length;
+
+} iscsi_conn_t;
+
+void *conn_process(void *v);
+void conn_state(iscsi_conn_t *c, iscsi_transition_t t);
+void send_iscsi_pkt(iscsi_conn_t *c, iscsi_hdr_t *h, char *opt_text);
+int read_retry(int fd, char *buf, int count);
+void iscsi_inventory_change(char *targ_name);
+void iscsi_capacity_change(char *targ_name, int lun);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _TARGET_CONN_H */